mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-22 20:43:10 +01:00
Spacevines, Comet Expulsion event balances (#21256)
Slightly increases potency of Spacevines random seeds, and increases range of areas which can spawn them. Makes Comet Expulsion event populate a whole bunch of meteors on the overmap, but most of them are just traveling in random directions. Makes it less trivial for bridge crew to just scoot one tile to the left and everything's fine. Tested it multiple times on local instance to find numbers that tended to make the overmap dangerous, but not bullet-hell levels. It should be okay for the Horizon to get hit once or thrice- dodging them all ought to be a really nice trick. Also increased minimum spawn distance from the edges of the overmap on round start to prevent comet spawn from deciding 'hey fuck you' and nuking you with 4 meteors to the face and 0 time to maneuver. That's too mean, even for me. changes: - balance: "Spacevines event has more area types to potentially spawn in." - balance: "Spacevines event potency_min increased from 70 -> 85." - balance: "Comet Expulsion event chances slightly increased with greater weighting towards Bridge Crew availability." - balance: "Comet Expulsion event now generates many overmap hazards, mostly in random directions, to make evasion less trivial." - balance: "Comet Expulsion event meteors now have a small chance to do greater damage." - balance: "Horizon and other overmap visitable sites minimum spawn distance from overmap edge increased from 2 to 4." - qol: "Provided additional admin logging for Comet Expulsion event."
This commit is contained in:
@@ -62,9 +62,12 @@
|
||||
/obj/effect/meteor/comet_expulsion
|
||||
heavy = TRUE
|
||||
ignore_shield_destruction = TRUE
|
||||
hitpwr = 2
|
||||
hitpwr = 3
|
||||
|
||||
/obj/effect/meteor/comet_expulsion/Collide(atom/A)
|
||||
// Low chance that its a big boi
|
||||
if(prob(3))
|
||||
hitpwr = 5
|
||||
//If there's shields and it's strong enough, the power of the explosion is reduced, but it won't stop it
|
||||
if(istype(A, /obj/effect/energy_field))
|
||||
var/obj/effect/energy_field/impacted_energy_field = A
|
||||
@@ -76,7 +79,6 @@
|
||||
|
||||
/obj/effect/meteor/comet_expulsion/meteor_effect()
|
||||
. = ..()
|
||||
|
||||
explosion(get_turf(src), ROUND_UP(hitpwr), ROUND_UP(hitpwr*1.2), ROUND_UP(hitpwr*1.4))
|
||||
|
||||
|
||||
@@ -87,13 +89,16 @@
|
||||
/datum/event/comet_expulsion
|
||||
severity = EVENT_LEVEL_MAJOR
|
||||
startWhen = 30
|
||||
/// Number of meteors aimed directly at Horizon (few)
|
||||
var/meteors_aimed = 0
|
||||
/// Number of meteors traveling on random trajectories on the overmap (lots)
|
||||
var/meteors_random = 0
|
||||
|
||||
/datum/event/comet_expulsion/setup()
|
||||
if(!SSatlas.current_map.use_overmap)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
/datum/event/comet_expulsion/start()
|
||||
. = ..()
|
||||
|
||||
@@ -105,10 +110,35 @@
|
||||
var/obj/effect/overmap/visitable/target = GLOB.map_sectors["[pick(possible_station_levels)]"]
|
||||
|
||||
if(!istype(target))
|
||||
log_and_message_admins("Comet Expulsion failed to find a viable overmap target.")
|
||||
qdel(src)
|
||||
return
|
||||
/**
|
||||
* These numbers may seem high, but the overmap is a Big Place. Meteors aimed at the Horizon will impact along its outer hull, if they manage to strike.
|
||||
* Huddling crew in the Central Ring is the easiest way to keep them safe. The overwhelming majority of unaimed meteors will almost never come close; they
|
||||
* just need to ensure there's stuff to dodge in most directions.
|
||||
*/
|
||||
meteors_aimed = (rand(2,5))
|
||||
meteors_random = (rand(12,24))
|
||||
|
||||
// Rocks aimed directly at us.
|
||||
for(var/x in 1 to meteors_aimed)
|
||||
fire_comet(target, TRUE)
|
||||
// Rocks flying around nearby to dodge.
|
||||
for(var/y in 1 to meteors_random)
|
||||
fire_comet(target)
|
||||
|
||||
log_and_message_admins("Comet Expulsion has spawned meteors: [meteors_aimed] aimed at Horizon, [meteors_random] traveling random directions")
|
||||
|
||||
/**
|
||||
* Generate a meteor and fire it from the overmap edge in the general direction of, but not directly at, the Horizon.
|
||||
*
|
||||
* Parameter:
|
||||
* * aimed - aim DIRECTLY at the horizon: guaranteed collision if no action is taken.
|
||||
*/
|
||||
/datum/event/comet_expulsion/proc/fire_comet(var/obj/effect/overmap/visitable/target, var/aimed = FALSE)
|
||||
var/list/turf/unsimulated/map/edge/overmap_edges = list()
|
||||
var/projectile_angle
|
||||
|
||||
for(var/turf/unsimulated/map/edge/E in block(locate(1,1,SSatlas.current_map.overmap_z), locate(SSatlas.current_map.overmap_size,SSatlas.current_map.overmap_size,SSatlas.current_map.overmap_z)))
|
||||
overmap_edges += E
|
||||
@@ -121,12 +151,19 @@
|
||||
var/obj/projectile/comet_expulsion/our_comet = new(source)
|
||||
our_comet.preparePixelProjectile(target, source)
|
||||
our_comet.original = target
|
||||
our_comet.fire(get_angle(source, target))
|
||||
|
||||
// Get the angle to hit our target directly.
|
||||
projectile_angle = get_angle(source, target)
|
||||
// If we're not aiming, introduce random deviation.
|
||||
if(!aimed)
|
||||
var/random_deviation = rand(-75, 75)
|
||||
projectile_angle = abs((projectile_angle + random_deviation) % 360)
|
||||
|
||||
our_comet.fire(projectile_angle)
|
||||
|
||||
/datum/event/comet_expulsion/announce_start()
|
||||
. = ..()
|
||||
command_announcement.Announce("Warning, long range field scanners have detected an unforseen comet mass expulsion in collision route with [location_name()].\n\
|
||||
command_announcement.Announce("Warning, long range field scanners have detected an unforeseen comet expulsion in collision route with [location_name()].\n\
|
||||
All hands, assume defense condition, perform evasive maneuvers to avoid collision with the debris cloud. Damage control teams prepare to respond to breaches of the \
|
||||
vessel perimeter.",
|
||||
"[location_name()] Long Range Field Objects Sensor Array", new_sound = 'sound/effects/Evacuation.ogg', zlevels = affecting_z)
|
||||
|
||||
@@ -378,8 +378,8 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
|
||||
pop_needed = 4),
|
||||
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Comet Expulsion", /datum/event/comet_expulsion,
|
||||
1, list(ASSIGNMENT_BRIDGE_CREW = 15, ASSIGNMENT_ENGINEER = 12), is_one_shot = TRUE,
|
||||
pop_needed = 8),
|
||||
5, list(ASSIGNMENT_BRIDGE_CREW = 20, ASSIGNMENT_ENGINEER = 12), is_one_shot = TRUE,
|
||||
pop_needed = 12),
|
||||
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "APC Damage", /datum/event/apc_damage,
|
||||
20, list(ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 20)),
|
||||
|
||||
@@ -1,13 +1,32 @@
|
||||
#define DEFAULT_SEED "glowshroom"
|
||||
#define VINE_GROWTH_STAGES 5
|
||||
|
||||
/proc/spacevine_infestation(var/potency_min=70, var/potency_max=100, var/maturation_min=1, var/maturation_max=3)
|
||||
var/turf/T = pick_subarea_turf(/area/horizon/hallway, list(/proc/is_station_turf, /proc/not_turf_contains_dense_objects))
|
||||
/proc/spacevine_infestation(var/potency_min=85, var/potency_max=100, var/maturation_min=1, var/maturation_max=3)
|
||||
/// List of areas to affect.
|
||||
var/list/area/areaList = list()
|
||||
/// Area types to include.
|
||||
var/list/areaType = list(
|
||||
/area/horizon/hallway,
|
||||
/area/horizon/security/hallway,
|
||||
/area/horizon/engineering/hallway,
|
||||
/area/horizon/medical/hallway,
|
||||
/area/horizon/operations/lobby,
|
||||
/area/horizon/rnd/hallway,
|
||||
/area/horizon/security/hallway,
|
||||
/area/horizon/security/investigations_hallway,
|
||||
/area/horizon/service/cafeteria,
|
||||
/area/horizon/hangar
|
||||
)
|
||||
for(var/area/area in GLOB.the_station_areas)
|
||||
if(is_type_in_list(area, areaType))
|
||||
areaList += area
|
||||
|
||||
var/turf/T = pick_subarea_turf(pick(areaList), list(/proc/is_station_turf, /proc/not_turf_contains_dense_objects))
|
||||
if(T)
|
||||
var/datum/seed/seed = SSplants.create_random_seed(TRUE, SEED_NOUN_PITS)
|
||||
seed.set_trait(TRAIT_SPREAD,2) // So it will function properly as vines.
|
||||
seed.growth_stages = VINE_GROWTH_STAGES
|
||||
seed.set_trait(TRAIT_POTENCY,rand(potency_min, potency_max)) // 70-100 potency will help guarantee a wide spread and powerful effects.
|
||||
seed.set_trait(TRAIT_POTENCY,rand(potency_min, potency_max)) // 85-100 potency will help guarantee a wide spread and powerful effects.
|
||||
seed.set_trait(TRAIT_MATURATION,rand(maturation_min, maturation_max))
|
||||
|
||||
//make vine zero start off fully matured
|
||||
@@ -79,7 +98,6 @@
|
||||
/obj/effect/plant/single
|
||||
spread_chance = 0
|
||||
|
||||
|
||||
/obj/effect/plant/Initialize(mapload, datum/seed/newseed, obj/effect/plant/newparent)
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
//How far from the edge of overmap zlevel could randomly placed objects spawn
|
||||
#define OVERMAP_EDGE 2
|
||||
#define OVERMAP_EDGE 4
|
||||
|
||||
/// All sector overmap objects.
|
||||
/// Assoc list of stringified zlevel integer value (like `"1"` or `"42"` etc)
|
||||
|
||||
Reference in New Issue
Block a user