diff --git a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm index 6a957e3350a..b90406f23bd 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm @@ -477,9 +477,7 @@ dir = 6 }, /obj/structure/table, -/obj/item/storage/firstaid/regular{ - pixel_y = 0 - }, +/obj/item/storage/firstaid/regular, /turf/simulated/floor/catwalk/airless, /area/ruin/space/unpowered) "bv" = ( @@ -1277,7 +1275,7 @@ /area/ruin/space/deepstorage) "gq" = ( /obj/structure/rack, -/obj/effect/spawner/random/bluespace_tap/cultural, +/obj/effect/spawner/random/bluespace_tap/cultural_rare, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "vault" @@ -2659,7 +2657,7 @@ /obj/item/salvage/ruin/soviet, /obj/structure/rack, /obj/item/stack/spacecash/c500, -/obj/effect/spawner/random/bluespace_tap/cultural, +/obj/effect/spawner/random/bluespace_tap/cultural_rare, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "vault" @@ -2669,7 +2667,7 @@ /obj/structure/rack, /obj/effect/turf_decal/delivery/hollow, /obj/item/stack/spacecash/c500, -/obj/effect/spawner/random/bluespace_tap/organic, +/obj/effect/spawner/random/bluespace_tap/organic_rare, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "vault" @@ -5468,7 +5466,7 @@ "IR" = ( /obj/effect/turf_decal/delivery/hollow, /obj/structure/rack, -/obj/effect/spawner/random/bluespace_tap/organic, +/obj/effect/spawner/random/bluespace_tap/organic_rare, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "vault" diff --git a/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm b/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm index 580f1915200..9263dfe5d4c 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/telecomns_returns.dmm @@ -32,7 +32,6 @@ dir = 8 }, /obj/structure/sign/vacuum{ - pixel_x = 0; pixel_y = 32 }, /obj/structure/cable{ @@ -175,9 +174,7 @@ "dB" = ( /obj/machinery/power/smes{ charge = 2.5e+006; - input_attempt = 1; - input_level = 200000; - inputting = 1 + input_level = 200000 }, /obj/structure/cable{ icon_state = "0-4" @@ -246,8 +243,7 @@ /obj/structure/sign/securearea{ desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/foyer) @@ -319,8 +315,7 @@ /area/ruin/space/telecomms/chamber) "gm" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/tele) @@ -333,8 +328,7 @@ icon_state = "1-4" }, /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /turf/simulated/floor/catwalk/airless, /area/space/nearstation/no_teleport) @@ -376,9 +370,7 @@ dir = 4 }, /obj/item/radio/intercom{ - name = "station intercom (General)"; - pixel_x = 29; - pixel_y = 0 + pixel_x = 29 }, /obj/effect/spawner/random/maintenance, /turf/simulated/floor/plasteel, @@ -467,8 +459,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/machinery/door/firedoor, /turf/simulated/floor/catwalk, @@ -510,8 +501,7 @@ icon_state = "1-8" }, /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /turf/simulated/floor/catwalk/airless, /area/space/nearstation/no_teleport) @@ -539,8 +529,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/catwalk, /area/ruin/space/telecomms/powercontrol) @@ -608,7 +597,7 @@ /area/space/nearstation/no_teleport) "mD" = ( /obj/structure/table, -/obj/effect/spawner/random/bluespace_tap/organic, +/obj/effect/spawner/random/bluespace_tap/organic_uncommon, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms) "mH" = ( @@ -624,8 +613,7 @@ /area/ruin/space/telecomms) "mO" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/structure/grille, /turf/simulated/floor/catwalk/airless, @@ -661,8 +649,7 @@ /area/ruin/space/telecomms/chamber) "np" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/computer) @@ -714,10 +701,9 @@ "nS" = ( /obj/structure/table, /obj/machinery/status_display{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, -/obj/effect/spawner/random/bluespace_tap/cultural, +/obj/effect/spawner/random/bluespace_tap/cultural_rare, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms) "oe" = ( @@ -749,9 +735,7 @@ "oz" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 1; - external_pressure_bound = 101.325; - on = 1; - pressure_checks = 1 + on = 1 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/foyer) @@ -763,8 +747,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5; - level = 1 + dir = 5 }, /turf/simulated/floor/catwalk, /area/ruin/space/telecomms) @@ -815,8 +798,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/foyer) @@ -845,8 +827,7 @@ /area/ruin/space/telecomms/computer) "qe" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /turf/simulated/floor/bluegrid{ name = "Mainframe Base"; @@ -890,9 +871,7 @@ /obj/item/storage/toolbox/mechanical, /obj/machinery/atmospherics/unary/vent_pump{ dir = 1; - external_pressure_bound = 101.325; - on = 1; - pressure_checks = 1 + on = 1 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms) @@ -990,8 +969,7 @@ /area/ruin/space/telecomms/computer) "sH" = ( /obj/structure/sign/nosmoking_2{ - pixel_x = -32; - pixel_y = 0 + pixel_x = -32 }, /turf/simulated/floor/bluegrid{ name = "Mainframe Base"; @@ -1010,7 +988,6 @@ on = 1 }, /obj/machinery/status_display{ - pixel_x = 0; pixel_y = 32 }, /obj/structure/table, @@ -1027,7 +1004,6 @@ dir = 4 }, /obj/machinery/status_display{ - pixel_x = 0; pixel_y = 32 }, /turf/simulated/floor/catwalk, @@ -1055,9 +1031,7 @@ /area/ruin/space/telecomms) "tx" = ( /obj/item/radio/intercom{ - name = "station intercom (General)"; pixel_x = 29; - pixel_y = 0; broadcasting = 1 }, /obj/machinery/bluespace_beacon, @@ -1092,7 +1066,6 @@ dir = 1 }, /obj/machinery/status_display{ - pixel_x = 0; pixel_y = 32 }, /obj/item/salvage/ruin/nanotrasen{ @@ -1102,9 +1075,7 @@ /area/ruin/space/telecomms/computer) "tF" = ( /obj/item/radio/intercom{ - name = "station intercom (General)"; - pixel_x = 29; - pixel_y = 0 + pixel_x = 29 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/computer) @@ -1127,9 +1098,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - level = 1 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/catwalk, /area/ruin/space/telecomms) "ul" = ( @@ -1157,8 +1126,7 @@ /area/ruin/space/telecomms/foyer) "uT" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/machinery/light{ dir = 1 @@ -1179,7 +1147,6 @@ /area/ruin/space/telecomms) "ve" = ( /obj/machinery/status_display{ - pixel_x = 0; pixel_y = 32 }, /turf/simulated/floor/bluegrid{ @@ -1215,8 +1182,7 @@ dir = 4 }, /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/effect/decal/cleanable/blood/old, /obj/structure/window/reinforced{ @@ -1244,8 +1210,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/tele) @@ -1269,9 +1234,7 @@ "wA" = ( /obj/machinery/power/smes{ charge = 2.5e+006; - input_attempt = 1; - input_level = 200000; - inputting = 1 + input_level = 200000 }, /obj/structure/cable, /turf/simulated/floor/bluegrid{ @@ -1322,8 +1285,7 @@ /obj/structure/lattice, /obj/structure/grille, /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /turf/simulated/floor/plating/airless, /area/space/nearstation/no_teleport) @@ -1332,8 +1294,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1; - level = 1 + dir = 1 }, /turf/simulated/floor/catwalk, /area/ruin/space/telecomms) @@ -1352,8 +1313,7 @@ dir = 4 }, /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /turf/simulated/floor/catwalk, /area/ruin/space/telecomms) @@ -1416,8 +1376,7 @@ /area/ruin/space/telecomms) "yC" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/machinery/recharge_station/upgraded, /mob/living/simple_animal/hostile/hivebot/strong/malfborg, @@ -1456,8 +1415,7 @@ /area/ruin/space/telecomms/tele) "yN" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/machinery/door/airlock/hatch/syndicate/command/trapped, /obj/item/radio/intercom{ @@ -1569,8 +1527,7 @@ "Az" = ( /obj/structure/lattice, /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/structure/grille, /turf/simulated/floor/plating/airless, @@ -1599,8 +1556,7 @@ /area/ruin/space/telecomms) "AY" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/structure/window/reinforced{ dir = 4 @@ -1611,8 +1567,7 @@ /obj/structure/sign/securearea{ desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/foyer) @@ -1690,8 +1645,7 @@ "CD" = ( /obj/structure/grille, /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/structure/cable{ icon_state = "2-4" @@ -1807,8 +1761,7 @@ /area/space/no_teleport) "Ew" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/machinery/camera/tracking_head/dvorak, /turf/simulated/floor/bluegrid{ @@ -1854,8 +1807,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /turf/template_noop, /area/space/nearstation/no_teleport) @@ -1878,8 +1830,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9; - level = 1 + dir = 9 }, /obj/structure/lattice, /turf/template_noop, @@ -1889,8 +1840,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/structure/barricade/sandbags, /turf/simulated/floor/plasteel, @@ -1898,8 +1848,7 @@ "FA" = ( /obj/structure/sign/securearea{ desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = 0 + name = "SERVER ROOM" }, /turf/simulated/wall/indestructible/riveted, /area/ruin/space/telecomms/chamber) @@ -1953,7 +1902,6 @@ dir = 10 }, /obj/machinery/status_display{ - pixel_x = 0; pixel_y = 32 }, /turf/simulated/floor/plasteel, @@ -2040,8 +1988,7 @@ icon_state = "2-4" }, /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /turf/simulated/floor/catwalk/airless, /area/space/nearstation/no_teleport) @@ -2093,8 +2040,7 @@ /area/ruin/space/telecomms) "Ig" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /turf/simulated/floor/catwalk/airless, /area/space/nearstation/no_teleport) @@ -2271,8 +2217,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/tele) @@ -2320,9 +2265,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - level = 1 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/window/reinforced{ dir = 4 }, @@ -2433,20 +2376,17 @@ /area/space/nearstation/no_teleport) "Px" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/structure/girder/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9; - level = 1 + dir = 9 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/computer) "PA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /turf/simulated/floor/catwalk, /area/ruin/space/telecomms/powercontrol) @@ -2473,8 +2413,7 @@ /area/space/no_teleport) "Qf" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/machinery/light/small{ dir = 1 @@ -2489,7 +2428,7 @@ /area/ruin/space/telecomms/tele) "Qg" = ( /obj/structure/table, -/obj/effect/spawner/random/bluespace_tap/cultural, +/obj/effect/spawner/random/bluespace_tap/cultural_rare, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms) "Qx" = ( @@ -2507,8 +2446,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /obj/structure/lattice, /turf/template_noop, @@ -2616,9 +2554,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - level = 1 - }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, /turf/simulated/floor/catwalk, /area/ruin/space/telecomms) "Sn" = ( @@ -2627,8 +2563,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/tele) @@ -2730,8 +2665,7 @@ /area/space/no_teleport) "Uw" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/tele) @@ -2746,9 +2680,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - level = 1 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/telecomms_trap_tank, /obj/effect/abstract/cheese_trap, /turf/simulated/floor/catwalk, @@ -2770,16 +2702,14 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4; - initialize_directions = 11; - level = 1 + initialize_directions = 11 }, /obj/structure/lattice, /turf/template_noop, /area/space/nearstation/no_teleport) "Vb" = ( /obj/structure/sign/nosmoking_2{ - pixel_x = 32; - pixel_y = 0 + pixel_x = 32 }, /obj/machinery/light{ dir = 4 @@ -2816,8 +2746,7 @@ /area/ruin/space/telecomms/computer) "VO" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/machinery/light/small{ dir = 1 @@ -2861,8 +2790,7 @@ /area/ruin/space/telecomms) "WO" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/machinery/firealarm/directional/north, /turf/simulated/floor/plasteel, @@ -2885,8 +2813,7 @@ /area/ruin/space/telecomms/chamber) "Xb" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1; - level = 1 + dir = 1 }, /turf/simulated/floor/plasteel, /area/ruin/space/telecomms/foyer) @@ -3028,8 +2955,7 @@ /area/ruin/space/telecomms/powercontrol) "Zt" = ( /obj/structure/cable{ - icon_state = "4-8"; - pixel_x = 0 + icon_state = "4-8" }, /obj/machinery/camera/tracking_head/dvorak{ dir = 1 @@ -3046,8 +2972,7 @@ /area/ruin/space/telecomms/chamber) "ZB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 + dir = 4 }, /obj/effect/spawner/random/oil/often, /turf/simulated/floor/catwalk, diff --git a/code/game/objects/effects/spawners/random/bluespace_tap_spawners.dm b/code/game/objects/effects/spawners/random/bluespace_tap_spawners.dm index 25b21a26954..77f011d04ab 100644 --- a/code/game/objects/effects/spawners/random/bluespace_tap_spawners.dm +++ b/code/game/objects/effects/spawners/random/bluespace_tap_spawners.dm @@ -2,10 +2,11 @@ name = "bluespace harvester reward spawner" spawn_loot_count = 1 -/obj/effect/spawner/random/bluespace_tap/hat - name = "exotic hat" +// Common clothing pool +/obj/effect/spawner/random/bluespace_tap/clothes_common + name = "exotic common clothing" loot = list( - /obj/item/clothing/head/collectable/chef, //same weighing on all of them + /obj/item/clothing/head/collectable/chef, /obj/item/clothing/head/collectable/paper, /obj/item/clothing/head/collectable/tophat, /obj/item/clothing/head/collectable/captain, @@ -13,9 +14,7 @@ /obj/item/clothing/head/collectable/welding, /obj/item/clothing/head/collectable/flatcap, /obj/item/clothing/head/collectable/pirate, - /obj/item/clothing/head/collectable/kitty, /obj/item/clothing/head/crown/fancy, - /obj/item/clothing/head/collectable/rabbitears, /obj/item/clothing/head/collectable/wizard, /obj/item/clothing/head/collectable/hardhat, /obj/item/clothing/head/collectable/hos, @@ -25,90 +24,198 @@ /obj/item/clothing/head/collectable/police, /obj/item/clothing/head/collectable/slime, /obj/item/clothing/head/collectable/xenom, - /obj/item/clothing/head/collectable/petehat + /obj/item/clothing/head/collectable/petehat, + /obj/item/clothing/under/retro/medical, + /obj/item/clothing/under/retro/engineering, + /obj/item/clothing/under/retro/science, + /obj/item/clothing/under/retro/security, + /obj/item/clothing/under/costume/captain_fly, + /obj/item/clothing/under/costume/mankini, + /obj/item/clothing/under/costume/janimaid, + /obj/item/clothing/under/costume/psyjump ) - -/obj/effect/spawner/random/bluespace_tap/cultural - name = "cultural artifacts" +// Uncommon Clothing Pool +/obj/effect/spawner/random/bluespace_tap/clothes_uncommon + name = "exotic uncommon clothing" loot = list( - /obj/vehicle/space/speedbike/red = 10, - /obj/item/grenade/clusterbuster/honk = 10, - /obj/item/toy/katana = 10, - /obj/item/stack/tile/brass/fifty = 20, - /obj/item/stack/sheet/mineral/abductor/fifty = 20, - /obj/item/sord = 20, - /obj/item/toy/syndicateballoon = 15, - /obj/item/lighter/zippo/gonzofist = 5, - /obj/item/lighter/zippo/engraved = 5, - /obj/item/lighter/zippo/nt_rep = 5, - /obj/item/gun/projectile/automatic/c20r/toy = 1, - /obj/item/gun/projectile/automatic/l6_saw/toy = 1, - /obj/item/gun/projectile/automatic/toy/pistol = 2, - /obj/item/gun/projectile/automatic/toy/pistol/enforcer = 1, - /obj/item/gun/projectile/shotgun/toy = 1, - /obj/item/gun/projectile/shotgun/toy/crossbow = 1, - /obj/item/gun/projectile/shotgun/toy/tommygun = 1, - /obj/item/gun/projectile/automatic/sniper_rifle/toy = 1, - /obj/item/dualsaber/toy = 5, - /obj/machinery/snow_machine = 10, - /obj/item/clothing/head/kitty = 5, - /obj/item/coin/antagtoken = 5, - /obj/item/toy/prizeball/action_figure = 15, - /obj/item/toy/prizeball/therapy = 10, - /obj/item/bedsheet/patriot = 2, - /obj/item/bedsheet/rainbow = 2, - /obj/item/bedsheet/captain = 2, - /obj/item/bedsheet/centcom = 1, //mythic rare rarity - /obj/item/bedsheet/syndie = 2, - /obj/item/bedsheet/cult = 2, - /obj/item/bedsheet/wiz = 2, - /obj/item/stack/sheet/mineral/tranquillite/fifty = 3, - /obj/item/clothing/gloves/combat = 5, - /obj/item/blank_tarot_card = 5, - /obj/item/tarot_card_pack = 5, - /obj/item/tarot_card_pack/jumbo = 3, - /obj/item/tarot_card_pack/mega = 2 + /obj/item/clothing/head/collectable/kitty, + /obj/item/clothing/head/collectable/rabbitears, + /obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/armor/vest/bloody, + /obj/item/clothing/suit/armor/riot, + /obj/item/clothing/suit/armor/riot/knight, + /obj/item/clothing/suit/armor/vest/durathread, + /obj/item/clothing/suit/armor/bulletproof, + /obj/item/clothing/suit/storage/iaa/blackjacket/armored, + /obj/item/clothing/suit/hooded/goliath, + /obj/item/clothing/suit/armor/bone, + /obj/item/clothing/under/chameleon, + /obj/item/clothing/glasses/chameleon, + /obj/item/clothing/gloves/chameleon, + /obj/item/clothing/head/chameleon, + /obj/item/clothing/mask/chameleon, + /obj/item/clothing/mask/chameleon/voice_change, + /obj/item/clothing/shoes/chameleon, + /obj/item/clothing/shoes/chameleon/noslip, + /obj/item/storage/belt/chameleon, + /obj/item/clothing/head/helmet, + /obj/item/clothing/head/helmet/riot, + /obj/item/clothing/head/helmet/riot/knight, + /obj/item/clothing/head/helmet/alt ) -/obj/effect/spawner/random/bluespace_tap/organic - name = "organic objects" +// Rare clothing pool +/obj/effect/spawner/random/bluespace_tap/clothes_rare + name = "exotic rare clothing" loot = list( - /obj/item/seeds/random/labelled = 50, - /obj/item/guardiancreator/biological = 5, - /obj/item/organ/internal/vocal_cords/adamantine = 15, - /obj/item/storage/pill_bottle/random_meds/labelled = 25, - /obj/item/reagent_containers/glass/bottle/reagent/omnizine = 15, - /obj/item/dnainjector/telemut = 5, - /obj/item/dnainjector/small_size = 5, - /obj/item/dnainjector/morph = 5, - /obj/item/dnainjector/regenerate = 5, - /mob/living/simple_animal/pet/dog/corgi/ = 5, - /mob/living/simple_animal/pet/cat = 5, - /mob/living/simple_animal/pet/dog/fox/ = 5, - /mob/living/simple_animal/pet/penguin/baby = 5, - /mob/living/simple_animal/pig = 5, - /obj/item/slimepotion/sentience = 5, - /obj/item/clothing/mask/cigarette/cigar/havana = 3, - /obj/item/stack/sheet/mineral/bananium/fifty = 2, //bananas are organic, clearly. - /obj/item/storage/box/monkeycubes = 5, - /obj/item/stack/tile/carpet/twenty = 10, - /obj/item/stack/tile/carpet/black/twenty = 10, - /obj/item/soap/deluxe = 5 + /obj/item/clothing/suit/armor/swat, + /obj/item/clothing/suit/armor/laserproof, + /obj/item/clothing/suit/hooded/drake, + /obj/item/clothing/glasses/chameleon/night, + /obj/item/clothing/head/helmet/meson, + /obj/item/clothing/head/helmet/justice, + /obj/item/clothing/head/helmet/swat, + /obj/item/mod/control/pre_equipped/standard, + /obj/item/mod/control/pre_equipped/engineering, + /obj/item/mod/control/pre_equipped/atmospheric, + /obj/item/mod/control/pre_equipped/loader, + /obj/item/mod/control/pre_equipped/mining, + /obj/item/mod/control/pre_equipped/rescue, + /obj/item/mod/control/pre_equipped/security, + /obj/item/mod/control/pre_equipped/cosmohonk ) -/obj/effect/spawner/random/bluespace_tap/food - name = "fancy food" - spawn_loot_count = 3 +// Common cultural pool +/obj/effect/spawner/random/bluespace_tap/cultural_common + name = "common cultural artifacts" + loot = list( + /obj/item/grenade/clusterbuster/honk, + /obj/item/stack/sheet/mineral/abductor/fifty, + /obj/item/toy/syndicateballoon, + /obj/item/lighter/zippo/gonzofist, + /obj/item/lighter/zippo/engraved, + /obj/item/gun/projectile/automatic/toy/pistol, + /obj/item/gun/projectile/shotgun/toy, + /obj/item/gun/projectile/shotgun/toy/crossbow, + /obj/item/gun/projectile/shotgun/toy/tommygun, + /obj/machinery/snow_machine, + /obj/item/clothing/head/kitty, + /obj/item/coin/antagtoken, + /obj/item/bedsheet/patriot, + /obj/item/bedsheet/rainbow, + /obj/item/bedsheet/captain, + /obj/item/bikehorn/golden, + /obj/item/salvage/ruin/brick, + /obj/item/toy/sword, + /obj/item/toy/windup_toolbox, + /obj/item/toy/foamblade, + /obj/item/toy/redbutton, + /obj/item/toy/figure/crew/ce, + /obj/item/toy/figure/crew/syndie, + /obj/item/stack/sheet/mineral/tranquillite/thirty, + /obj/item/stack/sheet/mineral/bananium/thirty + ) + +// Uncommon cultural pool +/obj/effect/spawner/random/bluespace_tap/cultural_uncommon + name = "uncommon cultural artifacts" + loot = list( + /obj/item/gun/projectile/automatic/c20r/toy, + /obj/item/dualsaber/toy, + /obj/item/gun/projectile/automatic/toy/pistol/enforcer, + /obj/item/bedsheet/syndie, + /obj/item/bedsheet/wiz, + /obj/item/clothing/gloves/combat, + /obj/item/blank_tarot_card, + /obj/item/storage/box/syndie_kit/space, + /obj/item/wrench/brass, + /obj/item/crowbar/brass, + /obj/item/screwdriver/brass, + /obj/item/weldingtool/experimental/brass, + /obj/item/wirecutters/brass + ) + +// Rare cultural pool +/obj/effect/spawner/random/bluespace_tap/cultural_rare + name = "rare cultural artifacts" + loot = list( + /obj/vehicle/space/speedbike/red, + /obj/item/gun/projectile/automatic/l6_saw/toy, + /obj/item/gun/projectile/automatic/sniper_rifle/toy, + /obj/item/bedsheet/centcom, + /obj/item/tarot_card_pack, + /obj/item/clothing/mask/holo_cigar, + /obj/item/melee/baseball_bat/homerun, + /obj/item/mod/module/dispenser, + /obj/item/storage/box/enforcer_rubber, + /obj/item/storage/belt/utility/brass + ) + +// Common organic pool +/obj/effect/spawner/random/bluespace_tap/organic_common + name = "common organic objects" + loot = list( + /obj/item/soap/syndie, + /obj/item/dnainjector/telemut, + /obj/item/dnainjector/small_size, + /obj/item/dnainjector/morph, + /obj/item/dnainjector/regenerate, + /obj/item/dnainjector/firemut, + /obj/item/dnainjector/nobreath, + /obj/item/dnainjector/remoteview, + /obj/item/dnainjector/insulation, + /obj/item/dnainjector/eatmut, + /obj/item/dnainjector/noprints, + /obj/item/dnainjector/comic, + /obj/item/seeds/random/labelled, + /obj/item/organ/internal/regenerative_core, + /obj/item/reagent_containers/glass/bottle/reagent/omnizine, + /obj/item/reagent_containers/glass/bottle/reagent/lazarus_reagent + ) + +// Uncommon organic pool +/obj/effect/spawner/random/bluespace_tap/organic_uncommon + name = "uncommon organic objects" + loot = list( + /obj/item/storage/pill_bottle/random_meds/labelled, + /obj/item/dnainjector/hulkmut, + /obj/item/organ/internal/alien/plasmavessel, + /obj/item/organ/internal/alien/acidgland, + /obj/item/organ/internal/alien/hivenode, + /obj/item/organ/internal/alien/neurotoxin, + /obj/item/organ/internal/alien/resinspinner, + /obj/item/organ/internal/alien/eggsac, + /obj/item/organ/internal/heart/gland/heals, + /obj/item/organ/internal/heart/gland/ventcrawling, + /obj/item/organ/internal/heart/gland/egg, + /obj/item/slimepotion/fireproof, + /obj/item/slimepotion/oil_slick + ) + +// Rare organic pool +/obj/effect/spawner/random/bluespace_tap/organic_rare + name = "rare organic objects" + loot = list( + /obj/item/guardiancreator/biological, + /obj/item/organ/internal/vocal_cords/adamantine, + /obj/item/food/grown/shell/gatfruit, + /obj/item/food/grown/cherry_bomb, + /obj/item/bio_chip_implanter/storage, + /obj/item/slimepotion/sentience, + /obj/item/slimepotion/transference + ) + +// Common food pool +/obj/effect/spawner/random/bluespace_tap/food_common + name = "common fancy food" + spawn_loot_count = 1 loot = list( /obj/item/food/wingfangchu, /obj/item/food/hotdog, - /obj/item/food/sliceable/turkey, + /obj/item/food/cookie, /obj/item/food/plumphelmetbiscuit, /obj/item/food/appletart, - /obj/item/food/sliceable/cheesecake, - /obj/item/food/sliceable/bananacake, - /obj/item/food/sliceable/chocolatecake, /obj/item/food/soup/meatballsoup, /obj/item/food/soup/mysterysoup, /obj/item/food/soup/stew, @@ -118,6 +225,73 @@ /obj/item/food/cubancarp, /obj/item/food/fishandchips, /obj/item/food/meatpie, - /obj/item/pizzabox/hawaiian, //it ONLY gives hawaiian. MUHAHAHA - /obj/item/food/sliceable/xenomeatbread //maybe add some dangerous/special food here, ie robobuger? + /obj/item/pizzabox/hawaiian, + /obj/item/food/fortunecookie, + /obj/item/food/sugarcookie, + /obj/item/food/pie, + /obj/item/food/donut/sprinkles, + /obj/item/food/chinese/rice, + /obj/item/food/pancake, + /obj/item/food/chawanmushi, + /obj/item/food/syntikebab, + /obj/item/food/salad/citrusdelight, + /obj/item/food/donkpocket, + /obj/item/food/onionrings, + /obj/item/food/tatortot, + /obj/item/food/stuffing, + /obj/item/food/waffles + ) + +// Uncommon food pool +/obj/effect/spawner/random/bluespace_tap/food_uncommon + name = "uncommon fancy food" + spawn_loot_count = 1 + loot = list( + /obj/item/food/sliceable/cheesecake, + /obj/item/food/sliceable/bananacake, + /obj/item/food/sliceable/chocolatecake, + /obj/item/food/sliceable/turkey, + /obj/item/food/sliceable/xenomeatbread, + /obj/item/food/amanita_pie, + /obj/item/food/xemeatpie, + /obj/item/food/sliceable/pumpkinpie, + /obj/item/food/donut/chaos, + /obj/item/pizzabox/meat, + /obj/item/pizzabox/pepperoni, + /obj/item/pizzabox/firecracker, + /obj/item/pizzabox/garlic, + /obj/item/food/burger/xeno, + /obj/item/food/burger/spell, + /obj/item/food/burger/superbite, + /obj/item/food/burger/crazy, + /obj/item/food/burger/ppatty/white, + /obj/item/food/burger/ppatty/red, + /obj/item/food/burger/ppatty/orange, + /obj/item/food/burger/ppatty/yellow, + /obj/item/food/burger/ppatty/green, + /obj/item/food/burger/ppatty/blue, + /obj/item/food/burger/ppatty/purple, + /obj/item/food/baguette, + /obj/item/food/rofflewaffles + ) + +// Rare food pool +/obj/effect/spawner/random/bluespace_tap/food_rare + name = "rare fancy food" + spawn_loot_count = 1 + loot = list( + /obj/item/food/monkeysdelight, + /obj/item/food/dionaroast, + /obj/item/food/boiledslimecore, + /obj/item/food/burger/brain, + /obj/item/food/liquidfood, + /obj/item/food/burger/ghost, + /obj/item/food/burger/hamborger, + /obj/item/food/burger/ppatty/rainbow, + /obj/item/food/burger/elec, + /obj/item/food/notasandwich, + /obj/item/storage/box/papersack/pbj_lunch, + /obj/item/food/soylentviridians, + /obj/item/food/syndidonkpocket, + /obj/item/food/baguette/combat ) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 5f45c2e3a02..57efa152294 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -393,6 +393,9 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( /obj/item/stack/sheet/mineral/bananium/ten amount = 10 +/obj/item/stack/sheet/mineral/bananium/thirty + amount = 30 + /obj/item/stack/sheet/mineral/bananium/fifty amount = 50 @@ -424,6 +427,9 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( /obj/item/stack/sheet/mineral/tranquillite/ten amount = 10 +/obj/item/stack/sheet/mineral/tranquillite/thirty + amount = 30 + /obj/item/stack/sheet/mineral/tranquillite/fifty amount = 50 diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index bb1605fae8e..90fcf07f58b 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -135,6 +135,14 @@ new /obj/item/extinguisher/mini(src) update_icon() +/obj/item/storage/belt/utility/brass/populate_contents() + new /obj/item/wrench/brass(src) + new /obj/item/crowbar/brass(src) + new /obj/item/screwdriver/brass(src) + new /obj/item/weldingtool/experimental/brass(src) + new /obj/item/wirecutters/brass(src) + update_icon() + /obj/item/storage/belt/utility/chief name = "advanced toolbelt" desc = "Holds tools, looks snazzy, and fits nicely into a bag." diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index e91d653d796..e1217702645 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -1049,6 +1049,14 @@ return return ..() +/obj/item/storage/box/papersack/pbj_lunch + name = "peanut butter and jelly lunch" + desc = "A paper sack filled with enough sandwiches to feed a department." + +/obj/item/storage/box/papersack/pbj_lunch/populate_contents() + for(var/i in 1 to 10) + new /obj/item/food/peanut_butter_jelly(src) + /obj/item/storage/box/relay_kit name = "telecommunications relay kit" desc = "Contains everything you need to set up your own telecommunications array!" diff --git a/code/modules/power/engines/supermatter/engineering_event.dm b/code/modules/power/engines/supermatter/engineering_event.dm new file mode 100644 index 00000000000..ab0db7f5b6a --- /dev/null +++ b/code/modules/power/engines/supermatter/engineering_event.dm @@ -0,0 +1,25 @@ +/datum/engi_event + var/name = "Unknown Engi Event (Report this to coders)" + /// The severity of the event + var/threat_level + /// How long the event lasts + var/duration + +/// Starts an event +/datum/engi_event/proc/start_event() + on_start() + return + +/// To be executed once an event has been started +/datum/engi_event/proc/on_start() + alert_engi() + if(duration) + addtimer(CALLBACK(src, PROC_REF(on_end)), duration) + +/// Send an alert to engineering about the event +/datum/engi_event/proc/alert_engi() + return + +/// What happens when an event ends. +/datum/engi_event/proc/on_end() + return diff --git a/code/modules/power/engines/supermatter/supermatter.dm b/code/modules/power/engines/supermatter/supermatter.dm index 7c6aaee0828..030c507cfc2 100644 --- a/code/modules/power/engines/supermatter/supermatter.dm +++ b/code/modules/power/engines/supermatter/supermatter.dm @@ -218,7 +218,7 @@ //vars used for supermatter events (Anomalous crystal activityw) /// Do we have an active event? - var/datum/supermatter_event/event_active + var/datum/engi_event/supermatter_event/event_active ///flat multiplies the amount of gas released by the SM. var/gas_multiplier = 1 ///flat multiplies the heat released by the SM @@ -1235,20 +1235,20 @@ return if(event_active) return - var/static/list/events = list(/datum/supermatter_event/delta_tier = 40, - /datum/supermatter_event/charlie_tier = 40, - /datum/supermatter_event/bravo_tier = 15, - /datum/supermatter_event/alpha_tier = 5, - /datum/supermatter_event/sierra_tier = 1) + var/static/list/events = list(/datum/engi_event/supermatter_event/delta_tier = 40, + /datum/engi_event/supermatter_event/charlie_tier = 40, + /datum/engi_event/supermatter_event/bravo_tier = 15, + /datum/engi_event/supermatter_event/alpha_tier = 5, + /datum/engi_event/supermatter_event/sierra_tier = 1) - var/datum/supermatter_event/event = pick(subtypesof(pickweight(events))) - if(ispath(event, /datum/supermatter_event/sierra_tier) && has_run_sclass) + var/datum/engi_event/supermatter_event/event = pick(subtypesof(pickweight(events))) + if(ispath(event, /datum/engi_event/supermatter_event/sierra_tier) && has_run_sclass) make_next_event_time() return // We're only gonna have one s-class per round, take a break engineers run_event(event) make_next_event_time() -/obj/machinery/atmospherics/supermatter_crystal/proc/run_event(datum/supermatter_event/event) // mostly admin testing and stuff +/obj/machinery/atmospherics/supermatter_crystal/proc/run_event(datum/engi_event/supermatter_event/event) // mostly admin testing and stuff if(ispath(event)) event = new event(src) if(!istype(event)) diff --git a/code/modules/power/engines/supermatter/supermatter_event.dm b/code/modules/power/engines/supermatter/supermatter_event.dm index f418db3a546..6ac84546407 100644 --- a/code/modules/power/engines/supermatter/supermatter_event.dm +++ b/code/modules/power/engines/supermatter/supermatter_event.dm @@ -1,37 +1,25 @@ -/datum/supermatter_event - var/name = "Unknown X-K (Report this to coders)" +/datum/engi_event/supermatter_event + name = "Unknown X-K (Report this to coders)" var/obj/machinery/atmospherics/supermatter_crystal/supermatter - /// Probability of the event not running, higher tiers being rarer - var/threat_level - var/duration var/turf/supermatter_turf -/datum/supermatter_event/New(obj/machinery/atmospherics/supermatter_crystal/_supermatter) +/datum/engi_event/supermatter_event/New(obj/machinery/atmospherics/supermatter_crystal/_supermatter) . = ..() supermatter = _supermatter supermatter_turf = get_turf(supermatter) if(!supermatter) - stack_trace("a /datum/supermatter_event was called without an involved supermatter.") + stack_trace("a /datum/engi_event/supermatter_event was called without an involved supermatter.") return if(!istype(supermatter)) - stack_trace("a /datum/supermatter_event was called with (name: [supermatter], type: [supermatter.type]) instead of a supermatter!") + stack_trace("a /datum/engi_event/supermatter_event was called with (name: [supermatter], type: [supermatter.type]) instead of a supermatter!") return -/datum/supermatter_event/proc/start_event() +/datum/engi_event/supermatter_event/start_event() supermatter.event_active = src - on_start() - alert_engi() supermatter.investigate_log("event [src] has been triggered", "supermatter") - if(duration) - addtimer(CALLBACK(src, PROC_REF(on_end)), duration) + . = ..() -/datum/supermatter_event/proc/on_start() - return - -/datum/supermatter_event/proc/alert_engi() - return - -/datum/supermatter_event/proc/on_end() +/datum/engi_event/supermatter_event/on_end() sm_radio_say("Anomalous crystal activity has ended.") supermatter.heat_penalty_threshold = SUPERMATTER_HEAT_PENALTY_THRESHOLD supermatter.gas_multiplier = 1 @@ -39,12 +27,12 @@ supermatter.heat_multiplier = 1 supermatter.event_active = null -/datum/supermatter_event/proc/sm_radio_say(text) +/datum/engi_event/supermatter_event/proc/sm_radio_say(text) if(!text) return supermatter.radio.autosay(text, supermatter.name, "Engineering") -/datum/supermatter_event/proc/general_radio_say(text) +/datum/engi_event/supermatter_event/proc/general_radio_say(text) if(!text) return supermatter.radio.autosay(text, supermatter.name, null) @@ -53,36 +41,36 @@ //D class events -/datum/supermatter_event/delta_tier +/datum/engi_event/supermatter_event/delta_tier threat_level = SM_EVENT_THREAT_D duration = 10 SECONDS -/datum/supermatter_event/delta_tier/alert_engi() +/datum/engi_event/supermatter_event/delta_tier/alert_engi() sm_radio_say("Abnormal crystal activity detected! Activity class: [name].") // sleeping gas -/datum/supermatter_event/delta_tier/sleeping_gas +/datum/engi_event/supermatter_event/delta_tier/sleeping_gas name = "D-1" -/datum/supermatter_event/delta_tier/sleeping_gas/on_start() +/datum/engi_event/supermatter_event/delta_tier/sleeping_gas/on_start() var/datum/gas_mixture/air = new() air.set_sleeping_agent(2000) supermatter_turf.blind_release_air(air) // nitrogen -/datum/supermatter_event/delta_tier/nitrogen +/datum/engi_event/supermatter_event/delta_tier/nitrogen name = "D-2" -/datum/supermatter_event/delta_tier/nitrogen/on_start() +/datum/engi_event/supermatter_event/delta_tier/nitrogen/on_start() var/datum/gas_mixture/air = new() air.set_nitrogen(2000) supermatter_turf.blind_release_air(air) // carbon dioxide -/datum/supermatter_event/delta_tier/carbon_dioxide +/datum/engi_event/supermatter_event/delta_tier/carbon_dioxide name = "D-3" -/datum/supermatter_event/delta_tier/carbon_dioxide/on_start() +/datum/engi_event/supermatter_event/delta_tier/carbon_dioxide/on_start() var/datum/gas_mixture/air = new() air.set_carbon_dioxide(2000) supermatter_turf.blind_release_air(air) @@ -90,131 +78,131 @@ // C class events -/datum/supermatter_event/charlie_tier +/datum/engi_event/supermatter_event/charlie_tier threat_level = SM_EVENT_THREAT_C duration = 15 SECONDS -/datum/supermatter_event/charlie_tier/alert_engi() +/datum/engi_event/supermatter_event/charlie_tier/alert_engi() sm_radio_say("Anomalous crystal activity detected. Activity class: [name]. Operator intervention may be required.") // oxygen -/datum/supermatter_event/charlie_tier/oxygen +/datum/engi_event/supermatter_event/charlie_tier/oxygen name = "C-1" -/datum/supermatter_event/charlie_tier/oxygen/on_start() +/datum/engi_event/supermatter_event/charlie_tier/oxygen/on_start() var/datum/gas_mixture/air = new() air.set_oxygen(2000) supermatter_turf.blind_release_air(air) // plasma -/datum/supermatter_event/charlie_tier/plasma +/datum/engi_event/supermatter_event/charlie_tier/plasma name = "C-2" -/datum/supermatter_event/charlie_tier/plasma/on_start() +/datum/engi_event/supermatter_event/charlie_tier/plasma/on_start() var/datum/gas_mixture/air = new() air.set_toxins(2000) supermatter_turf.blind_release_air(air) // lowers the temp required for the SM to take damage. -/datum/supermatter_event/charlie_tier/heat_penalty_threshold +/datum/engi_event/supermatter_event/charlie_tier/heat_penalty_threshold name = "C-3" duration = 5 MINUTES -/datum/supermatter_event/charlie_tier/heat_penalty_threshold/on_start() +/datum/engi_event/supermatter_event/charlie_tier/heat_penalty_threshold/on_start() supermatter.heat_penalty_threshold -= -173 //Class B events -/datum/supermatter_event/bravo_tier +/datum/engi_event/supermatter_event/bravo_tier threat_level = SM_EVENT_THREAT_B duration = 1 MINUTES -/datum/supermatter_event/bravo_tier/alert_engi() +/datum/engi_event/supermatter_event/bravo_tier/alert_engi() sm_radio_say("Anomalous crystal activity detected! Activity class: [name]. Operator intervention is required!") // more gas -/datum/supermatter_event/bravo_tier/gas_multiply +/datum/engi_event/supermatter_event/bravo_tier/gas_multiply name = "B-1" -/datum/supermatter_event/bravo_tier/gas_multiply/on_start() +/datum/engi_event/supermatter_event/bravo_tier/gas_multiply/on_start() supermatter.gas_multiplier = 3 -/datum/supermatter_event/bravo_tier/heat_multiplier +/datum/engi_event/supermatter_event/bravo_tier/heat_multiplier name = "B-2" -/datum/supermatter_event/bravo_tier/heat_multiplier/on_start() +/datum/engi_event/supermatter_event/bravo_tier/heat_multiplier/on_start() supermatter.heat_multiplier = 3 -/datum/supermatter_event/bravo_tier/power_additive +/datum/engi_event/supermatter_event/bravo_tier/power_additive name = "B-3" -/datum/supermatter_event/bravo_tier/power_additive/on_start() +/datum/engi_event/supermatter_event/bravo_tier/power_additive/on_start() supermatter.power += 3000 duration = 10 SECONDS //A class events -/datum/supermatter_event/alpha_tier +/datum/engi_event/supermatter_event/alpha_tier threat_level = SM_EVENT_THREAT_A duration = 10 SECONDS -/datum/supermatter_event/alpha_tier/alert_engi() +/datum/engi_event/supermatter_event/alpha_tier/alert_engi() sm_radio_say("ALERT: Critical anomalous crystal activity detected! Activity class: [name]. IMMEDIATE Operator intervention is REQUIRED!") -/datum/supermatter_event/alpha_tier/apc_short +/datum/engi_event/supermatter_event/alpha_tier/apc_short name = "A-1" -/datum/supermatter_event/alpha_tier/apc_short/on_start() +/datum/engi_event/supermatter_event/alpha_tier/apc_short/on_start() var/area/current_area = get_area(supermatter) var/obj/machinery/power/apc/A = current_area.get_apc() A.apc_short() -/datum/supermatter_event/alpha_tier/air_siphon +/datum/engi_event/supermatter_event/alpha_tier/air_siphon name = "A-2" -/datum/supermatter_event/alpha_tier/air_siphon/on_start() +/datum/engi_event/supermatter_event/alpha_tier/air_siphon/on_start() var/area/current_area = get_area(supermatter) for(var/obj/machinery/alarm/A in current_area) A.apply_mode(AALARM_MODE_OFF) -/datum/supermatter_event/alpha_tier/gas_multiplier +/datum/engi_event/supermatter_event/alpha_tier/gas_multiplier name = "A-3" duration = 2 MINUTES -/datum/supermatter_event/alpha_tier/gas_multiplier/on_start() +/datum/engi_event/supermatter_event/alpha_tier/gas_multiplier/on_start() supermatter.gas_multiplier = 4 // S-tier events are special. They are very dangerous, but give a 5 minute warning to the engis. -/datum/supermatter_event/sierra_tier +/datum/engi_event/supermatter_event/sierra_tier threat_level = SM_EVENT_THREAT_S duration = 7 MINUTES // 2 MINUTES of s-tier anomaly -/datum/supermatter_event/sierra_tier/alert_engi() +/datum/engi_event/supermatter_event/sierra_tier/alert_engi() general_radio_say("ALERT: Anomalous supermatter state expected in: 5 minutes.") sm_radio_say("EMERGENCY ALERT: 5 MINUTES UNTIL [supermatter] EXHIBITS [name] CLASS ANOMALOUS ACTIVITY!") -/datum/supermatter_event/sierra_tier/on_start() +/datum/engi_event/supermatter_event/sierra_tier/on_start() addtimer(CALLBACK(src, PROC_REF(start_sierra_event)), 5 MINUTES) supermatter.has_run_sclass = TRUE -/datum/supermatter_event/sierra_tier/proc/start_sierra_event() +/datum/engi_event/supermatter_event/sierra_tier/proc/start_sierra_event() general_radio_say("ALERT: ANOMALOUS SUPERMATTER STATE DETECTED!") sm_radio_say("EMERGENCY ALERT: Class [name] anomalous behavior in progress!") //S class events //Arc-type -/datum/supermatter_event/sierra_tier/arc +/datum/engi_event/supermatter_event/sierra_tier/arc name = "S-ARC" -/datum/supermatter_event/sierra_tier/arc/start_sierra_event() +/datum/engi_event/supermatter_event/sierra_tier/arc/start_sierra_event() ..() supermatter.power_additive = 6000 // Laminate type -/datum/supermatter_event/sierra_tier/laminate +/datum/engi_event/supermatter_event/sierra_tier/laminate name = "S-LAMINATE REJECTION" -/datum/supermatter_event/sierra_tier/laminate/start_sierra_event() +/datum/engi_event/supermatter_event/sierra_tier/laminate/start_sierra_event() ..() supermatter.heat_multiplier = 25 supermatter.gas_multiplier = 25 diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm index 65cd03fe5aa..ef69d3f31ef 100644 --- a/code/modules/station_goals/bluespace_tap.dm +++ b/code/modules/station_goals/bluespace_tap.dm @@ -8,9 +8,9 @@ Another research station has developed a device called a Bluespace Harvester. It reaches through bluespace into other dimensions to shift through them for interesting objects.
Due to unforseen circumstances the large-scale test of the prototype could not be completed on the original research station. It will instead be carried out on your station. - Acquire the circuit board, construct the device over a wire knot and feed it enough power to generate [goal] mining points by shift end. + Acquire the circuit board, construct the device over a wire knot and feed it enough power to strike a motherlode of objects, located [goal] points deep.

