diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_1.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_1.dmm deleted file mode 100644 index b3a1d6baffe3b..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_1.dmm +++ /dev/null @@ -1,46 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/clockwork, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/clockwork/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -b -a -c -"} -(2,1,1) = {" -c -c -b -c -c -"} -(3,1,1) = {" -c -c -b -c -c -"} -(4,1,1) = {" -c -c -b -c -c -"} -(5,1,1) = {" -c -a -b -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_2.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_2.dmm deleted file mode 100644 index 60b50b4d18992..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_2.dmm +++ /dev/null @@ -1,46 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/cult, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/engine/cult/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -b -a -c -"} -(2,1,1) = {" -c -c -b -c -c -"} -(3,1,1) = {" -c -c -b -c -c -"} -(4,1,1) = {" -c -c -b -c -c -"} -(5,1,1) = {" -c -a -b -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_3.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_3.dmm deleted file mode 100644 index 2d3360cc58007..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_3.dmm +++ /dev/null @@ -1,73 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/cult, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/obj/structure/stone_tile/surrounding, -/obj/structure/stone_tile/center, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"g" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"h" = ( -/obj/structure/stone_tile/slab, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"m" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"o" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/burnt, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -h -a -c -"} -(2,1,1) = {" -c -c -m -c -c -"} -(3,1,1) = {" -c -c -b -c -c -"} -(4,1,1) = {" -c -c -o -c -c -"} -(5,1,1) = {" -c -a -g -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_4.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_4.dmm deleted file mode 100644 index 272dfcd1246bd..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_4.dmm +++ /dev/null @@ -1,49 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/indestructible/hierophant, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/indestructible/hierophant, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"o" = ( -/turf/simulated/floor/indestructible/hierophant/two, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -b -a -c -"} -(2,1,1) = {" -c -c -b -c -c -"} -(3,1,1) = {" -c -c -o -c -c -"} -(4,1,1) = {" -c -c -b -c -c -"} -(5,1,1) = {" -c -a -b -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_5.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_5.dmm deleted file mode 100644 index 954adedd9c4bb..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_5.dmm +++ /dev/null @@ -1,50 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/mineral/wood/nonmetal, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/wood/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"v" = ( -/obj/effect/landmark/damageturf, -/turf/simulated/floor/wood/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -v -a -c -"} -(2,1,1) = {" -c -c -b -c -c -"} -(3,1,1) = {" -c -c -b -c -c -"} -(4,1,1) = {" -c -c -v -c -c -"} -(5,1,1) = {" -c -a -b -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_6.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_6.dmm deleted file mode 100644 index 2cfe9bd744641..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_horizontal_6.dmm +++ /dev/null @@ -1,49 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/structure/lattice/catwalk/mining, -/obj/structure/marker_beacon/dock_marker/collision, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/obj/structure/lattice/catwalk/mining, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -a -b -a -c -"} -(2,1,1) = {" -c -c -b -c -c -"} -(3,1,1) = {" -c -c -b -c -c -"} -(4,1,1) = {" -c -c -b -c -c -"} -(5,1,1) = {" -c -a -b -a -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_1.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_1.dmm deleted file mode 100644 index dca66633eba89..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_1.dmm +++ /dev/null @@ -1,46 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/clockwork, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/clockwork/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -a -c -c -c -a -"} -(3,1,1) = {" -b -b -b -b -b -"} -(4,1,1) = {" -a -c -c -c -a -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_2.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_2.dmm deleted file mode 100644 index 02fd1e0a69f90..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_2.dmm +++ /dev/null @@ -1,46 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/cult, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/engine/cult/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -a -c -c -c -a -"} -(3,1,1) = {" -b -b -b -b -b -"} -(4,1,1) = {" -a -c -c -c -a -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_3.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_3.dmm deleted file mode 100644 index 8fbfe6ba32e62..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_3.dmm +++ /dev/null @@ -1,83 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/wall/cult, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/obj/structure/stone_tile/slab, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"w" = ( -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding/cracked, -/obj/structure/stone_tile/slab/cracked{ - dir = 10 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"I" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"M" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 5 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"R" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -a -c -c -c -a -"} -(3,1,1) = {" -b -I -w -R -M -"} -(4,1,1) = {" -a -c -c -c -a -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_4.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_4.dmm deleted file mode 100644 index 7c187f4aeecc1..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_4.dmm +++ /dev/null @@ -1,49 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/floor/indestructible/hierophant/two, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/turf/simulated/floor/indestructible/hierophant, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"y" = ( -/turf/simulated/wall/indestructible/hierophant, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -y -c -c -c -y -"} -(3,1,1) = {" -a -a -b -a -a -"} -(4,1,1) = {" -y -c -c -c -y -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_5.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_5.dmm deleted file mode 100644 index 588567999bff4..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_5.dmm +++ /dev/null @@ -1,50 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/simulated/floor/wood/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/obj/effect/landmark/damageturf, -/turf/simulated/floor/wood/lavaland_air, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"y" = ( -/turf/simulated/wall/mineral/wood, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -y -c -c -c -y -"} -(3,1,1) = {" -b -a -b -a -b -"} -(4,1,1) = {" -y -c -c -c -y -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_6.dmm b/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_6.dmm deleted file mode 100644 index ae47effe5fc8c..0000000000000 --- a/_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/lavaland_bridge_vertical_6.dmm +++ /dev/null @@ -1,49 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/structure/lattice/catwalk/mining, -/obj/structure/marker_beacon/dock_marker, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"b" = ( -/obj/structure/lattice/catwalk/mining, -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) -"c" = ( -/turf/template_noop, -/area/lavaland/surface/outdoors/unexplored/danger) - -(1,1,1) = {" -c -c -c -c -c -"} -(2,1,1) = {" -b -c -c -c -b -"} -(3,1,1) = {" -b -a -b -a -b -"} -(4,1,1) = {" -b -c -c -c -b -"} -(5,1,1) = {" -c -c -c -c -c -"} diff --git a/_maps/map_files/RandomRuins/SpaceRuins/freighter.dmm b/_maps/map_files/RandomRuins/SpaceRuins/freighter.dmm new file mode 100644 index 0000000000000..976a7bfc5db38 --- /dev/null +++ b/_maps/map_files/RandomRuins/SpaceRuins/freighter.dmm @@ -0,0 +1,1307 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"cn" = ( +/obj/structure/closet/crate, +/obj/item/mop/advanced, +/obj/item/soap/syndie, +/obj/item/reagent_containers/spray/cleaner/advanced, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"dC" = ( +/turf/simulated/wall/mineral/plastitanium/nodiagonal, +/area/ruin/space/powered) +"dN" = ( +/obj/effect/landmark/damageturf, +/obj/machinery/disco, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"ei" = ( +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "caution" + }, +/area/ruin/space/powered) +"eI" = ( +/obj/effect/turf_decal/delivery/white/partial, +/obj/machinery/light/small, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"fp" = ( +/obj/effect/turf_decal/delivery/partial, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"fL" = ( +/obj/structure/bed, +/obj/item/bedsheet/black, +/turf/simulated/floor/wood, +/area/ruin/space/powered) +"fY" = ( +/obj/effect/spawner/window/plastitanium, +/turf/simulated/floor/plating, +/area/ruin/space/powered) +"gd" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "caution" + }, +/area/ruin/space/powered) +"hM" = ( +/obj/effect/landmark/damageturf, +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"iq" = ( +/obj/structure/fans/tiny, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"iP" = ( +/obj/machinery/door/airlock/medical, +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"jM" = ( +/obj/machinery/door/poddoor/multi_tile/impassable/three_tile_hor{ + id_tag = "freighterblastdoor1" + }, +/obj/structure/fans/tiny, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"jQ" = ( +/turf/simulated/floor/wood, +/area/ruin/space/powered) +"jY" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"kK" = ( +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "caution" + }, +/area/ruin/space/powered) +"ls" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/space/powered) +"lw" = ( +/obj/structure/table, +/obj/item/clipboard, +/obj/item/pen/fancy, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"lx" = ( +/turf/simulated/floor/pod/dark, +/area/ruin/space/powered) +"lT" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/spawner/random_spawners/blood_maybe, +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"mk" = ( +/obj/effect/turf_decal/delivery/white/partial{ + dir = 4 + }, +/obj/effect/turf_decal/delivery/white/partial{ + dir = 8 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"mA" = ( +/obj/structure/table/reinforced, +/obj/item/tank/internals/oxygen, +/obj/structure/window/reinforced/survival_pod{ + dir = 4 + }, +/turf/simulated/floor/pod/dark, +/area/ruin/space/powered) +"mG" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"ni" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/fire{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/reagent_containers/glass/bottle/oculine{ + pixel_x = -9; + pixel_y = 9 + }, +/obj/item/reagent_containers/glass/bottle/oculine{ + pixel_x = -9 + }, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "darkblue" + }, +/area/ruin/space/powered) +"nq" = ( +/obj/structure/closet/crate, +/obj/item/banhammer, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"nD" = ( +/obj/structure/bookcase/random, +/turf/simulated/floor/plasteel{ + dir = 6; + icon_state = "caution" + }, +/area/ruin/space/powered) +"ov" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/space/powered) +"oy" = ( +/turf/simulated/floor/plasteel{ + icon_state = "yellowsiding" + }, +/area/ruin/space/powered) +"rK" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/space/powered) +"rV" = ( +/obj/structure/closet/crate/secure/loot, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"st" = ( +/obj/structure/railing, +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"sy" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/cigarettes/cigpack_random, +/obj/item/lighter/zippo/engraved{ + pixel_x = -5; + pixel_y = 7 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/space/powered) +"sB" = ( +/obj/machinery/kitchen_machine/oven, +/obj/effect/landmark/damageturf, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/space/powered) +"sZ" = ( +/obj/structure/table, +/obj/item/stamp/granted{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/item/toy/figure/crew/cargotech{ + pixel_x = 8; + pixel_y = 9 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"tV" = ( +/obj/effect/turf_decal/delivery/white/partial, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"uk" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/ruin/space/powered) +"vc" = ( +/obj/effect/turf_decal/delivery/partial, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"vN" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 8 + }, +/turf/space, +/area/ruin/space/powered) +"wa" = ( +/obj/structure/safe, +/obj/item/id_decal/gold, +/obj/item/stack/spacecash/c200, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "caution" + }, +/area/ruin/space/powered) +"wu" = ( +/obj/effect/turf_decal/delivery/white/partial{ + dir = 4 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"wL" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/item/flag/species/nian, +/turf/simulated/floor/plasteel{ + dir = 6; + icon_state = "caution" + }, +/area/ruin/space/powered) +"xB" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/pod/dark, +/area/ruin/space/powered) +"xF" = ( +/turf/simulated/floor/plasteel/stairs{ + dir = 4 + }, +/area/ruin/space/powered) +"xJ" = ( +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/space/powered) +"zd" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"zu" = ( +/obj/effect/turf_decal/delivery/white/partial{ + dir = 1 + }, +/obj/effect/turf_decal/delivery/white/partial, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"zL" = ( +/obj/structure/dresser, +/turf/simulated/floor/wood, +/area/ruin/space/powered) +"zV" = ( +/turf/simulated/floor/plasteel{ + dir = 6; + icon_state = "darkblue" + }, +/area/ruin/space/powered) +"Aa" = ( +/obj/structure/rack, +/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill, +/obj/item/mecha_parts/mecha_equipment/mining_scanner, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"As" = ( +/obj/structure/table/wood, +/obj/item/book/manual/random, +/obj/effect/spawner/random/book{ + pixel_x = -7 + }, +/obj/effect/landmark/damageturf, +/obj/machinery/light/small, +/turf/simulated/floor/wood, +/area/ruin/space/powered) +"AU" = ( +/obj/effect/turf_decal/delivery/white/partial, +/obj/effect/turf_decal/delivery/white/partial{ + dir = 1 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"Br" = ( +/obj/effect/landmark/damageturf, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/space/powered) +"BE" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/turf/simulated/floor/pod/dark, +/area/ruin/space/powered) +"BN" = ( +/obj/structure/mineral_door/wood, +/turf/simulated/floor/wood, +/area/ruin/space/powered) +"Cb" = ( +/obj/effect/turf_decal/delivery/partial{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "caution" + }, +/area/ruin/space/powered) +"Cj" = ( +/obj/effect/turf_decal/delivery/white/partial{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"Dn" = ( +/obj/effect/turf_decal/delivery/partial{ + dir = 1 + }, +/obj/structure/railing/cap, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/space/powered) +"EW" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"EZ" = ( +/obj/effect/landmark/damageturf, +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "caution" + }, +/area/ruin/space/powered) +"Fl" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/space/powered) +"Fm" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/folder, +/obj/item/pen/multi/fountain, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/space/powered) +"Fw" = ( +/obj/machinery/door_control{ + name = "exterior warehouse blastdoors"; + id = "freighterblastdoor1" + }, +/turf/simulated/wall/mineral/plastitanium, +/area/ruin/space/powered) +"Ga" = ( +/obj/machinery/light/small, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"GP" = ( +/obj/structure/table/wood, +/obj/machinery/computer/library{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "caution" + }, +/area/ruin/space/powered) +"HX" = ( +/obj/item/reagent_containers/drinks/bottle/vodka, +/obj/item/reagent_containers/drinks/drinkingglass/shotglass{ + pixel_x = 10 + }, +/obj/item/reagent_containers/drinks/drinkingglass/shotglass{ + pixel_x = -8; + pixel_y = 7 + }, +/obj/structure/table/glass/reinforced/plastitanium, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/space/powered) +"Ij" = ( +/obj/effect/landmark/damageturf, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"Ix" = ( +/obj/structure/bed, +/obj/item/bedsheet/black, +/obj/item/toy/plushie/nianplushie, +/turf/simulated/floor/wood, +/area/ruin/space/powered) +"Je" = ( +/obj/machinery/door/airlock/multi_tile/glass{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/space/powered) +"Jw" = ( +/obj/structure/rack, +/obj/item/stack/sheet/metal/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/plasmarglass/fifty, +/obj/item/stack/sheet/mineral/uranium/fifty, +/obj/item/stack/sheet/plastitaniumglass{ + amount = 20; + pixel_x = -2; + pixel_y = 2 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"JC" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced/survival_pod{ + dir = 4 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/space/powered) +"JW" = ( +/obj/structure/closet/cabinet, +/obj/item/clothing/under/new_soviet/sovietofficer, +/obj/item/salvage/ruin/soviet, +/obj/item/clothing/suit/sovietcoat, +/turf/simulated/floor/wood, +/area/ruin/space/powered) +"Kh" = ( +/turf/space, +/area/template_noop) +"Ki" = ( +/obj/structure/table, +/obj/machinery/kitchen_machine/microwave{ + pixel_y = 6 + }, +/turf/simulated/floor/plasteel{ + icon_state = "cafeteria" + }, +/area/ruin/space/powered) +"Kv" = ( +/obj/structure/shuttle/engine/heater{ + dir = 8 + }, +/obj/structure/window/reinforced/survival_pod{ + dir = 4 + }, +/obj/structure/window/reinforced/survival_pod{ + dir = 4 + }, +/turf/simulated/floor/plating/airless, +/area/ruin/space/powered) +"KC" = ( +/obj/structure/sign/vacuum, +/turf/simulated/wall/mineral/plastitanium, +/area/ruin/space/powered) +"La" = ( +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/space/powered) +"LW" = ( +/turf/simulated/wall/mineral/plastitanium, +/area/ruin/space/powered) +"LX" = ( +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"Md" = ( +/turf/simulated/floor/plasteel{ + icon_state = "yellowsiding"; + dir = 6 + }, +/area/ruin/space/powered) +"Mm" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/simulated/floor/plasteel/stairs, +/area/ruin/space/powered) +"Mu" = ( +/obj/machinery/light, +/mob/living/simple_animal/hostile/soviet_nian, +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"MX" = ( +/obj/effect/spawner/random_spawners/blood_maybe, +/obj/machinery/light/small{ + dir = 4; + pixel_y = 8 + }, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "darkblue" + }, +/area/ruin/space/powered) +"MY" = ( +/obj/effect/turf_decal/delivery/white/partial{ + dir = 1 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"Nl" = ( +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"NP" = ( +/obj/item/mecha_parts/mecha_equipment/weapon/energy/mining_grenade, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"Ob" = ( +/obj/effect/turf_decal/delivery/partial{ + dir = 1 + }, +/obj/structure/railing/cap{ + pixel_x = -21 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/space/powered) +"Oc" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"Ok" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"Pb" = ( +/obj/structure/rack, +/obj/item/clothing/head/kitty, +/obj/item/mecha_modkit/voice/honk{ + pixel_y = 10; + pixel_x = 3 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"Pf" = ( +/obj/machinery/computer/nonfunctional{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/space/powered) +"Pn" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/machinery/light/small, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"PE" = ( +/obj/structure/bookcase/random, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "caution" + }, +/area/ruin/space/powered) +"Qe" = ( +/obj/effect/turf_decal/delivery/white/partial{ + dir = 8 + }, +/obj/effect/turf_decal/delivery/white/partial{ + dir = 4 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"QM" = ( +/obj/structure/railing, +/obj/item/flag/ussp, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "caution" + }, +/area/ruin/space/powered) +"Sp" = ( +/obj/structure/largecrate, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"SL" = ( +/obj/structure/railing, +/mob/living/simple_animal/hostile/soviet_nian, +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"Tf" = ( +/obj/machinery/economy/vending/snack/free, +/turf/simulated/floor/plasteel, +/area/ruin/space/powered) +"TW" = ( +/obj/effect/turf_decal/delivery/white/partial{ + dir = 8 + }, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"UZ" = ( +/mob/living/simple_animal/hostile/soviet_nian, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"WF" = ( +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/turf/simulated/floor/pod/dark, +/area/ruin/space/powered) +"WR" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/spawner/random_spawners/blood_maybe, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/space/powered) +"XB" = ( +/obj/structure/table, +/obj/item/paper/fluff/ruins/nian_freighter/manifest, +/turf/simulated/floor/mineral/plastitanium, +/area/ruin/space/powered) +"Zc" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/simulated/floor/plasteel/stairs, +/area/ruin/space/powered) +"Zt" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "darkblue" + }, +/area/ruin/space/powered) + +(1,1,1) = {" +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +vN +vN +vN +Kh +Kh +Kh +Kh +Kh +Kh +Kh +"} +(2,1,1) = {" +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +JC +JC +JC +Kh +Kh +Kh +Kh +Kh +Kh +Kh +"} +(3,1,1) = {" +Kh +Kh +Kh +Kh +Kh +Kh +Kh +LW +LW +LW +LW +LW +Kh +Kh +Kh +Kh +Kh +Kh +"} +(4,1,1) = {" +Kh +Kh +Kh +Kh +Kh +Kh +Kh +LW +lx +xB +lx +WF +Kh +Kh +Kh +Kh +Kh +Kh +"} +(5,1,1) = {" +Kh +Kh +Kh +Kh +Kh +Kh +LW +LW +BE +lx +mA +KC +LW +Kh +Kh +Kh +Kh +Kh +"} +(6,1,1) = {" +Kh +Kh +Kh +Kh +Kh +LW +LW +LW +KC +WF +LW +LW +LW +LW +Kh +Kh +Kh +Kh +"} +(7,1,1) = {" +Kh +Kh +Kh +Kh +Kh +LW +Oc +Ij +TW +TW +TW +Nl +Ga +LW +Kh +Kh +Kh +Kh +"} +(8,1,1) = {" +Kh +Kh +Kh +Kh +Kh +jM +Nl +MY +Pb +Nl +Jw +tV +Ij +LW +Kh +Kh +Kh +Kh +"} +(9,1,1) = {" +Kh +Kh +Kh +Kh +Kh +iq +Nl +MY +Nl +UZ +rV +tV +Ij +LW +Kh +Kh +Kh +Kh +"} +(10,1,1) = {" +Kh +Kh +Kh +Kh +Kh +iq +Ij +TW +mk +wu +Qe +TW +Nl +fY +Kh +Kh +Kh +Kh +"} +(11,1,1) = {" +Kh +Kh +Kh +Kh +Kh +Fw +Cj +Aa +NP +zu +dN +cn +tV +fY +Kh +Kh +Kh +Kh +"} +(12,1,1) = {" +Kh +Kh +Kh +Kh +Kh +LW +MY +Nl +Sp +zu +Nl +Nl +tV +fY +Kh +Kh +Kh +Kh +"} +(13,1,1) = {" +Kh +Kh +Kh +Kh +Kh +LW +MY +nq +Nl +AU +mG +Nl +eI +LW +Kh +Kh +Kh +Kh +"} +(14,1,1) = {" +Kh +Kh +Kh +vN +vN +LW +Nl +wu +wu +Nl +wu +wu +Nl +LW +vN +vN +Kh +Kh +"} +(15,1,1) = {" +Kh +Kh +Kh +JC +JC +LW +sZ +zd +Ij +Nl +Nl +Nl +Nl +LW +Kv +JC +Kh +Kh +"} +(16,1,1) = {" +Kh +Kh +LW +LW +LW +LW +lw +XB +Nl +Nl +EW +Ok +Pn +LW +LW +LW +LW +Kh +"} +(17,1,1) = {" +Kh +Kh +LW +Zt +ni +LW +LW +LW +La +Je +LW +LW +LW +dC +uk +zL +LW +Kh +"} +(18,1,1) = {" +Kh +Kh +LW +MX +zV +iP +xJ +xJ +Br +La +oy +jY +LX +BN +jQ +Ix +fY +Kh +"} +(19,1,1) = {" +Kh +Kh +LW +LW +LW +dC +xJ +xJ +La +La +oy +jY +Mu +LW +LW +LW +LW +Kh +"} +(20,1,1) = {" +Kh +Kh +Kh +Kh +fY +Ki +xJ +ls +La +La +Md +jY +hM +BN +jQ +As +LW +Kh +"} +(21,1,1) = {" +Kh +Kh +Kh +Kh +fY +sB +xJ +HX +La +Ob +Zc +fp +LX +LW +JW +fL +fY +Kh +"} +(22,1,1) = {" +Kh +Kh +Kh +Kh +fY +rK +xJ +Fl +La +Dn +Mm +vc +Tf +LW +LW +LW +LW +Kh +"} +(23,1,1) = {" +Kh +Kh +Kh +Kh +LW +LW +LW +LW +La +Je +LW +LW +LW +LW +LW +Kh +Kh +Kh +"} +(24,1,1) = {" +Kh +Kh +Kh +Kh +LW +EZ +ei +gd +Cb +Cb +gd +ei +PE +LW +Kh +Kh +Kh +Kh +"} +(25,1,1) = {" +Kh +Kh +Kh +Kh +LW +kK +st +Br +xF +xF +La +lT +GP +LW +Kh +Kh +Kh +Kh +"} +(26,1,1) = {" +Kh +Kh +Kh +Kh +LW +wa +SL +La +ov +WR +La +jY +nD +LW +Kh +Kh +Kh +Kh +"} +(27,1,1) = {" +Kh +Kh +Kh +Kh +LW +LW +QM +sy +Pf +Pf +Fm +wL +LW +LW +Kh +Kh +Kh +Kh +"} +(28,1,1) = {" +Kh +Kh +Kh +Kh +Kh +LW +LW +fY +fY +fY +fY +LW +LW +Kh +Kh +Kh +Kh +Kh +"} +(29,1,1) = {" +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +"} +(30,1,1) = {" +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +Kh +"} diff --git a/code/__DEFINES/dcs/atom_signals.dm b/code/__DEFINES/dcs/atom_signals.dm index 574a00cb2f603..f5f9a204bf698 100644 --- a/code/__DEFINES/dcs/atom_signals.dm +++ b/code/__DEFINES/dcs/atom_signals.dm @@ -6,6 +6,8 @@ // /atom +// from SSatoms InitAtom - Only if the atom was not deleted or failed initialization +#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success" ///from base of atom/attackby(): (/obj/item, /mob/living, params) #define COMSIG_PARENT_ATTACKBY "atom_attackby" ///Return this in response if you don't want afterattack to be called @@ -69,6 +71,8 @@ #define COMSIG_ATOM_SET_LIGHT "atom_set_light" ///from base of atom/setDir(): (old_dir, new_dir) #define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" +///from [/datum/controller/subsystem/processing/dcs/proc/rotate_decals]: (list/datum/element/decal/rotating) +#define COMSIG_ATOM_DECALS_ROTATING "atom_decals_rotating" ///from base of atom/has_gravity(): (turf/location, list/forced_gravities) #define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" ///from proc/get_rad_contents(): () diff --git a/code/__DEFINES/dcs/basetype_signals.dm b/code/__DEFINES/dcs/basetype_signals.dm index 6a5230caa465b..6affef128aa41 100644 --- a/code/__DEFINES/dcs/basetype_signals.dm +++ b/code/__DEFINES/dcs/basetype_signals.dm @@ -27,3 +27,5 @@ ///from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) #define COMSIG_TURF_CHANGE "turf_change" +///from base of turf/proc/onShuttleMove(): (turf/new_turf) +#define COMSIG_TURF_ON_SHUTTLE_MOVE "turf_on_shuttle_move" diff --git a/code/__DEFINES/dcs/datum_signals.dm b/code/__DEFINES/dcs/datum_signals.dm index 6850155f34517..1851311a8abfa 100644 --- a/code/__DEFINES/dcs/datum_signals.dm +++ b/code/__DEFINES/dcs/datum_signals.dm @@ -53,10 +53,12 @@ #define COMSIG_SONG_END "song_end" -// /datum/component/decal +// /datum/element/decal -///called on an object to clean it of cleanables. Usualy with soap: (num/strength) +///called on an object to clean it of cleanables. #define COMSIG_COMPONENT_CLEAN_ACT "clean_act" + ///Returned by cleanable components when they are cleaned. + #define COMPONENT_CLEANED (1<<0) // /datum/component/two_handed diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 5ba007f94e25f..08c5087b4b09e 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -45,6 +45,9 @@ #define INFORM_ADMINS_ON_RELOCATE_2 (1<<5) #define BANG_PROTECT_2 (1<<6) #define BLOCKS_LIGHT_2 (1<<7) // Light sources placed in anything with that flag will not emit light through them. +/// Whether a decal element's parent has already been initialized and thus has already had its decals attached. +/// see https://github.com/tgstation/tgstation/pull/71658 for a detailed explanation of the flag. +#define DECAL_INIT_UPDATE_EXPERIENCED_2 (1<<8) // A mob with OMNITONGUE has no restriction in the ability to speak // languages that they know. So even if they wouldn't normally be able to @@ -145,6 +148,7 @@ #define BLESSED_TILE (1<<0) #define NO_LAVA_GEN (1<<1) //Blocks lava rivers being generated on the turf #define NO_RUINS (1<<2) +#define LAVA_BRIDGE (1<<3) //! This turf has already been reserved for a lavaland bridge placement. //ORGAN TYPE FLAGS #define AFFECT_ROBOTIC_ORGAN 1 diff --git a/code/__DEFINES/misc_defines.dm b/code/__DEFINES/misc_defines.dm index ebcf72a653d95..a5995f17c6fa8 100644 --- a/code/__DEFINES/misc_defines.dm +++ b/code/__DEFINES/misc_defines.dm @@ -466,14 +466,6 @@ #define PLACE_SPACE_RUIN "space" #define PLACE_LAVA_RUIN "lavaland" -//Cleaning tool strength -// 1 is also a valid cleaning strength but completely unused so left undefined -#define CLEAN_WEAK 2 -#define CLEAN_MEDIUM 3 // Acceptable tools -#define CLEAN_STRONG 4 // Industrial strength -#define CLEAN_IMPRESSIVE 5 // Cleaning strong enough your granny would be proud -#define CLEAN_GOD 6 // Cleans things spotless down to the atomic structure - //Ghost orbit types: #define GHOST_ORBIT_CIRCLE "circle" #define GHOST_ORBIT_TRIANGLE "triangle" diff --git a/code/_globalvars/lists/mob_lists.dm b/code/_globalvars/lists/mob_lists.dm index c1533ef0fad1f..9b38978bdbe4d 100644 --- a/code/_globalvars/lists/mob_lists.dm +++ b/code/_globalvars/lists/mob_lists.dm @@ -28,6 +28,7 @@ GLOBAL_LIST_INIT(simple_animals, list(list(), list(), list(), list())) //One f GLOBAL_LIST_EMPTY(bots_list) //List of all bots(beepsky, medibots,etc) GLOBAL_LIST_EMPTY(roundstart_observer_keys) //List of ckeys who ghosted before the game began. GLOBAL_LIST_EMPTY(antag_hud_users) // ckeys of users who have enabled ahud at some point during the game +GLOBAL_LIST_EMPTY(crew_list) // list of all crew on manifest, contains name paired with their assignment GLOBAL_LIST_EMPTY(surgeries_list) GLOBAL_LIST_EMPTY(hear_radio_list) //Mobs that hear the radio even if there's no client diff --git a/code/_globalvars/lists/reagents_lists.dm b/code/_globalvars/lists/reagents_lists.dm index 17c8e76bc0d24..a9a04f4a0f6aa 100644 --- a/code/_globalvars/lists/reagents_lists.dm +++ b/code/_globalvars/lists/reagents_lists.dm @@ -41,8 +41,8 @@ GLOBAL_LIST_INIT(blocked_chems, list("polonium", "initropidril", "concentrated_i "syndicate_nanites", "ripping_tendrils", "boiling_oil", "envenomed_filaments", "lexorin_jelly", "kinetic", "cryogenic_liquid", "liquid_dark_matter", "b_sorium", - "reagent", "dragonsbreath", "nanocalcium", - "xenomicrobes", "nanomachines", "gibbis", "prions", + "reagent", "drink", "medicine", "plantnutrient", "consumable", "dragonsbreath", + "nanocalcium", "xenomicrobes", "nanomachines", "gibbis", "prions", "spidereggs", "heartworms", "bacon_grease", "fungalspores", "jagged_crystals", "salmonella", "lavaland_extract", "stable_mutagen", "beer2", diff --git a/code/_globalvars/mapping_vars.dm b/code/_globalvars/mapping_vars.dm index cff1c4251b631..dc095a33d16d7 100644 --- a/code/_globalvars/mapping_vars.dm +++ b/code/_globalvars/mapping_vars.dm @@ -46,5 +46,3 @@ GLOBAL_LIST_EMPTY(space_ruins_templates) GLOBAL_LIST_EMPTY(lava_ruins_templates) GLOBAL_LIST_EMPTY(shelter_templates) GLOBAL_LIST_EMPTY(shuttle_templates) -GLOBAL_LIST_EMPTY(bridge_horizontal_templates) -GLOBAL_LIST_EMPTY(bridge_vertical_templates) diff --git a/code/controllers/subsystem/non_firing/SSatoms.dm b/code/controllers/subsystem/non_firing/SSatoms.dm index fb54196803756..d40c236192ba5 100644 --- a/code/controllers/subsystem/non_firing/SSatoms.dm +++ b/code/controllers/subsystem/non_firing/SSatoms.dm @@ -100,6 +100,8 @@ SUBSYSTEM_DEF(atoms) qdeleted = TRUE else if(!A.initialized) BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + else + SEND_SIGNAL(A, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) return qdeleted || QDELING(A) diff --git a/code/controllers/subsystem/non_firing/SSlate_mapping.dm b/code/controllers/subsystem/non_firing/SSlate_mapping.dm index b3e66541577ca..eec96be19f977 100644 --- a/code/controllers/subsystem/non_firing/SSlate_mapping.dm +++ b/code/controllers/subsystem/non_firing/SSlate_mapping.dm @@ -28,16 +28,3 @@ SUBSYSTEM_DEF(late_mapping) QDEL_LIST_CONTENTS(maze_generators) var/duration = stop_watch(watch) log_startup_progress("Generated [mgcount] mazes in [duration]s") - - if(length(bridge_spawners)) - var/watch = start_watch() - log_startup_progress("Spawning bridges...") - - for(var/i in bridge_spawners) - var/obj/effect/spawner/bridge/BS = i - BS.generate_bridge() - - var/list/bscount = length(bridge_spawners) // Keeping track of this here because we wipe it next line down - QDEL_LIST_CONTENTS(bridge_spawners) - var/duration = stop_watch(watch) - log_startup_progress("Spawned [bscount] bridges in [duration]s") diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm deleted file mode 100644 index b0cc7617e3c20..0000000000000 --- a/code/datums/components/decal.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/component/decal - dupe_mode = COMPONENT_DUPE_ALLOWED - can_transfer = TRUE - var/cleanable - var/description - var/mutable_appearance/pic - - var/first_dir // This only stores the dir arg from init - -/datum/component/decal/Initialize(_icon, _icon_state, _dir, _cleanable = CLEAN_GOD, _color, _layer = TURF_LAYER, _description, _alpha = 255) - if(!isatom(parent) || !generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha)) - return COMPONENT_INCOMPATIBLE - first_dir = _dir - description = _description - cleanable = _cleanable - - apply() - -/datum/component/decal/RegisterWithParent() - if(first_dir) - RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(rotate_react)) - if(cleanable) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_react)) - if(description) - RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine)) - -/datum/component/decal/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE)) - -/datum/component/decal/Destroy() - remove() - return ..() - -/datum/component/decal/PreTransfer() - remove() - -/datum/component/decal/PostTransfer() - remove() - apply() - -/datum/component/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha) - if(!_icon || !_icon_state) - return FALSE - // It has to be made from an image or dir breaks because of a byond bug - var/temp_image = image(_icon, null, _icon_state, _layer, _dir) - pic = new(temp_image) - pic.color = _color - pic.alpha = _alpha - return TRUE - -/datum/component/decal/proc/apply(atom/thing) - var/atom/master = thing || parent - master.add_overlay(pic, TRUE) - if(isitem(master)) - addtimer(CALLBACK(master, TYPE_PROC_REF(/obj/item, update_slot_icon)), 0, TIMER_UNIQUE) - -/datum/component/decal/proc/remove(atom/thing) - var/atom/master = thing || parent - master.cut_overlay(pic, TRUE) - if(isitem(master)) - addtimer(CALLBACK(master, TYPE_PROC_REF(/obj/item, update_slot_icon)), 0, TIMER_UNIQUE) - -/datum/component/decal/proc/rotate_react(datum/source, old_dir, new_dir) - if(old_dir == new_dir) - return - remove() - pic.dir = turn(pic.dir, dir2angle(old_dir) - dir2angle(new_dir)) - apply() - -/datum/component/decal/proc/clean_react(datum/source, strength) - if(strength >= cleanable) - qdel(src) - -/datum/component/decal/proc/examine(datum/source, mob/user, list/examine_list) - examine_list += description diff --git a/code/datums/components/label.dm b/code/datums/components/label.dm index eba55631c5a5b..c76e2ca97210e 100644 --- a/code/datums/components/label.dm +++ b/code/datums/components/label.dm @@ -22,11 +22,12 @@ apply_label() /datum/component/label/RegisterWithParent() - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(OnAttackby)) - RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(Examine)) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attack_by)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_NAME, PROC_REF(on_update_name)) /datum/component/label/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_PARENT_ATTACKBY, COMSIG_PARENT_EXAMINE)) + UnregisterSignal(parent, list(COMSIG_PARENT_ATTACKBY, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_NAME)) /** This proc will fire after the parent is hit by a hand labeler which is trying to apply another label. @@ -51,7 +52,8 @@ * attacker: The object that is hitting the parent. * user: The mob who is wielding the attacking object. */ -/datum/component/label/proc/OnAttackby(datum/source, obj/item/attacker, mob/user) +/datum/component/label/proc/on_attack_by(datum/source, obj/item/attacker, mob/user) + SIGNAL_HANDLER // COMSIG_PARENT_ATTACKBY // If the attacking object is not a hand labeler or it's not off (has a label ready to apply), return. // The hand labeler should be off in order to remove a label. var/obj/item/hand_labeler/labeler = attacker @@ -72,7 +74,14 @@ * user: The mob exmaining the parent. * examine_list: The current list of text getting passed from the parent's normal examine() proc. */ -/datum/component/label/proc/Examine(datum/source, mob/user, list/examine_list) + +///Reapplies label when update_name is called on the parent object. Attempts to remove it first just in case. +/datum/component/label/proc/on_update_name() + SIGNAL_HANDLER // COMSIG_ATOM_UPDATE_NAME + remove_label() + apply_label() + +/datum/component/label/proc/on_examine(datum/source, mob/user, list/examine_list) examine_list += "It has a label with some words written on it. Use a hand labeler to remove it." /// Applies a label to the name of the parent in the format of: "parent_name (label)" @@ -96,7 +105,7 @@ return ..() /// Adds detailed information to the examine text. -/datum/component/label/goal/Examine(datum/source, mob/user, list/examine_list) +/datum/component/label/goal/on_examine(datum/source, mob/user, list/examine_list) examine_list += "It has a label on it, marking it as part of a secondary goal for [label_name]. Use a hand labeler to remove it." /// Applies a static label to the parent's name. diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 3b70419f9d832..e992ba111ed94 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -150,6 +150,7 @@ GLOBAL_VAR_INIT(record_id_num, 1001) assignment = H.job else assignment = "Unassigned" + GLOB.crew_list[H.real_name] = assignment var/id = num2hex(GLOB.record_id_num++, 6) diff --git a/code/datums/elements/decal_element.dm b/code/datums/elements/decal_element.dm new file mode 100644 index 0000000000000..c15e9f43a480c --- /dev/null +++ b/code/datums/elements/decal_element.dm @@ -0,0 +1,177 @@ +// NOTE: +// This is an incredibly piecemeal port of /tg/'s decal element. +// It does not include several pieces of functionality that exist in /tg/. +// +// Namely: +// - It does not support smoothing decals +// - It does not send a signal when a decal is detached (used for trapdoors on /tg/) +// - It does not support custom plane configuration as this behavior seems primarily concerned with multi-z + +/datum/element/decal + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY + argument_hash_start_idx = 2 + /// Whether this decal can be cleaned. + var/cleanable + /// A description this decal appends to the target's examine message. + var/description + /// If true this was initialized with no set direction - will follow the parent dir. + var/directional + /// The base icon state that this decal was initialized with. + var/base_icon_state + /// The overlay applied by this decal to the target. + var/mutable_appearance/pic + +/datum/element/decal/Attach(atom/target, _icon, _icon_state, _dir, _layer=TURF_LAYER, _alpha=255, _color, _cleanable=FALSE, _description, mutable_appearance/_pic) + . = ..() + if(!isatom(target)) + return ELEMENT_INCOMPATIBLE + if(_pic) + pic = _pic + else if(!generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, target)) + return ELEMENT_INCOMPATIBLE + description = _description + cleanable = _cleanable + directional = _dir + base_icon_state = _icon_state + + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(apply_overlay), TRUE) + if(target.initialized) + target.update_appearance(UPDATE_OVERLAYS) //could use some queuing here now maybe. + else + RegisterSignal(target, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, PROC_REF(late_update_icon), TRUE) + if(isitem(target)) + INVOKE_ASYNC(target, TYPE_PROC_REF(/obj/item/, update_slot_icon), TRUE) + if(_dir) + RegisterSignal(target, COMSIG_ATOM_DECALS_ROTATING, PROC_REF(shuttle_rotate), TRUE) + SSdcs.RegisterSignal(target, COMSIG_ATOM_DIR_CHANGE, TYPE_PROC_REF(/datum/controller/subsystem/processing/dcs, rotate_decals), override=TRUE) + if(_cleanable) + RegisterSignal(target, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_react), TRUE) + if(_description) + RegisterSignal(target, COMSIG_PARENT_EXAMINE, PROC_REF(examine), TRUE) + + RegisterSignal(target, COMSIG_TURF_ON_SHUTTLE_MOVE, PROC_REF(shuttle_move_react), TRUE) + +/// Remove old decals and apply new decals after rotation as necessary +/datum/controller/subsystem/processing/dcs/proc/rotate_decals(datum/source, old_dir, new_dir) + SIGNAL_HANDLER // COMSIG_ATOM_DIR_CHANGE + + if(old_dir == new_dir) + return + + var/list/datum/element/decal/old_decals = list() //instances + SEND_SIGNAL(source, COMSIG_ATOM_DECALS_ROTATING, old_decals) + + if(!length(old_decals)) + UnregisterSignal(source, COMSIG_ATOM_DIR_CHANGE) + return + + var/list/resulting_decals_params = list() // param lists + for(var/datum/element/decal/rotating as anything in old_decals) + resulting_decals_params += list(rotating.get_rotated_parameters(old_dir,new_dir)) + + //Instead we could generate ids and only remove duplicates to save on churn on four-corners symmetry ? + for(var/datum/element/decal/decal in old_decals) + decal.Detach(source) + + for(var/result in resulting_decals_params) + source.AddElement(/datum/element/decal, result["icon"], result["icon_state"], result["dir"], result["layer"], result["alpha"], result["color"], result["cleanable"], result["desc"]) + +/datum/element/decal/proc/get_rotated_parameters(old_dir,new_dir) + var/rotation = 0 + if(directional) //Even when the dirs are the same rotation is coming out as not 0 for some reason + rotation = SIMPLIFY_DEGREES(dir2angle(new_dir)-dir2angle(old_dir)) + new_dir = turn(pic.dir,-rotation) + return list( + "icon" = pic.icon, + "icon_state" = base_icon_state, + "dir" = new_dir, + "plane" = pic.plane, + "layer" = pic.layer, + "alpha" = pic.alpha, + "color" = pic.color, + "cleanable" = cleanable, + "desc" = description + ) + +/datum/element/decal/proc/late_update_icon(atom/source) + SIGNAL_HANDLER // COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE + + if(istype(source) && !(source.flags_2 & DECAL_INIT_UPDATE_EXPERIENCED_2)) + source.flags_2 |= DECAL_INIT_UPDATE_EXPERIENCED_2 + source.update_appearance(UPDATE_OVERLAYS) + UnregisterSignal(source, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) + +/** + * If the decal was not given an appearance, it will generate one based on the other given arguments. + * element won't be compatible if it cannot do either + * all args are fed into creating an image, they are byond vars for images you'll recognize in the byond docs + * (except source, source is the object whose appearance we're copying.) + */ +/datum/element/decal/proc/generate_appearance(_icon, _icon_state, _dir, _layer, _color, _alpha, source) + if(!_icon || !_icon_state) + return FALSE + var/temp_image = image(_icon, null, _icon_state, _layer, _dir) + pic = new(temp_image) + pic.color = _color + pic.alpha = _alpha + return TRUE + +/datum/element/decal/Detach(atom/source) + UnregisterSignal(source, list( + COMSIG_ATOM_DIR_CHANGE, + COMSIG_COMPONENT_CLEAN_ACT, + COMSIG_PARENT_EXAMINE, + COMSIG_ATOM_UPDATE_OVERLAYS, + COMSIG_TURF_ON_SHUTTLE_MOVE, + COMSIG_ATOM_DECALS_ROTATING + )) + SSdcs.UnregisterSignal(source, COMSIG_ATOM_DIR_CHANGE) + source.update_appearance(UPDATE_OVERLAYS) + if(isitem(source)) + INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item/, update_slot_icon)) + return ..() + +/datum/element/decal/proc/apply_overlay(atom/source) + SIGNAL_HANDLER // COMSIG_ATOM_UPDATE_OVERLAYS + + source.add_overlay(pic) + // TODO: Fix this disgusting hack + // + // `COMSIG_ATOM_UPDATE_OVERLAYS` is sent at the end of + // /atom/proc/update_icon's stanza for updating overlays, instead + // somewhere useful, like, during it. /tg/ handles this by sending + // a list of overlays with the signal, allowing receivers to add to + // the list, instead of returning their own. + // + // This is much saner and more flexible, but would require refactoring + // many many uses of update_overlay() across the code base, which is left + // as an exercise for the next poor sap to touch this code (probably me). + if(source.managed_overlays && !islist(source.managed_overlays)) + source.managed_overlays = list(source.managed_overlays, pic) + else + LAZYDISTINCTADD(source.managed_overlays, pic) + +/datum/element/decal/proc/clean_react(datum/source, clean_types) + SIGNAL_HANDLER // COMSIG_COMPONENT_CLEAN_ACT + + if(clean_types & cleanable) + Detach(source) + return COMPONENT_CLEANED + return NONE + +/datum/element/decal/proc/examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER // COMSIG_PARENT_EXAMINE + + examine_list += description + +/datum/element/decal/proc/shuttle_move_react(datum/source, turf/new_turf) + SIGNAL_HANDLER // COMSIG_TURF_ON_SHUTTLE_MOVE + + if(new_turf == source) + return + Detach(source) + new_turf.AddElement(type, pic.icon, base_icon_state, directional, pic.layer, pic.alpha, pic.color, cleanable, description) + +/datum/element/decal/proc/shuttle_rotate(datum/source, list/datum/element/decal/rotating) + SIGNAL_HANDLER // COMSIG_ATOM_DECALS_ROTATING + rotating += src diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm index 59fb398fe6c3c..ff159e7d63ca2 100644 --- a/code/datums/helper_datums/map_template.dm +++ b/code/datums/helper_datums/map_template.dm @@ -121,7 +121,6 @@ preloadRuinTemplates() preloadShelterTemplates() preloadShuttleTemplates() - preloadBridgeTemplates() preloadEventTemplates() /proc/preloadRuinTemplates() @@ -169,22 +168,6 @@ GLOB.shuttle_templates[S.shuttle_id] = S GLOB.map_templates[S.shuttle_id] = S -/proc/preloadBridgeTemplates() - for(var/item in subtypesof(/datum/map_template/ruin/bridge/horizontal)) - var/datum/map_template/ruin/bridge/horizontal/horizontal_type = item - if(!(initial(horizontal_type.suffix))) - continue - var/datum/map_template/ruin/bridge/horizontal/S = new horizontal_type() - GLOB.bridge_horizontal_templates[S.suffix] = S - GLOB.map_templates[S.suffix] = S - for(var/item in subtypesof(/datum/map_template/ruin/bridge/vertical)) - var/datum/map_template/ruin/bridge/horizontal/vertical_type = item - if(!(initial(vertical_type.suffix))) - continue - var/datum/map_template/ruin/bridge/vertical/V = new vertical_type() - GLOB.bridge_vertical_templates[V.suffix] = V - GLOB.map_templates[V.suffix] = V - /proc/preloadEventTemplates() for(var/item in subtypesof(/datum/map_template/event)) var/datum/map_template/event/event_type = item diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b2d508beec0e7..53046c88c5dea 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -238,7 +238,7 @@ return FALSE /** - * Gets every objective this mind owns, including all of those from any antag datums they have, and returns them as a list. + * Gets every objective this mind owns, including all of those from any antag datums and teams they have, and returns them as a list. */ /datum/mind/proc/get_all_objectives(include_team = TRUE) var/list/all_objectives = list() @@ -246,11 +246,7 @@ all_objectives += objective_holder.get_objectives() // Get their personal objectives for(var/datum/antagonist/A as anything in antag_datums) - all_objectives += A.objective_holder.get_objectives() // Add all antag datum objectives. - if(include_team) - var/datum/team/team = A.get_team() - if(team) // have to make asure a team exists here, team?. does not work below because it will add the null to the list - all_objectives += team.objective_holder.get_objectives() // Get all of their teams' objectives + all_objectives += A.get_antag_objectives(include_team) // Add all antag datum objectives, and possibly antag team objectives // For custom non-antag role teams if(include_team && LAZYLEN(teams)) @@ -279,9 +275,9 @@ if(!remove_from_everything) return for(var/datum/antagonist/A as anything in antag_datums) - A.objective_holder.remove_objective(O) // Add all antag datum objectives. + A.remove_antag_objective(O) var/datum/team/team = A.get_team() - team?.objective_holder.remove_objective(O) // Get all of their teams' objectives + team?.objective_holder.remove_objective(O) /datum/mind/proc/_memory_edit_header(gamemode, list/alt) . = gamemode diff --git a/code/datums/ruins/bridges/bridges.dm b/code/datums/ruins/bridges/bridges.dm index 6d5770419a3c4..313f57126d77b 100644 --- a/code/datums/ruins/bridges/bridges.dm +++ b/code/datums/ruins/bridges/bridges.dm @@ -1,87 +1,237 @@ -/datum/map_template/ruin/bridge - prefix = "_maps/map_files/RandomRuins/LavaRuins/chasm_bridges/" - ci_exclude = /datum/map_template/ruin/bridge - -/datum/map_template/ruin/bridge/horizontal - ci_exclude = /datum/map_template/ruin/bridge/horizontal - -/datum/map_template/ruin/bridge/horizontal/one - name = "Horizontal Bridge One" - suffix = "lavaland_bridge_horizontal_1.dmm" - -/datum/map_template/ruin/bridge/horizontal/two - name = "Horizontal Bridge Two" - suffix = "lavaland_bridge_horizontal_2.dmm" - -/datum/map_template/ruin/bridge/horizontal/three - name = "Horizontal Bridge Three" - suffix = "lavaland_bridge_horizontal_3.dmm" - -/datum/map_template/ruin/bridge/horizontal/four - name = "Horizontal Bridge Four" - suffix = "lavaland_bridge_horizontal_4.dmm" - -/datum/map_template/ruin/bridge/horizontal/five - name = "Horizontal Bridge Five" - suffix = "lavaland_bridge_horizontal_5.dmm" - -/datum/map_template/ruin/bridge/horizontal/six - name = "Horizontal Bridge Six" - suffix = "lavaland_bridge_horizontal_6.dmm" - -/datum/map_template/ruin/bridge/vertical - ci_exclude = /datum/map_template/ruin/bridge/vertical - -/datum/map_template/ruin/bridge/vertical/one - name = "Vertical Bridge One" - suffix = "lavaland_bridge_vertical_1.dmm" - -/datum/map_template/ruin/bridge/vertical/two - name = "Vertical Bridge Two" - suffix = "lavaland_bridge_vertical_2.dmm" - -/datum/map_template/ruin/bridge/vertical/three - name = "Vertical Bridge Three" - suffix = "lavaland_bridge_vertical_3.dmm" - -/datum/map_template/ruin/bridge/vertical/four - name = "Vertical Bridge Four" - suffix = "lavaland_bridge_vertical_4.dmm" - -/datum/map_template/ruin/bridge/vertical/five - name = "Vertical Bridge Five" - suffix = "lavaland_bridge_vertical_5.dmm" - -/datum/map_template/ruin/bridge/vertical/six - name = "Vertical Bridge Six" - suffix = "lavaland_bridge_vertical_6.dmm" - -/obj/effect/spawner/bridge - name = "Bridge spawner" - var/datum/map_template/ruin/bridge/template - -/obj/effect/spawner/bridge/Initialize(mapload) +#define LONG_BRIDGE_THEME_CULT "cult" +#define LONG_BRIDGE_THEME_HIERO "hiero" +#define LONG_BRIDGE_THEME_CLOCKWORK "clockwork" +#define LONG_BRIDGE_THEME_STONE "stone" +#define LONG_BRIDGE_THEME_WOOD "wood" +#define LONG_BRIDGE_THEME_CATWALK "catwalk" + +/** + * A spawner for dynamic bridges, largely with hardcoded expectations to be + * operating on Lavaland. + * + * It does this by starting at its spawn point, placed by a + * [/datum/river_spawner] during generation, and walking in each direction + * "forwards" and "backwards" until it reaches the maximum possible length of + * the bridge, or a tile that doesn't appear to be a valid "passage" + * (essentially a tile that doesn't have lava on both sides and thus wouldn't + * look good or make an effective bridge). If it manages to do this and find two + * tiles that work as the start and end of the bridge, it places the paths, + * pillars, and "cleans up" the tiles contiguous to its entrance and exit turfs, + * removing any lava if present. + * + * It attempts this first in the vertical direction, and then the horizontal. So + * "fowards" and "backwards" can mean NORTH/SOUTH or EAST/WEST depending on the + * direction it's attempting. + * + * There are several bridge "themes" implemented in `make_walkway()` and + * `make_pillar()`, and more can be added if desired. + */ +/obj/effect/spawner/dynamic_bridge + var/max_length = 8 + var/min_length = 4 + var/bridge_theme = LONG_BRIDGE_THEME_CULT + var/list/forwards_backwards + var/list/side_to_side + +/obj/effect/spawner/dynamic_bridge/Initialize(mapload) . = ..() - SSlate_mapping.bridge_spawners += src - -/obj/effect/spawner/bridge/Destroy() - SSlate_mapping.bridge_spawners -= src - return ..() - -/obj/effect/spawner/bridge/proc/generate_bridge() - var/turf/east = locate(x + 3, y, z) - var/turf/west = locate(x - 3, y, z) - var/turf/north = locate(x, y + 3, z) - var/turf/south = locate(x, y - 3, z) - var/turf/e1 = locate(x + 1, y, z) - var/turf/w1 = locate(x - 1, y, z) - var/turf/n1 = locate(x, y + 1, z) - var/turf/s1 = locate(x, y - 1, z) - - - if((ismineralturf(east) || istype(east, /turf/simulated/floor/plating/asteroid)) && (ismineralturf(west) || istype(west, /turf/simulated/floor/plating/asteroid)) && !(ismineralturf(n1) || istype(n1, /turf/simulated/floor/plating/asteroid)) && !(ismineralturf(s1) || istype(s1, /turf/simulated/floor/plating/asteroid))) - template = GLOB.bridge_horizontal_templates[pick("lavaland_bridge_horizontal_1.dmm", "lavaland_bridge_horizontal_2.dmm", "lavaland_bridge_horizontal_3.dmm", "lavaland_bridge_horizontal_4.dmm", "lavaland_bridge_horizontal_5.dmm", "lavaland_bridge_horizontal_6.dmm")] - template.load(loc, centered = TRUE) - else if((ismineralturf(north) || istype(north, /turf/simulated/floor/plating/asteroid)) && (ismineralturf(south) || istype(south, /turf/simulated/floor/plating/asteroid)) && !(ismineralturf(e1) || istype(e1, /turf/simulated/floor/plating/asteroid)) && !(ismineralturf(w1) || istype(w1, /turf/simulated/floor/plating/asteroid))) - template = GLOB.bridge_vertical_templates[pick("lavaland_bridge_vertical_1.dmm", "lavaland_bridge_vertical_2.dmm", "lavaland_bridge_vertical_3.dmm", "lavaland_bridge_vertical_4.dmm", "lavaland_bridge_vertical_5.dmm", "lavaland_bridge_vertical_6.dmm")] - template.load(loc, centered = TRUE) + bridge_theme = pick( + LONG_BRIDGE_THEME_CULT, + LONG_BRIDGE_THEME_HIERO, + LONG_BRIDGE_THEME_CLOCKWORK, + LONG_BRIDGE_THEME_STONE, + LONG_BRIDGE_THEME_WOOD, + LONG_BRIDGE_THEME_CATWALK, + ) + return INITIALIZE_HINT_LATELOAD + +/obj/effect/spawner/dynamic_bridge/LateInitialize() + forwards_backwards = list(NORTH, SOUTH) + side_to_side = list(EAST, WEST) + if(!attempt_bridge()) + forwards_backwards = list(EAST, WEST) + side_to_side = list(NORTH, SOUTH) + attempt_bridge() + + qdel(src) + +/// Returns whether the passed in turf is a valid "landing". A valid landing is +/// a tile that hasn't been reserved by another bridge, and has a non-lava tile +/// leading directly to it. +/obj/effect/spawner/dynamic_bridge/proc/valid_landing(turf/T, direction) + if(T.flags & LAVA_BRIDGE || T.flags & NO_LAVA_GEN) + return FALSE + + var/turf/end = get_step(T, direction) + if(end.flags & LAVA_BRIDGE || !(ismineralturf(end) || istype(end, /turf/simulated/floor/plating/asteroid))) + return FALSE + + return TRUE + +/// Returns whether the passed in turf is a valid "passage". A valid passage is +/// a lava tile that has lava on both sides of it. Invalid passage tiles do not +/// look good as bridge walkways and defeat the purpose of there is floor right +/// next to it. +/obj/effect/spawner/dynamic_bridge/proc/valid_passage(turf/T) + if(T.flags & LAVA_BRIDGE) + return FALSE + if(!istype(T, /turf/simulated/floor/lava/mapping_lava)) + return FALSE + if(!istype(get_step(T, side_to_side[1]), /turf/simulated/floor/lava/mapping_lava)) + return FALSE + if(!istype(get_step(T, side_to_side[2]), /turf/simulated/floor/lava/mapping_lava)) + return FALSE + + return TRUE + +/obj/effect/spawner/dynamic_bridge/proc/make_pillar(turf/T) + for(var/obj/structure/spawner/S in T) + qdel(S) + for(var/mob/living/M in T) + qdel(M) + for(var/obj/structure/flora/F in T) + qdel(F) + + switch(bridge_theme) + if(LONG_BRIDGE_THEME_CULT) + T.ChangeTurf(/turf/simulated/wall/cult) + if(LONG_BRIDGE_THEME_HIERO) + T.ChangeTurf(/turf/simulated/wall/indestructible/hierophant) + if(LONG_BRIDGE_THEME_CLOCKWORK) + T.ChangeTurf(/turf/simulated/wall/clockwork) + if(LONG_BRIDGE_THEME_STONE) + T.ChangeTurf(/turf/simulated/wall/cult) + if(LONG_BRIDGE_THEME_WOOD) + T.ChangeTurf(/turf/simulated/wall/mineral/wood/nonmetal) + if(LONG_BRIDGE_THEME_CATWALK) + new /obj/structure/lattice/catwalk/mining(T) + new /obj/structure/marker_beacon/dock_marker/collision(T) + + T.flags |= LAVA_BRIDGE + +/obj/effect/spawner/dynamic_bridge/proc/make_walkway(turf/T) + for(var/obj/structure/spawner/S in T) + qdel(S) + for(var/mob/living/M in T) + qdel(M) + for(var/obj/structure/flora/F in T) + qdel(F) + + switch(bridge_theme) + if(LONG_BRIDGE_THEME_CULT) + T.ChangeTurf(/turf/simulated/floor/engine/cult/lavaland_air) + if(LONG_BRIDGE_THEME_HIERO) + T.ChangeTurf(/turf/simulated/floor/indestructible/hierophant) + if(LONG_BRIDGE_THEME_CLOCKWORK) + T.ChangeTurf(/turf/simulated/floor/clockwork/lavaland_air) + if(LONG_BRIDGE_THEME_STONE) + // Stone tiles are different sizes and shapes so these are + // "safe-looking" arrangements + switch(rand(1, 5)) + if(1) + new /obj/structure/stone_tile/block(T) + var/obj/structure/stone_tile/block/cracked/C = new(T) + C.dir = NORTH + if(2) + new /obj/structure/stone_tile/slab(T) + if(3) + new /obj/structure/stone_tile/surrounding(T) + new /obj/structure/stone_tile/center(T) + if(4) + new /obj/structure/stone_tile/slab/cracked(T) + if(5) + new /obj/structure/stone_tile/burnt(T) + var/obj/structure/stone_tile/surrounding_tile/ST = new(T) + ST.dir = WEST + var/obj/structure/stone_tile/block/B = new(T) + B.dir = NORTH + if(LONG_BRIDGE_THEME_WOOD) + T.ChangeTurf(/turf/simulated/floor/wood/lavaland_air) + if(prob(20)) + new /obj/effect/landmark/damageturf(T) + if(LONG_BRIDGE_THEME_CATWALK) + new /obj/structure/lattice/catwalk/mining(T) + + T.flags |= LAVA_BRIDGE + +/// Make a tile safe for player passage, for use at the bridge entrance and exits +/obj/effect/spawner/dynamic_bridge/proc/cleanup_edge(turf/T) + if(istype(T, /turf/simulated/floor/lava/mapping_lava)) + T.ChangeTurf(/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface) + T.icon_state = "basalt" // hate + +/obj/effect/spawner/dynamic_bridge/proc/attempt_bridge() + var/count = 1 + var/walk_dir = forwards_backwards[1] + var/turf/forward_step = get_turf(src) + var/turf/backward_step = get_turf(src) + var/turf/forward_goal + var/turf/backward_goal + var/bad_passage = FALSE + + while(count <= max_length && !(forward_goal && backward_goal) && !bad_passage) + if(walk_dir == forwards_backwards[1]) + if(!forward_goal) + if(out_of_bounds(walk_dir, forward_step)) + break // Out of bounds + forward_step = get_step(forward_step, walk_dir) + if(valid_landing(forward_step, walk_dir)) + forward_goal = forward_step + else if(!valid_passage(forward_step)) + bad_passage = TRUE + count++ + walk_dir = forwards_backwards[2] + else + if(!backward_goal) + if(out_of_bounds(walk_dir, backward_step)) + break // Out of bounds + backward_step = get_step(backward_step, walk_dir) + if(valid_landing(backward_step, walk_dir)) + backward_goal = backward_step + else if(!valid_passage(backward_step)) + bad_passage = TRUE + count++ + walk_dir = forwards_backwards[1] + + if(!bad_passage && count >= min_length && forward_goal && backward_goal) + for(var/turf/T in get_line(forward_goal, backward_goal)) + make_walkway(T) + for(var/turf/T in list( + get_step(forward_goal, side_to_side[1]), + get_step(forward_goal, side_to_side[2]), + get_step(backward_goal, side_to_side[1]), + get_step(backward_goal, side_to_side[2]))) + make_pillar(T) + for(var/turf/T in get_line( + get_step(get_step(forward_goal, side_to_side[1]), forwards_backwards[1]), + get_step(get_step(forward_goal, side_to_side[2]), forwards_backwards[1]))) + cleanup_edge(T) + for(var/turf/T in get_line( + get_step(get_step(backward_goal, side_to_side[1]), forwards_backwards[2]), + get_step(get_step(backward_goal, side_to_side[2]), forwards_backwards[2]))) + cleanup_edge(T) + + return TRUE + +/// Checks if we are going out of bounds. Returns TRUE if we are close (less than or equal to 2 turfs) to a border +/obj/effect/spawner/dynamic_bridge/proc/out_of_bounds(direction, turf/current_turf) + if(!direction || !current_turf) + return TRUE + + switch(direction) + if(NORTH) + return current_turf.y >= world.maxy - 2 + if(EAST) + return current_turf.x >= world.maxx - 2 + if(SOUTH) + return current_turf.y <= 2 + if(WEST) + return current_turf.x <= 2 + return TRUE + +#undef LONG_BRIDGE_THEME_CULT +#undef LONG_BRIDGE_THEME_HIERO +#undef LONG_BRIDGE_THEME_CLOCKWORK +#undef LONG_BRIDGE_THEME_STONE +#undef LONG_BRIDGE_THEME_WOOD +#undef LONG_BRIDGE_THEME_CATWALK diff --git a/code/datums/ruins/space_ruins.dm b/code/datums/ruins/space_ruins.dm index 57cf14cc6cafd..abc7652d8002e 100644 --- a/code/datums/ruins/space_ruins.dm +++ b/code/datums/ruins/space_ruins.dm @@ -370,6 +370,12 @@ description = "A security shuttle that has been floating in space." allow_duplicates = FALSE +/datum/map_template/ruin/space/freighter + id = "freighter" + suffix = "freighter.dmm" + name = "Voidhopper of Nexus" + description = "A cargo ship headed to a nearby system." + /datum/map_template/ruin/space/drakehound_breacher id = "drakehound_breacher" suffix = "unathi_skiff.dmm" diff --git a/code/datums/spells/projectile_spell.dm b/code/datums/spells/projectile_spell.dm index fd724b5019b24..07e83ec6686a7 100644 --- a/code/datums/spells/projectile_spell.dm +++ b/code/datums/spells/projectile_spell.dm @@ -30,6 +30,7 @@ projectile.icon_state = proj_icon_state projectile.dir = get_dir(target, projectile) projectile.name = proj_name + projectile.firer = user var/current_loc = get_turf(projectile) for(var/i in 1 to proj_lifespan) diff --git a/code/game/area/ai_monitored.dm b/code/game/area/ai_monitored.dm index c09499af43ce2..db60b423c5d90 100644 --- a/code/game/area/ai_monitored.dm +++ b/code/game/area/ai_monitored.dm @@ -10,7 +10,6 @@ for(var/obj/machinery/camera/M in src) if(M.isMotion()) motioncameras.Add(M) - M.AddComponent(/datum/component/proximity_monitor) M.set_area_motion(src) /area/station/ai_monitored/Entered(atom/movable/O) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index b8e0fc8fdfbde..1ee6822d206bd 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -239,7 +239,6 @@ if(!occupant) return to_chat(occupant, "Something is electrifying you!") - sleep(1 SECONDS) occupant.electrocute_act(10, src) do_sparks(5, TRUE, src) @@ -248,7 +247,7 @@ return to_chat(occupant, "Something is stabbing you in the back!") occupant.apply_damage(5, BRUTE, BODY_ZONE_CHEST) - occupant.reagents.add_reagent("ether", 5) + occupant.reagents.add_reagent("pancuronium", 3) /obj/machinery/abductor/experiment/force_eject_occupant(mob/target) eject_abductee() diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 904cc49d3b059..cd2d04885f671 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -1,13 +1,14 @@ //Revenants: based off of wraiths from Goon //"Ghosts" that are invisible and move like ghosts, cannot take damage while invsible -//Don't hear deadchat and are NOT normal ghosts +//Wreck havoc with haunting themed abilities //Admin-spawn or random event #define INVISIBILITY_REVENANT 45 #define REVENANT_NAME_FILE "revenant_names.json" /mob/living/simple_animal/revenant - name = "revenant" + name = "revenant" //The name shown on examine + real_name = "revenant" //The name shown in dchat desc = "A malevolent spirit." icon = 'icons/mob/mob.dmi' icon_state = "revenant_idle" @@ -120,11 +121,7 @@ if(copytext(message, 1, 2) == "*") return emote(copytext(message, 2), intentional = TRUE) - var/rendered - for(var/mob/M in GLOB.mob_list) - rendered = "[src] [(isobserver(M) ? ("([ghost_follow_link(src, ghost=M)])") : "")] says, \"[message]\"" - if(istype(M, /mob/living/simple_animal/revenant) || isobserver(M)) - to_chat(M, rendered) + say_dead(message) /mob/living/simple_animal/revenant/get_status_tab_items() var/list/status_tab_data = ..() @@ -148,6 +145,7 @@ built_name += pick(strings(REVENANT_NAME_FILE, "adjective")) built_name += pick(strings(REVENANT_NAME_FILE, "theme")) name = built_name + real_name = built_name /mob/living/simple_animal/revenant/proc/firstSetupAttempt() if(mind) diff --git a/code/game/gamemodes/objective_holder.dm b/code/game/gamemodes/objective_holder.dm index 4cbeb50d1d51d..c3d7b455487be 100644 --- a/code/game/gamemodes/objective_holder.dm +++ b/code/game/gamemodes/objective_holder.dm @@ -4,15 +4,15 @@ /datum/objective_holder /// Our list of current objectives - var/list/datum/objective/objectives = list() + VAR_PRIVATE/list/datum/objective/objectives = list() /// Who do we belong to [mind, antagonist, team] - var/datum/objective_owner + VAR_PRIVATE/datum/objective_owner /// A list of strings which contain [targets][/datum/objective/var/target] of the antagonist's objectives. Used to prevent duplicate objectives. - var/list/assigned_targets = list() + VAR_PRIVATE/list/assigned_targets = list() /// A callback invoked when a new objective is added. This is required because sometimes objectives are added directly without going through objective_owner. Not currently used. - var/datum/callback/on_add_callback + VAR_PRIVATE/datum/callback/on_add_callback /// A callback invoked when a new objective is added. This is required because sometimes objectives are removed directly without going through objective_owner (EX: replace_objective(), clear()). Not currently used. - var/datum/callback/on_remove_callback + VAR_PRIVATE/datum/callback/on_remove_callback /datum/objective_holder/New(new_owner) . = ..() diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index 77e4f3cbb7b4a..592de13f2b91e 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -6,6 +6,8 @@ var/datum/spell/touch/attached_spell icon = 'icons/obj/weapons/magical_weapons.dmi' icon_state = "disintegrate" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' item_state = null flags = ABSTRACT | NODROP | DROPDEL w_class = WEIGHT_CLASS_HUGE diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 629aad215de90..7c99ca64c72c8 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -391,7 +391,7 @@ "Tourist") /proc/get_all_job_icons() //For all existing HUD icons - return GLOB.joblist + get_all_ERT_jobs() + list("Prisoner") + return GLOB.joblist + get_all_ERT_jobs() + list("Prisoner", "Centcom", "Solgov", "Soviet", "Unknown") /proc/get_accesslist_static_data(num_min_region = REGION_GENERAL, num_max_region = REGION_COMMAND) var/list/retval diff --git a/code/game/machinery/camera/camera_presets.dm b/code/game/machinery/camera/camera_presets.dm index 64ab059fd8b0a..9c7f0fc61bc0f 100644 --- a/code/game/machinery/camera/camera_presets.dm +++ b/code/game/machinery/camera/camera_presets.dm @@ -155,6 +155,7 @@ if(name == initial(name)) name = "motion-sensitive security camera" assembly.upgrades.Add(new /obj/item/assembly/prox_sensor(assembly)) + AddComponent(/datum/component/proximity_monitor, CAMERA_VIEW_DISTANCE) setPowerUsage() // Add it to machines that process START_PROCESSING(SSmachines, src) diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index 68010c1fb3c1f..5f2e83b11a269 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -12,7 +12,7 @@ else if(detectTime == -1) for(var/thing in getTargetList()) var/mob/target = locateUID(thing) - if(QDELETED(target) || target.stat == DEAD || (!area_motion && !in_range(src, target))) + if(QDELETED(target) || target.stat == DEAD || (!area_motion && (!(get_dist(src, target) <= view_range) || !(target in hearers(view_range, get_turf(src)))))) //If not part of a monitored area and the camera is not in range or the target is dead lostTargetRef(thing) @@ -24,6 +24,10 @@ /obj/machinery/camera/proc/newTarget(mob/target) if(isAI(target)) return FALSE + if(isbot(target)) //No armsky, you don't get to set off the motion alarm constantly + return FALSE + if(!area_motion && (!(get_dist(src, target) <= view_range) || !(target in hearers(view_range, get_turf(src))))) + return FALSE if(detectTime == 0) detectTime = world.time // start the clock var/list/targets = getTargetList() @@ -33,7 +37,7 @@ /obj/machinery/camera/proc/lostTargetRef(uid) var/list/targets = getTargetList() targets -= uid - if(length(targets)) + if(!length(targets)) cancelAlarm() /obj/machinery/camera/proc/cancelAlarm() @@ -47,7 +51,8 @@ if(!detectTime) return FALSE if(status) - GLOB.alarm_manager.trigger_alarm("Motion", get_area(src), list(UID()), src) + var/area/A = get_area(src) + GLOB.alarm_manager.trigger_alarm("Motion", A, A.cameras, src) visible_message("A red light flashes on [src]!") detectTime = -1 return TRUE diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index f0f9942e14452..c6798b91c91e4 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -404,7 +404,7 @@ if(G.fields["name"] == occupant.real_name) announce_rank = G.fields["rank"] qdel(G) - + GLOB.crew_list -= occupant.real_name icon_state = base_icon_state //Make an announcement and log the person entering storage + their rank diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index c4c46fbb601f7..da1534bdbb578 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -142,9 +142,12 @@ if(machine_powernet?.powernet_area != get_area(src)) var/area/machine_area = get_area(src) if(machine_area) + var/old_power_mode = power_state + change_power_mode(NO_POWER_USE) // Take away our current power from the old network machine_powernet?.unregister_machine(src) machine_powernet = machine_area.powernet machine_powernet.register_machine(src) + change_power_mode(old_power_mode) // add it to the new network /// Helper proc to change the machines power usage mode, automatically adjusts static power usage to maintain perfect parity /obj/machinery/proc/change_power_mode(use_type = IDLE_POWER_USE) diff --git a/code/game/objects/effects/decals/turf_decal.dm b/code/game/objects/effects/decals/turf_decal.dm index 69cc446158799..8d6315aad78ac 100644 --- a/code/game/objects/effects/decals/turf_decal.dm +++ b/code/game/objects/effects/decals/turf_decal.dm @@ -9,4 +9,5 @@ var/turf/T = loc if(!istype(T)) //you know this will happen somehow CRASH("Turf decal initialized in an object/nullspace") - T.AddComponent(/datum/component/decal, icon, icon_state, dir, CLEAN_GOD, color, null, null, alpha) + + T.AddElement(/datum/element/decal, icon, icon_state, dir, layer, alpha, color, FALSE, null) diff --git a/code/game/objects/items/tools/welder.dm b/code/game/objects/items/tools/welder.dm index 4226798d73566..0a645a62b7b3e 100644 --- a/code/game/objects/items/tools/welder.dm +++ b/code/game/objects/items/tools/welder.dm @@ -154,8 +154,12 @@ remove_fuel(0.5) /obj/item/weldingtool/attack(mob/living/target, mob/living/user) - if(!cigarette_lighter_act(user, target)) - return ..() + if(cigarette_lighter_act(user, target)) + return + if(tool_enabled && target.IgniteMob()) + message_admins("[key_name_admin(user)] set [key_name_admin(target)] on fire") + log_game("[key_name(user)] set [key_name(target)] on fire") + return ..() /obj/item/weldingtool/cigarette_lighter_act(mob/living/user, mob/living/target, obj/item/direct_attackby_item) var/obj/item/clothing/mask/cigarette/cig = ..() diff --git a/code/game/objects/items/weapons/agent_id.dm b/code/game/objects/items/weapons/agent_id.dm new file mode 100644 index 0000000000000..c3c48a09e02ca --- /dev/null +++ b/code/game/objects/items/weapons/agent_id.dm @@ -0,0 +1,300 @@ +/obj/item/card/id/syndicate + name = "agent card" + origin_tech = "syndicate=1" + untrackable = TRUE + /// List of access types the agent ID should start off with + var/list/initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_EXTERNAL_AIRLOCKS) + /// Editing is prohibited if registered_human reference is missing + var/mob/living/carbon/human/registered_human + // Static list of all occupations available when changing the occupation on an agent ID + var/static/list/possible_jobs + /// The HUD icon that should be displayed on a mob that is wearing the agent ID + var/hud_icon + + COOLDOWN_DECLARE(new_photo_cooldown) + +/obj/item/card/id/syndicate/Initialize(mapload) + . = ..() + access = initial_access.Copy() + if(!length(possible_jobs)) + possible_jobs = sortTim(GLOB.joblist, GLOBAL_PROC_REF(cmp_text_asc)) + +/obj/item/card/id/syndicate/Destroy() + registered_human = null + return ..() + +/obj/item/card/id/syndicate/researcher + initial_access = list(ACCESS_SYNDICATE) + assignment = "Syndicate Researcher" + icon_state = "syndie" + untrackable = TRUE + +/obj/item/card/id/syndicate/vox + name = "agent card" + initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_VOX, ACCESS_EXTERNAL_AIRLOCKS) + +/obj/item/card/id/syndicate/ghost_bar + name = "ghost bar identification card" + assignment = "Ghost Bar Occupant" + initial_access = list() // This is for show, they don't need actual accesses + icon_state = "assistant" + +/obj/item/card/id/syndicate/command + initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS) + icon_state = "commander" + +/obj/item/card/id/syndicate_command + name = "syndicate ID card" + desc = "An ID straight from the Syndicate." + registered_name = "Syndicate" + icon_state = "syndie" + assignment = "Syndicate Overlord" + untrackable = TRUE + access = list(ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS) + +/obj/item/card/id/syndicate/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + if(!proximity_flag) + return + if(istype(target, /obj/item/card/id)) + var/obj/item/card/id/I = target + if(isliving(user) && user?.mind?.special_role) + to_chat(usr, "The card's microscanners activate as you pass it over [I], copying its access.") + access |= I.access //Don't copy access if user isn't an antag -- to prevent metagaming + +/obj/item/card/id/syndicate/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + if(..()) + return + if(!registered_human || !Adjacent(registered_human)) + return + . = TRUE + switch(action) + if("delete_info") + delete_info(ui) + if("clear_access") + clear_access() + if("change_ai_tracking") + change_ai_tracking() + if("change_name") + change_name(params["option"], params["name"]) + if("change_photo") + change_photo() + if("change_appearance") + change_appearance(params["new_appearance"]) + if("change_sex") + change_sex(params["sex"]) + if("change_age") + change_age(params["age"]) + if("change_occupation") + change_occupation(params["option"]) + if("change_money_account") + change_money_account(params["option"], params["new_account"]) + if("change_blood_type") + change_blood_type(params["option"], params["new_type"]) + if("change_dna_hash") + change_dna_hash(params["option"], params["new_dna"]) + if("change_fingerprints") + change_fingerprints(params["option"], params["new_fingerprints"]) + RebuildHTML() + +/obj/item/card/id/syndicate/ui_data(mob/user) + var/list/data = list() + data["registered_name"] = registered_name + data["sex"] = sex + data["age"] = age + data["assignment"] = assignment + data["job_icon"] = hud_icon + data["associated_account_number"] = associated_account_number + data["blood_type"] = blood_type + data["dna_hash"] = dna_hash + data["fingerprint_hash"] = fingerprint_hash + data["photo"] = photo + data["ai_tracking"] = untrackable + data["photo_cooldown"] = COOLDOWN_FINISHED(src, new_photo_cooldown) + return data + +/obj/item/card/id/syndicate/ui_static_data(mob/user) + var/list/data = list() + var/list/idcard_skins = list() + for(var/idcard_skin in get_all_card_skins()) + idcard_skins.Add(idcard_skin) + data["appearances"] = idcard_skins + data["id_icon"] = icon + return data + +/obj/item/card/id/syndicate/ui_interact(mob/user, datum/tgui/ui = null) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AgentCard", name) + ui.open() + +/obj/item/card/id/syndicate/attack_self(mob/user) + if(!ishuman(user)) + return + if(!registered_human) + registered_human = user + if(registered_human != user) + flash_card(user) + return + switch(tgui_alert(user, "Would you like to display [src] or edit it?", "Choose", list("Edit", "Show"))) + if("Show") + flash_card(user) + if("Edit") + ui_interact(user) + +/obj/item/card/id/syndicate/proc/delete_info(datum/tgui/ui) + name = initial(name) + registered_name = initial(registered_name) + icon_state = initial(icon_state) + sex = initial(sex) + age = initial(age) + assignment = initial(assignment) + rank = initial(rank) + associated_account_number = initial(associated_account_number) + blood_type = initial(blood_type) + dna_hash = initial(dna_hash) + fingerprint_hash = initial(fingerprint_hash) + photo = null + registered_human.sec_hud_set_ID() + registered_human = null + ui.close() + +/obj/item/card/id/syndicate/proc/clear_access() + access = initial_access.Copy() // Initial() doesn't work on lists + to_chat(registered_human, "Card access reset.") + +/obj/item/card/id/syndicate/proc/change_ai_tracking() + untrackable = !untrackable + +/obj/item/card/id/syndicate/proc/change_name(option, name) + var/new_name + if(option == "Primary") + new_name = ishuman(registered_human) ? registered_human.real_name : registered_human.name + else if(option == "Secondary") + new_name = tgui_input_list(registered_human, "Whose name do you want to copy?", "Agent ID - Name", GLOB.crew_list) + if(isnull(new_name)) + return + else + new_name = sanitize(name) + + registered_name = reject_bad_name(new_name, TRUE) + UpdateName() + to_chat(registered_human, "ID name has been changed to [new_name].") + +/obj/item/card/id/syndicate/proc/change_photo() + if(!COOLDOWN_FINISHED(src, new_photo_cooldown)) + return + var/job_clothes = null + if(assignment) + job_clothes = assignment + var/icon/newphoto = get_id_photo(registered_human, job_clothes) + if(!newphoto) + return + photo = newphoto + COOLDOWN_START(src, new_photo_cooldown, 10 SECONDS) // This proc is expensive, we don't want people spamming it. + +/obj/item/card/id/syndicate/proc/change_appearance(new_appearance) + if(!new_appearance) + return + if(new_appearance in icon_states(icon)) + icon_state = new_appearance + +/obj/item/card/id/syndicate/proc/change_sex(new_sex) + if(!Adjacent(registered_human) || isnull(new_sex)) + return + + sex = sanitize(new_sex) + +/obj/item/card/id/syndicate/proc/change_age(new_age) + age = clamp(new_age, AGE_MIN, AGE_MAX) + +/obj/item/card/id/syndicate/proc/change_occupation(option) + var/new_job + var/new_rank + if(option == "Primary") + new_job = assignment + new_rank = tgui_input_list(registered_human, "What SecHUD icon would you like to be shown on this card?", "Agent Card Occupation", GLOB.joblist + "Prisoner" + "Centcom" + "Solgov" + "Soviet" + "Unknown") + else + var/department = tgui_input_list(registered_human, "Do you want a custom occupation?", "Agent Card Occupation", list("Existing job", "Custom")) + if(department != "Custom") + new_job = tgui_input_list(registered_human, "What job would you like to put on this card?", "Agent Card Occupation", possible_jobs) + new_rank = new_job + else + new_job = sanitize(tgui_input_text(registered_human, "Choose a custom job title:", "Agent Card Occupation", "Assistant", MAX_MESSAGE_LEN)) + new_rank = tgui_input_list(registered_human, "What SecHUD icon would you like to be shown on this card?", "Agent Card Occupation", GLOB.joblist + "Prisoner" + "Centcom" + "Solgov" + "Soviet" + "Unknown") + + if(!Adjacent(registered_human) || isnull(new_job)) + return + assignment = new_job + rank = new_rank + hud_icon = ckey(get_job_name()) + UpdateName() + registered_human.sec_hud_set_ID() + +/obj/item/card/id/syndicate/proc/change_money_account(option, new_account) + if(option == "Primary") + new_account = registered_human.mind.initial_account?.account_number + if(!new_account) + to_chat(registered_human, "You don't have an account.") + return + else if(option == "Secondary") + new_account = rand(1000, 9999) * 1000 + rand(1000, 9999) + else + new_account = text2num(new_account) + if(!isnum(new_account)) + to_chat(registered_human, "ID account number can only contain numbers.") + return + + associated_account_number = clamp(new_account, 1000000, 9999999) + to_chat(registered_human, "ID account number has been changed to [new_account].") + +/obj/item/card/id/syndicate/proc/change_blood_type(option, new_type) + var/list/possible_blood_types = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-", "Slime Jelly", "None") + if(option == "Primary") + blood_type = registered_human.dna.blood_type + else if(new_type) + if(!(blood_type in possible_blood_types)) + return + blood_type = new_type + to_chat(registered_human, "ID blood type has been changed to [blood_type].") + +/obj/item/card/id/syndicate/proc/change_dna_hash(option, new_dna) + if(option == "Primary") + dna_hash = registered_human.dna.unique_enzymes + else if(option == "Secondary") + dna_hash = md5(num2text(rand(0, 999))) + else + if(new_dna) + dna_hash = sanitize(new_dna, 33) // Max length of 32 characters + +/obj/item/card/id/syndicate/proc/change_fingerprints(option, new_fingerprints) + if(option == "Primary") + fingerprint_hash = md5(registered_human.dna.uni_identity) + else if(option == "Secondary") + fingerprint_hash = md5(num2text(rand(0, 999))) + else + var/fingerprints_param = new_fingerprints + if(fingerprints_param) + fingerprint_hash = sanitize(fingerprints_param, 33) + +/// like /obj/item/card/id/syndicate, but you can only swipe access, not change your identity, its also trackable +/obj/item/card/id/syndi_scan_only + name = "Syndicate Operative's ID card (Operative)" + rank = "Operative" + assignment = "Operative" + registered_name = "Syndicate Operative" + access = list(ACCESS_SYNDICATE) + +/obj/item/card/id/syndi_scan_only/examine(mob/user) + . = ..() + if(isAntag(user)) + . += "Similar to an agent ID, this ID card can be used to copy accesses, but it lacks the customization and anti-tracking capabilities of an agent ID." + +/obj/item/card/id/syndi_scan_only/afterattack(obj/item/O, mob/user, proximity) + if(!proximity) + return + if(istype(O, /obj/item/card/id)) + var/obj/item/card/id/I = O + if(isliving(user) && user.mind) + if(user.mind.special_role) + to_chat(user, "The card's microscanners activate as you pass it over [I], copying its access.") + access |= I.access // Don't copy access if user isn't an antag -- to prevent metagaming diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 6cde633e30823..6bf01556f5134 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -152,15 +152,15 @@ popup.open() /obj/item/card/id/attack_self(mob/user as mob) - user.visible_message("[user] shows you: [bicon(src)] [src.name]. The assignment on the card: [src.assignment]",\ - "You flash your ID card: [bicon(src)] [src.name]. The assignment on the card: [src.assignment]") + user.visible_message("[user] shows you: [bicon(src)] [name]. The assignment on the card: [assignment]",\ + "You flash your ID card: [bicon(src)] [name]. The assignment on the card: [assignment]") if(mining_points) to_chat(user, "There's [mining_points] Mining Points loaded onto this card. This card has earned [total_mining_points] Mining Points this Shift!") - src.add_fingerprint(user) + add_fingerprint(user) return /obj/item/card/id/proc/UpdateName() - name = "[src.registered_name]'s ID Card ([src.assignment])" + name = "[registered_name]'s ID Card ([assignment])" /obj/item/card/id/proc/SetOwnerInfo(mob/living/carbon/human/H) if(!H || !H.dna) @@ -327,6 +327,13 @@ RebuildHTML() ..() +/obj/item/card/id/proc/flash_card(mob/user) + user.visible_message("[user] shows you: [bicon(src)] [name]. The assignment on the card: [assignment]",\ + "You flash your ID card: [bicon(src)] [name]. The assignment on the card: [assignment]") + if(mining_points) + to_chat(user, "There's [mining_points] Mining Points loaded onto this card. This card has earned [total_mining_points] Mining Points this Shift!") + add_fingerprint(user) + /obj/item/card/id/silver name = "identification card" desc = "A silver card which shows honour and dedication." @@ -339,327 +346,6 @@ icon_state = "gold" item_state = "gold_id" -/obj/item/card/id/syndicate - name = "agent card" - var/list/initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_EXTERNAL_AIRLOCKS) - origin_tech = "syndicate=1" - var/registered_user = null - untrackable = TRUE - -/obj/item/card/id/syndicate/researcher - initial_access = list(ACCESS_SYNDICATE) - assignment = "Syndicate Researcher" - icon_state = "syndie" - untrackable = TRUE - -/obj/item/card/id/syndicate/New() - access = initial_access.Copy() - ..() - -/obj/item/card/id/syndicate/vox - name = "agent card" - initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_VOX, ACCESS_EXTERNAL_AIRLOCKS) - -/obj/item/card/id/syndicate/ghost_bar - name = "ghost bar identification card" - assignment = "Ghost Bar Occupant" - initial_access = list() // This is for show, they don't need actual accesses - icon_state = "assistant" - -/obj/item/card/id/syndicate/command - initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS) - icon_state = "commander" - -/obj/item/card/id/syndicate/afterattack(obj/item/O as obj, mob/user as mob, proximity) - if(!proximity) - return - if(istype(O, /obj/item/card/id)) - var/obj/item/card/id/I = O - if(isliving(user) && user.mind) - if(user.mind.special_role) - to_chat(usr, "The card's microscanners activate as you pass it over \the [I], copying its access.") - src.access |= I.access //Don't copy access if user isn't an antag -- to prevent metagaming - -/obj/item/card/id/syndicate/attack_self(mob/user as mob) - if(!src.registered_name) - var/t = reject_bad_name(tgui_input_text(user, "What name would you like to use on this card?", "Agent Card name", ishuman(user) ? user.real_name : user.name), TRUE) - if(!t) - to_chat(user, "Invalid name.") - return - src.registered_name = t - - var/u = tgui_input_text(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than maintenance.", "Agent Card Job Assignment", "Agent", MAX_MESSAGE_LEN) - if(!u) - to_chat(user, "Invalid assignment.") - src.registered_name = "" - return - src.assignment = u - src.name = "[src.registered_name]'s ID Card ([src.assignment])" - to_chat(user, "You successfully forge the ID card.") - registered_user = user.mind.current - else if(!registered_user || registered_user == user.mind.current) - if(!registered_user) - registered_user = user.mind.current - - switch(tgui_alert(user, "Would you like to display [src] or edit it?", "Choose", list("Show", "Edit"))) - if("Show") - return ..() - if("Edit") - switch(tgui_input_list(user, "What would you like to edit on [src]?", "Agent ID", list("Name", "Photo", "Appearance", "Sex", "Age", "Occupation", "Money Account", "Blood Type", "DNA Hash", "Fingerprint Hash", "Reset Access", "Delete Card Information"))) - if("Name") - var/new_name = reject_bad_name(tgui_input_text(user, "What name would you like to put on this card?", "Agent Card Name", ishuman(user) ? user.real_name : user.name), TRUE) - if(!Adjacent(user) || !new_name) - return - src.registered_name = new_name - UpdateName() - to_chat(user, "Name changed to [new_name].") - RebuildHTML() - - if("Photo") - if(!Adjacent(user)) - return - var/job_clothes = null - if(assignment) - job_clothes = assignment - var/icon/newphoto = get_id_photo(user, job_clothes) - if(!newphoto) - return - photo = newphoto - to_chat(user, "Photo changed. Select another occupation and take a new photo if you wish to appear with different clothes.") - RebuildHTML() - - if("Appearance") - var/static/list/appearances = list( - "data", - "id", - "gold", - "silver", - "centcom", - "security", - "detective", - "warden", - "internalaffairsagent", - "medical", - "coroner", - "virologist", - "chemist", - "paramedic", - "psychiatrist", - "research", - "roboticist", - "quartermaster", - "cargo", - "shaftminer", - "engineering", - "atmostech", - "captain", - "HoP", - "HoS", - "CMO", - "RD", - "CE", - "assistant", - "clown", - "mime", - "botanist", - "librarian", - "chaplain", - "bartender", - "chef", - "janitor", - "explorer", - "rainbow", - "prisoner", - "syndie", - "deathsquad", - "commander", - "ERT_leader", - "ERT_security", - "ERT_engineering", - "ERT_medical", - "ERT_janitorial", - "ERT_paranormal", - ) - var/choice = tgui_input_list(user, "Select the appearance for this card.", "Agent Card Appearance", appearances) - if(!Adjacent(user) || !choice) - return - icon_state = choice - switch(choice) - if("silver") - desc = "A silver card which shows honour and dedication." - if("gold") - desc = "A golden card which shows power and might." - if("clown") - desc = "Even looking at the card strikes you with deep fear." - if("mime") - desc = "..." - if("prisoner") - desc = "You are a number, you are not a free man." - if("centcom") - desc = "An ID straight from Central Command." - else - desc = "A card used to provide ID and determine access across the station." - to_chat(usr, "Appearance changed to [choice].") - - if("Sex") - var/new_sex = tgui_input_text(user,"What sex would you like to put on this card?", "Agent Card Sex", ishuman(user) ? capitalize(user.gender) : "Male") - if(!Adjacent(user) || !new_sex) - return - sex = new_sex - to_chat(user, "Sex changed to [new_sex].") - RebuildHTML() - - if("Age") - var/default = "21" - if(ishuman(user)) - var/mob/living/carbon/human/H = user - default = H.age - var/new_age = tgui_input_number(user, "What age would you like to be written on this card?", "Agent Card Age", default, 300, 17) - if(!Adjacent(user) || isnull(new_age)) - return - age = new_age - to_chat(user, "Age changed to [new_age].") - RebuildHTML() - - if("Occupation") - var/static/list/departments = list( - "Assistant" = null, - "Engineering" = GLOB.engineering_positions, - "Medical" = GLOB.medical_positions, - "Science" = GLOB.science_positions, - "Security" = GLOB.security_positions, - "Service" = GLOB.service_positions, - "Supply" = GLOB.supply_positions, - "Command" = GLOB.command_positions, - "Custom" = null, - ) - - var/department = tgui_input_list(user, "What job would you like to put on this card?\nChoose a department or a custom job title.\nChanging occupation will not grant or remove any access levels.", "Agent Card Occupation", departments) - var/new_job = "Assistant" - - if(department == "Custom") - new_job = tgui_input_text(user, "Choose a custom job title:", "Agent Card Occupation", "Assistant") - else if(department != "Assistant" && !isnull(departments[department])) - new_job = tgui_input_list(user, "What job would you like to put on this card?\nChanging occupation will not grant or remove any access levels.", "Agent Card Occupation", departments[department]) - - if(!Adjacent(user) || !new_job) - return - assignment = new_job - to_chat(user, "Occupation changed to [new_job].") - UpdateName() - RebuildHTML() - - if("Money Account") - var/new_account = tgui_input_number(user, "What money account would you like to link to this card?", "Agent Card Account", 12345, max_value = 9999999) - if(!Adjacent(user) || isnull(new_account)) - return - associated_account_number = new_account - to_chat(user, "Linked money account changed to [new_account].") - - if("Blood Type") - var/default = "\[UNSET\]" - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna) - default = H.dna.blood_type - - var/new_blood_type = tgui_input_text(user, "What blood type would you like to be written on this card?", "Agent Card Blood Type", default) - if(!Adjacent(user) || !new_blood_type) - return - blood_type = new_blood_type - to_chat(user, "Blood type changed to [new_blood_type].") - RebuildHTML() - - if("DNA Hash") - var/default = "\[UNSET\]" - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna) - default = H.dna.unique_enzymes - - var/new_dna_hash = tgui_input_text(user, "What DNA hash would you like to be written on this card?", "Agent Card DNA Hash", default) - if(!Adjacent(user) || !new_dna_hash) - return - dna_hash = new_dna_hash - to_chat(user, "DNA hash changed to [new_dna_hash].") - RebuildHTML() - - if("Fingerprint Hash") - var/default = "\[UNSET\]" - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna) - default = md5(H.dna.uni_identity) - - var/new_fingerprint_hash = tgui_input_text(user, "What fingerprint hash would you like to be written on this card?", "Agent Card Fingerprint Hash", default) - if(!Adjacent(user) || !new_fingerprint_hash) - return - fingerprint_hash = new_fingerprint_hash - to_chat(user, "Fingerprint hash changed to [new_fingerprint_hash].") - RebuildHTML() - - if("Reset Access") - var/response = tgui_alert(user, "Are you sure you want to reset access saved on the card?", "Reset Access", list("No", "Yes")) - if(response == "Yes") - access = initial_access.Copy() // Initial() doesn't work on lists - to_chat(user, "Card access reset.") - - if("Delete Card Information") - var/response = tgui_alert(user, "Are you sure you want to delete all information saved on the card?", "Delete Card Information", list("No", "Yes")) - if(response == "Yes") - name = initial(name) - registered_name = initial(registered_name) - icon_state = initial(icon_state) - sex = initial(sex) - age = initial(age) - assignment = initial(assignment) - associated_account_number = initial(associated_account_number) - blood_type = initial(blood_type) - dna_hash = initial(dna_hash) - fingerprint_hash = initial(fingerprint_hash) - photo = null - registered_user = null - to_chat(user, "All information has been deleted from \the [src].") - RebuildHTML() - else - ..() - -/obj/item/card/id/syndicate/Destroy() - registered_user = null - return ..() - -/obj/item/card/id/syndicate_command - name = "syndicate ID card" - desc = "An ID straight from the Syndicate." - registered_name = "Syndicate" - icon_state = "syndie" - assignment = "Syndicate Overlord" - untrackable = TRUE - access = list(ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS) - -// like /obj/item/card/id/syndicate, but you can only swipe access, not change your identity, its also trackable -/obj/item/card/id/syndi_scan_only - name = "Syndicate Operative's ID card (Operative)" - rank = "Operative" - assignment = "Operative" - registered_name = "Syndicate Operative" - access = list(ACCESS_SYNDICATE) - -/obj/item/card/id/syndi_scan_only/examine(mob/user) - . = ..() - if(isAntag(user)) - . += "Similar to an agent ID, this ID card can be used to copy accesses, but it lacks the customization and anti-tracking capabilities of an agent ID." - -/obj/item/card/id/syndi_scan_only/afterattack(obj/item/O, mob/user, proximity) - if(!proximity) - return - if(istype(O, /obj/item/card/id)) - var/obj/item/card/id/I = O - if(isliving(user) && user.mind) - if(user.mind.special_role) - to_chat(user, "The card's microscanners activate as you pass it over [I], copying its access.") - access |= I.access // Don't copy access if user isn't an antag -- to prevent metagaming - /obj/item/card/id/captains_spare name = "captain's spare ID" desc = "The spare ID of the captain. Keep this secured." diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 4b67c9867856e..9f468b673fd1f 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -114,12 +114,15 @@ /obj/item/grenade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) var/obj/item/projectile/P = hitby if(damage && attack_type == PROJECTILE_ATTACK && P.damage_type != STAMINA && prob(15)) - owner.visible_message("[attack_text] hits [owner]'s [src], setting it off! What a shot!") + owner.visible_message("[hitby] hits [owner]'s [name], setting it off! What a shot!") var/turf/T = get_turf(src) log_game("A projectile ([hitby]) detonated a grenade held by [key_name(owner)] at [COORD(T)]") add_attack_logs(P.firer, owner, "A projectile ([hitby]) detonated a grenade held", ATKLOG_FEW) prime() - return 1 //It hit the grenade, not them + if(!QDELETED(src)) // some grenades don't detonate but we want them destroyed, otherwise you can just hold empty grenades as shields. + qdel(src) + return TRUE + return ..() /obj/item/grenade/chem_grenade/attackby(obj/item/I, mob/user, params) if(istype(I,/obj/item/hand_labeler)) diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 0d2c6535098d2..b51fb00bfd49e 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -11,6 +11,7 @@ slot_flags = ITEM_SLOT_BELT resistance_flags = FLAMMABLE max_integrity = 40 + flags_2 = RANDOM_BLOCKER_2 /// Has the pin been pulled? var/active = FALSE /// Time between the pin being pulled and detonation. diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm index 384f75a953fda..ef8c45d74f81a 100644 --- a/code/game/turfs/simulated/river.dm +++ b/code/game/turfs/simulated/river.dm @@ -107,7 +107,7 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets) else var/turf/river_turf = cur_turf.ChangeTurf(river_turf_type, ignore_air = TRUE) if(prob(1)) - new /obj/effect/spawner/bridge(river_turf) + new /obj/effect/spawner/dynamic_bridge(river_turf) spread_turf(river_turf, spread_prob, spread_prob_loss, whitelist_area_type) for(var/WP in river_nodes) @@ -135,7 +135,7 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets) if(!istype(T, start_turf.type) && T.ChangeTurf(start_turf.type, ignore_air = TRUE) && prob(probability)) spread_turf(T, probability - prob_loss, prob_loss, whitelisted_area) if(prob(1)) - new /obj/effect/spawner/bridge(T) + new /obj/effect/spawner/dynamic_bridge(T) for(var/F in diagonal_turfs) //diagonal turfs only sometimes change, but will always spread if changed var/turf/T = F @@ -144,7 +144,7 @@ GLOBAL_LIST_EMPTY(river_waypoint_presets) else if(istype(T, whitelist_turf_type) && !istype(T, start_turf.type)) T.ChangeTurf(shoreline_turf_type, ignore_air = TRUE) if(prob(1)) - new /obj/effect/spawner/bridge(T) + new /obj/effect/spawner/dynamic_bridge(T) #undef RIVER_MAX_X #undef RIVER_MAX_Y diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index eae1ba66320fb..497bb2bb8026f 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -22,7 +22,7 @@ GLOBAL_LIST_EMPTY(antagonists) /// Should we replace the role-banned player with a ghost? var/replace_banned = TRUE /// List of objectives connected to this datum. - var/datum/objective_holder/objective_holder + VAR_PRIVATE/datum/objective_holder/objective_holder /// Antagonist datum specific information that appears in the player's notes. Information stored here will be removed when the datum is removed from the player. var/antag_memory /// The special role that will be applied to the owner's `special_role` var. i.e. `SPECIAL_ROLE_TRAITOR`, `SPECIAL_ROLE_VAMPIRE`. @@ -283,22 +283,22 @@ GLOBAL_LIST_EMPTY(antagonists) */ /datum/antagonist/proc/has_antag_objectives(include_team = TRUE) . = FALSE - if(include_team) + . |= objective_holder.has_objectives() + if(!. && include_team) var/datum/team/team = get_team() if(istype(team)) . |= team.objective_holder.has_objectives() - . |= objective_holder.has_objectives() /** * Get all of this antagonist's objectives, including from the team. */ /datum/antagonist/proc/get_antag_objectives(include_team = TRUE) . = list() + . |= objective_holder.get_objectives() if(include_team) var/datum/team/team = get_team() if(istype(team)) . |= team.objective_holder.get_objectives() - . |= objective_holder.get_objectives() /** * Proc called when the datum is given to a mind. diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index e46251f852f4f..146cabfa1a476 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -517,7 +517,7 @@ flags = NODROP | DROPDEL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 20, BOMB = 10, RAD = 0, FIRE = 90, ACID = 90) - flags_inv = HIDEJUMPSUIT + flags_inv = HIDEJUMPSUIT | HIDESHOES cold_protection = 0 heat_protection = 0 sprite_sheets = null diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index d392e6fe5f674..71c9c97ca6c46 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -274,7 +274,7 @@ RESTRICT_TYPE(/datum/antagonist/traitor) return "[GLOB.current_date_string], [station_time_timestamp()]\n[station_name()], [get_area_name(owner.current, TRUE)]\nBEGIN_MISSION" /datum/antagonist/traitor/proc/reveal_delayed_objectives() - for(var/datum/objective/delayed/delayed_obj in objective_holder.objectives) + for(var/datum/objective/delayed/delayed_obj in get_antag_objectives(FALSE)) delayed_obj.reveal_objective() if(!owner?.current) diff --git a/code/modules/asset_cache/assets/asset_chem_master.dm b/code/modules/asset_cache/assets/asset_chem_master.dm index 7371b807289ac..8b5e867a1de1b 100644 --- a/code/modules/asset_cache/assets/asset_chem_master.dm +++ b/code/modules/asset_cache/assets/asset_chem_master.dm @@ -5,7 +5,7 @@ /datum/asset/spritesheet/chem_master/create_spritesheets() for(var/pill_type = 1 to 20) Insert("pill[pill_type]", 'icons/obj/chemical.dmi', "pill[pill_type]") - for(var/bottle_type in list("bottle", "small_bottle", "wide_bottle", "round_bottle", "reagent_bottle")) + for(var/bottle_type in list("bottle", "reagent_bottle")) Insert(bottle_type, 'icons/obj/chemical.dmi', bottle_type) /datum/asset/spritesheet/chem_master/ModifyInserted(icon/pre_asset) diff --git a/code/modules/asset_cache/assets/asset_job_icons.dm b/code/modules/asset_cache/assets/asset_job_icons.dm new file mode 100644 index 0000000000000..345ee7122c5ce --- /dev/null +++ b/code/modules/asset_cache/assets/asset_job_icons.dm @@ -0,0 +1,12 @@ +/// All job icon sprites, as visible on a security HUD. Used by orbit menu. +/datum/asset/spritesheet/job_icons + name = "job_icons" + +/datum/asset/spritesheet/job_icons/create_spritesheets() + var/list/states = GLOB.joblist + "prisoner" + "centcom" + "solgov" + "soviet" + "unknown" + for(var/state in states) + Insert(ckey(state), 'icons/mob/hud/job_assets.dmi', ckey(state)) + +/datum/asset/spritesheet/job_icons/ModifyInserted(icon/pre_asset) + pre_asset.Scale(16, 16) + return pre_asset diff --git a/code/modules/asset_cache/assets/asset_orbit_icons.dm b/code/modules/asset_cache/assets/asset_orbit_icons.dm deleted file mode 100644 index edc7c9923e1d4..0000000000000 --- a/code/modules/asset_cache/assets/asset_orbit_icons.dm +++ /dev/null @@ -1,12 +0,0 @@ -/// Sprites for Orbit Role UI -/datum/asset/spritesheet/orbit_job - name = "orbit_job" - -/datum/asset/spritesheet/orbit_job/create_spritesheets() - var/list/states = GLOB.joblist + "prisoner" + "centcom" + "solgov" + "soviet" + "unknown" - for(var/state in states) - Insert(ckey(state), 'icons/mob/hud/job_assets.dmi', ckey(state)) - -/datum/asset/spritesheet/orbit_job/ModifyInserted(icon/pre_asset) - pre_asset.Scale(16, 16) - return pre_asset diff --git a/code/modules/awaymissions/mission_code/ruins/nian_freighter.dm b/code/modules/awaymissions/mission_code/ruins/nian_freighter.dm new file mode 100644 index 0000000000000..9372018e5396b --- /dev/null +++ b/code/modules/awaymissions/mission_code/ruins/nian_freighter.dm @@ -0,0 +1,30 @@ +/obj/item/paper/fluff/ruins/nian_freighter/manifest + name = "Voidhopper of Nexus Shipping Manifest" + info = {" +
m;)d[m]=i[m++];return d}return S}(),k)},88739:function(T,r,n){"use strict";var e=n(4246),a=n(22603).some,t=e.aTypedArray,o=e.exportTypedArrayMethod;o("some",function(){function f(b){return a(t(this),b,arguments.length>1?arguments[1]:void 0)}return f}())},60415:function(T,r,n){"use strict";var e=n(74685),a=n(71138),t=n(40033),o=n(10320),f=n(90274),b=n(4246),k=n(652),S=n(19228),y=n(5026),h=n(9342),i=b.aTypedArray,c=b.exportTypedArrayMethod,m=e.Uint16Array,l=m&&a(m.prototype.sort),d=!!l&&!(t(function(){l(new m(2),null)})&&t(function(){l(new m(2),{})})),s=!!l&&!t(function(){if(y)return y<74;if(k)return k<67;if(S)return!0;if(h)return h<602;var v=new m(516),N=Array(516),C,p;for(C=0;C<516;C++)p=C%4,v[C]=515-C,N[C]=C-2*p+3;for(l(v,function(g,V){return(g/4|0)-(V/4|0)}),C=0;C<516;C++)if(v[C]!==N[C])return!0}),u=function(N){return function(C,p){return N!==void 0?+N(C,p)||0:p!==p?-1:C!==C?1:C===0&&p===0?1/C>0&&1/p<0?1:-1:C>p}};c("sort",function(){function v(N){return N!==void 0&&o(N),s?l(this,N):f(i(this),u(N))}return v}(),!s||d)},72532:function(T,r,n){"use strict";var e=n(4246),a=n(10188),t=n(13912),o=n(31082),f=e.aTypedArray,b=e.exportTypedArrayMethod;b("subarray",function(){function k(S,y){var h=f(this),i=h.length,c=t(S,i),m=o(h);return new m(h.buffer,h.byteOffset+c*h.BYTES_PER_ELEMENT,a((y===void 0?i:t(y,i))-c))}return k}())},62207:function(T,r,n){"use strict";var e=n(74685),a=n(61267),t=n(4246),o=n(40033),f=n(54602),b=e.Int8Array,k=t.aTypedArray,S=t.exportTypedArrayMethod,y=[].toLocaleString,h=!!b&&o(function(){y.call(new b(1))}),i=o(function(){return[1,2].toLocaleString()!==new b([1,2]).toLocaleString()})||!o(function(){b.prototype.toLocaleString.call([1,2])});S("toLocaleString",function(){function c(){return a(y,h?f(k(this)):k(this),f(arguments))}return c}(),i)},906:function(T,r,n){"use strict";var e=n(4246).exportTypedArrayMethod,a=n(40033),t=n(74685),o=n(67250),f=t.Uint8Array,b=f&&f.prototype||{},k=[].toString,S=o([].join);a(function(){k.call({})})&&(k=function(){function h(){return S(this)}return h}());var y=b.toString!==k;e("toString",k,y)},78824:function(T,r,n){"use strict";var e=n(80185);e("Uint16",function(a){return function(){function t(o,f,b){return a(this,o,f,b)}return t}()})},72846:function(T,r,n){"use strict";var e=n(80185);e("Uint32",function(a){return function(){function t(o,f,b){return a(this,o,f,b)}return t}()})},24575:function(T,r,n){"use strict";var e=n(80185);e("Uint8",function(a){return function(){function t(o,f,b){return a(this,o,f,b)}return t}()})},71968:function(T,r,n){"use strict";var e=n(80185);e("Uint8",function(a){return function(){function t(o,f,b){return a(this,o,f,b)}return t}()},!0)},80040:function(T,r,n){"use strict";var e=n(50730),a=n(74685),t=n(67250),o=n(30145),f=n(81969),b=n(45150),k=n(39895),S=n(77568),y=n(5419).enforce,h=n(40033),i=n(21820),c=Object,m=Array.isArray,l=c.isExtensible,d=c.isFrozen,s=c.isSealed,u=c.freeze,v=c.seal,N=!a.ActiveXObject&&"ActiveXObject"in a,C,p=function(E){return function(){function P(){return E(this,arguments.length?arguments[0]:void 0)}return P}()},g=b("WeakMap",p,k),V=g.prototype,B=t(V.set),I=function(){return e&&h(function(){var E=u([]);return B(new g,E,1),!d(E)})};if(i)if(N){C=k.getConstructor(p,"WeakMap",!0),f.enable();var L=t(V.delete),w=t(V.has),A=t(V.get);o(V,{delete:function(){function x(E){if(S(E)&&!l(E)){var P=y(this);return P.frozen||(P.frozen=new C),L(this,E)||P.frozen.delete(E)}return L(this,E)}return x}(),has:function(){function x(E){if(S(E)&&!l(E)){var P=y(this);return P.frozen||(P.frozen=new C),w(this,E)||P.frozen.has(E)}return w(this,E)}return x}(),get:function(){function x(E){if(S(E)&&!l(E)){var P=y(this);return P.frozen||(P.frozen=new C),w(this,E)?A(this,E):P.frozen.get(E)}return A(this,E)}return x}(),set:function(){function x(E,P){if(S(E)&&!l(E)){var D=y(this);D.frozen||(D.frozen=new C),w(this,E)?B(this,E,P):D.frozen.set(E,P)}else B(this,E,P);return this}return x}()})}else I()&&o(V,{set:function(){function x(E,P){var D;return m(E)&&(d(E)?D=u:s(E)&&(D=v)),B(this,E,P),D&&D(E),this}return x}()})},90846:function(T,r,n){"use strict";n(80040)},67042:function(T,r,n){"use strict";var e=n(45150),a=n(39895);e("WeakSet",function(t){return function(){function o(){return t(this,arguments.length?arguments[0]:void 0)}return o}()},a)},40348:function(T,r,n){"use strict";n(67042)},5606:function(T,r,n){"use strict";var e=n(63964),a=n(74685),t=n(60375).clear;e({global:!0,bind:!0,enumerable:!0,forced:a.clearImmediate!==t},{clearImmediate:t})},83006:function(T,r,n){"use strict";n(5606),n(27807)},25764:function(T,r,n){"use strict";var e=n(63964),a=n(74685),t=n(37713),o=n(10320),f=n(24986),b=n(40033),k=n(58310),S=b(function(){return k&&Object.getOwnPropertyDescriptor(a,"queueMicrotask").value.length!==1});e({global:!0,enumerable:!0,dontCallGetSet:!0,forced:S},{queueMicrotask:function(){function y(h){f(arguments.length,1),t(o(h))}return y}()})},27807:function(T,r,n){"use strict";var e=n(63964),a=n(74685),t=n(60375).set,o=n(78362),f=a.setImmediate?o(t,!1):t;e({global:!0,bind:!0,enumerable:!0,forced:a.setImmediate!==f},{setImmediate:f})},45569:function(T,r,n){"use strict";var e=n(63964),a=n(74685),t=n(78362),o=t(a.setInterval,!0);e({global:!0,bind:!0,forced:a.setInterval!==o},{setInterval:o})},5213:function(T,r,n){"use strict";var e=n(63964),a=n(74685),t=n(78362),o=t(a.setTimeout,!0);e({global:!0,bind:!0,forced:a.setTimeout!==o},{setTimeout:o})},69401:function(T,r,n){"use strict";n(45569),n(5213)},7435:function(T){"use strict";/**
+ */var t=r.BoxWithSampleText=function(){function o(f){return(0,e.normalizeProps)((0,e.createComponentVNode)(2,a.Box,Object.assign({},f,{children:[(0,e.createComponentVNode)(2,a.Box,{italic:!0,children:"Jackdaws love my big sphinx of quartz."}),(0,e.createComponentVNode)(2,a.Box,{mt:1,bold:!0,children:"The wide electrification of the southern provinces will give a powerful impetus to the growth of agriculture."})]})))}return o}()},67160:function(){},23542:function(){},30386:function(){},98996:function(){},50578:function(){},4444:function(){},77870:function(){},23632:function(){},56492:function(){},39108:function(){},11714:function(){},73492:function(){},49641:function(){},17570:function(){},61858:function(){},32882:function(){},70752:function(T,r,n){var e={"./pai_atmosphere.js":80818,"./pai_bioscan.js":23903,"./pai_directives.js":64988,"./pai_doorjack.js":13813,"./pai_main_menu.js":66025,"./pai_manifest.js":2983,"./pai_medrecords.js":40758,"./pai_messenger.js":98599,"./pai_radio.js":50775,"./pai_secrecords.js":48623,"./pai_signaler.js":47297};function a(o){var f=t(o);return n(f)}function t(o){if(!n.o(e,o)){var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}return e[o]}a.keys=function(){return Object.keys(e)},a.resolve=t,T.exports=a,a.id=70752},59395:function(T,r,n){var e={"./pda_atmos_scan.js":78532,"./pda_games.js":2395,"./pda_janitor.js":40253,"./pda_main_menu.js":58293,"./pda_manifest.js":58059,"./pda_medical.js":18147,"./pda_messenger.js":77595,"./pda_minesweeper.js":90382,"./pda_mule.js":24635,"./pda_nanobank.js":23734,"./pda_notes.js":97085,"./pda_power.js":57513,"./pda_secbot.js":99808,"./pda_security.js":77168,"./pda_signaler.js":21773,"./pda_status_display.js":81857,"./pda_supplyrecords.js":70287};function a(o){var f=t(o);return n(f)}function t(o){if(!n.o(e,o)){var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}return e[o]}a.keys=function(){return Object.keys(e)},a.resolve=t,T.exports=a,a.id=59395},32054:function(T,r,n){var e={"./AICard":1090,"./AICard.js":1090,"./AIFixer":39454,"./AIFixer.js":39454,"./APC":88422,"./APC.js":88422,"./ATM":99660,"./ATM.js":99660,"./AccountsUplinkTerminal":86423,"./AccountsUplinkTerminal.js":86423,"./AgentCard":39683,"./AgentCard.tsx":39683,"./AiAirlock":56793,"./AiAirlock.js":56793,"./AirAlarm":72475,"./AirAlarm.js":72475,"./AirlockAccessController":12333,"./AirlockAccessController.js":12333,"./AirlockElectronics":28736,"./AirlockElectronics.js":28736,"./AlertModal":47365,"./AlertModal.tsx":47365,"./AppearanceChanger":71824,"./AppearanceChanger.js":71824,"./AtmosAlertConsole":72285,"./AtmosAlertConsole.js":72285,"./AtmosControl":65805,"./AtmosControl.js":65805,"./AtmosFilter":87816,"./AtmosFilter.js":87816,"./AtmosMixer":52977,"./AtmosMixer.js":52977,"./AtmosPump":11748,"./AtmosPump.js":11748,"./AtmosTankControl":69321,"./AtmosTankControl.js":69321,"./AugmentMenu":92444,"./AugmentMenu.js":92444,"./Autolathe":59179,"./Autolathe.js":59179,"./BioChipPad":5147,"./BioChipPad.js":5147,"./Biogenerator":64273,"./Biogenerator.js":64273,"./BloomEdit":47823,"./BloomEdit.js":47823,"./BlueSpaceArtilleryControl":18621,"./BlueSpaceArtilleryControl.js":18621,"./BluespaceTap":27629,"./BluespaceTap.js":27629,"./BodyScanner":33758,"./BodyScanner.js":33758,"./BookBinder":67963,"./BookBinder.js":67963,"./BotCall":61925,"./BotCall.js":61925,"./BotClean":20464,"./BotClean.js":20464,"./BotFloor":69479,"./BotFloor.js":69479,"./BotHonk":59887,"./BotHonk.js":59887,"./BotMed":80063,"./BotMed.js":80063,"./BotSecurity":74439,"./BotSecurity.js":74439,"./BrigCells":10833,"./BrigCells.js":10833,"./BrigTimer":45761,"./BrigTimer.js":45761,"./CameraConsole":26300,"./CameraConsole.js":26300,"./Canister":52927,"./Canister.js":52927,"./CardComputer":51793,"./CardComputer.js":51793,"./CargoConsole":64083,"./CargoConsole.js":64083,"./Chameleon":36232,"./Chameleon.tsx":36232,"./ChangelogView":87331,"./ChangelogView.js":87331,"./CheckboxListInputModal":91360,"./CheckboxListInputModal.tsx":91360,"./ChemDispenser":36108,"./ChemDispenser.js":36108,"./ChemHeater":13146,"./ChemHeater.js":13146,"./ChemMaster":56541,"./ChemMaster.tsx":56541,"./CloningConsole":37173,"./CloningConsole.js":37173,"./CloningPod":98723,"./CloningPod.js":98723,"./CoinMint":18259,"./CoinMint.tsx":18259,"./ColorPickerModal":93858,"./ColorPickerModal.tsx":93858,"./ColourMatrixTester":8444,"./ColourMatrixTester.js":8444,"./CommunicationsComputer":63818,"./CommunicationsComputer.js":63818,"./CompostBin":20562,"./CompostBin.js":20562,"./Contractor":21813,"./Contractor.js":21813,"./ConveyorSwitch":54151,"./ConveyorSwitch.js":54151,"./CrewMonitor":73169,"./CrewMonitor.js":73169,"./Cryo":63987,"./Cryo.js":63987,"./CryopodConsole":86099,"./CryopodConsole.js":86099,"./DNAModifier":12692,"./DNAModifier.js":12692,"./DestinationTagger":41074,"./DestinationTagger.js":41074,"./DisposalBin":46500,"./DisposalBin.js":46500,"./DnaVault":33233,"./DnaVault.js":33233,"./DroneConsole":33681,"./DroneConsole.js":33681,"./EFTPOS":17263,"./EFTPOS.js":17263,"./ERTManager":76382,"./ERTManager.js":76382,"./EconomyManager":90217,"./EconomyManager.js":90217,"./Electropack":82565,"./Electropack.js":82565,"./Emojipedia":11243,"./Emojipedia.tsx":11243,"./EvolutionMenu":36730,"./EvolutionMenu.js":36730,"./ExosuitFabricator":17370,"./ExosuitFabricator.js":17370,"./ExperimentConsole":59128,"./ExperimentConsole.js":59128,"./ExternalAirlockController":97086,"./ExternalAirlockController.js":97086,"./FaxMachine":96142,"./FaxMachine.js":96142,"./FilingCabinet":74123,"./FilingCabinet.js":74123,"./FloorPainter":83767,"./FloorPainter.js":83767,"./GPS":53424,"./GPS.js":53424,"./GeneModder":89124,"./GeneModder.js":89124,"./GenericCrewManifest":73053,"./GenericCrewManifest.js":73053,"./GhostHudPanel":42914,"./GhostHudPanel.js":42914,"./GlandDispenser":25825,"./GlandDispenser.js":25825,"./GravityGen":10270,"./GravityGen.js":10270,"./GuestPass":48657,"./GuestPass.js":48657,"./HandheldChemDispenser":67834,"./HandheldChemDispenser.js":67834,"./HealthSensor":46098,"./HealthSensor.js":46098,"./Holodeck":36771,"./Holodeck.js":36771,"./Instrument":25471,"./Instrument.js":25471,"./KeyComboModal":13618,"./KeyComboModal.tsx":13618,"./KeycardAuth":35655,"./KeycardAuth.js":35655,"./KitchenMachine":62955,"./KitchenMachine.js":62955,"./LawManager":9525,"./LawManager.js":9525,"./LibraryComputer":85066,"./LibraryComputer.js":85066,"./LibraryManager":9516,"./LibraryManager.js":9516,"./ListInputModal":90447,"./ListInputModal.tsx":90447,"./Loadout":26826,"./Loadout.tsx":26826,"./MODsuit":77613,"./MODsuit.js":77613,"./MagnetController":78624,"./MagnetController.js":78624,"./MechBayConsole":72106,"./MechBayConsole.js":72106,"./MechaControlConsole":7466,"./MechaControlConsole.js":7466,"./MedicalRecords":79625,"./MedicalRecords.js":79625,"./MerchVendor":54989,"./MerchVendor.js":54989,"./MiningVendor":87684,"./MiningVendor.js":87684,"./NTRecruiter":59783,"./NTRecruiter.js":59783,"./Newscaster":64713,"./Newscaster.js":64713,"./Noticeboard":48286,"./Noticeboard.tsx":48286,"./NuclearBomb":41166,"./NuclearBomb.js":41166,"./NumberInputModal":52416,"./NumberInputModal.tsx":52416,"./OperatingComputer":1218,"./OperatingComputer.js":1218,"./Orbit":46892,"./Orbit.js":46892,"./OreRedemption":15421,"./OreRedemption.js":15421,"./PAI":52754,"./PAI.js":52754,"./PDA":85175,"./PDA.js":85175,"./Pacman":68654,"./Pacman.js":68654,"./PanDEMIC":1701,"./PanDEMIC.tsx":1701,"./ParticleAccelerator":67921,"./ParticleAccelerator.js":67921,"./PdaPainter":71432,"./PdaPainter.js":71432,"./PersonalCrafting":33388,"./PersonalCrafting.js":33388,"./Photocopier":56150,"./Photocopier.js":56150,"./PoolController":84676,"./PoolController.js":84676,"./PortablePump":57003,"./PortablePump.js":57003,"./PortableScrubber":70069,"./PortableScrubber.js":70069,"./PortableTurret":59955,"./PortableTurret.js":59955,"./PowerMonitor":61631,"./PowerMonitor.js":61631,"./PrisonerImplantManager":50992,"./PrisonerImplantManager.js":50992,"./PrisonerShuttleConsole":53952,"./PrisonerShuttleConsole.js":53952,"./PrizeCounter":97852,"./PrizeCounter.tsx":97852,"./RCD":94813,"./RCD.js":94813,"./RPD":18738,"./RPD.js":18738,"./Radio":80299,"./Radio.js":80299,"./RankedListInputModal":14846,"./RankedListInputModal.tsx":14846,"./ReagentGrinder":48125,"./ReagentGrinder.js":48125,"./ReagentsEditor":58262,"./ReagentsEditor.tsx":58262,"./RemoteSignaler":30207,"./RemoteSignaler.js":30207,"./RequestConsole":25472,"./RequestConsole.js":25472,"./RndBackupConsole":9861,"./RndBackupConsole.js":9861,"./RndConsole":12644,"./RndConsole/":12644,"./RndConsole/DataDiskMenu":37556,"./RndConsole/DataDiskMenu.js":37556,"./RndConsole/DeconstructionMenu":58147,"./RndConsole/DeconstructionMenu.js":58147,"./RndConsole/LatheCategory":16830,"./RndConsole/LatheCategory.js":16830,"./RndConsole/LatheChemicalStorage":70497,"./RndConsole/LatheChemicalStorage.js":70497,"./RndConsole/LatheMainMenu":70864,"./RndConsole/LatheMainMenu.js":70864,"./RndConsole/LatheMaterialStorage":42878,"./RndConsole/LatheMaterialStorage.js":42878,"./RndConsole/LatheMaterials":52662,"./RndConsole/LatheMaterials.js":52662,"./RndConsole/LatheMenu":9681,"./RndConsole/LatheMenu.js":9681,"./RndConsole/LatheSearch":68198,"./RndConsole/LatheSearch.js":68198,"./RndConsole/LinkMenu":81421,"./RndConsole/LinkMenu.js":81421,"./RndConsole/SettingsMenu":6256,"./RndConsole/SettingsMenu.js":6256,"./RndConsole/index":12644,"./RndConsole/index.js":12644,"./RndNetController":29205,"./RndNetController.js":29205,"./RndServer":63315,"./RndServer.js":63315,"./RobotSelfDiagnosis":26109,"./RobotSelfDiagnosis.js":26109,"./RoboticsControlConsole":97997,"./RoboticsControlConsole.js":97997,"./Safe":54431,"./Safe.js":54431,"./SatelliteControl":29740,"./SatelliteControl.js":29740,"./SecureStorage":44162,"./SecureStorage.js":44162,"./SecurityRecords":6272,"./SecurityRecords.js":6272,"./SeedExtractor":5099,"./SeedExtractor.js":5099,"./ShuttleConsole":2916,"./ShuttleConsole.js":2916,"./ShuttleManipulator":39401,"./ShuttleManipulator.js":39401,"./Sleeper":88284,"./Sleeper.js":88284,"./SlotMachine":21597,"./SlotMachine.js":21597,"./Smartfridge":46348,"./Smartfridge.js":46348,"./Smes":86162,"./Smes.js":86162,"./SolarControl":63584,"./SolarControl.js":63584,"./SpawnersMenu":38096,"./SpawnersMenu.js":38096,"./SpecMenu":30586,"./SpecMenu.js":30586,"./StackCraft":95152,"./StackCraft.js":95152,"./StationAlertConsole":38307,"./StationAlertConsole.js":38307,"./StationTraitsPanel":96091,"./StationTraitsPanel.tsx":96091,"./StripMenu":39409,"./StripMenu.tsx":39409,"./SuitStorage":69514,"./SuitStorage.js":69514,"./SupermatterMonitor":15022,"./SupermatterMonitor.js":15022,"./SyndicateComputerSimple":46029,"./SyndicateComputerSimple.js":46029,"./TEG":36372,"./TEG.js":36372,"./TachyonArray":56441,"./TachyonArray.js":56441,"./Tank":1754,"./Tank.js":1754,"./TankDispenser":7579,"./TankDispenser.js":7579,"./TcommsCore":16136,"./TcommsCore.js":16136,"./TcommsRelay":88046,"./TcommsRelay.js":88046,"./Teleporter":20802,"./Teleporter.js":20802,"./TelescienceConsole":48517,"./TelescienceConsole.js":48517,"./TempGun":21800,"./TempGun.js":21800,"./TextInputModal":24410,"./TextInputModal.tsx":24410,"./ThermoMachine":25036,"./ThermoMachine.js":25036,"./TransferValve":20035,"./TransferValve.js":20035,"./TurbineComputer":78166,"./TurbineComputer.js":78166,"./Uplink":52847,"./Uplink.js":52847,"./Vending":12261,"./Vending.js":12261,"./VolumeMixer":68971,"./VolumeMixer.js":68971,"./VotePanel":2510,"./VotePanel.js":2510,"./Wires":30138,"./Wires.js":30138,"./WizardApprenticeContract":21400,"./WizardApprenticeContract.js":21400,"./common/AccessList":49148,"./common/AccessList.js":49148,"./common/AtmosScan":26991,"./common/AtmosScan.js":26991,"./common/BeakerContents":85870,"./common/BeakerContents.js":85870,"./common/BotStatus":92963,"./common/BotStatus.js":92963,"./common/ComplexModal":3939,"./common/ComplexModal.js":3939,"./common/CrewManifest":41874,"./common/CrewManifest.js":41874,"./common/InputButtons":19203,"./common/InputButtons.tsx":19203,"./common/InterfaceLockNoticeBox":195,"./common/InterfaceLockNoticeBox.js":195,"./common/Loader":51057,"./common/Loader.tsx":51057,"./common/LoginInfo":321,"./common/LoginInfo.js":321,"./common/LoginScreen":5485,"./common/LoginScreen.js":5485,"./common/Operating":62411,"./common/Operating.js":62411,"./common/Signaler":13545,"./common/Signaler.js":13545,"./common/SimpleRecords":41984,"./common/SimpleRecords.js":41984,"./common/TemporaryNotice":22091,"./common/TemporaryNotice.js":22091,"./pai/pai_atmosphere":80818,"./pai/pai_atmosphere.js":80818,"./pai/pai_bioscan":23903,"./pai/pai_bioscan.js":23903,"./pai/pai_directives":64988,"./pai/pai_directives.js":64988,"./pai/pai_doorjack":13813,"./pai/pai_doorjack.js":13813,"./pai/pai_main_menu":66025,"./pai/pai_main_menu.js":66025,"./pai/pai_manifest":2983,"./pai/pai_manifest.js":2983,"./pai/pai_medrecords":40758,"./pai/pai_medrecords.js":40758,"./pai/pai_messenger":98599,"./pai/pai_messenger.js":98599,"./pai/pai_radio":50775,"./pai/pai_radio.js":50775,"./pai/pai_secrecords":48623,"./pai/pai_secrecords.js":48623,"./pai/pai_signaler":47297,"./pai/pai_signaler.js":47297,"./pda/pda_atmos_scan":78532,"./pda/pda_atmos_scan.js":78532,"./pda/pda_games":2395,"./pda/pda_games.js":2395,"./pda/pda_janitor":40253,"./pda/pda_janitor.js":40253,"./pda/pda_main_menu":58293,"./pda/pda_main_menu.js":58293,"./pda/pda_manifest":58059,"./pda/pda_manifest.js":58059,"./pda/pda_medical":18147,"./pda/pda_medical.js":18147,"./pda/pda_messenger":77595,"./pda/pda_messenger.js":77595,"./pda/pda_minesweeper":90382,"./pda/pda_minesweeper.js":90382,"./pda/pda_mule":24635,"./pda/pda_mule.js":24635,"./pda/pda_nanobank":23734,"./pda/pda_nanobank.js":23734,"./pda/pda_notes":97085,"./pda/pda_notes.js":97085,"./pda/pda_power":57513,"./pda/pda_power.js":57513,"./pda/pda_secbot":99808,"./pda/pda_secbot.js":99808,"./pda/pda_security":77168,"./pda/pda_security.js":77168,"./pda/pda_signaler":21773,"./pda/pda_signaler.js":21773,"./pda/pda_status_display":81857,"./pda/pda_status_display.js":81857,"./pda/pda_supplyrecords":70287,"./pda/pda_supplyrecords.js":70287};function a(o){var f=t(o);return n(f)}function t(o){if(!n.o(e,o)){var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}return e[o]}a.keys=function(){return Object.keys(e)},a.resolve=t,T.exports=a,a.id=32054},4085:function(T,r,n){var e={"./Blink.stories.js":51364,"./BlockQuote.stories.js":32453,"./Box.stories.js":83531,"./Button.stories.js":74198,"./ByondUi.stories.js":51956,"./Collapsible.stories.js":17466,"./Flex.stories.js":89241,"./ImageButton.stories.js":48779,"./Input.stories.js":21394,"./Popper.stories.js":43932,"./ProgressBar.stories.js":33270,"./Stack.stories.js":77766,"./Storage.stories.js":30187,"./Tabs.stories.js":46554,"./Themes.stories.js":53276,"./Tooltip.stories.js":28717};function a(o){var f=t(o);return n(f)}function t(o){if(!n.o(e,o)){var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}return e[o]}a.keys=function(){return Object.keys(e)},a.resolve=t,T.exports=a,a.id=4085},10320:function(T,r,n){"use strict";var e=n(55747),a=n(89393),t=TypeError;T.exports=function(o){if(e(o))return o;throw new t(a(o)+" is not a function")}},32606:function(T,r,n){"use strict";var e=n(1031),a=n(89393),t=TypeError;T.exports=function(o){if(e(o))return o;throw new t(a(o)+" is not a constructor")}},35908:function(T,r,n){"use strict";var e=n(45015),a=String,t=TypeError;T.exports=function(o){if(e(o))return o;throw new t("Can't set "+a(o)+" as a prototype")}},80575:function(T,r,n){"use strict";var e=n(24697),a=n(80674),t=n(74595).f,o=e("unscopables"),f=Array.prototype;f[o]===void 0&&t(f,o,{configurable:!0,value:a(null)}),T.exports=function(b){f[o][b]=!0}},35483:function(T,r,n){"use strict";var e=n(50233).charAt;T.exports=function(a,t,o){return t+(o?e(a,t).length:1)}},60077:function(T,r,n){"use strict";var e=n(21287),a=TypeError;T.exports=function(t,o){if(e(o,t))return t;throw new a("Incorrect invocation")}},30365:function(T,r,n){"use strict";var e=n(77568),a=String,t=TypeError;T.exports=function(o){if(e(o))return o;throw new t(a(o)+" is not an object")}},70377:function(T){"use strict";T.exports=typeof ArrayBuffer!="undefined"&&typeof DataView!="undefined"},3782:function(T,r,n){"use strict";var e=n(40033);T.exports=e(function(){if(typeof ArrayBuffer=="function"){var a=new ArrayBuffer(8);Object.isExtensible(a)&&Object.defineProperty(a,"a",{value:8})}})},4246:function(T,r,n){"use strict";var e=n(70377),a=n(58310),t=n(74685),o=n(55747),f=n(77568),b=n(45299),y=n(2281),S=n(89393),k=n(37909),h=n(55938),i=n(73936),c=n(21287),m=n(36917),l=n(76649),u=n(24697),s=n(16738),d=n(5419),v=d.enforce,g=d.get,C=t.Int8Array,p=C&&C.prototype,N=t.Uint8ClampedArray,V=N&&N.prototype,B=C&&m(C),I=p&&m(p),L=Object.prototype,w=t.TypeError,A=u("toStringTag"),x=s("TYPED_ARRAY_TAG"),E="TypedArrayConstructor",P=e&&!!l&&y(t.opera)!=="Opera",D=!1,M,O,R,F={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},W={BigInt64Array:8,BigUint64Array:8},U=function(){function ie(me){if(!f(me))return!1;var q=y(me);return q==="DataView"||b(F,q)||b(W,q)}return ie}(),z=function ie(me){var q=m(me);if(f(q)){var re=g(q);return re&&b(re,E)?re[E]:ie(q)}},$=function(me){if(!f(me))return!1;var q=y(me);return b(F,q)||b(W,q)},G=function(me){if($(me))return me;throw new w("Target is not a typed array")},X=function(me){if(o(me)&&(!l||c(B,me)))return me;throw new w(S(me)+" is not a typed array constructor")},Q=function(me,q,re,ae){if(a){if(re)for(var le in F){var Z=t[le];if(Z&&b(Z.prototype,me))try{delete Z.prototype[me]}catch(ne){try{Z.prototype[me]=q}catch(te){}}}(!I[me]||re)&&h(I,me,re?q:P&&p[me]||q,ae)}},se=function(me,q,re){var ae,le;if(a){if(l){if(re){for(ae in F)if(le=t[ae],le&&b(le,me))try{delete le[me]}catch(Z){}}if(!B[me]||re)try{return h(B,me,re?q:P&&B[me]||q)}catch(Z){}else return}for(ae in F)le=t[ae],le&&(!le[me]||re)&&h(le,me,q)}};for(M in F)O=t[M],R=O&&O.prototype,R?v(R)[E]=O:P=!1;for(M in W)O=t[M],R=O&&O.prototype,R&&(v(R)[E]=O);if((!P||!o(B)||B===Function.prototype)&&(B=function(){function ie(){throw new w("Incorrect invocation")}return ie}(),P))for(M in F)t[M]&&l(t[M],B);if((!P||!I||I===L)&&(I=B.prototype,P))for(M in F)t[M]&&l(t[M].prototype,I);if(P&&m(V)!==I&&l(V,I),a&&!b(I,A)){D=!0,i(I,A,{configurable:!0,get:function(){function ie(){return f(this)?this[x]:void 0}return ie}()});for(M in F)t[M]&&k(t[M],x,M)}T.exports={NATIVE_ARRAY_BUFFER_VIEWS:P,TYPED_ARRAY_TAG:D&&x,aTypedArray:G,aTypedArrayConstructor:X,exportTypedArrayMethod:Q,exportTypedArrayStaticMethod:se,getTypedArrayConstructor:z,isView:U,isTypedArray:$,TypedArray:B,TypedArrayPrototype:I}},37336:function(T,r,n){"use strict";var e=n(74685),a=n(67250),t=n(58310),o=n(70377),f=n(70520),b=n(37909),y=n(73936),S=n(30145),k=n(40033),h=n(60077),i=n(61365),c=n(10188),m=n(43806),l=n(95867),u=n(91784),s=n(36917),d=n(76649),v=n(88471),g=n(54602),C=n(5781),p=n(5774),N=n(84925),V=n(5419),B=f.PROPER,I=f.CONFIGURABLE,L="ArrayBuffer",w="DataView",A="prototype",x="Wrong length",E="Wrong index",P=V.getterFor(L),D=V.getterFor(w),M=V.set,O=e[L],R=O,F=R&&R[A],W=e[w],U=W&&W[A],z=Object.prototype,$=e.Array,G=e.RangeError,X=a(v),Q=a([].reverse),se=u.pack,ie=u.unpack,me=function(Ne){return[Ne&255]},q=function(Ne){return[Ne&255,Ne>>8&255]},re=function(Ne){return[Ne&255,Ne>>8&255,Ne>>16&255,Ne>>24&255]},ae=function(Ne){return Ne[3]<<24|Ne[2]<<16|Ne[1]<<8|Ne[0]},le=function(Ne){return se(l(Ne),23,4)},Z=function(Ne){return se(Ne,52,8)},ne=function(Ne,Be,be){y(Ne[A],Be,{configurable:!0,get:function(){function Le(){return be(this)[Be]}return Le}()})},te=function(Ne,Be,be,Le){var we=D(Ne),xe=m(be),Re=!!Le;if(xe+Be>we.byteLength)throw new G(E);var He=we.bytes,ye=xe+we.byteOffset,de=g(He,ye,ye+Be);return Re?de:Q(de)},pe=function(Ne,Be,be,Le,we,xe){var Re=D(Ne),He=m(be),ye=Le(+we),de=!!xe;if(He+Be>Re.byteLength)throw new G(E);for(var he=Re.bytes,ke=He+Re.byteOffset,ve=0;ve m;)u[m]=i[m++];return u}return S}(),y)},88739:function(T,r,n){"use strict";var e=n(4246),a=n(22603).some,t=e.aTypedArray,o=e.exportTypedArrayMethod;o("some",function(){function f(b){return a(t(this),b,arguments.length>1?arguments[1]:void 0)}return f}())},60415:function(T,r,n){"use strict";var e=n(74685),a=n(71138),t=n(40033),o=n(10320),f=n(90274),b=n(4246),y=n(652),S=n(19228),k=n(5026),h=n(9342),i=b.aTypedArray,c=b.exportTypedArrayMethod,m=e.Uint16Array,l=m&&a(m.prototype.sort),u=!!l&&!(t(function(){l(new m(2),null)})&&t(function(){l(new m(2),{})})),s=!!l&&!t(function(){if(k)return k<74;if(y)return y<67;if(S)return!0;if(h)return h<602;var v=new m(516),g=Array(516),C,p;for(C=0;C<516;C++)p=C%4,v[C]=515-C,g[C]=C-2*p+3;for(l(v,function(N,V){return(N/4|0)-(V/4|0)}),C=0;C<516;C++)if(v[C]!==g[C])return!0}),d=function(g){return function(C,p){return g!==void 0?+g(C,p)||0:p!==p?-1:C!==C?1:C===0&&p===0?1/C>0&&1/p<0?1:-1:C>p}};c("sort",function(){function v(g){return g!==void 0&&o(g),s?l(this,g):f(i(this),d(g))}return v}(),!s||u)},72532:function(T,r,n){"use strict";var e=n(4246),a=n(10188),t=n(13912),o=n(31082),f=e.aTypedArray,b=e.exportTypedArrayMethod;b("subarray",function(){function y(S,k){var h=f(this),i=h.length,c=t(S,i),m=o(h);return new m(h.buffer,h.byteOffset+c*h.BYTES_PER_ELEMENT,a((k===void 0?i:t(k,i))-c))}return y}())},62207:function(T,r,n){"use strict";var e=n(74685),a=n(61267),t=n(4246),o=n(40033),f=n(54602),b=e.Int8Array,y=t.aTypedArray,S=t.exportTypedArrayMethod,k=[].toLocaleString,h=!!b&&o(function(){k.call(new b(1))}),i=o(function(){return[1,2].toLocaleString()!==new b([1,2]).toLocaleString()})||!o(function(){b.prototype.toLocaleString.call([1,2])});S("toLocaleString",function(){function c(){return a(k,h?f(y(this)):y(this),f(arguments))}return c}(),i)},906:function(T,r,n){"use strict";var e=n(4246).exportTypedArrayMethod,a=n(40033),t=n(74685),o=n(67250),f=t.Uint8Array,b=f&&f.prototype||{},y=[].toString,S=o([].join);a(function(){y.call({})})&&(y=function(){function h(){return S(this)}return h}());var k=b.toString!==y;e("toString",y,k)},78824:function(T,r,n){"use strict";var e=n(80185);e("Uint16",function(a){return function(){function t(o,f,b){return a(this,o,f,b)}return t}()})},72846:function(T,r,n){"use strict";var e=n(80185);e("Uint32",function(a){return function(){function t(o,f,b){return a(this,o,f,b)}return t}()})},24575:function(T,r,n){"use strict";var e=n(80185);e("Uint8",function(a){return function(){function t(o,f,b){return a(this,o,f,b)}return t}()})},71968:function(T,r,n){"use strict";var e=n(80185);e("Uint8",function(a){return function(){function t(o,f,b){return a(this,o,f,b)}return t}()},!0)},80040:function(T,r,n){"use strict";var e=n(50730),a=n(74685),t=n(67250),o=n(30145),f=n(81969),b=n(45150),y=n(39895),S=n(77568),k=n(5419).enforce,h=n(40033),i=n(21820),c=Object,m=Array.isArray,l=c.isExtensible,u=c.isFrozen,s=c.isSealed,d=c.freeze,v=c.seal,g=!a.ActiveXObject&&"ActiveXObject"in a,C,p=function(E){return function(){function P(){return E(this,arguments.length?arguments[0]:void 0)}return P}()},N=b("WeakMap",p,y),V=N.prototype,B=t(V.set),I=function(){return e&&h(function(){var E=d([]);return B(new N,E,1),!u(E)})};if(i)if(g){C=y.getConstructor(p,"WeakMap",!0),f.enable();var L=t(V.delete),w=t(V.has),A=t(V.get);o(V,{delete:function(){function x(E){if(S(E)&&!l(E)){var P=k(this);return P.frozen||(P.frozen=new C),L(this,E)||P.frozen.delete(E)}return L(this,E)}return x}(),has:function(){function x(E){if(S(E)&&!l(E)){var P=k(this);return P.frozen||(P.frozen=new C),w(this,E)||P.frozen.has(E)}return w(this,E)}return x}(),get:function(){function x(E){if(S(E)&&!l(E)){var P=k(this);return P.frozen||(P.frozen=new C),w(this,E)?A(this,E):P.frozen.get(E)}return A(this,E)}return x}(),set:function(){function x(E,P){if(S(E)&&!l(E)){var D=k(this);D.frozen||(D.frozen=new C),w(this,E)?B(this,E,P):D.frozen.set(E,P)}else B(this,E,P);return this}return x}()})}else I()&&o(V,{set:function(){function x(E,P){var D;return m(E)&&(u(E)?D=d:s(E)&&(D=v)),B(this,E,P),D&&D(E),this}return x}()})},90846:function(T,r,n){"use strict";n(80040)},67042:function(T,r,n){"use strict";var e=n(45150),a=n(39895);e("WeakSet",function(t){return function(){function o(){return t(this,arguments.length?arguments[0]:void 0)}return o}()},a)},40348:function(T,r,n){"use strict";n(67042)},5606:function(T,r,n){"use strict";var e=n(63964),a=n(74685),t=n(60375).clear;e({global:!0,bind:!0,enumerable:!0,forced:a.clearImmediate!==t},{clearImmediate:t})},83006:function(T,r,n){"use strict";n(5606),n(27807)},25764:function(T,r,n){"use strict";var e=n(63964),a=n(74685),t=n(37713),o=n(10320),f=n(24986),b=n(40033),y=n(58310),S=b(function(){return y&&Object.getOwnPropertyDescriptor(a,"queueMicrotask").value.length!==1});e({global:!0,enumerable:!0,dontCallGetSet:!0,forced:S},{queueMicrotask:function(){function k(h){f(arguments.length,1),t(o(h))}return k}()})},27807:function(T,r,n){"use strict";var e=n(63964),a=n(74685),t=n(60375).set,o=n(78362),f=a.setImmediate?o(t,!1):t;e({global:!0,bind:!0,enumerable:!0,forced:a.setImmediate!==f},{setImmediate:f})},45569:function(T,r,n){"use strict";var e=n(63964),a=n(74685),t=n(78362),o=t(a.setInterval,!0);e({global:!0,bind:!0,forced:a.setInterval!==o},{setInterval:o})},5213:function(T,r,n){"use strict";var e=n(63964),a=n(74685),t=n(78362),o=t(a.setTimeout,!0);e({global:!0,bind:!0,forced:a.setTimeout!==o},{setTimeout:o})},69401:function(T,r,n){"use strict";n(45569),n(5213)},7435:function(T){"use strict";/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */var r,n=[],e=[],a=function(){if(0)var y;window.onunload=function(){return r&&r.close()}},t=function(y){return e.push(y)},o=function(y){var h=[],i=function(d){return typeof d=="number"&&!Number.isFinite(d)?{__number__:String(d)}:typeof d=="undefined"?{__undefined__:!0}:d},c=function(d,s){if(typeof s=="object"){if(s===null)return s;if(h.includes(s))return"[circular ref]";h.push(s);var u=s instanceof Error||s.code&&s.message&&s.message.includes("Error");return u?{__error__:!0,string:String(s),stack:s.stack}:Array.isArray(s)?s.map(i):s}return i(s)},m=JSON.stringify(y,c);return h=null,m},f=function(y){if(0)var h,i,c},b=function(y,h){if(0)var i,c,m},k=function(){};T.exports={subscribe:t,sendMessage:f,sendLogEntry:b,setupHotReloading:k}}},yt={};function Y(T){var r=yt[T];if(r!==void 0)return r.exports;var n=yt[T]={exports:{}};return Qt[T](n,n.exports,Y),n.exports}(function(){Y.g=function(){if(typeof globalThis=="object")return globalThis;try{return this||new Function("return this")()}catch(T){if(typeof window=="object")return window}}()})(),function(){Y.o=function(T,r){return Object.prototype.hasOwnProperty.call(T,r)}}();var Rn={};(function(){"use strict";Y(33313),Y(10933),Y(79250),Y(53795),Y(87806),Y(64677),Y(48058),Y(51583),Y(82403),Y(34265),Y(3295),Y(1078),Y(63207),Y(80520),Y(39600),Y(93237),Y(32057),Y(68933),Y(47830),Y(13455),Y(64094),Y(61915),Y(32384),Y(25579),Y(63532),Y(33425),Y(43894),Y(99636),Y(34570),Y(94432),Y(24683),Y(69984),Y(32089),Y(60206),Y(29645),Y(4788),Y(58672),Y(19356),Y(48968),Y(49852),Y(2712),Y(864),Y(54243),Y(75621),Y(26267),Y(50095),Y(33451),Y(74587),Y(25082),Y(47421),Y(32122),Y(6306),Y(90216),Y(84663),Y(92332),Y(98329),Y(9631),Y(47091),Y(59660),Y(15383),Y(92866),Y(86107),Y(29248),Y(52540),Y(79007),Y(77199),Y(6522),Y(95542),Y(2966),Y(20997),Y(57400),Y(45571),Y(54800),Y(15709),Y(76059),Y(96614),Y(324),Y(90426),Y(95443),Y(87968),Y(55007),Y(55323),Y(13521),Y(5006),Y(99009),Y(85770),Y(23532),Y(87119),Y(78618),Y(27129),Y(31943),Y(3579),Y(97397),Y(85028),Y(8225),Y(43331),Y(62289),Y(56196),Y(2950),Y(44205),Y(76882),Y(83186),Y(76065),Y(13411),Y(26634),Y(53118),Y(42514),Y(84353),Y(62987),Y(48993),Y(52917),Y(4972),Y(28913),Y(36382),Y(53092),Y(69861),Y(29674),Y(81543),Y(9373),Y(45093),Y(63074),Y(5815),Y(88527),Y(66390),Y(7784),Y(50551),Y(76483),Y(92046),Y(63915),Y(51454),Y(79669),Y(23057),Y(57983),Y(17953),Y(30442),Y(6403),Y(9867),Y(43673),Y(12354),Y(22515),Y(5143),Y(93514),Y(5416),Y(11619),Y(44590),Y(63272),Y(39930),Y(4038),Y(8448),Y(70604),Y(34965),Y(95309),Y(82256),Y(49484),Y(38931),Y(39308),Y(91550),Y(75008),Y(56027),Y(50340),Y(34325),Y(74498),Y(15812),Y(57726),Y(80756),Y(70567),Y(66756),Y(60037),Y(44195),Y(24575),Y(71968),Y(78824),Y(72846),Y(99872),Y(73364),Y(58166),Y(23793),Y(43820),Y(13917),Y(19852),Y(40379),Y(92770),Y(81069),Y(63689),Y(5659),Y(25014),Y(32189),Y(23030),Y(24309),Y(49110),Y(56445),Y(30939),Y(48321),Y(88739),Y(60415),Y(72532),Y(62207),Y(906),Y(90846),Y(40348),Y(83006),Y(25764),Y(69401),Y(95012),Y(30236)})(),function(){"use strict";var T=Y(89005);Y(67160),Y(23542),Y(30386),Y(98996),Y(50578),Y(4444),Y(77870),Y(39108),Y(11714),Y(73492),Y(49641),Y(17570),Y(61858),Y(32882),Y(23632),Y(56492);var r=Y(85822),n=Y(7435),e=Y(56518),a=Y(26427),t=Y(18498),o=Y(49060),f=Y(72178),b=Y(24826),k;/**
+ */var r,n=[],e=[],a=function(){if(0)var k;window.onunload=function(){return r&&r.close()}},t=function(k){return e.push(k)},o=function(k){var h=[],i=function(u){return typeof u=="number"&&!Number.isFinite(u)?{__number__:String(u)}:typeof u=="undefined"?{__undefined__:!0}:u},c=function(u,s){if(typeof s=="object"){if(s===null)return s;if(h.includes(s))return"[circular ref]";h.push(s);var d=s instanceof Error||s.code&&s.message&&s.message.includes("Error");return d?{__error__:!0,string:String(s),stack:s.stack}:Array.isArray(s)?s.map(i):s}return i(s)},m=JSON.stringify(k,c);return h=null,m},f=function(k){if(0)var h,i,c},b=function(k,h){if(0)var i,c,m},y=function(){};T.exports={subscribe:t,sendMessage:f,sendLogEntry:b,setupHotReloading:y}}},kt={};function Y(T){var r=kt[T];if(r!==void 0)return r.exports;var n=kt[T]={exports:{}};return Qt[T](n,n.exports,Y),n.exports}(function(){Y.g=function(){if(typeof globalThis=="object")return globalThis;try{return this||new Function("return this")()}catch(T){if(typeof window=="object")return window}}()})(),function(){Y.o=function(T,r){return Object.prototype.hasOwnProperty.call(T,r)}}();var Rn={};(function(){"use strict";Y(33313),Y(10933),Y(79250),Y(53795),Y(87806),Y(64677),Y(48058),Y(51583),Y(82403),Y(34265),Y(3295),Y(1078),Y(63207),Y(80520),Y(39600),Y(93237),Y(32057),Y(68933),Y(47830),Y(13455),Y(64094),Y(61915),Y(32384),Y(25579),Y(63532),Y(33425),Y(43894),Y(99636),Y(34570),Y(94432),Y(24683),Y(69984),Y(32089),Y(60206),Y(29645),Y(4788),Y(58672),Y(19356),Y(48968),Y(49852),Y(2712),Y(864),Y(54243),Y(75621),Y(26267),Y(50095),Y(33451),Y(74587),Y(25082),Y(47421),Y(32122),Y(6306),Y(90216),Y(84663),Y(92332),Y(98329),Y(9631),Y(47091),Y(59660),Y(15383),Y(92866),Y(86107),Y(29248),Y(52540),Y(79007),Y(77199),Y(6522),Y(95542),Y(2966),Y(20997),Y(57400),Y(45571),Y(54800),Y(15709),Y(76059),Y(96614),Y(324),Y(90426),Y(95443),Y(87968),Y(55007),Y(55323),Y(13521),Y(5006),Y(99009),Y(85770),Y(23532),Y(87119),Y(78618),Y(27129),Y(31943),Y(3579),Y(97397),Y(85028),Y(8225),Y(43331),Y(62289),Y(56196),Y(2950),Y(44205),Y(76882),Y(83186),Y(76065),Y(13411),Y(26634),Y(53118),Y(42514),Y(84353),Y(62987),Y(48993),Y(52917),Y(4972),Y(28913),Y(36382),Y(53092),Y(69861),Y(29674),Y(81543),Y(9373),Y(45093),Y(63074),Y(5815),Y(88527),Y(66390),Y(7784),Y(50551),Y(76483),Y(92046),Y(63915),Y(51454),Y(79669),Y(23057),Y(57983),Y(17953),Y(30442),Y(6403),Y(9867),Y(43673),Y(12354),Y(22515),Y(5143),Y(93514),Y(5416),Y(11619),Y(44590),Y(63272),Y(39930),Y(4038),Y(8448),Y(70604),Y(34965),Y(95309),Y(82256),Y(49484),Y(38931),Y(39308),Y(91550),Y(75008),Y(56027),Y(50340),Y(34325),Y(74498),Y(15812),Y(57726),Y(80756),Y(70567),Y(66756),Y(60037),Y(44195),Y(24575),Y(71968),Y(78824),Y(72846),Y(99872),Y(73364),Y(58166),Y(23793),Y(43820),Y(13917),Y(19852),Y(40379),Y(92770),Y(81069),Y(63689),Y(5659),Y(25014),Y(32189),Y(23030),Y(24309),Y(49110),Y(56445),Y(30939),Y(48321),Y(88739),Y(60415),Y(72532),Y(62207),Y(906),Y(90846),Y(40348),Y(83006),Y(25764),Y(69401),Y(95012),Y(30236)})(),function(){"use strict";var T=Y(89005);Y(67160),Y(23542),Y(30386),Y(98996),Y(50578),Y(4444),Y(77870),Y(39108),Y(11714),Y(73492),Y(49641),Y(17570),Y(61858),Y(32882),Y(23632),Y(56492);var r=Y(85822),n=Y(7435),e=Y(56518),a=Y(26427),t=Y(18498),o=Y(49060),f=Y(72178),b=Y(24826),y;/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */r.perf.mark("inception",(k=window.performance)==null||(k=k.timing)==null?void 0:k.navigationStart),r.perf.mark("init");var S=(0,f.configureStore)(),y=(0,o.createRenderer)(function(){(0,a.loadIconRefMap)();var i=Y(71253),c=i.getRoutedComponent,m=c(S);return(0,T.createComponentVNode)(2,f.StoreProvider,{store:S,children:(0,T.createComponentVNode)(2,m)})}),h=function i(){if(document.readyState==="loading"){document.addEventListener("DOMContentLoaded",i);return}(0,b.setupGlobalEvents)(),(0,e.setupHotKeys)(),(0,t.captureExternalLinks)(),S.subscribe(y),Byond.subscribe(function(c,m){return S.dispatch({type:c,payload:m})})};h()}()})();})();
+ */r.perf.mark("inception",(y=window.performance)==null||(y=y.timing)==null?void 0:y.navigationStart),r.perf.mark("init");var S=(0,f.configureStore)(),k=(0,o.createRenderer)(function(){(0,a.loadIconRefMap)();var i=Y(71253),c=i.getRoutedComponent,m=c(S);return(0,T.createComponentVNode)(2,f.StoreProvider,{store:S,children:(0,T.createComponentVNode)(2,m)})}),h=function i(){if(document.readyState==="loading"){document.addEventListener("DOMContentLoaded",i);return}(0,b.setupGlobalEvents)(),(0,e.setupHotKeys)(),(0,t.captureExternalLinks)(),S.subscribe(k),Byond.subscribe(function(c,m){return S.dispatch({type:c,payload:m})})};h()}()})();})();
1?arguments[1]:void 0,1),g=b(d);if(l)return a(i,this,g,v);var C=this.length,p=o(g),N=0;if(p+v>C)throw new S("Wrong length");for(;N