diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm new file mode 100644 index 0000000000000..0b39c276a7d61 --- /dev/null +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_comms_agent.dmm @@ -0,0 +1,4215 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ag" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"bk" = ( +/turf/open/floor/iron, +/area/ruin/comms_agent) +"bs" = ( +/obj/structure/table, +/obj/structure/desk_bell{ + pixel_y = -1; + pixel_x = -8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/ruin/comms_agent) +"bt" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"ce" = ( +/obj/machinery/modular_computer/preset{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"cI" = ( +/obj/structure/water_source/puddle, +/obj/item/reagent_containers/cup/glass/waterbottle/large/empty{ + pixel_x = 5; + pixel_y = -6 + }, +/turf/open/misc/asteroid/snow/standard_air, +/area/ruin/comms_agent) +"di" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/lava/plasma/ice_moon, +/area/icemoon/underground/explored) +"do" = ( +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"ds" = ( +/obj/structure/bed/maint, +/obj/item/bedsheet/syndie, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"dP" = ( +/obj/structure/closet/crate/secure/freezer/commsagent, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"eE" = ( +/obj/structure/cable, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"eT" = ( +/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/icemoon{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"fk" = ( +/obj/structure/rack, +/obj/structure/cable, +/obj/item/storage/box/lights/mixed{ + pixel_y = 1 + }, +/obj/item/storage/toolbox/electrical{ + pixel_y = -2; + pixel_x = 2 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = -7; + pixel_x = -1 + }, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"ge" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"gt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet, +/area/ruin/comms_agent) +"gv" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/lava/plasma/ice_moon, +/area/icemoon/underground/explored) +"gY" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/ruin/comms_agent) +"he" = ( +/turf/open/misc/asteroid/snow/standard_air, +/area/ruin/comms_agent) +"hl" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/comms_agent) +"hW" = ( +/obj/effect/turf_decal/siding/wideplating/light{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"ig" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"ij" = ( +/obj/effect/turf_decal/siding/wideplating/light/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"in" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"iZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"jc" = ( +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"jB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"ka" = ( +/obj/machinery/seed_extractor, +/turf/open/misc/asteroid/snow/standard_air, +/area/ruin/comms_agent) +"kp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"kA" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/fluff/fokoff_sign, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"kB" = ( +/obj/structure/cable, +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"kD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/item/storage/bag/trash, +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"kL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"la" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall, +/area/ruin/comms_agent) +"lb" = ( +/turf/open/floor/stone, +/area/ruin/comms_agent) +"lj" = ( +/obj/machinery/light_switch/directional/south, +/obj/effect/mapping_helpers/turn_off_lights_with_lightswitch, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"ly" = ( +/obj/structure/flora/tree/pine/style_random, +/obj/structure/flora/grass/green/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"mb" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"mr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"mM" = ( +/obj/structure/ore_box, +/turf/open/floor/wood/parquet, +/area/ruin/comms_agent) +"nc" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"nm" = ( +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"nL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/shower/directional/south, +/obj/structure/curtain, +/turf/open/floor/iron/white/diagonal, +/area/ruin/comms_agent) +"nP" = ( +/turf/closed/wall/r_wall, +/area/ruin/comms_agent) +"od" = ( +/obj/machinery/oven/range, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"oE" = ( +/obj/item/tape/frozen, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"pg" = ( +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"pl" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/centcom{ + name = "Syndicate Secure Airlock System"; + desc = "Truly, a marvel of modern engineering." + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"pV" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"qE" = ( +/obj/item/pickaxe, +/obj/structure/closet/crate, +/obj/item/flashlight, +/obj/item/tank/internals/emergency_oxygen, +/turf/open/floor/wood/parquet, +/area/ruin/comms_agent) +"rh" = ( +/obj/structure/chair/office/tactical{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"rA" = ( +/obj/machinery/atmospherics/components/tank/air, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"rW" = ( +/obj/structure/filingcabinet, +/obj/item/paperwork, +/obj/item/paper/monitorkey, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"sc" = ( +/obj/effect/decal/cleanable/blood/splatter/over_window{ + pixel_y = 32 + }, +/obj/structure/sign/poster/official/nanotrasen_logo/directional/north, +/turf/open/floor/wood/parquet, +/area/ruin/comms_agent) +"sB" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"sJ" = ( +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/machinery/computer/camera_advanced/syndie{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"tb" = ( +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"tl" = ( +/turf/closed/mineral/snowmountain/cavern/icemoon, +/area/icemoon/underground/explored) +"tp" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/lava/plasma/ice_moon, +/area/icemoon/underground/explored) +"tu" = ( +/obj/structure/table, +/obj/item/lighter/skull{ + pixel_x = -4; + pixel_y = -3 + }, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"ud" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating/snowed{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/ruin/comms_agent) +"uk" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"un" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"up" = ( +/obj/effect/decal/cleanable/food/flour, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"uY" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"vB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/paper/fluff/ruins/listeningstation/briefing{ + pixel_x = -2 + }, +/obj/item/pen/survival, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"vK" = ( +/obj/effect/turf_decal/siding/wideplating/light, +/obj/machinery/computer/arcade/orion_trail, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"vV" = ( +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/iron/white/diagonal, +/area/ruin/comms_agent) +"wh" = ( +/obj/structure/curtain{ + open = 0; + icon_state = "bathroom-closed" + }, +/obj/item/soap/syndie, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/diagonal, +/area/ruin/comms_agent) +"wj" = ( +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/centcom{ + name = "Nanotrasen Airlock"; + desc = "Truly, a marvel of modern engineering." + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"xi" = ( +/obj/machinery/hydroponics/soil, +/turf/open/misc/asteroid/snow/standard_air, +/area/ruin/comms_agent) +"xq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom{ + pixel_x = 31 + }, +/obj/structure/table/reinforced, +/obj/machinery/fax{ + syndicate_network = 1; + allow_exotic_faxes = 1; + fax_name = "Listening Post"; + desc = "Bluespace technologies on the application of bureaucracy. This one is send-only"; + pixel_y = 5 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"xs" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"xz" = ( +/obj/item/chair/stool/bar, +/turf/open/floor/carpet, +/area/ruin/comms_agent) +"xD" = ( +/obj/structure/table, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/item/food/pizzaslice/moldy, +/obj/structure/closet/mini_fridge/grimy, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"yD" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "syndicate_comms_base" + }, +/obj/structure/fans/tiny, +/turf/open/floor/iron, +/area/ruin/comms_agent) +"yG" = ( +/obj/machinery/computer/message_monitor{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"yR" = ( +/obj/structure/table, +/obj/item/taperecorder/empty, +/turf/open/floor/carpet, +/area/ruin/comms_agent) +"zi" = ( +/turf/open/floor/plating, +/area/ruin/comms_agent) +"zG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"zJ" = ( +/obj/machinery/biogenerator, +/turf/open/misc/asteroid/snow/standard_air, +/area/ruin/comms_agent) +"Ac" = ( +/obj/effect/turf_decal/siding/wideplating/light{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/coffeemaker/impressa{ + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"BD" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"BQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/office/tactical, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"BZ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/directional/north, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/item/storage/fancy/egg_box, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/flour, +/obj/structure/closet/secure_closet/freezer/empty, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"CL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible/layer2, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"CS" = ( +/obj/structure/rack, +/obj/item/clothing/head/utility/welding, +/obj/item/flashlight, +/obj/item/weldingtool/largetank, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/syndicate_access, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"CW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"DH" = ( +/obj/structure/closet/crate/freezer, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/onion, +/obj/item/food/grown/garlic, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"DT" = ( +/obj/item/stack/sheet/mineral/wood{ + pixel_x = -4; + pixel_y = 3; + amount = 30 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone, +/area/ruin/comms_agent) +"EL" = ( +/turf/template_noop, +/area/template_noop) +"Fm" = ( +/obj/machinery/telecomms/relay/preset/ruskie{ + use_power = 0 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"FL" = ( +/obj/structure/table/wood, +/obj/item/multitool, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"FZ" = ( +/obj/effect/baseturf_helper/reinforced_plating/ceiling, +/obj/structure/cable, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"Gp" = ( +/obj/structure/fluff/empty_sleeper/syndicate{ + dir = 1; + desc = "An open sleeper. This one seems to be malfunctioning." + }, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"Gq" = ( +/obj/effect/turf_decal/siding/wood, +/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/wood, +/area/ruin/comms_agent) +"GI" = ( +/obj/structure/closet/crate/hydroponics, +/obj/effect/spawner/random/food_or_drink/seed, +/obj/item/seeds/corn, +/obj/item/seeds/tower, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/seeds/coffee/robusta, +/obj/item/seeds/wheat, +/obj/effect/spawner/random/food_or_drink/seed, +/turf/open/misc/asteroid/snow/standard_air, +/area/ruin/comms_agent) +"GQ" = ( +/obj/structure/table, +/obj/item/camera{ + pixel_y = 8; + pixel_x = 5 + }, +/obj/item/paper/pamphlet/centcom/visitor_info{ + pixel_x = -5 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/carpet, +/area/ruin/comms_agent) +"GR" = ( +/obj/machinery/atmospherics/components/trinary/mixer/flipped/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"GY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"HX" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"Ie" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"IJ" = ( +/obj/machinery/griddle, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"Jh" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/table, +/obj/item/reagent_containers/cup/maunamug{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/storage/fancy/coffee_condi_display{ + pixel_x = -13; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"JD" = ( +/obj/structure/closet/cabinet, +/obj/item/bedsheet/syndie, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots/ice_boots/eva{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/maunamug, +/obj/item/toy/plush/nukeplushie, +/obj/item/ammo_box/magazine/m9mm, +/obj/item/ammo_box/magazine/m9mm, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"JY" = ( +/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/ruin/comms_agent) +"Kv" = ( +/obj/machinery/atmospherics/components/trinary/filter/layer2{ + dir = 8 + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/smes/super/full, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"KB" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood/parquet, +/area/ruin/comms_agent) +"KG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone, +/area/ruin/comms_agent) +"KM" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/parquet, +/area/ruin/comms_agent) +"KQ" = ( +/turf/open/genturf, +/area/template_noop) +"Lh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/item/cultivator/rake, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating/snowed{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/ruin/comms_agent) +"Ll" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/binary/volume_pump/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"Lr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/waterbottle/empty{ + pixel_y = 18; + pixel_x = -8 + }, +/obj/item/reagent_containers/cup/bowl{ + pixel_y = 7; + pixel_x = -7 + }, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = -7 + }, +/obj/machinery/reagentgrinder{ + pixel_x = 5; + pixel_y = 13 + }, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"Lz" = ( +/turf/open/floor/wood{ + initial_gas_mix = "o2=22;n2=82;TEMP=180"; + name = "bridge" + }, +/area/icemoon/underground/explored) +"LI" = ( +/obj/item/fishing_line/reinforced{ + pixel_x = 7; + pixel_y = 4 + }, +/turf/open/misc/asteroid/snow/standard_air, +/area/ruin/comms_agent) +"LP" = ( +/turf/closed/wall/r_wall, +/area/ruin/comms_agent/maint) +"Mj" = ( +/obj/structure/fireplace, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone, +/area/ruin/comms_agent) +"Ml" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/stone, +/area/ruin/comms_agent) +"Mv" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/glass{ + amount = 20 + }, +/obj/item/stack/sheet/iron/twenty, +/obj/item/stack/sheet/leather{ + amount = 10 + }, +/obj/item/reagent_containers/condiment/enzyme, +/obj/structure/cable, +/obj/item/stack/sheet/mineral/plasma/thirty, +/obj/item/stack/sheet/mineral/plasma/thirty, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"Mz" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"MH" = ( +/turf/closed/mineral/snowmountain/icemoon, +/area/icemoon/underground/explored) +"MM" = ( +/obj/machinery/door/airlock/maintenance, +/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/ruin/comms_agent/maint) +"Ng" = ( +/obj/item/chair/wood/wings, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone, +/area/ruin/comms_agent) +"Ny" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/washing_machine{ + pixel_x = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/plating/snowed{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/ruin/comms_agent) +"NJ" = ( +/obj/item/storage/medkit/regular, +/obj/item/reagent_containers/syringe, +/obj/structure/closet/secure_closet/freezer/empty/open, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"NL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall/r_wall, +/area/ruin/comms_agent/maint) +"Ok" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"Oy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating/snowed{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/ruin/comms_agent) +"OB" = ( +/turf/open/lava/plasma/ice_moon, +/area/icemoon/underground/explored) +"OM" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"Pj" = ( +/obj/structure/bed/maint, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"PC" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"PX" = ( +/obj/item/storage/toolbox/fishing{ + pixel_y = -9; + pixel_x = 11 + }, +/turf/open/misc/asteroid/snow/standard_air, +/area/ruin/comms_agent) +"Qn" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/syndicate_access, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"Qx" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"QG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/cable, +/obj/item/pipe/trinary/flippable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"QT" = ( +/obj/structure/table, +/obj/item/storage/photo_album/icemoonlisteningstation{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/crowbar/red, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"QU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall/r_wall, +/area/ruin/comms_agent) +"QW" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/general/visible, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"Sc" = ( +/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/ruin/comms_agent) +"Tn" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/machinery/newscaster/directional/south, +/obj/item/pen/edagger, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"Tp" = ( +/obj/effect/mapping_helpers/broken_floor, +/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/ruin/comms_agent) +"TH" = ( +/obj/structure/flora/tree/dead/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"TV" = ( +/obj/structure/flora/grass/green/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"Uv" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/carpet, +/area/ruin/comms_agent) +"Uw" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/ruin/comms_agent) +"UI" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/records/security/laptop/syndie{ + dir = 1 + }, +/obj/item/paper/monitorkey{ + pixel_x = -15; + pixel_y = 7 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"Vo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"VN" = ( +/turf/open/floor/carpet, +/area/ruin/comms_agent) +"Wl" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable, +/obj/machinery/atmospherics/components/trinary/filter/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/ruin/comms_agent/maint) +"Wm" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "syndicate_comms_base" + }, +/turf/open/floor/iron, +/area/ruin/comms_agent) +"WL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/ruin/comms_agent) +"WR" = ( +/turf/closed/wall, +/area/ruin/comms_agent) +"WU" = ( +/obj/structure/sign/warning/explosives/alt/directional/north, +/obj/machinery/syndicatebomb/self_destruct{ + anchored = 1 + }, +/obj/machinery/light/small/red/directional/north, +/obj/machinery/door/window/brigdoor/left/directional/south, +/turf/open/floor/circuit/red, +/area/ruin/comms_agent) +"Xk" = ( +/obj/effect/mapping_helpers/airlock/access/any/syndicate, +/obj/machinery/door/airlock/glass, +/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/ruin/comms_agent) +"XU" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/comms_agent) +"Yz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/ruin/comms_agent) +"YA" = ( +/turf/open/floor/wood/parquet, +/area/ruin/comms_agent) +"YI" = ( +/turf/closed/wall, +/area/ruin/comms_agent/maint) +"YX" = ( +/turf/closed/wall/ice, +/area/ruin/comms_agent) +"Ze" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/ruin/comms_agent) +"ZE" = ( +/obj/structure/sink/directional/east, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/mirror/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/diagonal, +/area/ruin/comms_agent) + +(1,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(2,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(3,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(4,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(5,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(6,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(7,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(8,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(9,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(10,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(11,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OM +OM +OB +OB +OM +OM +OM +OM +OM +OM +OM +OM +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(12,1,1) = {" +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OM +OM +OM +OM +OM +OM +OM +MH +OM +OM +OM +MH +MH +OM +OM +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(13,1,1) = {" +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OM +OM +OM +OM +OM +OM +MH +MH +MH +nm +MH +MH +MH +MH +OM +OM +OM +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(14,1,1) = {" +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OM +OM +OM +OM +MH +MH +MH +MH +nP +nP +QU +nP +nP +tl +MH +MH +OM +OM +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(15,1,1) = {" +EL +EL +EL +OB +OB +OB +OB +OB +OB +EL +EL +EL +OB +OB +OB +OB +OB +OM +OM +OM +OM +MH +MH +tl +tl +nP +nL +ZE +vV +nP +tl +tl +MH +OM +OM +OM +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(16,1,1) = {" +EL +EL +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OM +OM +OM +MH +MH +tl +tl +tl +nP +WR +wh +la +QU +NL +NL +NL +MH +OM +OM +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(17,1,1) = {" +EL +EL +OB +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OM +OM +MH +MH +tl +nP +nP +nP +nP +od +do +NJ +YI +tb +fk +NL +MH +MH +TH +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(18,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OM +OM +OM +MH +MH +nP +nP +JD +FL +WR +IJ +do +DH +YI +QW +Qx +NL +LP +MH +OM +OM +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(19,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OM +OM +TV +MH +MH +nP +ds +uY +pV +WR +BZ +WL +eT +YI +rA +uk +Mv +LP +MH +TV +OM +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(20,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OM +OM +jc +OM +MH +MH +nP +Pj +HX +Fm +WR +Lr +WL +Gp +YI +ge +GR +Kv +LP +MH +OM +OM +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(21,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OM +OM +OM +OM +OM +MH +MH +nP +WR +nc +WR +WR +xs +Vo +lj +YI +CS +Wl +CL +LP +MH +MH +OM +sB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(22,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OM +OM +OM +TV +OM +MH +nP +nP +kD +Ze +WR +vK +JY +JY +JY +MM +kB +Ll +CW +NL +GY +MH +TH +OM +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(23,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OM +ly +OM +OM +sB +MH +MH +nP +DT +lb +QG +xD +ij +hW +Ac +WR +YI +YI +YI +LP +LP +pg +OM +OM +OM +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(24,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +sB +OM +OM +OM +OM +MH +tl +nP +Mj +Ml +mr +QT +jB +Sc +Jh +WR +yG +sJ +Tn +nP +MH +MH +MH +OM +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(25,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OM +OM +OM +jc +MH +MH +tl +nP +KG +Ng +mr +kL +Sc +Tp +Gq +pl +HX +rh +UI +XU +MH +MH +MH +OM +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(26,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OM +OM +OM +OM +MH +MH +tl +nP +un +zG +mb +FZ +zi +in +bt +WR +xq +Yz +ce +XU +MH +MH +sB +OM +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(27,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OM +sB +OM +MH +MH +tl +nP +nP +nP +Mz +eE +Qn +up +in +ag +WR +WR +BQ +vB +XU +MH +MH +OM +OM +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +"} +(28,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OM +OM +MH +MH +MH +tl +nP +qE +nP +wj +nP +nP +dP +tu +kL +WR +WU +kp +rW +XU +MH +MH +OM +OM +OB +OB +OB +OB +OB +OB +OB +MH +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +"} +(29,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OM +OM +MH +MH +tl +tl +nP +YA +VN +Uw +KM +nP +nP +nP +Xk +WR +WR +WR +nP +nP +MH +MH +OM +OM +OM +OB +OB +OB +OB +OB +OB +MH +MH +OB +OB +EL +EL +EL +EL +EL +EL +EL +"} +(30,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OM +OM +MH +MH +tl +tl +nP +sc +gt +bs +gY +Wm +hl +nP +Oy +Lh +ud +GI +nP +tl +MH +TV +OM +OM +OM +OB +OB +OB +OB +OB +OM +OM +MH +OB +OB +OB +EL +EL +EL +EL +EL +EL +"} +(31,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OM +OM +MH +MH +MH +tl +nP +mM +xz +yR +KB +nP +bk +nP +Ny +he +cI +zJ +YX +tl +MH +OM +oE +OM +OM +OB +OB +OB +OB +OB +OM +OM +MH +MH +OB +OB +EL +EL +EL +EL +EL +EL +"} +(32,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OM +OM +OM +MH +MH +MH +nP +nP +Uv +GQ +YA +nP +bk +nP +xi +LI +PX +ka +YX +tl +MH +OM +OM +OM +OM +OB +OB +OB +OB +sB +OM +OM +MH +MH +OB +OB +EL +EL +EL +EL +EL +EL +"} +(33,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +sB +OM +OM +OM +jc +MH +MH +nP +nP +nP +nP +nP +yD +nP +nP +xi +xi +YX +YX +MH +MH +TV +OM +OM +OM +OB +OB +OB +OB +OM +OM +jc +OM +OB +OB +OB +EL +EL +EL +EL +EL +EL +"} +(34,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OM +OM +OM +OM +MH +MH +MH +MH +MH +MH +MH +KQ +tl +YX +YX +YX +YX +MH +MH +MH +OM +OM +OM +OB +OB +OB +OB +OB +OB +OM +OM +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +"} +(35,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OM +OM +OM +OM +OM +MH +MH +MH +MH +MH +KQ +KQ +tl +tl +MH +MH +MH +MH +OM +sB +OM +OM +OM +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +"} +(36,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OM +OM +OM +OM +OM +MH +MH +MH +MH +KQ +KQ +KQ +tl +tl +MH +jc +OM +OM +OM +OM +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(37,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OM +OM +OM +Ie +OM +PC +MH +MH +MH +KQ +KQ +tl +MH +MH +OM +sB +OM +OM +OM +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(38,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OM +OM +ig +Lz +iZ +sB +MH +MH +MH +KQ +MH +MH +OM +OM +OM +OM +OM +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(39,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +OM +kA +Lz +iZ +OM +OM +OM +OM +OM +TV +OM +OM +OM +OM +OM +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(40,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +gv +OM +OM +OM +OM +OM +OM +OM +OM +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(41,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +MH +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(42,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +MH +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(43,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +MH +MH +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(44,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +MH +MH +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(45,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +MH +MH +MH +MH +OB +OB +OB +OB +OB +OB +tp +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(46,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +MH +MH +MH +MH +MH +OB +OB +OB +Lz +di +OB +OB +OB +OB +OB +OB +OB +OB +OB +OB +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(47,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +MH +MH +MH +MH +MH +OB +ig +Lz +iZ +OB +OB +OB +OB +MH +MH +MH +MH +MH +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(48,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +MH +MH +MH +OM +BD +OM +Ok +OB +MH +MH +MH +MH +MH +MH +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(49,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +MH +MH +MH +OM +OM +OM +OM +OM +OM +MH +MH +MH +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(50,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +MH +MH +MH +OM +OM +OM +OM +MH +MH +MH +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(51,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(52,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(53,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(54,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} +(55,1,1) = {" +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +EL +"} diff --git a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm index 831e024754193..c396ddb4121e7 100644 --- a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm @@ -121,7 +121,7 @@ dir = 6 }, /obj/structure/table/reinforced, -/obj/item/reactive_armour_shell, +/obj/item/reactive_armor_shell, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/misc/anomaly_research) diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 6d08e39d81b1a..dc7c06cc66964 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -48099,9 +48099,6 @@ /obj/item/healthanalyzer, /turf/open/floor/iron/white/textured, /area/station/security/medical) -"otC" = ( -/turf/open/genturf, -/area/icemoon/surface/outdoors/nospawn) "otG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/blue{ @@ -272458,7 +272455,7 @@ wNO aaX wNO wNO -otC +bln hHG hHG hHG diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index c1e6494a5014a..0cb559b0e8f36 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -46,6 +46,7 @@ // item cooldowns #define COOLDOWN_SIGNALLER_SEND "cooldown_signaller_send" +#define COOLDOWN_TOOL_SOUND "cooldown_tool_sound" //circuit cooldowns #define COOLDOWN_CIRCUIT_SOUNDEMITTER "circuit_soundemitter" diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index 132ae1962398f..3e78ecf40d032 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -24,7 +24,7 @@ // If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY, // tool sound is only played when op is started. If not, it's played twice. #define MIN_TOOL_SOUND_DELAY 20 - +#define MIN_TOOL_OPERATING_DELAY 40 //minimum delay for operating sound. Prevent overlaps and overhand sound. /// Return when an item interaction is successful. /// This cancels the rest of the chain entirely and indicates success. #define ITEM_INTERACT_SUCCESS (1<<0) // Same as TRUE, as most tool (legacy) tool acts return TRUE on success diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm index 3824cc0b0048f..e23fc7e64db7a 100644 --- a/code/controllers/subsystem/dynamic/dynamic.dm +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -376,11 +376,11 @@ SUBSYSTEM_DEF(dynamic) /// Generate the advisory level depending on the shown threat level. /datum/controller/subsystem/dynamic/proc/generate_advisory_level() var/advisory_string = "" - if (prob(PULSAR_REPORT_CHANCE)) - if(HAS_TRAIT(SSstation, STATION_TRAIT_BANANIUM_SHIPMENTS)) - advisory_string += "Advisory Level: Clown Planet
" - advisory_string += "Your sector's advisory level is Clown Planet! Our bike horns have picked up on a large bananium stash. Clowns show a large influx of clowns on your station. We highly advise you to slip any threats to keep Honkotrasen assets within the Banana Sector. The Department of Intelligence advises defending chemistry from any clowns that are trying to make baldium or space lube." - return advisory_string + if(prob(PULSAR_REPORT_CHANCE)) + for(var/datum/station_trait/our_trait as anything in shuffle(SSstation.station_traits)) + advisory_string += our_trait.get_pulsar_message() + if(length(advisory_string)) + return advisory_string advisory_string += "Advisory Level: Pulsar Star
" advisory_string += "Your sector's advisory level is Pulsar Star. A large, unknown electromagnetic field has stormed through nearby surveillance equipment, causing major data loss. Partial data was recovered and showed no credible threats to Nanotrasen assets within the Spinward Sector; however, the Department of Intelligence advises maintaining high alert against potential threats due to the lack of complete data." @@ -662,9 +662,6 @@ SUBSYSTEM_DEF(dynamic) if (initial(ruleset_type.weight) == 0) continue - if(!(initial(ruleset_type.ruleset_category) & GLOB.dynamic_ruleset_categories)) - continue - var/ruleset = new ruleset_type configure_ruleset(ruleset) rulesets += ruleset @@ -944,6 +941,8 @@ SUBSYSTEM_DEF(dynamic) ruleset.restricted_roles |= ruleset.protected_roles if(CONFIG_GET(flag/protect_assistant_from_antagonist)) ruleset.restricted_roles |= JOB_ASSISTANT + if(!(ruleset.ruleset_category & GLOB.dynamic_ruleset_categories)) + ruleset.requirements = list(101,101,101,101,101,101,101,101,101,101) /// Get station traits and call for their config /datum/controller/subsystem/dynamic/proc/configure_station_trait_costs() diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index ca8acb4904039..d48166eeb23ac 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -46,6 +46,9 @@ if(!(pawn_mob.mobility_flags & MOBILITY_MOVE)) can_move = FALSE + if(HAS_TRAIT(pawn, TRAIT_NO_TRANSFORM)) + can_move = FALSE + return can_move ///Anything to do before moving; any checks if the pawn should be able to move should be placed in allowed_to_move() and called by this proc diff --git a/code/datums/announcers/intern_announcer.dm b/code/datums/announcers/intern_announcer.dm index 771b98b91b9d0..5e8544c18710f 100644 --- a/code/datums/announcers/intern_announcer.dm +++ b/code/datums/announcers/intern_announcer.dm @@ -43,4 +43,4 @@ ANNOUNCER_SHUTTLERECALLED = 'sound/ai/intern/shuttlerecalled.ogg', ANNOUNCER_SPANOMALIES = 'sound/ai/intern/spanomalies.ogg') - custom_alert_message = "
Please stand by for an important message from our new intern.
" + custom_alert_message = "Please stand by for an important message from our new intern.
" diff --git a/code/datums/components/profound_fisher.dm b/code/datums/components/profound_fisher.dm index 73c12198777ae..ec839e265f2f0 100644 --- a/code/datums/components/profound_fisher.dm +++ b/code/datums/components/profound_fisher.dm @@ -52,9 +52,9 @@ if(!do_after(living_parent, 10 SECONDS, target = target)) qdel(lure) return - var/reward_loot = pick_weight(fish_spot.fish_table) + var/reward_loot = fish_spot.roll_reward(our_rod, parent) if(ispath(reward_loot)) - new reward_loot(get_turf(living_parent)) + fish_spot.dispense_reward(reward_loot, parent, target) qdel(lure) /obj/item/fishing_rod/mob_fisher diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index c79d7229ceecf..73153792ee647 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -166,6 +166,12 @@ description = "3 Peaks Radio, where the 2000's live forever." suffix = "icemoon_underground_frozen_comms.dmm" +/datum/map_template/ruin/icemoon/underground/comms_agent + name = "Icemoon Listening Post" + id = "icemoon_comms_agent" + description = "Radio signals are being detected and the source is this completely innocent pile of snow." + suffix = "icemoon_underground_comms_agent.dmm" + //TODO: Bottom-Level ONLY Spawns after Refactoring Related Code /datum/map_template/ruin/icemoon/underground/plasma_facility name = "Ice-Ruin Abandoned Plasma Facility" diff --git a/code/datums/station_traits/_station_trait.dm b/code/datums/station_traits/_station_trait.dm index 7d71c52012e22..174b127b2d474 100644 --- a/code/datums/station_traits/_station_trait.dm +++ b/code/datums/station_traits/_station_trait.dm @@ -131,3 +131,7 @@ GLOBAL_LIST_EMPTY(lobby_station_traits) var/datum/hud/using_hud = hud_owner.hud_used using_hud?.show_hud(using_hud?.hud_version) lobby_buttons = list() + +/// Called when overriding a pulsar star command report message. +/datum/station_trait/proc/get_pulsar_message() + return diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index c0950bfdd7b93..509b6bdcbdbc8 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -308,6 +308,11 @@ event_control_path = /datum/round_event_control/ion_storm weight_multiplier = 2 +/datum/station_trait/random_event_weight_modifier/ion_storms/get_pulsar_message() + var/advisory_string = "Advisory Level: ERROR
" + advisory_string += scramble_message_replace_chars("Your sector's advisory level is ERROR. An electromagnetic field has stormed through nearby surveillance equipment, causing major data loss. Partial data was recovered and showed no credible threats to Nanotrasen assets within the Spinward Sector; however, the Department of Intelligence advises maintaining high alert against potential threats due to the lack of complete data.", 35) + return advisory_string + /datum/station_trait/random_event_weight_modifier/rad_storms name = "Radiation Stormfront" report_message = "A radioactive stormfront is passing through your station's system. Expect an increased likelihood of radiation storms passing over your station, as well the potential for multiple radiation storms to occur during your shift." @@ -719,7 +724,11 @@ weight = 3 show_in_report = TRUE report_message = "It looks like the storm is not gonna calm down anytime soon, stay safe out there." - storm_type = /datum/weather/snow_storm/forever_storm +/datum/station_trait/storm/foreverstorm/get_pulsar_message() + var/advisory_string = "Advisory Level: Ice Giant
" + advisory_string += "The ongoing blizzard has interfered with our surveillance equipment, and we cannot provide an accurate threat summary at this time. We advise you to stay safe and avoid traversing the area around the station." + return advisory_string + #undef GLOW_NEBULA diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index f174f5f8d8bb0..e066079802d7a 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -7,6 +7,11 @@ report_message = "Rumors has it that the clown planet has been sending support packages to clowns in this system." trait_to_give = STATION_TRAIT_BANANIUM_SHIPMENTS +/datum/station_trait/bananium_shipment/get_pulsar_message() + var/advisory_string = "Advisory Level: Clown Planet
" + advisory_string += "Your sector's advisory level is Clown Planet! Our bike horns have picked up on a large bananium stash. Clowns show a large influx of clowns on your station. We highly advise you to slip any threats to keep Honkotrasen assets within the Banana Sector. The Department of Intelligence advises defending chemistry from any clowns that are trying to make baldium or space lube." + return advisory_string + /datum/station_trait/unnatural_atmosphere name = "Unnatural atmospherical properties" trait_type = STATION_TRAIT_NEUTRAL @@ -122,6 +127,11 @@ . = ..() SSstation.announcer = /datum/centcom_announcer/intern +/datum/station_trait/announcement_intern/get_pulsar_message() + var/advisory_string = "Advisory Level: (TITLE HERE)
" + advisory_string += "(Copy/Paste the summary provided by the Threat Intelligence Office in this field. You shouldn't have any trouble with this just make sure to replace this message before hitting the send button. Also, make sure there's coffee ready for the meeting at 06:00 when you're done.)" + return advisory_string + /datum/station_trait/announcement_medbot name = "Announcement \"System\"" trait_type = STATION_TRAIT_NEUTRAL diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 185628a118738..99ed18f6fc734 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -294,6 +294,11 @@ weight_multiplier = 3 max_occurrences_modifier = 10 //lotta cows +/datum/station_trait/random_event_weight_modifier/wise_cows/get_pulsar_message() + var/advisory_string = "Advisory Level: Cow Planet
" //We're gonna go fast and we're gonna go far. + advisory_string += "Your sector's advisory level is Cow Planet. We don't really know what this one means -- the model we use to create these threat reports hasn't produced this result before. Watch out for cows, I guess? Good luck!" + return advisory_string + /datum/station_trait/bright_day name = "Bright Day" report_message = "The stars shine bright and the clouds are scarcer than usual. It's a bright day here on the Ice Moon's surface." @@ -354,9 +359,14 @@ /// Spawns assistants with some gear, either gimmicky or functional. Maybe, one day, it will inspire an assistant to do something productive or fun /datum/station_trait/assistant_gimmicks name = "Geared Assistants Pilot" - report_message = "The Nanotrassen Assistant Affairs division is performing a pilot to see if different assistant equipments help improve productivity!" + report_message = "The Nanotrassen Assistant Affairs division is performing a pilot to see if different assistant equipment helps improve productivity!" trait_type = STATION_TRAIT_POSITIVE weight = 3 trait_to_give = STATION_TRAIT_ASSISTANT_GIMMICKS show_in_report = TRUE blacklist = list(/datum/station_trait/colored_assistants) + +/datum/station_trait/random_event_weight_modifier/assistant_gimmicks/get_pulsar_message() + var/advisory_string = "Advisory Level: Grey Sky
" + advisory_string += "Your sector's advisory level is Grey Sky. Our sensors detect abnormal activity among the assistants assigned to your station. We advise you to closely monitor the Tool Storage, Bridge, Tech Storage, and Brig for gathering crowds or petty thievery." + return advisory_string diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index cab413b3b9b00..a20b552df4f04 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -20,7 +20,7 @@ protected_areas = list(/area/station/maintenance, /area/station/ai_monitored/turret_protected/ai_upload, /area/station/ai_monitored/turret_protected/ai_upload_foyer, /area/station/ai_monitored/turret_protected/aisat/maint, /area/station/ai_monitored/command/storage/satellite, /area/station/ai_monitored/turret_protected/ai, /area/station/commons/storage/emergency/starboard, /area/station/commons/storage/emergency/port, - /area/shuttle, /area/station/security/prison/safe, /area/station/security/prison/toilet, /area/icemoon/underground) + /area/shuttle, /area/station/security/prison/safe, /area/station/security/prison/toilet, /area/icemoon/underground, /area/ruin/comms_agent/maint) target_trait = ZTRAIT_STATION immunity_type = TRAIT_RADSTORM_IMMUNE diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm index 5f51b602fa766..fd983f763a3a2 100644 --- a/code/game/area/areas/ruins/icemoon.dm +++ b/code/game/area/areas/ruins/icemoon.dm @@ -23,6 +23,14 @@ /area/ruin/powered/mailroom name = "\improper Abandoned Post Office" +/area/ruin/comms_agent + name = "\improper Listening Post" + sound_environment = SOUND_ENVIRONMENT_CITY + +/area/ruin/comms_agent/maint + name = "\improper Listening Post Maintenance" + sound_environment = SOUND_AREA_TUNNEL_ENCLOSED + /area/ruin/plasma_facility/commons name = "\improper Abandoned Plasma Facility Commons" sound_environment = SOUND_AREA_STANDARD_STATION diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 2a2f219e61800..4e16a1946c7b9 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -8,7 +8,7 @@ req_access = list(ACCESS_ROBOTICS) state_open = TRUE circuit = /obj/item/circuitboard/machine/cyborgrecharger - occupant_typecache = list(/mob/living/silicon/robot, /mob/living/carbon/human) + occupant_typecache = list(/mob/living/silicon/robot, /mob/living/carbon/human, /mob/living/circuit_drone) processing_flags = NONE var/recharge_speed var/repairs diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 957b0d50ba47e..452d02c981d62 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -69,6 +69,8 @@ var/hitsound ///Played when the item is used, for example tools var/usesound + ///Played when item is used for long progress + var/operating_sound ///Used when yate into a mob var/mob_throw_hit_sound ///Sound used when equipping the item into a valid slot @@ -1123,6 +1125,9 @@ // Create a callback with checks that would be called every tick by do_after. var/datum/callback/tool_check = CALLBACK(src, PROC_REF(tool_check_callback), user, amount, extra_checks) + if(delay >= MIN_TOOL_OPERATING_DELAY) + play_tool_operating_sound(target, volume) + if(!do_after(user, delay, target=target, extra_checks=tool_check)) return else @@ -1165,6 +1170,19 @@ playsound(target, played_sound, volume, TRUE) +///Play item's operating sound +/obj/item/proc/play_tool_operating_sound(atom/target, volume=50) + if(target && operating_sound && volume) + var/played_sound = operating_sound + + if(islist(operating_sound)) + played_sound = pick(operating_sound) + + if(!TIMER_COOLDOWN_FINISHED(src, COOLDOWN_TOOL_SOUND)) + return + playsound(target, played_sound, volume, TRUE) + TIMER_COOLDOWN_START(src, COOLDOWN_TOOL_SOUND, 4 SECONDS) //based on our longest sound clip + /// Used in a callback that is passed by use_tool into do_after call. Do not override, do not call manually. /obj/item/proc/tool_check_callback(mob/living/user, amount, datum/callback/extra_checks) SHOULD_NOT_OVERRIDE(TRUE) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 3c42e65e29c87..b4c12d75a30c3 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -32,7 +32,7 @@ to_chat(borg, span_alert("Upgrade mounting error! No suitable hardpoint detected.")) to_chat(user, span_warning("There's no mounting point for the module!")) return FALSE - if(!allow_duplicates && (locate(type) in borg.contents)) + if(!allow_duplicates && (locate(type) in borg.upgrades)) to_chat(borg, span_alert("Upgrade mounting error! Hardpoint already occupied!")) to_chat(user, span_warning("The mounting point for the module is already occupied!")) return FALSE diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 9bb61e847b72d..b4185732ce96c 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -7,6 +7,7 @@ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' usesound = 'sound/items/crowbar.ogg' + operating_sound = 'sound/items/crowbar_prying.ogg' obj_flags = CONDUCTS_ELECTRICITY slot_flags = ITEM_SLOT_BELT force = 5 diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 02765122a134d..b9e0d15e69f6e 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -22,6 +22,7 @@ attack_verb_simple = list("stab") hitsound = 'sound/weapons/bladeslice.ogg' usesound = list('sound/items/screwdriver.ogg', 'sound/items/screwdriver2.ogg') + operating_sound = 'sound/items/screwdriver_operating.ogg' tool_behaviour = TOOL_SCREWDRIVER toolspeed = 1 armor_type = /datum/armor/item_screwdriver diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 06e4e01326894..7f2b11777d8f5 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -24,6 +24,7 @@ attack_verb_simple = list("pinch", "nip") hitsound = 'sound/items/wirecutter.ogg' usesound = 'sound/items/wirecutter.ogg' + operating_sound = 'sound/items/wirecutter_cut.ogg' drop_sound = 'sound/items/handling/wirecutter_drop.ogg' pickup_sound = 'sound/items/handling/wirecutter_pickup.ogg' tool_behaviour = TOOL_WIRECUTTER diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 8fbb681acfc3a..aa72b5d257ac6 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -14,6 +14,7 @@ demolition_mod = 1.25 w_class = WEIGHT_CLASS_SMALL usesound = 'sound/items/ratchet.ogg' + operating_sound = list('sound/items/ratchet_fast.ogg', 'sound/items/ratchet_slow.ogg') custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*1.5) drop_sound = 'sound/items/handling/wrench_drop.ogg' pickup_sound = 'sound/items/handling/wrench_pickup.ogg' diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index 6a8e1efdb5656..f0f2fc4a8f076 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -134,17 +134,19 @@ ADMIN_VERB(borg_panel, R_ADMIN, "Show Borg Panel", ADMIN_VERB_NO_DESCRIPTION, AD borg.fully_replace_character_name(borg.real_name,new_name) if ("toggle_upgrade") var/upgradepath = text2path(params["upgrade"]) - var/obj/item/borg/upgrade/installedupgrade = locate(upgradepath) in borg + var/obj/item/borg/upgrade/installedupgrade = locate(upgradepath) in borg.upgrades if (installedupgrade) message_admins("[key_name_admin(user)] removed the [installedupgrade] upgrade from [ADMIN_LOOKUPFLW(borg)].") log_silicon("[key_name(user)] removed the [installedupgrade] upgrade from [key_name(borg)].") qdel(installedupgrade) // see [mob/living/silicon/robot/on_upgrade_deleted()]. else var/obj/item/borg/upgrade/upgrade = new upgradepath(borg) - upgrade.action(borg, user) - borg.upgrades += upgrade message_admins("[key_name_admin(user)] added the [upgrade] borg upgrade to [ADMIN_LOOKUPFLW(borg)].") log_silicon("[key_name(user)] added the [upgrade] borg upgrade to [key_name(borg)].") + if(upgrade.action(borg, user)) + borg.add_to_upgrades(upgrade) + else + qdel(upgrade) if ("toggle_radio") var/channel = params["channel"] if (channel in borg.radio.channels) // We're removing a channel diff --git a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm index 112fa9f46692a..4ec7830ac88cf 100644 --- a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm +++ b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm @@ -491,6 +491,10 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) if(allow_link_change) disconnect_sensor() + if ("lock") + togglelock(usr) + return TRUE + update_appearance() return TRUE 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 f7eaf5788c9ee..1d2dbfa336308 100644 --- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm @@ -71,6 +71,9 @@ if(machine_stat & (NOPOWER|BROKEN)) to_chat(user, span_warning("It does nothing!")) else + if(HAS_SILICON_ACCESS(user)) + locked = !locked + return if(src.allowed(usr) && !wires.is_cut(WIRE_IDSCAN)) locked = !locked to_chat(user, span_notice("You [ locked ? "lock" : "unlock"] the air alarm interface.")) @@ -78,7 +81,6 @@ ui_interact(user) else to_chat(user, span_danger("Access denied.")) - return /obj/machinery/airalarm/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 1de6c330bfce9..37766aea223eb 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -213,7 +213,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( return TRUE if(src.last_message_count >= SPAM_TRIGGER_WARNING) //"auto-ban" sends the message that the cold and uncaring gamecode has been designed to quiash you like a bug in short measure should you continue, and it's quite intentional that the user isn't told exactly what that entails. - to_chat(src, span_danger("You are nearing the auto-ban limit for identical messages.")) + to_chat(src, span_userdanger("You are nearing the auto-ban limit for identical messages.")) + mob.balloon_alert(mob, "stop spamming!") return FALSE else last_message = message diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 9fec4dbe82b92..155e4dbe42fb6 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -1,11 +1,11 @@ -/obj/item/reactive_armour_shell - name = "reactive armour shell" - desc = "An experimental suit of armour, awaiting installation of an anomaly core." +/obj/item/reactive_armor_shell + name = "reactive armor shell" + desc = "An experimental suit of armor, awaiting installation of an anomaly core." icon_state = "reactiveoff" icon = 'icons/obj/clothing/suits/armor.dmi' w_class = WEIGHT_CLASS_BULKY -/obj/item/reactive_armour_shell/attackby(obj/item/weapon, mob/user, params) +/obj/item/reactive_armor_shell/attackby(obj/item/weapon, mob/user, params) ..() var/static/list/anomaly_armour_types = list( /obj/effect/anomaly/grav = /obj/item/clothing/suit/armor/reactive/repulse, diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/commsagent.dm b/code/modules/mapfluff/ruins/icemoonruin_code/commsagent.dm new file mode 100644 index 0000000000000..f6e0a6be8264a --- /dev/null +++ b/code/modules/mapfluff/ruins/icemoonruin_code/commsagent.dm @@ -0,0 +1,54 @@ +/obj/item/tape/frozen + name = "frozen tape" + desc = "A frozen old tape. The cold has somewhat preserved the recording inside." + icon_state = "tape_white" + used_capacity = 10 MINUTES + storedinfo = list( + "\[00:04\]Three.", + "\[00:05\]Years.", + "\[00:07\]Three FUCKING years in this frozen hellhole", + "\[00:11\]My mission's supposed to be over already!", + "\[00:15\]Nanotrasen has left their place to rot for like what,", + "\[00:20\]8, 9, 10 months? I lost track of it", + "\[00:25\]This was supposed to be a mission for TWO men,", + "\[00:29\]But the other agent hasn't even given any signs of waking up...", + //long silence + "\[02:00\]I can't do this anymore, man.", + "\[02:03\]I need to get out,", + "\[02:06\]Maybe with the gorilla gloves, i could...", + "\[02:11\]Hm.", + //shorter silence + "\[02:34\]I'm gonna go for it.", + "\[02:37\]If anyone finds this tape,", + "\[02:40\]whatever the outcome was,", + "\[02:43\]just know that i didn't regret it." + ) + timestamp = list ( + 4 SECONDS, + 5 SECONDS, + 7 SECONDS, + 11 SECONDS, + 15 SECONDS, + 20 SECONDS, + 25 SECONDS, + 29 SECONDS, + 2 MINUTES, + 2 MINUTES + 3 SECONDS, + 2 MINUTES + 6 SECONDS, + 2 MINUTES + 11 SECONDS, + 2 MINUTES + 34 SECONDS, + 2 MINUTES + 37 SECONDS, + 2 MINUTES + 40 SECONDS, + 2 MINUTES + 43 SECONDS + ) + +/obj/item/tape/frozen/Initialize(mapload) + . = ..() + unspool() // the tape spawns damaged + +/obj/item/tape/comms_wall + icon_state = "tape_red" + used_capacity = 10 MINUTES + storedinfo = list( + "\[00:01\]" + ) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index dea05f07b82ce..7555924753735 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -216,7 +216,6 @@ humanc = character //Let's retypecast the var to be human, if(humanc) //These procs all expect humans - GLOB.manifest.inject(humanc) if(SSshuttle.arrivals) SSshuttle.arrivals.QueueAnnounce(humanc, rank) else @@ -243,6 +242,9 @@ if((job.job_flags & JOB_ASSIGN_QUIRKS) && humanc && CONFIG_GET(flag/roundstart_traits)) SSquirks.AssignQuirks(humanc, humanc.client) + if(humanc) // Quirks may change manifest datapoints, so inject only after assigning quirks + GLOB.manifest.inject(humanc) + var/area/station/arrivals = GLOB.areas_by_type[/area/station/hallway/secondary/entry] if(humanc && arrivals && !arrivals.power_environ) //arrivals depowered humanc.put_in_hands(new /obj/item/crowbar/large/emergency(get_turf(humanc))) //if hands full then just drops on the floor diff --git a/code/modules/mob_spawn/ghost_roles/mining_roles.dm b/code/modules/mob_spawn/ghost_roles/mining_roles.dm index 5fb3337b911e7..00ff1b5a8fd1e 100644 --- a/code/modules/mob_spawn/ghost_roles/mining_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/mining_roles.dm @@ -283,6 +283,7 @@ important_text = "The base is rigged with explosives, DO NOT abandon it or let it fall into enemy hands!" outfit = /datum/outfit/lavaland_syndicate spawner_job_path = /datum/job/lavaland_syndicate + deletes_on_zero_uses_left = FALSE /obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/special(mob/living/new_spawn) . = ..() @@ -320,6 +321,21 @@ mask = /obj/item/clothing/mask/chameleon/gps r_hand = /obj/item/melee/energy/sword/saber +/datum/outfit/lavaland_syndicate/comms/icemoon + name = "Icemoon Syndicate Comms Agent" + mask = /obj/item/clothing/mask/chameleon + shoes = /obj/item/clothing/shoes/winterboots/ice_boots/eva + /obj/item/clothing/mask/chameleon/gps/Initialize(mapload) . = ..() AddComponent(/datum/component/gps, "Encrypted Signal") + +///Icemoon Syndicate Comms Agent + +/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/icemoon + name = "Icemoon Comms Agent" + prompt_name = "a syndicate comms agent" + you_are_text = "You are a syndicate comms agent, assigned in an underground secret listening post close to your enemy's facility." + flavour_text = "Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the outpost fall into enemy hands!" + important_text = "Do NOT let the outpost fall into enemy hands" + outfit = /datum/outfit/lavaland_syndicate/comms/icemoon diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index c8159de9b34f3..00cb86446bbfb 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -45,7 +45,7 @@ /obj/item/camera/Initialize(mapload) . = ..() - AddComponent(/datum/component/shell, list(new /obj/item/circuit_component/camera), SHELL_CAPACITY_SMALL) + AddComponent(/datum/component/shell, list(new /obj/item/circuit_component/camera, new /obj/item/circuit_component/remotecam/polaroid), SHELL_CAPACITY_SMALL) /obj/item/camera/attack_self(mob/user) if(!disk) diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index ddc896fe758fb..4a1647abebe7a 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -140,6 +140,11 @@ icon_state = "album_red" persistence_id = "listeningstation" +/obj/item/storage/photo_album/icemoonlisteningstation + name = "photo album (Icemoon Outpost)" + icon_state = "album_red" + persistence_id = "icemooncomms" + /obj/item/storage/photo_album/prison name = "photo album (Prison)" icon_state = "album_blue" diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 84dcb67233d52..8ae869220deef 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -720,7 +720,7 @@ // Armour /datum/design/reactive_armour - name = "Reactive Armour Shell" + name = "Reactive Armor Shell" desc = "An experimental suit of armour capable of utilizing an implanted anomaly core to protect the user." id = "reactive_armour" build_type = PROTOLATHE | AWAY_LATHE @@ -731,7 +731,7 @@ /datum/material/silver = SHEET_MATERIAL_AMOUNT*2.5, /datum/material/gold = SHEET_MATERIAL_AMOUNT * 2.5, ) - build_path = /obj/item/reactive_armour_shell + build_path = /obj/item/reactive_armor_shell category = list( RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SCIENCE ) diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm index 204ecaa289bcf..dbcd74165946a 100644 --- a/code/modules/research/designs/wiremod_designs.dm +++ b/code/modules/research/designs/wiremod_designs.dm @@ -467,6 +467,11 @@ id = "comp_assoc_list_pick" build_path = /obj/item/circuit_component/list_pick/assoc +/datum/design/component/bci/bci_camera + name = "BCI Camera" + id = "comp_camera_bci" + build_path = /obj/item/circuit_component/remotecam/bci + /datum/design/compact_remote_shell name = "Compact Remote Shell" desc = "A handheld shell with one big button." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index e678147e8c129..cb1ec6bb1ccc1 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -894,6 +894,7 @@ "bci_implanter", "bci_shell", "comp_bar_overlay", + "comp_camera_bci", "comp_counter_overlay", "comp_install_detector", "comp_object_overlay", diff --git a/code/modules/wiremod/components/atom/remotecam.dm b/code/modules/wiremod/components/atom/remotecam.dm new file mode 100644 index 0000000000000..3d5afa2381cd9 --- /dev/null +++ b/code/modules/wiremod/components/atom/remotecam.dm @@ -0,0 +1,438 @@ +#define REMOTECAM_RANGE_FAR 7 +#define REMOTECAM_RANGE_NEAR 2 +#define REMOTECAM_ENERGY_USAGE_NEAR 0.003 * STANDARD_CELL_CHARGE //Normal components have 0.001 * STANDARD_CELL_CHARGE, this is expensive to livestream footage +#define REMOTECAM_ENERGY_USAGE_FAR 0.008 * STANDARD_CELL_CHARGE //Far range vision should be expensive, crank this up 8 times +#define REMOTECAM_EMP_RESET 90 SECONDS + +/** + * # Remote Camera Component + * + * Attaches a camera for surveillance-on-the-go. + */ +/obj/item/circuit_component/remotecam + display_name = "Camera Abstract Type" + desc = "This is the abstract parent type - do not use this directly!" + category = "Entity" + circuit_flags = CIRCUIT_NO_DUPLICATES + + /// Starts the cameraa + var/datum/port/input/start + /// Stops the program. + var/datum/port/input/stop + /// Camera range flag (near/far) + var/datum/port/input/camera_range + /// The network to use + var/datum/port/input/network + + /// Allow camera range to be set or not + var/camera_range_settable = TRUE + /// Used only for the BCI shell type, as the COMSIG_MOVABLE_MOVED signal need to be assigned to the user mob, not the shell circuit + var/camera_signal_move_override = FALSE + + /// Camera object + var/obj/machinery/camera/shell_camera = null + /// The shell storing the parent circuit + var/atom/movable/shell_parent = null + /// The shell's type (used for prefix naming) + var/camera_prefix = "Camera" + /// Camera random ID + var/c_tag_random = 0 + + /// Used to store the current process state + var/current_camera_state = FALSE + /// Used to store the current cameranet state + var/current_cameranet_state = TRUE + /// Used to store the camera emp state + var/current_camera_emp = FALSE + /// Used to store the camera emp timer id + var/current_camera_emp_timer_id + /// Used to store the last string used for the camera name + var/current_camera_name = "" + /// Used to store the current camera range setting (near/far) + var/current_camera_range = 0 + /// Used to store the last string used for the camera network + var/current_camera_network = "" + +/obj/item/circuit_component/remotecam/get_ui_notices() + . = ..() + if(camera_range_settable) + . += create_ui_notice("Energy Usage For Near (0) Range: [display_energy(REMOTECAM_ENERGY_USAGE_NEAR)] Per [DisplayTimeText(COMP_CLOCK_DELAY)]", "orange", "clock") + . += create_ui_notice("Energy Usage For Far (1) Range: [display_energy(REMOTECAM_ENERGY_USAGE_FAR)] Per [DisplayTimeText(COMP_CLOCK_DELAY)]", "orange", "clock") + else + . += create_ui_notice("Energy Usage While Active: [display_energy(current_camera_range > 0 ? REMOTECAM_ENERGY_USAGE_FAR : REMOTECAM_ENERGY_USAGE_NEAR)] Per [DisplayTimeText(COMP_CLOCK_DELAY)]", "orange", "clock") + +/obj/item/circuit_component/remotecam/populate_ports() + start = add_input_port("Start", PORT_TYPE_SIGNAL) + stop = add_input_port("Stop", PORT_TYPE_SIGNAL) + if(camera_range_settable) + camera_range = add_input_port("Camera Range", PORT_TYPE_NUMBER, default = 0) + network = add_input_port("Network", PORT_TYPE_STRING, default = "ss13") + + if(camera_range_settable) + current_camera_range = camera_range.value + c_tag_random = rand(1, 999) + +/obj/item/circuit_component/remotecam/register_shell(atom/movable/shell) + shell_parent = shell + stop_process() + +/obj/item/circuit_component/remotecam/unregister_shell(atom/movable/shell) + stop_process() + remove_camera() + shell_parent = null + +/obj/item/circuit_component/remotecam/Destroy() + stop_process() + remove_camera() + shell_parent = null + return ..() + +/obj/item/circuit_component/remotecam/input_received(datum/port/input/port) + if(!shell_parent || !shell_camera) + return + update_camera_name_network() + if(COMPONENT_TRIGGERED_BY(start, port)) + start_process() + cameranet_add() + current_camera_state = TRUE + else if(COMPONENT_TRIGGERED_BY(stop, port)) + stop_process() + close_camera() //Instantly turn off the camera + current_camera_state = FALSE + +/** + * Initializes the camera + */ +/obj/item/circuit_component/remotecam/proc/init_camera() + shell_camera.desc = "This camera belongs in a circuit. If you see this, tell a coder!" + shell_camera.AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) + shell_camera.use_power = NO_POWER_USE + shell_camera.start_active = TRUE + shell_camera.internal_light = FALSE + current_camera_name = "" + if(camera_range_settable) + current_camera_range = camera_range.value + current_cameranet_state = TRUE + current_camera_emp = FALSE + current_camera_network = "" + close_camera() + update_camera_range() + update_camera_name_network() + if(current_camera_state) + start_process() + update_camera_location() + else + cameranet_remove() //Remove camera from global cameranet until user activates the camera first + if(!camera_signal_move_override) + RegisterSignal(shell_parent, COMSIG_MOVABLE_MOVED, PROC_REF(update_camera_location)) + RegisterSignal(shell_parent, COMSIG_ATOM_EMP_ACT, PROC_REF(set_camera_emp)) + +/** + * Remove the camera + */ +/obj/item/circuit_component/remotecam/proc/remove_camera() + if(!shell_camera) + return + if(!camera_signal_move_override) + UnregisterSignal(shell_parent, COMSIG_MOVABLE_MOVED) + UnregisterSignal(shell_parent, COMSIG_ATOM_EMP_ACT) + if(current_camera_emp) + deltimer(current_camera_emp_timer_id) + current_camera_emp = FALSE + cameranet_add() //Readd camera to cameranet before deleting camera + QDEL_NULL(shell_camera) + +/** + * Close the camera state (only if it's already active) + */ +/obj/item/circuit_component/remotecam/proc/close_camera() + if(shell_camera?.camera_enabled) + shell_camera.toggle_cam(null, 0) + +/** + * Set the camera range + */ +/obj/item/circuit_component/remotecam/proc/update_camera_range() + shell_camera.setViewRange(current_camera_range > 0 ? REMOTECAM_RANGE_FAR : REMOTECAM_RANGE_NEAR) + +/** + * Updates the camera name and network + */ +/obj/item/circuit_component/remotecam/proc/update_camera_name_network() + if(!parent || !parent.display_name || parent.display_name == "") + shell_camera.c_tag = "[camera_prefix]: unspecified #[c_tag_random]" + current_camera_name = "" + else if(current_camera_name != parent.display_name) + current_camera_name = parent.display_name + var/new_cam_name = reject_bad_name(current_camera_name, allow_numbers = TRUE, ascii_only = FALSE, strict = TRUE, cap_after_symbols = FALSE) + //Set camera name using parent circuit name + if(new_cam_name) + shell_camera.c_tag = "[camera_prefix]: [new_cam_name] #[c_tag_random]" + else + shell_camera.c_tag = "[camera_prefix]: unspecified #[c_tag_random]" + + if(!network.value || network.value == "") + shell_camera.network = list("ss13") + current_camera_network = "" + else if(current_camera_network != network.value) + current_camera_network = network.value + var/new_net_name = LOWER_TEXT(sanitize(current_camera_network)) + //Set camera network string + if(new_net_name) + shell_camera.network = list("[new_net_name]") + else + shell_camera.network = list("ss13") + +/** + * Update the chunk for the camera (if enabled) + */ +/obj/item/circuit_component/remotecam/proc/update_camera_location(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + SIGNAL_HANDLER + if(current_camera_state && current_cameranet_state) + GLOB.cameranet.updatePortableCamera(shell_camera, 0.5 SECONDS) + +/** + * Add camera from global cameranet + */ +/obj/item/circuit_component/remotecam/proc/cameranet_add() + if(current_cameranet_state) + return + GLOB.cameranet.cameras += shell_camera + GLOB.cameranet.addCamera(shell_camera) + current_cameranet_state = TRUE + +/** + * Remove camera from global cameranet + */ +/obj/item/circuit_component/remotecam/proc/cameranet_remove() + if(!current_cameranet_state) + return + GLOB.cameranet.removeCamera(shell_camera) + GLOB.cameranet.cameras -= shell_camera + current_cameranet_state = FALSE + +/** + * Set the camera as emp'd + */ +/obj/item/circuit_component/remotecam/proc/set_camera_emp(datum/source, severity, protection) + SIGNAL_HANDLER + if(current_camera_emp) + return + if(!prob(150 / severity)) + return + current_camera_emp = TRUE + close_camera() + current_camera_emp_timer_id = addtimer(CALLBACK(src, PROC_REF(remove_camera_emp)), REMOTECAM_EMP_RESET, TIMER_STOPPABLE) + for(var/mob/M as anything in GLOB.player_list) + if (M.client?.eye == shell_camera) + M.reset_perspective(null) + to_chat(M, span_warning("The screen bursts into static!")) + +/** + * Restore emp'd camera + */ +/obj/item/circuit_component/remotecam/proc/remove_camera_emp() + current_camera_emp = FALSE + +/** + * Adds the component to the SSclock_component process list + * + * Starts draining cell per second while camera is active + */ +/obj/item/circuit_component/remotecam/proc/start_process() + START_PROCESSING(SSclock_component, src) + +/** + * Removes the component to the SSclock_component process list + * + * Stops draining cell per second + */ +/obj/item/circuit_component/remotecam/proc/stop_process() + STOP_PROCESSING(SSclock_component, src) + +/** + * Handle power usage and camera state updating + * + * This is the generic abstract proc - subtypes with specialized logic should use their own copy of process() + */ +/obj/item/circuit_component/remotecam/process(seconds_per_tick) + if(!shell_parent || !shell_camera) + return PROCESS_KILL + //Camera is currently emp'd + if (current_camera_emp) + close_camera() + return + var/obj/item/stock_parts/cell/cell = parent.get_cell() + //If cell doesn't exist, or we ran out of power + if(!cell?.use(current_camera_range > 0 ? REMOTECAM_ENERGY_USAGE_FAR : REMOTECAM_ENERGY_USAGE_NEAR)) + close_camera() + return + if(camera_range_settable) + //If the camera range has changed, update camera range + if(!camera_range.value != !current_camera_range) + current_camera_range = camera_range.value + update_camera_range() + //Set the camera state (if state has been changed) + if(current_camera_state ^ shell_camera.camera_enabled) + shell_camera.toggle_cam(null, 0) + +/obj/item/circuit_component/remotecam/bci + display_name = "BCI Camera" + desc = "Digitizes user's sight for surveillance-on-the-go. User must have fully functional eyes for digitizer to work. Camera range input is either 0 (near) or 1 (far). Network field is used for camera network." + category = "BCI" + camera_prefix = "BCI" + required_shells = list(/obj/item/organ/internal/cyberimp/bci) + + /// BCIs are organs, and thus the signal must be assigned ONLY when the shell has been installed in a mob - otherwise the camera will never update position + camera_signal_move_override = TRUE + + /// Store the BCI owner as a variable, so we can remove the move signal if the user was gibbed/destroyed while the BCI is still installed + var/mob/living/carbon/bciuser = null + +/obj/item/circuit_component/remotecam/drone + display_name = "Remote Camera" + desc = "Capture the surrounding environment for surveillance-on-the-go. Camera range input is either 0 (near) or 1 (far). Network field is used for camera network." + camera_prefix = "Drone" + +/obj/item/circuit_component/remotecam/airlock + display_name = "Peephole Camera" + desc = "A peephole camera that captures both sides of the airlock. Network field is used for camera network." + camera_prefix = "Airlock" + + /// Hardcode camera to near range + camera_range_settable = FALSE + current_camera_range = 0 + +/obj/item/circuit_component/remotecam/polaroid + display_name = "Camera Stream Add-On" + desc = "Relays a polaroid camera's feed as a digital stream for surveillance-on-the-go. The camera stream will not work if stored inside of a container like a backpack/box. Network field is used for camera network." + camera_prefix = "Polaroid" + + /// Hardcode camera to near range + camera_range_settable = FALSE + current_camera_range = 0 + +/obj/item/circuit_component/remotecam/bci/register_shell(atom/movable/shell) + . = ..() + if(!istype(shell_parent, /obj/item/organ/internal/cyberimp/bci)) + return + shell_camera = new /obj/machinery/camera (shell_parent) + init_camera() + RegisterSignal(shell_parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_organ_implanted)) + RegisterSignal(shell_parent, COMSIG_ORGAN_REMOVED, PROC_REF(on_organ_removed)) + var/obj/item/organ/internal/cyberimp/bci/bci = shell_parent + if(bci.owner) //If somehow the camera was added while shell is already installed inside a mob, assign signals + if(bciuser) //This should never happen... But if it does, unassign move signal from old mob + UnregisterSignal(bciuser, COMSIG_MOVABLE_MOVED, PROC_REF(update_camera_location)) + bciuser = bci.owner + RegisterSignal(bciuser, COMSIG_MOVABLE_MOVED, PROC_REF(update_camera_location)) + +/obj/item/circuit_component/remotecam/bci/unregister_shell(atom/movable/shell) + if(shell_camera) + if(bciuser) + UnregisterSignal(bciuser, COMSIG_MOVABLE_MOVED, PROC_REF(update_camera_location)) + bciuser = null + UnregisterSignal(shell_parent, list(COMSIG_ORGAN_IMPLANTED, COMSIG_ORGAN_REMOVED)) + return ..() + +/obj/item/circuit_component/remotecam/bci/Destroy() + if(shell_camera) + if(bciuser) + UnregisterSignal(bciuser, COMSIG_MOVABLE_MOVED, PROC_REF(update_camera_location)) + bciuser = null + UnregisterSignal(shell_parent, list(COMSIG_ORGAN_IMPLANTED, COMSIG_ORGAN_REMOVED)) + return ..() + +/obj/item/circuit_component/remotecam/bci/proc/on_organ_implanted(datum/source, mob/living/carbon/owner) + SIGNAL_HANDLER + if(bciuser) + return + bciuser = owner + RegisterSignal(bciuser, COMSIG_MOVABLE_MOVED, PROC_REF(update_camera_location)) + +/obj/item/circuit_component/remotecam/bci/proc/on_organ_removed(datum/source, mob/living/carbon/owner) + SIGNAL_HANDLER + if(!bciuser) + return + UnregisterSignal(bciuser, COMSIG_MOVABLE_MOVED, PROC_REF(update_camera_location)) + bciuser = null + +/obj/item/circuit_component/remotecam/drone/register_shell(atom/movable/shell) + . = ..() + if(!istype(shell_parent, /mob/living/circuit_drone)) + return + current_camera_state = FALSE //Always reset camera state for built-in shell components + shell_camera = new /obj/machinery/camera (shell_parent) + init_camera() + +/obj/item/circuit_component/remotecam/airlock/register_shell(atom/movable/shell) + . = ..() + if(!istype(shell_parent, /obj/machinery/door/airlock)) + return + current_camera_state = FALSE //Always reset camera state for built-in shell components + shell_camera = new /obj/machinery/camera (shell_parent) + init_camera() + +/obj/item/circuit_component/remotecam/polaroid/register_shell(atom/movable/shell) + . = ..() + if(!istype(shell_parent, /obj/item/camera)) + return + current_camera_state = FALSE //Always reset camera state for built-in shell components + shell_camera = new /obj/machinery/camera (shell_parent) + init_camera() + +/obj/item/circuit_component/remotecam/bci/process(seconds_per_tick) + if(!shell_parent || !shell_camera) + return PROCESS_KILL + //Camera is currently emp'd + if (current_camera_emp) + close_camera() + return + var/obj/item/organ/internal/cyberimp/bci/bci = shell_parent + //If shell is not currently inside a head, or user is currently blind, or user is dead + if(!bci.owner || bci.owner.is_blind() || bci.owner.stat >= UNCONSCIOUS) + close_camera() + return + var/obj/item/stock_parts/cell/cell = parent.get_cell() + //If cell doesn't exist, or we ran out of power + if(!cell?.use(current_camera_range > 0 ? REMOTECAM_ENERGY_USAGE_FAR : REMOTECAM_ENERGY_USAGE_NEAR)) + close_camera() + return + //If owner is nearsighted, set camera range to short (if it wasn't already) + if(bci.owner.is_nearsighted_currently()) + if(current_camera_range) + current_camera_range = 0 + update_camera_range() + //Else if the camera range has changed, update camera range + else if(!camera_range.value != !current_camera_range) + current_camera_range = camera_range.value + update_camera_range() + //Set the camera state (if state has been changed) + if(current_camera_state ^ shell_camera.camera_enabled) + shell_camera.toggle_cam(null, 0) + +/obj/item/circuit_component/remotecam/polaroid/process(seconds_per_tick) + if(!shell_parent || !shell_camera) + return PROCESS_KILL + //Camera is currently emp'd + if (current_camera_emp) + close_camera() + return + //If camera is stored inside of bag or something, turn it off + if(shell_parent.loc.atom_storage) + close_camera() + return + var/obj/item/stock_parts/cell/cell = parent.get_cell() + //If cell doesn't exist, or we ran out of power + if(!cell?.use(REMOTECAM_ENERGY_USAGE_NEAR)) + close_camera() + return + //Set the camera state (if state has been changed) + if(current_camera_state ^ shell_camera.camera_enabled) + shell_camera.toggle_cam(null, 0) + +#undef REMOTECAM_RANGE_FAR +#undef REMOTECAM_RANGE_NEAR +#undef REMOTECAM_ENERGY_USAGE_NEAR +#undef REMOTECAM_ENERGY_USAGE_FAR +#undef REMOTECAM_EMP_RESET diff --git a/code/modules/wiremod/shell/airlock.dm b/code/modules/wiremod/shell/airlock.dm index 6c5cd11df7d68..165949529c429 100644 --- a/code/modules/wiremod/shell/airlock.dm +++ b/code/modules/wiremod/shell/airlock.dm @@ -16,7 +16,7 @@ . = ..() AddComponent( \ /datum/component/shell, \ - unremovable_circuit_components = list(new /obj/item/circuit_component/airlock, new /obj/item/circuit_component/airlock_access_event), \ + unremovable_circuit_components = list(new /obj/item/circuit_component/airlock, new /obj/item/circuit_component/airlock_access_event, new /obj/item/circuit_component/remotecam/airlock), \ capacity = SHELL_CAPACITY_LARGE, \ shell_flags = SHELL_FLAG_ALLOW_FAILURE_ACTION|SHELL_FLAG_REQUIRE_ANCHOR \ ) diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm index aaeafb6b551fc..4627a3cf32624 100644 --- a/code/modules/wiremod/shell/drone.dm +++ b/code/modules/wiremod/shell/drone.dm @@ -16,7 +16,8 @@ /mob/living/circuit_drone/Initialize(mapload) . = ..() AddComponent(/datum/component/shell, list( - new /obj/item/circuit_component/bot_circuit() + new /obj/item/circuit_component/bot_circuit(), + new /obj/item/circuit_component/remotecam/drone() ), SHELL_CAPACITY_LARGE) /mob/living/circuit_drone/examine(mob/user) diff --git a/html/changelogs/AutoChangeLog-pr-83404.yml b/html/changelogs/AutoChangeLog-pr-83404.yml new file mode 100644 index 0000000000000..91fab2e77bd2c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83404.yml @@ -0,0 +1,4 @@ +author: "DATA-xPUNGED" +delete-after: True +changes: + - rscadd: "NT reports indicate that the Syndicate have increased listening activities on Icemoon, crew is advised to watch out for possible communication interference." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83462.yml b/html/changelogs/AutoChangeLog-pr-83462.yml new file mode 100644 index 0000000000000..f6f0fffb68450 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83462.yml @@ -0,0 +1,4 @@ +author: "TheBoondock" +delete-after: True +changes: + - sound: "added operating sounds for wrench, wirecutter and crowbar" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83578.yml b/html/changelogs/AutoChangeLog-pr-83578.yml new file mode 100644 index 0000000000000..8af4ed75b545a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83578.yml @@ -0,0 +1,5 @@ +author: "tmyqlfpir" +delete-after: True +changes: + - rscadd: "Added new circuit camera components" + - qol: "Circuit drones can now recharge at recharge stations" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83591.yml b/html/changelogs/AutoChangeLog-pr-83591.yml new file mode 100644 index 0000000000000..5e509afdadbae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83591.yml @@ -0,0 +1,4 @@ +author: "Rhials" +delete-after: True +changes: + - rscadd: "Adds some more station-trait dependent pulsar star reports. Keep an eye on that roundstart command report!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83609.yml b/html/changelogs/AutoChangeLog-pr-83609.yml new file mode 100644 index 0000000000000..d563f3d137196 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83609.yml @@ -0,0 +1,4 @@ +author: "Wayland-Smithy" +delete-after: True +changes: + - bugfix: "Fixed Silicons not being able to (un)lock Air Alarms." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83621.yml b/html/changelogs/AutoChangeLog-pr-83621.yml new file mode 100644 index 0000000000000..7e333a147b8d3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83621.yml @@ -0,0 +1,4 @@ +author: "Goat" +delete-after: True +changes: + - bugfix: "mobs no longer move during cutscenes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83630.yml b/html/changelogs/AutoChangeLog-pr-83630.yml new file mode 100644 index 0000000000000..b3008451a4046 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83630.yml @@ -0,0 +1,4 @@ +author: "Watermelon914" +delete-after: True +changes: + - spellcheck: "Intern announcer no longer has a weird space before the introduction message." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83636.yml b/html/changelogs/AutoChangeLog-pr-83636.yml new file mode 100644 index 0000000000000..546c515074ae7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83636.yml @@ -0,0 +1,4 @@ +author: "Jackraxxus" +delete-after: True +changes: + - admin: "The auto-mute system yells at you harder when you send a bunch of identical messages." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83657.yml b/html/changelogs/AutoChangeLog-pr-83657.yml new file mode 100644 index 0000000000000..cbc585c801079 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83657.yml @@ -0,0 +1,4 @@ +author: "Time-Green" +delete-after: True +changes: + - bugfix: "admins can force rulesets on background checks station trait (fucking lame)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83661.yml b/html/changelogs/AutoChangeLog-pr-83661.yml new file mode 100644 index 0000000000000..3689d68f7ca9a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83661.yml @@ -0,0 +1,4 @@ +author: "Ben10Omintrix" +delete-after: True +changes: + - bugfix: "lobstrosities will no longer be able to fish out multiple necropolis chests" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83683.yml b/html/changelogs/AutoChangeLog-pr-83683.yml new file mode 100644 index 0000000000000..70044676f939d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83683.yml @@ -0,0 +1,4 @@ +author: "zxaber" +delete-after: True +changes: + - qol: "Plexagon Access Management now tells you that you need an ID Trim before applying a Template, rather than silently failing." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83724.yml b/html/changelogs/AutoChangeLog-pr-83724.yml new file mode 100644 index 0000000000000..96842a58a77fd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83724.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - spellcheck: "all instances of reactive armor are now spelt the same" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83733.yml b/html/changelogs/AutoChangeLog-pr-83733.yml new file mode 100644 index 0000000000000..33a893563f8da --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83733.yml @@ -0,0 +1,4 @@ +author: "thegrb93" +delete-after: True +changes: + - bugfix: "Fixes admin borg panel upgrade functions" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-83740.yml b/html/changelogs/AutoChangeLog-pr-83740.yml new file mode 100644 index 0000000000000..8e3c56845250a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-83740.yml @@ -0,0 +1,5 @@ +author: "00-Steven" +delete-after: True +changes: + - bugfix: "Latejoiners with heterochromatic eyes no longer have the wrong fingerprint in the security records." + - bugfix: "Latejoiners actually have their quirks visible in the medical records." \ No newline at end of file diff --git a/sound/items/crowbar_prying.ogg b/sound/items/crowbar_prying.ogg new file mode 100644 index 0000000000000..5876802616def Binary files /dev/null and b/sound/items/crowbar_prying.ogg differ diff --git a/sound/items/ratchet_fast.ogg b/sound/items/ratchet_fast.ogg new file mode 100644 index 0000000000000..d7a55e259202e Binary files /dev/null and b/sound/items/ratchet_fast.ogg differ diff --git a/sound/items/ratchet_slow.ogg b/sound/items/ratchet_slow.ogg new file mode 100644 index 0000000000000..d3a362b06c105 Binary files /dev/null and b/sound/items/ratchet_slow.ogg differ diff --git a/sound/items/screwdriver_operating.ogg b/sound/items/screwdriver_operating.ogg new file mode 100644 index 0000000000000..9e0659e382674 Binary files /dev/null and b/sound/items/screwdriver_operating.ogg differ diff --git a/sound/items/wirecutter_cut.ogg b/sound/items/wirecutter_cut.ogg new file mode 100644 index 0000000000000..143ac2fd9cdc8 Binary files /dev/null and b/sound/items/wirecutter_cut.ogg differ diff --git a/tgstation.dme b/tgstation.dme index ab21c37773105..f14d18829832e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4455,6 +4455,7 @@ #include "code\modules\mapfluff\centcom\nuke_ops.dm" #include "code\modules\mapfluff\ruins\generic.dm" #include "code\modules\mapfluff\ruins\lavaland_ruin_code.dm" +#include "code\modules\mapfluff\ruins\icemoonruin_code\commsagent.dm" #include "code\modules\mapfluff\ruins\icemoonruin_code\hotsprings.dm" #include "code\modules\mapfluff\ruins\icemoonruin_code\library.dm" #include "code\modules\mapfluff\ruins\icemoonruin_code\mailroom.dm" @@ -6120,6 +6121,7 @@ #include "code\modules\wiremod\components\atom\matscanner.dm" #include "code\modules\wiremod\components\atom\pinpointer.dm" #include "code\modules\wiremod\components\atom\reagentscanner.dm" +#include "code\modules\wiremod\components\atom\remotecam.dm" #include "code\modules\wiremod\components\atom\self.dm" #include "code\modules\wiremod\components\atom\species.dm" #include "code\modules\wiremod\components\bci\install_detector.dm" diff --git a/tgui/packages/tgui/interfaces/NtosCard.tsx b/tgui/packages/tgui/interfaces/NtosCard.tsx index 5997aa0e91c12..ffba4a647540c 100644 --- a/tgui/packages/tgui/interfaces/NtosCard.tsx +++ b/tgui/packages/tgui/interfaces/NtosCard.tsx @@ -69,6 +69,7 @@ export const NtosCardContent = (props) => { trimAccess, wildcardFlags, wildcardSlots, + hasTrim, } = data; return ( @@ -93,7 +94,11 @@ export const NtosCardContent = (props) => { /> } > - + {hasTrim ? ( + + ) : ( + 'Templates require a trim already applied to the card. Please use an ID Painter to apply a trim.' + )} )} diff --git a/tools/icon_cutter/README.md b/tools/icon_cutter/README.md index ce79a941fb619..91edd1a40657e 100644 --- a/tools/icon_cutter/README.md +++ b/tools/icon_cutter/README.md @@ -2,7 +2,7 @@ ## What is this? -This folder holds a set of cached versions of hypnagogic, our icon cutter. +This folder will hold a set of cached versions of hypnagogic, our icon cutter. We autodownload the tagged version from github on build. ## How is it used?