New/Changed Events Tuning (#20888)

First round of tuning after the addition of new electrical storms,
changes in behavior, etc. Details in the changelogs, but apart from
general balancing of event weights and effects, this PR also expands the
description info on Telecomms machinery to communicate that you need to
use Nanopaste to repair them (which I don't think was documented in-game
anywhere), and also adds a stack of Nanopaste to the TComms vestibule to
facilitate repairs if no one is around to produce the stuff.

Also you can beat Telecomms machinery with a stick to start garbling
them now! Take that, Medical channel!

There will probably be another round of balancing after this to make
sure the events all feel and play maximally right/fun.

---------

Signed-off-by: Batrachophreno <Batrochophreno@gmail.com>
Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>
This commit is contained in:
Batrachophreno
2025-06-30 14:02:59 -04:00
committed by GitHub
parent 27b5079066
commit c2a9041a8f
10 changed files with 132 additions and 17 deletions

View File

@@ -10,18 +10,20 @@
switch(severity)
if(EVENT_LEVEL_MAJOR)
victim_apc.overload_lighting(50, TRUE)
victim_apc.overload_lighting(100, TRUE)
victim_apc.set_broken()
if(!QDELETED(victim_apc.cell))
victim_apc.cell.corrupt()
if(EVENT_LEVEL_MODERATE)
victim_apc.overload_lighting(85, TRUE)
victim_apc.set_broken()
if(!QDELETED(victim_apc.cell))
victim_apc.cell.corrupt()
//EVENT_LEVEL_MUNDANE and if someone fucked up the config
else
victim_apc.overload_lighting(60, TRUE)
victim_apc.emagged = TRUE
victim_apc.flicker_all()

View File

@@ -34,7 +34,7 @@
for(var/obj/machinery/power/apc/valid_apc in SSmachinery.apc_units)
if((valid_apc.z in affecting_z) && !valid_apc.is_critical)
valid_apcs += valid_apc
endWhen = (severity * 60) + startWhen
endWhen = (severity * 45) + startWhen
/datum/event/electrical_storm/end(faked)
..()
@@ -60,17 +60,22 @@
var/list/picked_apcs = list()
// Up to 2/4/6 APCs per tick depending on severity
for(var/i = 0, i < ((severity + 1)), i++)
for(var/i = 0, i < (severity * 2), i++)
picked_apcs |= pick(valid_apcs)
for(var/obj/machinery/power/apc/victim_apc in picked_apcs)
// Determine what each APC does. Depending on how bad they roll, might be nothing or might blow out the entire thing.
// Mundane storm: 0-55 nothing, 56+ lights flicker, 86+ damage (2 APC at a time)
// Moderate storm: 0-30 nothing, 31+ lights flicker, 81+ damage (4 APCs at a time)
// Severe storm: 0-5 nothing, 6+ lights flicker, 76+ damage (6 APCs at a time)
// Moderate storm: 0-30 nothing, 31+ lights flicker, 81+ damage (3 APCs at a time)
// Severe storm: 0-5 nothing, 6+ lights flicker, 76+ damage (4 APCs at a time)
// Once storm damage exceeds a threshold, there is a random chance of certain secondary effects.
storm_damage = rand(0,100)
// We don't want to obliterate small offships (lucky 7 APCs or fewer).
if(LAZYLEN(valid_apcs) < 8)
LAZYREMOVE(victim_apc, valid_apcs)
// Main breaker is turned off, or we rolled lucky. Consider this APC protected.
if(!victim_apc.operating || storm_damage <= (80 - (severity * 25)))
continue

View File

@@ -213,7 +213,7 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
120),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage,
10, list(ASSIGNMENT_ENGINEER = 15)),
10, list(ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence", /datum/event/brand_intelligence,
0, list(ASSIGNMENT_ENGINEER = 5), TRUE),
@@ -225,7 +225,7 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
300),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Electrical Storm", /datum/event/electrical_storm,
50, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 25)),
30, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 25)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Cozmozoan Migration", /datum/event/carp_migration/cozmo,
60),
@@ -287,14 +287,18 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
0, list(ASSIGNMENT_SURGEON = 25)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Comms Blackout", /datum/event/communications_blackout,
100),
50),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Comms Blackout - Damage", /datum/event/communications_blackout/damage_machinery,
50, list(ASSIGNMENT_ENGINEER = 25),
pop_needed = 6),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Comms Blackout - Damage", /datum/event/communications_blackout/damage_machinery,
100, list(ASSIGNMENT_ENGINEER = 25),
pop_needed = 6),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm,
40, list(ASSIGNMENT_AI = 10, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 20)),
30, list(ASSIGNMENT_AI = 10, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 20)),
// see comment at code/modules/events/gravity.dm
// tl;dr gravity is handled globally, meaning if the horizon loses gravity, everyone does
@@ -333,7 +337,7 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
25, list(ASSIGNMENT_ENGINEER = 30)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "APC Damage", /datum/event/apc_damage,
20, list(ASSIGNMENT_ENGINEER = 15)),
20, list(ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 20)),
)
@@ -378,11 +382,11 @@ 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 = 5, ASSIGNMENT_ENGINEER = 2), is_one_shot = TRUE,
1, list(ASSIGNMENT_BRIDGE_CREW = 15, ASSIGNMENT_ENGINEER = 12), is_one_shot = TRUE,
pop_needed = 8),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "APC Damage", /datum/event/apc_damage,
20, list(ASSIGNMENT_ENGINEER = 15)),
20, list(ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 20)),
)

View File

@@ -341,7 +341,7 @@ ABSTRACT_TYPE(/obj/machinery/power/apc)
else
icon_state = basestate
else if(update_state & UPDATE_OPENED2)
icon_state = "[basestate]-nocover"
icon_state = "apcmaint" //needs missing "[basestate]-nocover" icon restored
else if(update_state & UPDATE_BROKE)
icon_state = "apc-b"
else if(update_state & UPDATE_BLUESCREEN)
@@ -941,6 +941,7 @@ ABSTRACT_TYPE(/obj/machinery/power/apc)
area.power_equip = (equipment > 1)
area.power_environ = (environ > 1)
else
GLOB.power_alarm.triggerAlarm(loc, src)
area.power_light = FALSE
area.power_equip = FALSE
area.power_environ = FALSE