- Be advised that the device is experimental and might act in slightly unforseen ways if sufficiently powered. + Be advised that the device is experimental and might act in slightly unforseen ways if sufficiently powered. It may also require maintenance irregularly.
Nanotrasen Science Directorate"} @@ -31,14 +31,22 @@ //needed for the vending part of it /datum/data/bluespace_tap_product + /// Name of the product var/product_name = "generic" - var/product_path = null + /// The path to a list containing the common drops + var/product_path_common = null + /// The path to a list containing the uncommon drops + var/product_path_uncommon = null + /// The path to a list containing the rare drops + var/product_path_rare = null + /// How much the product costs to produce var/product_cost = 100 //cost in mining points to generate - -/datum/data/bluespace_tap_product/New(name, path, cost) +/datum/data/bluespace_tap_product/New(name, path_common, path_uncommon, path_rare, cost) product_name = name - product_path = path + product_path_common = path_common + product_path_uncommon = path_uncommon + product_path_rare = path_rare product_cost = cost /obj/item/circuitboard/machine/bluespace_tap @@ -55,6 +63,7 @@ /// Amount of points generated per cycle per 50KW for the first 500KW #define BASE_POINTS 2 + /** * # Bluespace Harvester * @@ -79,10 +88,26 @@ /// list of possible products var/static/product_list = list( - new /datum/data/bluespace_tap_product("Unknown Exotic Hat", /obj/effect/spawner/random/bluespace_tap/hat, 5000), - new /datum/data/bluespace_tap_product("Unknown Snack", /obj/effect/spawner/random/bluespace_tap/food, 6000), - new /datum/data/bluespace_tap_product("Unknown Cultural Artifact", /obj/effect/spawner/random/bluespace_tap/cultural, 15000), - new /datum/data/bluespace_tap_product("Unknown Biological Artifact", /obj/effect/spawner/random/bluespace_tap/organic, 20000) + new /datum/data/bluespace_tap_product("Unknown Exotic Clothing", + /obj/effect/spawner/random/bluespace_tap/clothes_common, + /obj/effect/spawner/random/bluespace_tap/clothes_uncommon, + /obj/effect/spawner/random/bluespace_tap/clothes_rare, + 5000), + new /datum/data/bluespace_tap_product("Unknown Food", + /obj/effect/spawner/random/bluespace_tap/food_common, + /obj/effect/spawner/random/bluespace_tap/food_uncommon, + /obj/effect/spawner/random/bluespace_tap/food_rare, + 6000), + new /datum/data/bluespace_tap_product("Unknown Cultural Artifact", + /obj/effect/spawner/random/bluespace_tap/cultural_common, + /obj/effect/spawner/random/bluespace_tap/cultural_uncommon, + /obj/effect/spawner/random/bluespace_tap/cultural_rare, + 15000), + new /datum/data/bluespace_tap_product("Unknown Biological Artifact", + /obj/effect/spawner/random/bluespace_tap/organic_common, + /obj/effect/spawner/random/bluespace_tap/organic_uncommon, + /obj/effect/spawner/random/bluespace_tap/organic_rare, + 20000) ) /// The amount of power being used for mining at the moment (Watts) @@ -95,6 +120,18 @@ var/points = 0 /// The total points earned by this machine so far, for tracking station goal and highscore var/total_points = 0 + /// The point interval where the machine will automatically spawn a clothing item + var/clothing_interval = 7500 + /// The point interval where the machine will automatically spawn a food item + var/food_interval = 10000 + /// The point interval where the machine will automatically spawn a cultural item + var/cultural_interval = 15000 + /// The point interval where the machine will automatically spawn an organic item + var/organic_interval = 20000 + /// The point interval where the machine will strike a motherlode + var/motherlode_interval = 45000 + /// How much power the machine needs per processing tick at the current level. + var/actual_power_usage = 0 // Tweak these and active_power_consumption to balance power generation @@ -107,9 +144,16 @@ /// Whether or not mining power will be prevented from exceedingn stabilizer power var/stabilizer_priority = TRUE /// When event triggers this will hold references to all portals so we can fix the sprite after they're broken + /// Amount of overhead in levels. Each level of overhead allows stabilizing 15+overhead. + var/overhead = 0 + /// When portal event triggers this will hold references to all portals so we can fix the sprite after they're broken var/list/active_nether_portals = list() /// The amount of portals waiting to be spawned. Used mostly for UI and icon stuff. var/spawning = 0 + /// When a filth event triggers, this will stop the operation until it is cleaned + var/dirty = FALSE + /// Internal radio to handle announcements over engineering + var/obj/item/radio/radio /obj/machinery/power/bluespace_tap/Initialize(mapload) . = ..() @@ -126,6 +170,14 @@ list(1, MACH_CENTER, 1), list(1, 0, 1), )) + radio = new(src) + radio.listening = FALSE + radio.follow_target = src + radio.config(list("Engineering" = 0)) + +/obj/machinery/power/bluespace_tap/post_clean() + . = ..() + dirty = FALSE /obj/machinery/power/bluespace_tap/update_icon_state() . = ..() @@ -156,7 +208,10 @@ set_light(1, 1, "#353535") if(get_available_power()) - . += "screen" + if(dirty) + . += "screen_dirty" + else + . += "screen" if(light) underlays += emissive_appearance(icon, "light_mask") @@ -252,10 +307,38 @@ consume_direct_power(mining_power + stabilizer_power) // 2 points per 50 KW up to 20 and 4 points per MW (or 5 when emmaged). - mined_points = min(BASE_POINTS * (mining_power / (50 KW)) , 20) + mining_power * (POINTS_PER_W + emagged / (1 MW)) - points += mined_points - total_points += mined_points - update_icon() + // A dirty machine does not produce points + if(!dirty) + mined_points = min(BASE_POINTS * (mining_power / (50 KW)) , 20) + mining_power * (POINTS_PER_W + emagged / (1 MW)) + points += mined_points + total_points += mined_points + update_icon() + + // Handle automatic spawning of loot. Extra loot spawns in maints if stabilizers are off to incentivise risk taking + if(total_points > clothing_interval) + produce(product_list[1], FALSE, !stabilizers) + radio.autosay("Bluespace harvester progress detected: [src] has produced unknown clothes!", name, "Engineering") + clothing_interval += 7500 + + if(total_points > food_interval) + produce(product_list[2], FALSE, !stabilizers) + radio.autosay("Bluespace harvester progress detected: [src] has produced unknown food!", name, "Engineering") + food_interval += 10000 + + if(total_points > cultural_interval) + produce(product_list[3], FALSE, !stabilizers) + radio.autosay("Bluespace harvester progress detected: [src] has produced something unknown with cultural value!", name, "Engineering") + cultural_interval += 15000 + + if(total_points > organic_interval) + produce(product_list[4], FALSE, !stabilizers) + radio.autosay("Bluespace harvester progress detected: [src] has produced something organic!", name, "Engineering") + organic_interval += 20000 + + if(total_points > motherlode_interval) + produce_motherlode() + motherlode_interval += 45000 + /* * Portal chance is 0.1% per cycle per difference of 1MW between the stabilizer and mining power * This should translate to portals spawning every 33:20 minutes for 1 difference of 1MW @@ -274,6 +357,7 @@ desired_mining_power = 0 //emergency shutdown unless it is disabled // An extra portal for each 30MW above 15 start_nether_portaling(rand(1 , 3) + round(max((mining_power - 15 MW) / (30 MW) , 0)), TRUE) + try_events() /obj/machinery/power/bluespace_tap/proc/start_nether_portaling(amount, new_incursion = FALSE) if(new_incursion) @@ -300,6 +384,7 @@ data["powerUse"] = mining_power + stabilizer_power data["availablePower"] = get_surplus() data["emagged"] = emagged + data["dirty"] = dirty data["autoShutown"] = auto_shutdown data["stabilizers"] = stabilizers data["stabilizerPower"] = stabilizer_power @@ -331,20 +416,118 @@ /** * Produces the product with the desired key and increases product cost accordingly */ -/obj/machinery/power/bluespace_tap/proc/produce(key) - if(key <= 0 || key > length(product_list)) //invalid key +/obj/machinery/power/bluespace_tap/proc/produce(datum/data/bluespace_tap_product/product, purchased = FALSE, double_chance = FALSE) + if(!product) return - var/datum/data/bluespace_tap_product/A = product_list[key] - if(!A) - return - if(A.product_cost > points) - return - points -= A.product_cost - A.product_cost = round(1.2 * A.product_cost, 1) + if(purchased) + if(product.product_cost > points) + return + points -= product.product_cost + product.product_cost = round(1.2 * product.product_cost, 1) playsound(src, 'sound/magic/blink.ogg', 50) do_sparks(2, FALSE, src) - new A.product_path(get_turf(src)) + + var/spawn_location = find_spawn_location() + if(!spawn_location) + // If there is no valid space, spawn the item on the BSH harvester itself + spawn_item(get_turf(src)) + else + spawn_item(product, spawn_location) + + if(prob(25) && double_chance) + // Spawn second item in random spot on station - places it where NADs can respawn + spawn_location = find_spawn_location(TRUE) + if(!spawn_location) + // If there is no valid space, do not spawn the item + return + spawn_item(product, spawn_location) + +/// Handles a motherlode - each product is spawned 5 times at both the machine and around the station +/obj/machinery/power/bluespace_tap/proc/produce_motherlode() + // Announce lootsplosion + radio.autosay("Power spike detected during Bluespace Harvester Operation. Large bluespace payload inbound.", name, "Engineering") + // Build location list cache once + var/list/possible_spawns = list() + var/list/random_spawns = GLOB.nukedisc_respawn + // Build list of spawn positions + for(var/turf/current_target_turf in view(3, src)) + possible_spawns.Add(current_target_turf) + + // Spawn lootsplosion + for(var/datum/data/bluespace_tap_product/product in product_list) + for(var/i in 1 to 5) + var/turf/spawn_location = pick_n_take(possible_spawns) + if(spawn_location.density) + var/list/open_turfs = spawn_location.AdjacentTurfs(open_only = TRUE) + if(length(open_turfs)) + spawn_location = pick(open_turfs) + spawn_item(product, spawn_location) + + if(!random_spawns) + continue + spawn_location = pick(random_spawns) + spawn_location = pick(spawn_location.AdjacentTurfs(open_only = TRUE)) + if(spawn_location.density) + var/list/open_turfs = spawn_location.AdjacentTurfs(open_only = TRUE) + if(length(open_turfs)) + spawn_location = pick(open_turfs) + spawn_item(product, spawn_location) + +/obj/machinery/power/bluespace_tap/proc/find_spawn_location(random = FALSE) + var/list/possible_spawns = list() + if(random) + possible_spawns = GLOB.nukedisc_respawn + else + // Build list of spawn positions + for(var/turf/current_target_turf in view(3, src)) + possible_spawns.Add(current_target_turf) + + while(length(possible_spawns)) + var/turf/current_spawn = pick_n_take(possible_spawns) + if(!current_spawn.density) + return current_spawn + // Someone built a wall over it, check the surroundings + var/list/open_turfs = current_spawn.AdjacentTurfs(open_only = TRUE) + if(length(open_turfs)) + return pick(open_turfs) + +/obj/machinery/power/bluespace_tap/proc/spawn_item(datum/data/bluespace_tap_product/product, turf) + if(!product) + return + var/list/loot_rarities = list( + product.product_path_common = 60, + product.product_path_uncommon = 30, + product.product_path_rare = 10 + ) + var/obj/effect/spawner/random/bluespace_tap/product_path = pickweight(loot_rarities) + var/obj/effect/portal/tap_portal = new /obj/effect/portal(turf, null, src, 10) + tap_portal.name = "Bluespace Harvester Portal" + playsound(src, 'sound/magic/blink.ogg', 50) + new product_path(turf) flick_overlay_view(image(icon, src, "flash", FLY_LAYER)) + log_game("Bluespace harvester product spawned at [turf]") + +/obj/machinery/power/bluespace_tap/proc/try_events() + if(!mining_power) + return + if(!prob((mining_power / (10 MW)) + (emagged * 5))) // Calculate prob of event based on mining power. Return if no event. + return + var/static/list/event_list = list( + /datum/engi_event/bluespace_tap_event/dirty, + /datum/engi_event/bluespace_tap_event/electric_arc, + /datum/engi_event/bluespace_tap_event/radiation, + /datum/engi_event/bluespace_tap_event/gas + ) + var/datum/engi_event/bluespace_tap_event/event = pick(event_list) + run_event(event) + +/obj/machinery/power/bluespace_tap/proc/run_event(datum/engi_event/bluespace_tap_event/event) // mostly admin testing and stuff + if(ispath(event)) + event = new event(src) + if(!istype(event)) + log_debug("Attempted bluespace tap event aborted due to incorrect path. Incorrect path type: [event.type].") + return + event.start_event() //UI stuff below @@ -357,7 +540,9 @@ set_power(text2num(params["set_power"])) if("vend")//it's not really vending as producing, but eh var/key = text2num(params["target"]) - produce(key) + if(key <= 0 || key > length(product_list)) // invalid key + return + produce(product_list[key], TRUE, TRUE) if("auto_shutdown") auto_shutdown = !auto_shutdown if("stabilizers") diff --git a/code/modules/station_goals/bluespace_tap_events.dm b/code/modules/station_goals/bluespace_tap_events.dm new file mode 100644 index 00000000000..f173fb42bef --- /dev/null +++ b/code/modules/station_goals/bluespace_tap_events.dm @@ -0,0 +1,117 @@ +/datum/engi_event/bluespace_tap_event + name = "Unknown Anomaly (Report this to coders)" + /// Which bluespace tap started the event + var/obj/machinery/power/bluespace_tap/tap + +/datum/engi_event/bluespace_tap_event/New(obj/machinery/power/bluespace_tap/_tap) + . = ..() + tap = _tap + if(!tap) + stack_trace("a /datum/bluespace_tap_event was called without an involved bluespace tap.") + return + if(!istype(tap)) + stack_trace("a /datum/bluespace_tap_event was called with (name: [tap], type: [tap.type]) instead of a bluespace tap!") + return + +/datum/engi_event/bluespace_tap_event/start_event() + tap.investigate_log("event [src] has been triggered", "bluespace_tap") + return ..() + +/datum/engi_event/bluespace_tap_event/Destroy(force, ...) + tap = null + return ..() + +// gas events +/datum/engi_event/bluespace_tap_event/gas + name = "Gas Event" + +/datum/engi_event/bluespace_tap_event/gas/alert_engi() + tap.radio.autosay("Bluespace harvester has released a class [src] gas pocket!", tap, "Engineering") + +/datum/engi_event/bluespace_tap_event/gas/on_start() + var/datum/gas_mixture/air = new() + var/picked_gas = pick("N2O", "N2", "O2", "CO2", "Plasma", "Unknown") + switch(picked_gas) + if("N2") + name = "G-1" + air.set_nitrogen(250) + if("O2") + name = "G-2" + air.set_oxygen(250) + if("N2O") + name = "G-3" + air.set_sleeping_agent(200) + if("CO2") + name = "G-4" + air.set_carbon_dioxide(250) + if("Plasma") + name = "G-5" + air.set_toxins(250) + if("Unknown") + name = "G-6" + air.set_agent_b(250) + + air.set_temperature(T20C) + var/turf/tap_turf = get_turf(tap) + tap_turf.blind_release_air(air) + +// dirty +/datum/engi_event/bluespace_tap_event/dirty + name = "F-1" + +/datum/engi_event/bluespace_tap_event/dirty/alert_engi() + tap.radio.autosay("Bluespace harvester has struck a congealed mass of filth!", tap, "Engineering") + +/datum/engi_event/bluespace_tap_event/dirty/on_start() + tap.dirty = TRUE + var/list/gunk = list("carbon", "flour", "blood") + var/datum/reagents/R = new /datum/reagents(50) + R.my_atom = tap + R.add_reagent(pick(gunk), 50) + + var/datum/effect_system/smoke_spread/chem/smoke = new + smoke.set_up(R, tap, TRUE) + playsound(tap.loc, 'sound/effects/smoke.ogg', 50, TRUE, -3) + smoke.start(3) + qdel(R) + +// radiation pulse +/datum/engi_event/bluespace_tap_event/radiation + name = "R-1" + +/datum/engi_event/bluespace_tap_event/radiation/alert_engi() + tap.radio.autosay("Bluespace harvester has released a spike of radiation!", tap, "Engineering") + +/datum/engi_event/bluespace_tap_event/radiation/on_start() + radiation_pulse(tap, 3000, 7) + +// electrical arc +/datum/engi_event/bluespace_tap_event/electric_arc + name = "E-1" + +/datum/engi_event/bluespace_tap_event/electric_arc/alert_engi() + tap.radio.autosay("Class [src] power spike detected in bluespace harvester operation!", tap, "Engineering") + +/datum/engi_event/bluespace_tap_event/electric_arc/on_start() + var/shock_type = pick("single", "mass") + switch(shock_type) + if("single") + var/list/shock_mobs = list() + for(var/C in view(get_turf(tap), 5)) // We only want to shock a single random mob in range, not every one. + if(isliving(C)) + shock_mobs += C + if(length(shock_mobs)) + var/mob/living/L = pick(shock_mobs) + L.electrocute_act(rand(5, 25), "electrical arc") + playsound(get_turf(L), 'sound/effects/eleczap.ogg', 75, TRUE) + tap.Beam(L, icon_state = "lightning[rand(1, 12)]", icon = 'icons/effects/effects.dmi', time = 5) + if("mass") + name = "E-2" + for(var/C in view(get_turf(tap), 5)) // Zap everyone + if(isliving(C)) + var/mob/living/L = C + L.electrocute_act(rand(5, 25), "electrical arc") + playsound(get_turf(L), 'sound/effects/eleczap.ogg', 75, TRUE) + tap.Beam(L, icon_state = "lightning[rand(1, 12)]", icon = 'icons/effects/effects.dmi', time = 5) + + diff --git a/icons/obj/machines/bluespace_tap.dmi b/icons/obj/machines/bluespace_tap.dmi index 4e6e32afe7c..9d156871fca 100644 Binary files a/icons/obj/machines/bluespace_tap.dmi and b/icons/obj/machines/bluespace_tap.dmi differ diff --git a/paradise.dme b/paradise.dme index 111f44183ed..d8f1e6e23d9 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2645,6 +2645,7 @@ #include "code\modules\power\engines\singularity\particle_accelerator\particle_control.dm" #include "code\modules\power\engines\singularity\particle_accelerator\particle_emitter.dm" #include "code\modules\power\engines\singularity\particle_accelerator\particle_power.dm" +#include "code\modules\power\engines\supermatter\engineering_event.dm" #include "code\modules\power\engines\supermatter\supermatter.dm" #include "code\modules\power\engines\supermatter\supermatter_event.dm" #include "code\modules\power\engines\tesla\coil.dm" @@ -2852,6 +2853,7 @@ #include "code\modules\space_management\space_transition.dm" #include "code\modules\space_management\zlevel_manager.dm" #include "code\modules\station_goals\bluespace_tap.dm" +#include "code\modules\station_goals\bluespace_tap_events.dm" #include "code\modules\station_goals\bsa.dm" #include "code\modules\station_goals\dna_vault.dm" #include "code\modules\station_goals\shield.dm"