From 4a63be94485cdc93cbb2cda98453ca1ce2a91466 Mon Sep 17 00:00:00 2001 From: Batrachophreno Date: Sun, 22 Jun 2025 14:09:11 -0400 Subject: [PATCH] More Event Variations, Event Balance (#20813) Some functional updates to events: **Comms Blackouts:** Now has a variant (min. 6 pop, engineering-weighted) which gives each machine a 10% chance to take a little integrity damage. Additionally, Telecomms Processors now factor their integrity damage into their ability to decompress messages, so this alternative comms blackout might cause radio transmissions (either global or for a given department) to start getting a little garbled- not enough to genuinely impede comms, but enough to justify Engi to fix them up. **Prison Break:** Given how rarely we actually have people sitting around in the prison waiting for breakouts over the course of a given round, this event has been changed to be more akin to the existing Containment events- the entire department (minus armory, nuke storage, checkpoints, etc.) are at risk of lights blown, access issues, etc. Just a little more variety added to the mix. **Space Vines:** Minimum 4 pop to fire. Shouldn't matter much in the grand scheme of things, just reduces annoyance factor for extremely low-pop if they roll some vines that fuck them up. Will look into refactoring that event so that the danger factor of the vines increases with population, and remove the min pop requirement again. **Drone Revolution:** Minimum 4 pop to fire. Again, shouldn't matter much in the grand scheme of things but this highest tier event will seriously fuck up anyone who latejoins and uses the maints to, say, help set the ship up during low pop! No I'm not salty! **Electrical Storm:** Refactored this and restored the Mundane and Major variants. While we want this event to keep Engineers on their toes and provide openings for people to break regs if they so wished, most of the event is theater (lots of flickering lights now!) While the Mundane and Moderate variants are mostly flavorful and will just give Engineers a few excuses to visit different departments and RP with people, Major events will be your 'all hands on deck' affairs (as Major events are ought) and in very rare circumstances could even cascade into more serious issues. Did a ton of unit testing on this and feel very good about how each variant actually looks, will make any additional tweaks if needed once we see how it plays with an actual population! The Event Probabilities sheet was also very out of date, missing Comet Expulsion, had the old Viral Outbreak, lots of old values, etc. Updated all the events, and also updated the % formulas to factor in minimum population- changing the 'Assumed Personnel' values at the top to a level below the minimum population for a given event will now correctly set its probability to 0%, making it clearer what actual odds are given different pop levels. I also don't think pop_needed was working correctly: various changes in there to get it behaving. Obv this PR grew in scope from outset and touches a small handful of different things, so lmk anything to mix and match and change and drop. !review --- .../machinery/telecomms/machines/processor.dm | 11 ++- .../machinery/telecomms/telecommunications.dm | 3 + .../modules/events/communications_blackout.dm | 7 ++ code/modules/events/electrical_storm.dm | 67 +++++++++++++----- code/modules/events/event.dm | 7 +- code/modules/events/event_container.dm | 31 +++++--- code/modules/events/prison_break.dm | 23 +++--- code/modules/power/apc.dm | 11 ++- .../Batrachophreno-EventUpdates.yml | 65 +++++++++++++++++ .../Event Probabilities.xlsx | Bin 34547 -> 33495 bytes 10 files changed, 181 insertions(+), 44 deletions(-) create mode 100644 html/changelogs/Batrachophreno-EventUpdates.yml diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm index c5a719c9198..52d8900a864 100644 --- a/code/game/machinery/telecomms/machines/processor.dm +++ b/code/game/machinery/telecomms/machines/processor.dm @@ -22,10 +22,17 @@ if(!is_freq_listening(signal)) return + // Processor set to COMPRESS if(!process_mode) - signal.data["compression"] = 100 // even more compressed signal + // Data scrambling increased from 35-65 to MAXIMUM GIBBERISH + signal.data["compression"] = 100 + // Processor set to UNCOMPRESS else if (signal.data["compression"]) - signal.data["compression"] = 0 // uncompress subspace signal + // Taken any damage? Start gently scrambling things. + if(integrity < 100) + signal.data["compression"] = rand(0, round((100-integrity))) + // Uncompress signal to complete clarity + else signal.data["compression"] = 0 if(istype(machine_from, /obj/machinery/telecomms/bus)) relay_direct_information(signal, machine_from) // send the signal back to the machine diff --git a/code/game/machinery/telecomms/telecommunications.dm b/code/game/machinery/telecomms/telecommunications.dm index 622ed5dcea8..e976ea2849c 100644 --- a/code/game/machinery/telecomms/telecommunications.dm +++ b/code/game/machinery/telecomms/telecommunications.dm @@ -147,6 +147,9 @@ stat |= EMPED addtimer(CALLBACK(src, PROC_REF(post_emp_act)), (300 SECONDS) / severity) +/obj/machinery/telecomms/proc/emp_damage() + integrity = between(0, integrity - (rand(5,30)), 100) + /obj/machinery/telecomms/proc/post_emp_act() stat &= ~EMPED toggle_power(POWER_USE_IDLE) diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index 84d2d90439c..9882da902d5 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -1,5 +1,9 @@ /datum/event/communications_blackout no_fake = 1 + var/damage_machinery = 0 + +/datum/event/communications_blackout/damage_machinery + damage_machinery = 1 /datum/event/communications_blackout/announce() var/alert = pick( "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you*%fj00)`5vc-BZZT", \ @@ -27,3 +31,6 @@ for(var/obj/machinery/telecomms/T in SSmachinery.all_telecomms) if(T.z in affecting_z) T.emp_act(EMP_HEAVY) + // 10% chance for a given machine to take damage: slight delays in transmission time or slight message garbling until repaired. + if(damage_machinery && prob(10)) + T.emp_damage() diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index e85e1d57edd..81a682663fa 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -6,6 +6,7 @@ has_skybox_image = TRUE var/list/valid_apcs var/global/lightning_color + var/storm_damage /datum/event/electrical_storm/Destroy(force) valid_apcs = null @@ -25,9 +26,10 @@ if(EVENT_LEVEL_MODERATE) command_announcement.Announce("The [location_name()] is about to pass through an electrical storm. Please secure sensitive electrical equipment until the storm passes.", "[location_name()] Sensor Array", new_sound = 'sound/AI/electrical_storm.ogg', zlevels = affecting_z) if(EVENT_LEVEL_MAJOR) - command_announcement.Announce("Alert. A strong electrical storm has been detected in proximity of the [location_name()]. It is recommended to immediately secure sensitive electrical equipment until the storm passes.", "[location_name()] Sensor Array", new_sound = 'sound/AI/electrical_storm.ogg', zlevels = affecting_z) + command_announcement.Announce("Alert. A catastrophic electrical storm has been detected in proximity of the [location_name()]. It is recommended to immediately secure sensitive electrical equipment until the storm passes.", "[location_name()] Sensor Array", new_sound = 'sound/AI/electrical_storm.ogg', zlevels = affecting_z) -/datum/event/electrical_storm/setup() +/datum/event/electrical_storm/start() + ..() valid_apcs = list() for(var/obj/machinery/power/apc/valid_apc in SSmachinery.apc_units) if((valid_apc.z in affecting_z) && !valid_apc.is_critical) @@ -42,32 +44,63 @@ /datum/event/electrical_storm/tick() ..() + /* + While we want this event to keep Engineers on their toes and provide openings for people to break regs if they so wished, + most of this should be theater: the biggest show should be lights flickering all over the place and a few APCs temporarily + disabled (and able to be immediately re-enabled by anyone) rather than creating excessive work for Engineering/Janitors. + + The damage and effect will add up very quickly when multiple APCs are targeted though. While Mundane and Moderate events are mostly + flavorful and will just give Engineers a few excuses to visit different departments and RP with people. Major events will be your + 'all hands on deck' affairs (as Major events are ought) and in very rare circumstances could even cascade into more serious issues + (battery detonates somewhere that pokes a hole in the hull and enough rooms are depowered once to start venting a portion of the ship.) + */ + if(!length(valid_apcs)) return var/list/picked_apcs = list() - for(var/i=0, i< severity*2, i++) // up to 2/4/6 APCs per tick depending on severity + // Up to 2/4/6 APCs per tick depending on severity + for(var/i = 0, i < (severity * 2), i++) picked_apcs |= pick(valid_apcs) - for(var/obj/machinery/power/apc/T in picked_apcs) - // Main breaker is turned off. Consider this APC protected. - if(!T.operating) + 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) + // Once storm damage exceeds a threshold, there is a random chance of certain secondary effects. + storm_damage = rand(0,100) + + // Main breaker is turned off, or we rolled lucky. Consider this APC protected. + if(!victim_apc.operating || storm_damage <= (80 - (severity * 25))) continue - // Decent chance to overload lighting circuit. - if(prob(3 * severity)) - T.overload_lighting() + // If the APC wasn't protected or we didn't roll lucky, flicker the lights for dramatic effect. + victim_apc.flicker_all() - // Relatively small chance to emag the apc as apc_damage event does. - if(prob(0.2 * severity)) - T.emagged = 1 - T.update_icon() + // Now all the things that can happen if we roll high on damage. + if(storm_damage > (90 - (severity * 5))) + // Very tiny chance to completely break the APC. Has a check to ensure we don't break critical APCs such as the Engine room, or AI core. Does not occur on Mundane severity. + if(prob((1 * severity) - 1)) + LOG_DEBUG("[victim_apc.name]: storm destroyed") + victim_apc.set_broken() + continue - T.energy_fail(10 * severity * rand(severity * 2, severity * 4)) + // Very high chance to shutdown the APC for a short time; this can be reversed immediately by interacting with it. + if(prob(80 + (severity * 5))) + victim_apc.energy_fail(4 * severity * rand(severity * 2, severity * 4)) - // Very tiny chance to completely break the APC. Has a check to ensure we don't break critical APCs such as the Engine room, or AI core. Does not occur on Mundane severity. - if(prob((0.2 * severity) - 0.2)) - T.set_broken() + // Medium chance to overload lighting circuit. + if(prob(15 * severity)) + victim_apc.overload_lighting((range(15 * severity, 100))) + // Tiny chance to corrupt the cell (could potentially cause minor explosions!) + if(!QDELETED(victim_apc.cell) && prob(8 * severity)) + victim_apc.cell.corrupt() + + // Small chance to emag the apc as apc_damage event does. + if(prob(8 * severity)) + victim_apc.emagged = 1 + victim_apc.update_icon() /datum/event/electrical_storm/announce_end() . = ..() diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm index 5cceb97d5d9..ae003fc7892 100644 --- a/code/modules/events/event.dm +++ b/code/modules/events/event.dm @@ -28,7 +28,7 @@ var/list/minimum_job_requirement = list() ///Minimum amount of player_list mobs for this to fire - var/pop_requirement = 0 + var/pop_requirement = 1 /// A lazylist of gamemodes during which this event won't fire var/list/excluded_gamemodes @@ -59,7 +59,10 @@ if(!enabled) return 0 - if(length(GLOB.player_list) <= pop_requirement) + var/n = 0 + for (var/mob/living in GLOB.player_list) + n++ + if(n <= pop_requirement) return 0 if(LAZYISIN(excluded_gamemodes, SSticker.mode.name)) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index b53d447612e..09f81fd233a 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -128,6 +128,7 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT //WHAT THE FUCK IS THIS, WHY /// Returns how many characters are currently active (not logged out, not AFK for more than 10 minutes) with a specific role. /// Note that this isn't sorted by department, because e.g. having a roboticist shouldn't make meteors spawn. +/// The higher this value is, the greater likelihood that the event will occur with each active dept member. /proc/number_active_with_role() var/list/active_with_role = list() active_with_role[ASSIGNMENT_ANY] = 0 @@ -223,6 +224,9 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Electrical Storm", /datum/event/electrical_storm, + 50, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 25)), + new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Cozmozoan Migration", /datum/event/carp_migration/cozmo, 60), @@ -282,11 +286,15 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_SURGEON = 25)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Comms Blackout", /datum/event/communications_blackout, 100), + 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, - 50, list(ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 20)), + 40, 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 @@ -296,11 +304,11 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_AI = 45, ASSIGNMENT_CYBORG = 25, ASSIGNMENT_ENGINEER = 6, ASSIGNMENT_SCIENTIST = 6)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Containment Error - Security", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 15, ASSIGNMENT_CYBORG = 20), TRUE), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Containment Error - Xenobiology", /datum/event/prison_break/xenobiology, - 0, list(ASSIGNMENT_SCIENTIST = 15, ASSIGNMENT_CYBORG = 20), TRUE), + 0, list(ASSIGNMENT_SCIENTIST = 25, ASSIGNMENT_CYBORG = 20), TRUE), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Containment Error - Bridge", /datum/event/prison_break/bridge, 0, list(ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_CYBORG = 20), TRUE), @@ -316,8 +324,7 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT 15, list(ASSIGNMENT_SECURITY = 15)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Moderate Spider Infestation", /datum/event/spider_infestation/moderate, - 50, list(ASSIGNMENT_SECURITY = 10), - pop_needed = 8), + 50, list(ASSIGNMENT_SECURITY = 10)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Moderate Vermin Infestation", /datum/event/infestation/moderate, 30, list(ASSIGNMENT_JANITOR = 15, ASSIGNMENT_SECURITY = 15, ASSIGNMENT_MEDICAL = 10)), @@ -353,18 +360,22 @@ GLOBAL_LIST_INIT(severity_to_string, list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT 0, list(ASSIGNMENT_ENGINEER = 10), TRUE, minimum_job_requirement_list = list(ASSIGNMENT_ENGINEER = 2), pop_needed = 10), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Electrical Storm", /datum/event/electrical_storm, + 30, list(ASSIGNMENT_AI = 20, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 20)), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, - 0, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_GARDENER = 20), TRUE), + 0, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_GARDENER = 20), TRUE, + pop_needed = 4), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Spider Infestation", /datum/event/spider_infestation, - 25, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_MEDICAL = 5), TRUE, - pop_needed = 8), + 25, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_MEDICAL = 5), TRUE), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Major Vermin Infestation", /datum/event/infestation/major, 15, list(ASSIGNMENT_SECURITY = 15, ASSIGNMENT_MEDICAL = 5)), new /datum/event_meta(EVENT_LEVEL_MAJOR, "Drone Revolution", /datum/event/rogue_maint_drones, - 0, list(ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 5, ASSIGNMENT_SECURITY = 5)), + 0, list(ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 5, ASSIGNMENT_SECURITY = 5), + 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, diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index cb1884e2fe6..e83b964efd4 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -3,14 +3,19 @@ announceWhen = 75 var/releaseWhen = 60 - var/list/area/areas = list() //List of areas to affect. Filled by start() + //List of areas to affect. Filled by start() + var/list/area/areas = list() ic_name = "an imprisonment system virus" no_fake = 1 - var/eventDept = "Security" //Department name in announcement - var/list/areaName = list("Brig") //Names of areas mentioned in AI and Engineering announcements - var/list/areaType = list(/area/security/prison, /area/security/brig) //Area types to include. - var/list/areaNotType = list() //Area types to specifically exclude. + //Department name in announcement + var/eventDept = "Security" + //Names of areas mentioned in AI and Engineering announcements + var/list/areaName = list("Security") + //Area types to include. + var/list/areaType = list(/area/security) + //Area types to specifically exclude. + var/list/areaNotType = list(/area/security/armory, /area/security/nuke_storage, /area/security/checkpoint, /area/security/checkpoint2, /area/security/bridge_surface_checkpoint, /area/security/penal_colony) /datum/event/prison_break/xenobiology eventDept = "Science" @@ -18,12 +23,6 @@ areaType = list(/area/rnd/xenobiology) areaNotType = list(/area/rnd/xenobiology/xenoflora, /area/rnd/xenobiology/xenoflora_storage) -/datum/event/prison_break/station - eventDept = "Station" - areaName = list("Brig","Xenobiology") - areaType = list(/area/security/prison, /area/security/brig, /area/rnd/xenobiology) - areaNotType = list(/area/rnd/xenobiology/xenoflora, /area/rnd/xenobiology/xenoflora_storage) - /datum/event/prison_break/bridge eventDept = "Bridge" areaName = list("Bridge") @@ -39,7 +38,7 @@ /datum/event/prison_break/announce() if(areas && areas.len > 0) - command_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name()] [(eventDept == "Security")? "imprisonment":"containment"] subroutines. Secure any compromised areas immediately. AI involvement is recommended.", "[eventDept] Alert", zlevels = affecting_z) + command_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name()] containment subroutines. Secure any compromised areas immediately. AI involvement is recommended.", "[eventDept] Alert", zlevels = affecting_z) /datum/event/prison_break/start() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 6556bff8829..09e8c5c014d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1322,12 +1322,20 @@ ABSTRACT_TYPE(/obj/machinery/power/apc) /obj/machinery/power/apc/proc/set_broken() // Aesthetically much better! visible_message(SPAN_NOTICE("[src]'s screen flickers with warnings briefly!")) + spark(src, 5, GLOB.alldirs) addtimer(CALLBACK(src, PROC_REF(break_timer)), rand(2, 5)) /obj/machinery/power/apc/proc/break_timer() - visible_message(SPAN_NOTICE("[src]'s screen suddenly explodes in rain of sparks and small debris!")) + visible_message(SPAN_DANGER("[src]'s screen suddenly explodes in rain of sparks and small debris!"), \ + SPAN_DANGER("You hear sizzling electronics.")) + var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() + smoke.set_up(3, 0, loc) + smoke.attach(src) + smoke.start() + spark(src, 5, GLOB.alldirs) stat |= BROKEN operating = 0 + failure_timer = 0 queue_icon_update() update() @@ -1345,6 +1353,7 @@ ABSTRACT_TYPE(/obj/machinery/power/apc) if (prob(chance)) L.stat &= ~POWEROFF L.broken() + spark(L, 5, GLOB.alldirs) CHECK_TICK /obj/machinery/power/apc/proc/flicker_all() diff --git a/html/changelogs/Batrachophreno-EventUpdates.yml b/html/changelogs/Batrachophreno-EventUpdates.yml new file mode 100644 index 00000000000..f2f92caa121 --- /dev/null +++ b/html/changelogs/Batrachophreno-EventUpdates.yml @@ -0,0 +1,65 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: Batrachophreno + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added variant of the Communications Blackout event which has the potential to damage telecomms machinery (weighted towards Engineering being on-manifest)." + - rscadd: "Telecomms Processors now factor damage into account when uncompressing messages (gibberish factor increases with damage)." + - balance: "Prison Break event adjusted to be in line with Containment events (now affects all of Security excepting certain highly secured areas)." + - balance: "Space Vines, Drone Revolution major events now require minimum population of 4." + - qol: "Majorly updated Event Probabilities sheet (updated multiple changed events, removed retired events, added missing new events, etc.)" + - bugfix: "Event selection now respects minimum pop requirement param." + - balance: "Refactored the Electrical Storm behavior to play more interestingly (less grinding busywork, more smoke and mirrors)." + - rscadd: "Added Mundane and Major variants of the Electrical Storm event." \ No newline at end of file diff --git a/tools/Event Probabilities/Event Probabilities.xlsx b/tools/Event Probabilities/Event Probabilities.xlsx index 6c4ae1274dd6c468d7655df8f4dd5bb88f1aa3d2..1be10c2b1ceea59894d383f31458082f543e27e8 100644 GIT binary patch literal 33495 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 literal 34547 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 N4EulyPQC@i0|0E(ke2`e