From 069f6875fb7af15c1181ece2c44ffade2513bf45 Mon Sep 17 00:00:00 2001
From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Date: Thu, 3 Oct 2024 20:36:59 -0400
Subject: [PATCH 01/31] Description, vars
---
code/modules/station_goals/bluespace_tap.dm | 22 ++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm
index d4c3a9509013..d98a3d36cfd5 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"}
@@ -222,6 +222,16 @@
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 = 5000
+ /// The point interval where the machine will automatically spawn a food item
+ var/food_interval = 6000
+ /// The point interval where the machine will automatically spawn a cultural item
+ var/cultural_interval = 10000
+ /// The point interval where the machine will automatically spawn an organic item
+ var/organic_interval = 15000
+ /// 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
@@ -243,8 +253,14 @@
var/stabilizer_power = 0
/// Amount of overhead in levels. Each level of overhead allows stabilizing 15+overhead.
var/overhead = 0
- /// When event triggers this will hold references to all portals so we can fix the sprite after they're broken
+ /// 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()
+ /// When a filth event triggers, this will stop the operation until it is cleaned
+ var/dirty = FALSE
+ /// When a chemical event triggers, this will stop operation until the chemical is fed to the machine
+ var/chemical_block = FALSE
+ /// When a chemical event triggers, this will contain the needed chemical to start progress again
+ var/chemical_needed = "Water"
/obj/machinery/power/bluespace_tap/Initialize(mapload)
. = ..()
From 052bda63c8c69705eca17c0216f5c552915e69e9 Mon Sep 17 00:00:00 2001
From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Date: Sun, 3 Nov 2024 17:34:13 -0500
Subject: [PATCH 02/31] Lootpools and item spawning
---
.../objects/items/weapons/storage/belt.dm | 8 +
code/modules/station_goals/bluespace_tap.dm | 190 ++++--------
.../station_goals/bluespace_tap_lootpools.dm | 281 ++++++++++++++++++
paradise.dme | 1 +
4 files changed, 347 insertions(+), 133 deletions(-)
create mode 100644 code/modules/station_goals/bluespace_tap_lootpools.dm
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index bfb2ad7f8690..3911886d3dd6 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/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm
index 424f747e32f2..9ce8d05f6c78 100644
--- a/code/modules/station_goals/bluespace_tap.dm
+++ b/code/modules/station_goals/bluespace_tap.dm
@@ -32,13 +32,16 @@
//needed for the vending part of it
/datum/data/bluespace_tap_product
var/product_name = "generic"
- var/product_path = null
+ var/product_path_common = null
+ var/product_path_uncommon = null
+ var/product_path_rare = null
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
@@ -50,135 +53,12 @@
/obj/item/stock_parts/capacitor/quadratic = 5,//Probably okay, right?
/obj/item/stack/ore/bluespace_crystal = 5)
-/obj/effect/spawner/lootdrop/bluespace_tap
- name = "bluespace harvester reward spawner"
- lootcount = 1
-
-/obj/effect/spawner/lootdrop/bluespace_tap/hat
- name = "exotic hat"
- loot = list(
- /obj/item/clothing/head/collectable/chef, //same weighing on all of them
- /obj/item/clothing/head/collectable/paper,
- /obj/item/clothing/head/collectable/tophat,
- /obj/item/clothing/head/collectable/captain,
- /obj/item/clothing/head/collectable/beret,
- /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,
- /obj/item/clothing/head/collectable/thunderdome,
- /obj/item/clothing/head/collectable/swat,
- /obj/item/clothing/head/collectable/slime,
- /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/effect/spawner/lootdrop/bluespace_tap/cultural
- name = "cultural artifacts"
- 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/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/effect/spawner/lootdrop/bluespace_tap/organic
- name = "organic objects"
- 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/effect/spawner/lootdrop/bluespace_tap/food
- name = "fancy food"
- lootcount = 3
- loot = list(
- /obj/item/food/wingfangchu,
- /obj/item/food/hotdog,
- /obj/item/food/sliceable/turkey,
- /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,
- /obj/item/food/soup/hotchili,
- /obj/item/food/burrito,
- /obj/item/food/fishburger,
- /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?
- )
-
/// Points generated per cycle for each Watt of power consumption
#define POINTS_PER_W 4e-6
/// Amount of points generated per cycle per 50KW for the first 500KW
#define BASE_POINTS 2
+
/**
* # Bluespace Harvester
*
@@ -203,10 +83,26 @@
/// list of possible products
var/static/product_list = list(
- new /datum/data/bluespace_tap_product("Unknown Exotic Hat", /obj/effect/spawner/lootdrop/bluespace_tap/hat, 5000),
- new /datum/data/bluespace_tap_product("Unknown Snack", /obj/effect/spawner/lootdrop/bluespace_tap/food, 6000),
- new /datum/data/bluespace_tap_product("Unknown Cultural Artifact", /obj/effect/spawner/lootdrop/bluespace_tap/cultural, 15000),
- new /datum/data/bluespace_tap_product("Unknown Biological Artifact", /obj/effect/spawner/lootdrop/bluespace_tap/organic, 20000)
+ new /datum/data/bluespace_tap_product("Unknown Exotic Clothing",
+ /obj/effect/spawner/lootdrop/bluespace_tap/clothes_common,
+ /obj/effect/spawner/lootdrop/bluespace_tap/clothes_uncommon,
+ /obj/effect/spawner/lootdrop/bluespace_tap/clothes_rare,
+ 5000),
+ new /datum/data/bluespace_tap_product("Unknown Food",
+ /obj/effect/spawner/lootdrop/bluespace_tap/food_common,
+ /obj/effect/spawner/lootdrop/bluespace_tap/food_uncommon,
+ /obj/effect/spawner/lootdrop/bluespace_tap/food_rare,
+ 6000),
+ new /datum/data/bluespace_tap_product("Unknown Cultural Artifact",
+ /obj/effect/spawner/lootdrop/bluespace_tap/cultural_common,
+ /obj/effect/spawner/lootdrop/bluespace_tap/cultural_uncommon,
+ /obj/effect/spawner/lootdrop/bluespace_tap/cultural_rare,
+ 15000),
+ new /datum/data/bluespace_tap_product("Unknown Biological Artifact",
+ /obj/effect/spawner/lootdrop/bluespace_tap/organic_common,
+ /obj/effect/spawner/lootdrop/bluespace_tap/organic_uncommon,
+ /obj/effect/spawner/lootdrop/bluespace_tap/organic_rare,
+ 20000)
)
/// The amount of power being used for mining at the moment (Watts)
@@ -488,7 +384,35 @@
A.product_cost = round(1.2 * A.product_cost, 1)
playsound(src, 'sound/magic/blink.ogg', 50)
do_sparks(2, FALSE, src)
- new A.product_path(get_turf(src))
+ var/selected_rarity = pick(1, 10)
+ var/selected_path = null
+ if(selected_rarity < 7)
+ selected_path = A.product_path_common
+ if(selected_rarity < 10 && selected_rarity > 6)
+ selected_path = A.product_path_uncommon
+ if(selected_rarity > 9)
+ selected_path = A.product_path_rare
+ spawn_item(selected_path, get_turf(src))
+ if(pick(1, 4) == 4)
+ // Spawn second item in random spot on station - places it where NADs can respawn
+ var/random_turf = null
+ var/list/possible_spawns = GLOB.nukedisc_respawn
+ while(length(possible_spawns))
+ var/turf/current_spawn = pick_n_take(possible_spawns)
+ if(!current_spawn.density)
+ spawn_item(selected_path, current_spawn)
+ return
+ // Someone built a wall over it, check the surroundings
+ var/list/open_turfs = current_spawn.AdjacentTurfs(open_only = TRUE)
+ if(length(open_turfs))
+ spawn_item(selected_path, pick(open_turfs))
+ return
+
+/obj/machinery/power/bluespace_tap/proc/spawn_item(product_path, turf)
+ 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))
//UI stuff below
diff --git a/code/modules/station_goals/bluespace_tap_lootpools.dm b/code/modules/station_goals/bluespace_tap_lootpools.dm
new file mode 100644
index 000000000000..02417357c151
--- /dev/null
+++ b/code/modules/station_goals/bluespace_tap_lootpools.dm
@@ -0,0 +1,281 @@
+/obj/effect/spawner/lootdrop/bluespace_tap
+ name = "bluespace harvester reward spawner"
+ lootcount = 1
+
+/obj/effect/spawner/lootdrop/bluespace_tap/clothes_common
+ name = "exotic common clothing"
+ loot = list(
+ /obj/item/clothing/head/collectable/chef,
+ /obj/item/clothing/head/collectable/paper,
+ /obj/item/clothing/head/collectable/tophat,
+ /obj/item/clothing/head/collectable/captain,
+ /obj/item/clothing/head/collectable/beret,
+ /obj/item/clothing/head/collectable/welding,
+ /obj/item/clothing/head/collectable/flatcap,
+ /obj/item/clothing/head/collectable/pirate,
+ /obj/item/clothing/head/crown/fancy,
+ /obj/item/clothing/head/collectable/wizard,
+ /obj/item/clothing/head/collectable/hardhat,
+ /obj/item/clothing/head/collectable/HoS,
+ /obj/item/clothing/head/collectable/thunderdome,
+ /obj/item/clothing/head/collectable/swat,
+ /obj/item/clothing/head/collectable/slime,
+ /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/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/lootdrop/bluespace_tap/clothes_uncommon
+ name = "exotic uncommon clothing"
+ loot = list(
+ /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/lootdrop/bluespace_tap/clothes_rare
+ name = "exotic rare clothing"
+ loot = list(
+ /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/lootdrop/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/effect/spawner/lootdrop/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/stack/sheet/mineral/tranquillite/fifty,
+ /obj/item/clothing/gloves/combat,
+ /obj/item/blank_tarot_card,
+ /obj/item/tarot_card_pack,
+ /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
+ )
+
+/obj/effect/spawner/lootdrop/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/jumbo,
+ /obj/item/tarot_card_pack/mega,
+ /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
+ )
+
+/obj/effect/spawner/lootdrop/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/effect/spawner/lootdrop/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/effect/spawner/lootdrop/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/effect/spawner/lootdrop/bluespace_tap/food_common
+ name = "common fancy food"
+ lootcount = 1
+ loot = list(
+ /obj/item/food/wingfangchu,
+ /obj/item/food/hotdog,
+ /obj/item/food/cookie
+ /obj/item/food/plumphelmetbiscuit,
+ /obj/item/food/appletart,
+ /obj/item/food/soup/meatballsoup,
+ /obj/item/food/soup/mysterysoup,
+ /obj/item/food/soup/stew,
+ /obj/item/food/soup/hotchili,
+ /obj/item/food/burrito,
+ /obj/item/food/fishburger,
+ /obj/item/food/cubancarp,
+ /obj/item/food/fishandchips,
+ /obj/item/food/meatpie,
+ /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
+ )
+
+/obj/effect/spawner/lootdrop/bluespace_tap/food_uncommon
+ name = "uncommon fancy food"
+ lootcount = 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/food/syndidonkpocket,
+ /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
+ )
+
+/obj/effect/spawner/lootdrop/bluespace_tap/food_rare
+ name = "rare fancy food"
+ lootcount = 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/food/peanut_butter_jelly,
+ /obj/item/food/soylentviridians,
+ /obj/item/food/baguette/combat
+ )
diff --git a/paradise.dme b/paradise.dme
index 9039bff0f310..1a00fd55e21e 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -2803,6 +2803,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_lootpools.dm"
#include "code\modules\station_goals\bsa.dm"
#include "code\modules\station_goals\dna_vault.dm"
#include "code\modules\station_goals\shield.dm"
From 3f8fa7709bdf198776241da258df4c87b384363f Mon Sep 17 00:00:00 2001
From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Date: Fri, 8 Nov 2024 03:27:09 -0500
Subject: [PATCH 03/31] Automatic spawning, Motherlode
---
code/modules/station_goals/bluespace_tap.dm | 141 +++++++++++++-----
.../station_goals/bluespace_tap_lootpools.dm | 2 +-
2 files changed, 107 insertions(+), 36 deletions(-)
diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm
index 9ce8d05f6c78..4f7e66845bf1 100644
--- a/code/modules/station_goals/bluespace_tap.dm
+++ b/code/modules/station_goals/bluespace_tap.dm
@@ -151,6 +151,8 @@
var/chemical_block = FALSE
/// When a chemical event triggers, this will contain the needed chemical to start progress again
var/chemical_needed = "Water"
+ /// Internal radio to handle announcements over engineering
+ var/obj/item/radio/radio
/obj/machinery/power/bluespace_tap/Initialize(mapload)
. = ..()
@@ -167,6 +169,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/cleaning_act(mob/user, atom/cleaner, cleanspeed, text_verb, text_description, text_targetname)
+ . = ..()
+ dirty = FALSE
/obj/machinery/power/bluespace_tap/update_icon_state()
. = ..()
@@ -293,10 +303,44 @@
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()
+ // Machine gets dirty. Always remains at 2% regardless of power draw.
+ if(prob(0.02))
+ radio.autosay("Bluespace harvester malfunction detected: filth contaminants have jammed [src]'s bluespace receiver!", name, "Engineering")
+ dirty = TRUE
+
+ // 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 some clothes!", name, "Engineering")
+ clothing_interval += 5000
+
+ if(total_points > food_interval)
+ produce(product_list[2], FALSE, !stabilizers)
+ radio.autosay("Bluespace harvester progress detected: [src] has produced some food!", name, "Engineering")
+ food_interval += 6000
+
+ if(total_points > cultural_interval)
+ produce(product_list[3], FALSE, !stabilizers)
+ radio.autosay("Bluespace harvester progress detected: [src] has produced something with culture!", name, "Engineering")
+ cultural_interval += 10000
+
+ 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 += 15000
+
+ 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
@@ -341,6 +385,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
@@ -372,48 +417,72 @@
/**
* 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(var/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)
+
+ var/spawn_location = find_spawn_location()
+ spawn_item(product, spawn_location)
+
+ if(prob(0.25) && double_chance)
+ // Spawn second item in random spot on station - places it where NADs can respawn
+ spawn_location = find_spawn_location(TRUE)
+ 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
+ GLOB.major_announcement.Announce("Power spike detected during Bluespace Harvester Operation. Large bluespace payload inbound.", "Bluespace Harvester Motherlode", 'sound/AI/attention.ogg')
+ // Spawn lootsplosion
+ for(var/datum/data/bluespace_tap_product/product in product_list)
+ for(var/i in 1 to 5)
+ var/spawn_location = find_spawn_location()
+ spawn_item(product, spawn_location)
+ spawn_location = find_spawn_location(TRUE)
+ 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(var/datum/data/bluespace_tap_product/product, turf)
+ if(!product)
+ return
var/selected_rarity = pick(1, 10)
- var/selected_path = null
+ var/product_path = null
if(selected_rarity < 7)
- selected_path = A.product_path_common
+ product_path = product.product_path_common
if(selected_rarity < 10 && selected_rarity > 6)
- selected_path = A.product_path_uncommon
+ product_path = product.product_path_uncommon
if(selected_rarity > 9)
- selected_path = A.product_path_rare
- spawn_item(selected_path, get_turf(src))
- if(pick(1, 4) == 4)
- // Spawn second item in random spot on station - places it where NADs can respawn
- var/random_turf = null
- var/list/possible_spawns = GLOB.nukedisc_respawn
- while(length(possible_spawns))
- var/turf/current_spawn = pick_n_take(possible_spawns)
- if(!current_spawn.density)
- spawn_item(selected_path, current_spawn)
- return
- // Someone built a wall over it, check the surroundings
- var/list/open_turfs = current_spawn.AdjacentTurfs(open_only = TRUE)
- if(length(open_turfs))
- spawn_item(selected_path, pick(open_turfs))
- return
-
-/obj/machinery/power/bluespace_tap/proc/spawn_item(product_path, turf)
+ product_path = product.product_path_rare
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.loc_name]")
//UI stuff below
@@ -426,7 +495,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_lootpools.dm b/code/modules/station_goals/bluespace_tap_lootpools.dm
index 02417357c151..29971dceb708 100644
--- a/code/modules/station_goals/bluespace_tap_lootpools.dm
+++ b/code/modules/station_goals/bluespace_tap_lootpools.dm
@@ -199,7 +199,7 @@
loot = list(
/obj/item/food/wingfangchu,
/obj/item/food/hotdog,
- /obj/item/food/cookie
+ /obj/item/food/cookie,
/obj/item/food/plumphelmetbiscuit,
/obj/item/food/appletart,
/obj/item/food/soup/meatballsoup,
From 919735883b5a63ad3d9cbbc4a34913042ab2c8eb Mon Sep 17 00:00:00 2001
From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Date: Sat, 9 Nov 2024 16:40:13 -0500
Subject: [PATCH 04/31] PBJ Bag, Proper dirty probability
---
code/game/objects/items/weapons/storage/boxes.dm | 8 ++++++++
code/modules/station_goals/bluespace_tap.dm | 8 +++-----
code/modules/station_goals/bluespace_tap_lootpools.dm | 2 +-
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 31e29968b4d0..8e57dd0da856 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -1023,6 +1023,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(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/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm
index 4f7e66845bf1..42410aa5e12c 100644
--- a/code/modules/station_goals/bluespace_tap.dm
+++ b/code/modules/station_goals/bluespace_tap.dm
@@ -310,7 +310,7 @@
total_points += mined_points
update_icon()
// Machine gets dirty. Always remains at 2% regardless of power draw.
- if(prob(0.02))
+ if(prob(2))
radio.autosay("Bluespace harvester malfunction detected: filth contaminants have jammed [src]'s bluespace receiver!", name, "Engineering")
dirty = TRUE
@@ -339,8 +339,6 @@
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
@@ -431,7 +429,7 @@
var/spawn_location = find_spawn_location()
spawn_item(product, spawn_location)
- if(prob(0.25) && double_chance)
+ 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)
spawn_item(product, spawn_location)
@@ -482,7 +480,7 @@
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.loc_name]")
+ log_game("Bluespace harvester product spawned at [turf]")
//UI stuff below
diff --git a/code/modules/station_goals/bluespace_tap_lootpools.dm b/code/modules/station_goals/bluespace_tap_lootpools.dm
index 29971dceb708..cc97e1fa672e 100644
--- a/code/modules/station_goals/bluespace_tap_lootpools.dm
+++ b/code/modules/station_goals/bluespace_tap_lootpools.dm
@@ -275,7 +275,7 @@
/obj/item/food/burger/ppatty/rainbow,
/obj/item/food/burger/elec,
/obj/item/food/notasandwich,
- /obj/item/food/peanut_butter_jelly,
+ /obj/item/storage/box/papersack/pbj_lunch,
/obj/item/food/soylentviridians,
/obj/item/food/baguette/combat
)
From 56d0da10d9c89607511c02fe976517449e7b3a21 Mon Sep 17 00:00:00 2001
From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Date: Sat, 9 Nov 2024 16:58:17 -0500
Subject: [PATCH 05/31] Added more items to organic lootpool
---
.../station_goals/bluespace_tap_lootpools.dm | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/code/modules/station_goals/bluespace_tap_lootpools.dm b/code/modules/station_goals/bluespace_tap_lootpools.dm
index cc97e1fa672e..865f5cbb60b9 100644
--- a/code/modules/station_goals/bluespace_tap_lootpools.dm
+++ b/code/modules/station_goals/bluespace_tap_lootpools.dm
@@ -165,7 +165,9 @@
/obj/item/dnainjector/noprints,
/obj/item/dnainjector/comic,
/obj/item/seeds/random/labelled,
- /obj/item/organ/internal/regenerative_core
+ /obj/item/organ/internal/regenerative_core,
+ /obj/item/reagent_containers/glass/bottle/reagent/omnizine,
+ /obj/item/reagent_containers/glass/bottle/reagent/lazarus_reagent
)
/obj/effect/spawner/lootdrop/bluespace_tap/organic_uncommon
@@ -181,7 +183,9 @@
/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/organ/internal/heart/gland/egg,
+ /obj/item/slimepotion/fireproof,
+ /obj/item/slimepotion/oil_slick
)
/obj/effect/spawner/lootdrop/bluespace_tap/organic_rare
@@ -190,7 +194,10 @@
/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/food/grown/cherry_bomb,
+ /obj/item/bio_chip_implanter/storage,
+ /obj/item/slimepotion/sentience,
+ /obj/item/slimepotion/transference
)
/obj/effect/spawner/lootdrop/bluespace_tap/food_common
From 0fd60c71fd98729bebfc7b69954d9513c465f3f7 Mon Sep 17 00:00:00 2001
From: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Date: Sat, 23 Nov 2024 05:08:07 -0500
Subject: [PATCH 06/31] BSH Events
---
.../objects/items/weapons/storage/boxes.dm | 2 +-
code/modules/station_goals/bluespace_tap.dm | 54 ++++--
.../station_goals/bluespace_tap_events.dm | 157 ++++++++++++++++++
icons/obj/machines/bluespace_tap.dmi | Bin 28981 -> 73966 bytes
paradise.dme | 1 +
5 files changed, 200 insertions(+), 14 deletions(-)
create mode 100644 code/modules/station_goals/bluespace_tap_events.dm
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 8e57dd0da856..b2bfead67644 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -1028,7 +1028,7 @@
desc = "A paper sack filled with enough sandwiches to feed a department."
/obj/item/storage/box/papersack/pbj_lunch/populate_contents()
- for(i in 1 to 10)
+ for(var/i in 1 to 10)
new /obj/item/food/peanut_butter_jelly(src)
/obj/item/storage/box/relay_kit
diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm
index 42410aa5e12c..35083102bd28 100644
--- a/code/modules/station_goals/bluespace_tap.dm
+++ b/code/modules/station_goals/bluespace_tap.dm
@@ -105,6 +105,9 @@
20000)
)
+ /// list of possible events
+ var/static/event_list
+
/// The amount of power being used for mining at the moment (Watts)
var/mining_power = 0
/// The power you WANT the machine to use for mining. It will try to match this. (Watts)
@@ -116,13 +119,13 @@
/// 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 = 5000
+ var/clothing_interval = 7500
/// The point interval where the machine will automatically spawn a food item
- var/food_interval = 6000
+ var/food_interval = 10000
/// The point interval where the machine will automatically spawn a cultural item
- var/cultural_interval = 10000
+ var/cultural_interval = 15000
/// The point interval where the machine will automatically spawn an organic item
- var/organic_interval = 15000
+ 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.
@@ -147,10 +150,6 @@
var/spawning = 0
/// When a filth event triggers, this will stop the operation until it is cleaned
var/dirty = FALSE
- /// When a chemical event triggers, this will stop operation until the chemical is fed to the machine
- var/chemical_block = FALSE
- /// When a chemical event triggers, this will contain the needed chemical to start progress again
- var/chemical_needed = "Water"
/// Internal radio to handle announcements over engineering
var/obj/item/radio/radio
@@ -169,6 +168,19 @@
list(1, MACH_CENTER, 1),
list(1, 0, 1),
))
+ event_list = list(
+ new /datum/bluespace_tap_event/dirty(src),
+ new /datum/bluespace_tap_event/electric_arc(src),
+ new /datum/bluespace_tap_event/electric_arc/mass(src),
+ new /datum/bluespace_tap_event/radiation(src),
+ new /datum/bluespace_tap_event/gas/nitrogen(src),
+ new /datum/bluespace_tap_event/gas/carbon_dioxide(src),
+ new /datum/bluespace_tap_event/gas/oxygen(src),
+ new /datum/bluespace_tap_event/gas/plasma(src),
+ new /datum/bluespace_tap_event/gas/agent_b(src),
+ new /datum/bluespace_tap_event/gas/sleeping_gas(src)
+ )
+
radio = new(src)
radio.listening = FALSE
radio.follow_target = src
@@ -207,7 +219,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")
@@ -309,10 +324,6 @@
points += mined_points
total_points += mined_points
update_icon()
- // Machine gets dirty. Always remains at 2% regardless of power draw.
- if(prob(2))
- radio.autosay("Bluespace harvester malfunction detected: filth contaminants have jammed [src]'s bluespace receiver!", name, "Engineering")
- dirty = TRUE
// Handle automatic spawning of loot. Extra loot spawns in maints if stabilizers are off to incentivise risk taking
if(total_points > clothing_interval)
@@ -357,6 +368,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)
@@ -482,6 +494,22 @@
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/datum/bluespace_tap_event/event = pick(event_list)
+ run_event(event)
+
+/obj/machinery/power/bluespace_tap/proc/run_event(datum/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
/obj/machinery/power/bluespace_tap/ui_act(action, params)
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 000000000000..0e36b694b76c
--- /dev/null
+++ b/code/modules/station_goals/bluespace_tap_events.dm
@@ -0,0 +1,157 @@
+/datum/bluespace_tap_event
+ var/name = "Unknown Anomaly (Report this to coders)"
+ var/obj/machinery/power/bluespace_tap/tap
+ /// Probability of the event not running, higher tiers being rarer
+ var/threat_level
+ var/duration
+ var/turf/tap_turf
+
+/datum/bluespace_tap_event/New(obj/machinery/power/bluespace_tap/_tap)
+ . = ..()
+ tap = _tap
+ tap_turf = get_turf(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/bluespace_tap_event/proc/start_event()
+ on_start()
+ alert_engi()
+ tap.investigate_log("event [src] has been triggered", "bluespace_tap")
+
+/datum/bluespace_tap_event/proc/on_start()
+ return
+
+/datum/bluespace_tap_event/proc/alert_engi()
+ return
+
+// gas events
+/datum/bluespace_tap_event/gas
+ name = "Gas Event"
+
+/datum/bluespace_tap_event/gas/alert_engi()
+ tap.radio.autosay("Bluespace harvester has released a class [src] gas pocket!", tap, "Engineering")
+
+// sleeping gas
+/datum/bluespace_tap_event/gas/sleeping_gas
+ name = "G-1"
+
+/datum/bluespace_tap_event/gas/sleeping_gas/on_start()
+ var/datum/gas_mixture/air = new()
+ air.set_sleeping_agent(200)
+ air.set_temperature(T20C)
+ tap_turf.blind_release_air(air)
+
+// nitrogen
+/datum/bluespace_tap_event/gas/nitrogen
+ name = "G-2"
+
+/datum/bluespace_tap_event/gas/nitrogen/on_start()
+ var/datum/gas_mixture/air = new()
+ air.set_nitrogen(250)
+ air.set_temperature(T20C)
+ tap_turf.blind_release_air(air)
+
+// carbon dioxide
+/datum/bluespace_tap_event/gas/carbon_dioxide
+ name = "G-3"
+
+/datum/bluespace_tap_event/gas/carbon_dioxide/on_start()
+ var/datum/gas_mixture/air = new()
+ air.set_carbon_dioxide(250)
+ air.set_temperature(T20C)
+ tap_turf.blind_release_air(air)
+
+// plasma
+/datum/bluespace_tap_event/gas/plasma
+ name = "G-4"
+
+/datum/bluespace_tap_event/gas/plasma/on_start()
+ var/datum/gas_mixture/air = new()
+ air.set_toxins(250)
+ air.set_temperature(T20C)
+ tap_turf.blind_release_air(air)
+
+
+// oxygen
+/datum/bluespace_tap_event/gas/oxygen
+ name = "G-5"
+
+/datum/bluespace_tap_event/gas/oxygen/on_start()
+ var/datum/gas_mixture/air = new()
+ air.set_oxygen(250)
+ air.set_temperature(T20C)
+ tap_turf.blind_release_air(air)
+
+// agent_b
+/datum/bluespace_tap_event/gas/agent_b
+ name = "G-6"
+
+/datum/bluespace_tap_event/gas/agent_b/on_start()
+ var/datum/gas_mixture/air = new()
+ air.set_agent_b(250)
+ air.set_temperature(T20C)
+ tap_turf.blind_release_air(air)
+
+// dirty
+/datum/bluespace_tap_event/dirty
+ name = "F-1"
+
+/datum/bluespace_tap_event/dirty/alert_engi()
+ tap.radio.autosay("Bluespace harvester has struck a congealed mass of filth!", tap, "Engineering")
+
+/datum/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/bluespace_tap_event/radiation
+ name = "R-1"
+
+/datum/bluespace_tap_event/radiation/alert_engi()
+ tap.radio.autosay("Bluespace harvester has released a spike of radiation!", tap, "Engineering")
+
+/datum/bluespace_tap_event/radiation/on_start()
+ radiation_pulse(tap, 3000, 7)
+
+// electrical arc
+/datum/bluespace_tap_event/electric_arc
+ name = "E-1"
+
+/datum/bluespace_tap_event/electric_arc/alert_engi()
+ tap.radio.autosay("Class [src] power spike detected in bluespace harvester operation!", tap, "Engineering")
+
+/datum/bluespace_tap_event/electric_arc/on_start()
+ var/list/shock_mobs = list()
+ for(var/C in view(tap_turf, 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)
+
+// mass electrical arc
+/datum/bluespace_tap_event/electric_arc/mass
+ name = "E-2"
+
+/datum/bluespace_tap_event/electric_arc/mass/on_start()
+ for(var/C in view(tap_turf, 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 4e6e32afe7cdd0862cdad552058dda4a357f576f..9d156871fcaee14f6c08f9a9361e208f3199dd60 100644
GIT binary patch
literal 73966
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
z
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 X&?1m_LgCnX77xq;9_ga
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