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"