From b5e57216ee682c5b3c870ffd5ccf548ff1ba7791 Mon Sep 17 00:00:00 2001 From: Profakos Date: Thu, 4 Aug 2022 23:18:14 +0200 Subject: [PATCH] Event menu rewrite (#68472) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit About The Pull Request kép This PR does the following: Force event menu uses tgUI. Arranged events into categories, and added a little description to each. The descriptions appear as tooltips when you hover over the Trigger button. Rewrote how "Announce to crew?" works. It no longer pops up a panel after the event has been already announced. Instead, the admins select it via a checkbox, and the result is passed through an optional argument. announceChance's comment is tweaked a bit to reflect how it actually works at the moment. Moved rpgtitles to wizard events, where it belongs. Fake Virus and Electric Storms show up to observers, as I believe they are not as common as Space Dust or Camera Failure, and should be cancelable. Potential issues: This only solves half of #68408, I don't think admin triggering having a timer and a cancel button is a big issue, as it allows other admins to overrule you if needed, but if i is, I will try to fix it within this PR. Fixes #68408. Events now spawn immediately, and the the announceChance is overwritten before it begins. My choices for categories and descriptions might not be the best, feedback would be appreciated. Why It's Good For The Game The old spawn menu was completely unorganized, and you could only search using the browser search tool. I believe a built in search bar helps with this issue a bit. I also believe that organizing the events into categories, and adding descriptions will help with newer admins who might not be familiar with all events. Changelog cl refactor: The Force Event UI has been refactored refactor: Events now have categories and descriptions refactor: Admin triggered events happen immediately balance: Fake Virus and Electric Storms are shown to admins, making them cancelable /cl --- code/__DEFINES/events.dm | 23 ++++ code/controllers/subsystem/events.dm | 35 ------ code/modules/admin/force_event.dm | 69 +++++++++++ code/modules/admin/topic.dm | 24 ---- .../antagonists/disease/disease_event.dm | 3 +- code/modules/antagonists/morph/morph.dm | 2 + .../revenant/revenant_spawn_event.dm | 2 + .../antagonists/slaughter/slaughterevent.dm | 2 + code/modules/events/_event.dm | 18 ++- code/modules/events/abductor.dm | 2 + code/modules/events/alien_infestation.dm | 2 + code/modules/events/anomaly.dm | 2 + code/modules/events/anomaly_bioscrambler.dm | 1 + code/modules/events/anomaly_bluespace.dm | 1 + code/modules/events/anomaly_flux.dm | 1 + code/modules/events/anomaly_grav.dm | 2 + code/modules/events/anomaly_hallucination.dm | 1 + code/modules/events/anomaly_pyro.dm | 1 + code/modules/events/anomaly_vortex.dm | 1 + code/modules/events/aurora_caelus.dm | 2 + code/modules/events/blob.dm | 2 + code/modules/events/brain_trauma.dm | 2 + code/modules/events/brand_intelligence.dm | 2 + code/modules/events/bureaucratic_error.dm | 2 + code/modules/events/camerafailure.dm | 2 + code/modules/events/carp_migration.dm | 2 + .../modules/events/communications_blackout.dm | 2 + code/modules/events/creep_awakening.dm | 2 + code/modules/events/disease_outbreak.dm | 2 + code/modules/events/dust.dm | 4 + code/modules/events/electrical_storm.dm | 3 +- code/modules/events/fake_virus.dm | 3 +- code/modules/events/false_alarm.dm | 3 +- code/modules/events/fugitive_spawning.dm | 2 + .../events/gravity_generator_blackout.dm | 2 + code/modules/events/grid_check.dm | 2 + code/modules/events/heart_attack.dm | 2 + code/modules/events/holiday/halloween.dm | 2 + code/modules/events/holiday/vday.dm | 2 + code/modules/events/holiday/xmas.dm | 2 + code/modules/events/immovable_rod.dm | 2 + code/modules/events/ion_storm.dm | 2 + code/modules/events/major_dust.dm | 1 + code/modules/events/market_crash.dm | 2 + code/modules/events/mass_hallucination.dm | 2 + code/modules/events/meateor_wave.dm | 1 + code/modules/events/meteor_wave.dm | 4 + code/modules/events/mice_migration.dm | 2 + code/modules/events/nightmare.dm | 2 + code/modules/events/operative.dm | 2 + code/modules/events/pirates.dm | 2 + code/modules/events/portal_storm.dm | 4 + code/modules/events/prison_break.dm | 2 + code/modules/events/processor_overload.dm | 2 + code/modules/events/radiation_storm.dm | 2 + code/modules/events/scrubber_clog.dm | 5 + code/modules/events/sentience.dm | 4 + code/modules/events/shuttle_catastrophe.dm | 2 + code/modules/events/shuttle_insurance.dm | 2 + code/modules/events/shuttle_loan.dm | 2 + code/modules/events/space_dragon.dm | 2 + code/modules/events/space_ninja.dm | 2 + code/modules/events/spacevine.dm | 2 + code/modules/events/spider_infestation.dm | 2 + code/modules/events/stray_cargo.dm | 3 + code/modules/events/wisdomcow.dm | 2 + code/modules/events/wizard/aid.dm | 2 + code/modules/events/wizard/blobies.dm | 1 + code/modules/events/wizard/curseditems.dm | 1 + .../modules/events/wizard/departmentrevolt.dm | 1 + code/modules/events/wizard/embeddies.dm | 2 + code/modules/events/wizard/fakeexplosion.dm | 1 + code/modules/events/wizard/ghost.dm | 2 + code/modules/events/wizard/greentext.dm | 1 + code/modules/events/wizard/identity_spoof.dm | 1 + code/modules/events/wizard/imposter.dm | 1 + code/modules/events/wizard/invincible.dm | 1 + code/modules/events/wizard/lava.dm | 1 + code/modules/events/wizard/madness.dm | 1 + code/modules/events/wizard/magicarp.dm | 1 + code/modules/events/wizard/petsplosion.dm | 1 + code/modules/events/wizard/race.dm | 1 + code/modules/events/wizard/rpgloot.dm | 1 + code/modules/events/{ => wizard}/rpgtitles.dm | 1 + code/modules/events/wizard/shuffle.dm | 3 + code/modules/events/wizard/summons.dm | 2 + code/modules/events/wormholes.dm | 2 + code/modules/holiday/easter.dm | 4 + code/modules/tgui/states/fun.dm | 17 +++ tgstation.dme | 4 +- tgui/packages/tgui/interfaces/ForceEvent.js | 116 ++++++++++++++++++ 91 files changed, 401 insertions(+), 67 deletions(-) create mode 100644 code/modules/admin/force_event.dm rename code/modules/events/{ => wizard}/rpgtitles.dm (98%) create mode 100644 code/modules/tgui/states/fun.dm create mode 100644 tgui/packages/tgui/interfaces/ForceEvent.js diff --git a/code/__DEFINES/events.dm b/code/__DEFINES/events.dm index d39932e1a70..0e72379461a 100644 --- a/code/__DEFINES/events.dm +++ b/code/__DEFINES/events.dm @@ -7,3 +7,26 @@ #define EVENT_READY 1 #define EVENT_CANCELLED 2 #define EVENT_INTERRUPTED 3 + +///Events that mess with or create artificial intelligences, such as vending machines and the AI itself +#define EVENT_CATEGORY_AI "AI issues" +///Events that spawn anomalies, which might be the source of anomaly cores +#define EVENT_CATEGORY_ANOMALIES "Anomalies" +///Events pertaining cargo, messages incoming to the station and job slots +#define EVENT_CATEGORY_BUREAUCRATIC "Bureaucratic" +///Events that cause breakages and malfunctions that could be fixed by engineers +#define EVENT_CATEGORY_ENGINEERING "Engineering" +///Events that spawn creatures with simple desires, such as to hunt +#define EVENT_CATEGORY_ENTITIES "Entities" +///Events that should have no harmful effects, and might be useful to the crew +#define EVENT_CATEGORY_FRIENDLY "Friendly" +///Events that affect the body and mind +#define EVENT_CATEGORY_HEALTH "Health" +///Events reserved for special occassions +#define EVENT_CATEGORY_HOLIDAY "Holiday" +///Events with enemy groups with a more complex plan +#define EVENT_CATEGORY_INVASION "Invasion" +///Events that summon meteors and other debris, and stationwide waves of harmful space weather +#define EVENT_CATEGORY_SPACE "Space Threats" +///Events summoned by a wizard +#define EVENT_CATEGORY_WIZARD "Wizard" diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 75a9d109cd9..32c8ef97b14 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -92,41 +92,6 @@ SUBSYSTEM_DEF(events) else if(. == EVENT_READY) E.runEvent(random = TRUE) -//allows a client to trigger an event -//aka Badmin Central -// > Not in modules/admin -// REEEEEEEEE -// Why the heck is this here! Took me so damn long to find! -/client/proc/forceEvent() - set name = "Trigger Event" - set category = "Admin.Events" - - if(!holder ||!check_rights(R_FUN)) - return - - holder.forceEvent() - -/datum/admins/proc/forceEvent() - var/dat = "" - var/normal = "" - var/magic = "" - var/holiday = "" - for(var/datum/round_event_control/E in SSevents.control) - dat = "
[E]" - if(E.holidayID) - holiday += dat - else if(E.wizardevent) - magic += dat - else - normal += dat - - dat = normal + "
" + magic + "
" + holiday - - var/datum/browser/popup = new(usr, "forceevent", "Force Random Event", 300, 750) - popup.set_content(dat) - popup.open() - - /* ////////////// // HOLIDAYS // diff --git a/code/modules/admin/force_event.dm b/code/modules/admin/force_event.dm new file mode 100644 index 00000000000..86d400c3c9b --- /dev/null +++ b/code/modules/admin/force_event.dm @@ -0,0 +1,69 @@ +///Allows an admin to force an event +/client/proc/forceEvent() + set name = "Trigger Event" + set category = "Admin.Events" + + if(!holder ||!check_rights(R_FUN)) + return + + holder.forceEvent() + +///Opens up the Force Event Panel +/datum/admins/proc/forceEvent() + if(!check_rights(R_FUN)) + return + + var/datum/force_event/ui = new(usr) + ui.ui_interact(usr) + +/// Force Event Panel +/datum/force_event + +/datum/force_event/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ForceEvent") + ui.open() + +/datum/force_event/ui_state(mob/user) + return GLOB.fun_state + +/datum/force_event/ui_static_data(mob/user) + var/list/data = list() + data["categories"] = list() + for(var/datum/round_event_control/event_control in SSevents.control) + if(!data["categories"][event_control.category]) + data["categories"][event_control.category] = list( + "name" = event_control.category, + "events" = list() + ) + data["categories"][event_control.category]["events"] += list(list( + "name" = event_control.name, + "description" = event_control.description, + "type" = event_control.type + )) + return data + +/datum/force_event/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + if(..()) + return + if(!check_rights(R_FUN)) + return + switch(action) + if("forceevent") + var/announce_event = params["announce"] + var/string_path = params["type"] + if(!string_path) + return + var/event_to_run_type = text2path(string_path) + if(!event_to_run_type) + return + var/datum/round_event_control/event = locate(event_to_run_type) in SSevents.control + if(!event) + return + event.admin_setup(usr) + var/always_announce_chance = 100 + var/no_announce_chance = 0 + event.runEvent(announce_chance_override = announce_event ? always_announce_chance : no_announce_chance, admin_forced = TRUE) + message_admins("[key_name_admin(usr)] has triggered an event. ([event.name])") + log_admin("[key_name(usr)] has triggered an event. ([event.name])") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 4d78a84a361..0fce604884c 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -47,30 +47,6 @@ to_chat(usr, span_danger("ERROR: Mob not found."), confidential = TRUE) return cmd_show_exp_panel(M.client) - else if(href_list["forceevent"]) - if(!check_rights(R_FUN)) - return - var/datum/round_event_control/E = locate(href_list["forceevent"]) in SSevents.control - if(E) - E.admin_setup(usr) - var/datum/round_event/event = E.runEvent() - if(event.cancel_event) - return - if(event.announceWhen>0) - event.processing = FALSE - var/prompt = tgui_alert(usr, "Would you like to alert the crew?", "Alert", list("Yes", "No", "Cancel")) - switch(prompt) - if("Yes") - event.announceChance = 100 - if("Cancel") - event.kill() - return - if("No") - event.announceChance = 0 - event.processing = TRUE - message_admins("[key_name_admin(usr)] has triggered an event. ([E.name])") - log_admin("[key_name(usr)] has triggered an event. ([E.name])") - return else if(href_list["editrightsbrowser"]) edit_admin_permissions(0) diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm index 5206934cf68..66986a99aa2 100644 --- a/code/modules/antagonists/disease/disease_event.dm +++ b/code/modules/antagonists/disease/disease_event.dm @@ -5,7 +5,8 @@ weight = 7 max_occurrences = 1 min_players = 25 - + category = EVENT_CATEGORY_HEALTH + description = "Spawns a sentient disease, who wants to infect as many people as possible." /datum/round_event/ghost_role/sentient_disease role_name = "sentient disease" diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index b046fc3014e..d046d136130 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -210,6 +210,8 @@ typepath = /datum/round_event/ghost_role/morph weight = 0 //Admin only max_occurrences = 1 + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a hungry shapeshifting blobby creature." /datum/round_event/ghost_role/morph minimum_required = 1 diff --git a/code/modules/antagonists/revenant/revenant_spawn_event.dm b/code/modules/antagonists/revenant/revenant_spawn_event.dm index 5b548e478b2..cb9df58961a 100644 --- a/code/modules/antagonists/revenant/revenant_spawn_event.dm +++ b/code/modules/antagonists/revenant/revenant_spawn_event.dm @@ -7,6 +7,8 @@ max_occurrences = 1 min_players = 5 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "Spawns an angry, soul sucking ghost." /datum/round_event/ghost_role/revenant diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm index b2463f6b642..15a3746b237 100644 --- a/code/modules/antagonists/slaughter/slaughterevent.dm +++ b/code/modules/antagonists/slaughter/slaughterevent.dm @@ -6,6 +6,8 @@ earliest_start = 1 HOURS min_players = 20 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a slaughter demon, to hunt by travelling through pools of blood." /datum/round_event/ghost_role/slaughter minimum_required = 1 diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index e95dec07f69..b9582cf4456 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -3,6 +3,8 @@ //this singleton datum is used by the events controller to dictate how it selects events /datum/round_event_control var/name //The human-readable name of the event + var/category //The category of the event + var/description //The description of the event var/typepath //The typepath of the event datum /datum/round_event var/weight = 10 //The weight this event has in the random-selection process. @@ -34,6 +36,7 @@ min_players = CEILING(min_players * CONFIG_GET(number/events_min_players_mul), 1) /datum/round_event_control/wizard + category = EVENT_CATEGORY_WIZARD wizardevent = TRUE // Checks if the event can be spawned. Used by event controller and "false alarm" event. @@ -92,7 +95,13 @@ log_admin_private("[key_name(usr)] cancelled event [name].") SSblackbox.record_feedback("tally", "event_admin_cancelled", 1, typepath) -/datum/round_event_control/proc/runEvent(random = FALSE) +/* +Runs the event +* Arguments: +* - random: shows if the event was triggered randomly, or by on purpose by an admin or an item +* - announce_chance_override: if the value is not null, overrides the announcement chance when an admin calls an event +*/ +/datum/round_event_control/proc/runEvent(random = FALSE, announce_chance_override = null, admin_forced = FALSE) /* * We clear our signals first so we dont cancel a wanted event by accident, * the majority of time the admin will probably want to cancel a single midround spawned random events @@ -105,10 +114,13 @@ E.control = src occurrences++ + if(announce_chance_override != null) + E.announceChance = announce_chance_override + testing("[time2text(world.time, "hh:mm:ss")] [E.type]") triggering = TRUE - if (alert_observers) + if (alert_observers && !admin_forced) message_admins("Random Event triggering in [DisplayTimeText(RANDOM_EVENT_ADMIN_INTERVENTION_TIME)]: [name] (CANCEL)") sleep(RANDOM_EVENT_ADMIN_INTERVENTION_TIME) @@ -142,7 +154,7 @@ var/startWhen = 0 //When in the lifetime to call start(). var/announceWhen = 0 //When in the lifetime to call announce(). If you don't want it to announce use announceChance, below. - var/announceChance = 100 // Probability of announcing, used in prob(), 0 to 100, default 100. Used in ion storms currently. + var/announceChance = 100 // Probability of announcing, used in prob(), 0 to 100, default 100. Called in process, and for a second time in the ion storm event. var/endWhen = 0 //When in the lifetime the event should end. var/activeFor = 0 //How long the event has existed. You don't need to change this. diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index 917f4752b52..8a2ccd0bc51 100755 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -5,6 +5,8 @@ max_occurrences = 1 min_players = 20 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_INVASION + description = "One or more abductor teams spawns, and they plan to experiment on the crew." /datum/round_event/ghost_role/abductor minimum_required = 2 diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 222741568fc..81469588055 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -6,6 +6,8 @@ min_players = 10 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "A xenomorph larva spawns on a random vent." /datum/round_event_control/alien_infestation/canSpawnEvent() . = ..() diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm index e695fa4f177..c8c4fa8ded5 100644 --- a/code/modules/events/anomaly.dm +++ b/code/modules/events/anomaly.dm @@ -5,6 +5,8 @@ min_players = 1 max_occurrences = 0 //This one probably shouldn't occur! It'd work, but it wouldn't be very fun. weight = 15 + category = EVENT_CATEGORY_ANOMALIES + description = "This anomaly shocks and explodes. This is the base type." /datum/round_event/anomaly var/area/impact_area diff --git a/code/modules/events/anomaly_bioscrambler.dm b/code/modules/events/anomaly_bioscrambler.dm index 7975b31c48a..04c2f78cd61 100644 --- a/code/modules/events/anomaly_bioscrambler.dm +++ b/code/modules/events/anomaly_bioscrambler.dm @@ -5,6 +5,7 @@ min_players = 10 max_occurrences = 5 weight = 20 + description = "This anomaly replaces the limbs of nearby people." /datum/round_event/anomaly/anomaly_bioscrambler startWhen = 10 diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 23a2a1968a8..1716f2ace88 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -4,6 +4,7 @@ max_occurrences = 1 weight = 15 + description = "This anomaly randomly teleports all items and mobs in a large area." /datum/round_event/anomaly/anomaly_bluespace startWhen = 3 diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm index 4737ad9bb41..d70bb0c659d 100644 --- a/code/modules/events/anomaly_flux.dm +++ b/code/modules/events/anomaly_flux.dm @@ -5,6 +5,7 @@ min_players = 10 max_occurrences = 5 weight = 20 + description = "This anomaly shocks and explodes." /datum/round_event/anomaly/anomaly_flux startWhen = 10 diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index 575bdc92808..dd70dad724a 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -4,6 +4,7 @@ max_occurrences = 5 weight = 25 + description = "This anomaly throws things around." /datum/round_event/anomaly/anomaly_grav startWhen = 3 @@ -16,6 +17,7 @@ weight = 15 max_occurrences = 1 earliest_start = 20 MINUTES + description = "This anomaly has an intense gravitational field, and can disable the gravity generator." /datum/round_event/anomaly/anomaly_grav/high startWhen = 3 diff --git a/code/modules/events/anomaly_hallucination.dm b/code/modules/events/anomaly_hallucination.dm index 0f3628c7e0b..8339599f9a5 100644 --- a/code/modules/events/anomaly_hallucination.dm +++ b/code/modules/events/anomaly_hallucination.dm @@ -5,6 +5,7 @@ min_players = 10 max_occurrences = 5 weight = 20 + description = "This anomaly causes you to hallucinate." /datum/round_event/anomaly/anomaly_hallucination startWhen = 10 diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 29c6e15d282..3df01e867b0 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -4,6 +4,7 @@ max_occurrences = 5 weight = 20 + description = "This anomaly sets things on fire, and creates a pyroclastic slime." /datum/round_event/anomaly/anomaly_pyro startWhen = 3 diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm index feb32ff13cd..307ea33b933 100644 --- a/code/modules/events/anomaly_vortex.dm +++ b/code/modules/events/anomaly_vortex.dm @@ -5,6 +5,7 @@ min_players = 20 max_occurrences = 2 weight = 10 + description = "This anomaly sucks in and detonates items." /datum/round_event/anomaly/anomaly_vortex startWhen = 10 diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index 3f15ab2e842..a49a95884d0 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -4,6 +4,8 @@ max_occurrences = 1 weight = 1 earliest_start = 5 MINUTES + category = EVENT_CATEGORY_FRIENDLY + description = "A colourful display can be seen through select windows. And the kitchen." /datum/round_event_control/aurora_caelus/canSpawnEvent(players) if(!CONFIG_GET(flag/starlight)) diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 32ce24d4fb7..0b805926563 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -7,6 +7,8 @@ min_players = 20 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a new blob overmind." /datum/round_event_control/blob/canSpawnEvent(players) if(EMERGENCY_PAST_POINT_OF_NO_RETURN) // no blobs if the shuttle is past the point of no return diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index ecb0dd00790..efe0d90311c 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -2,6 +2,8 @@ name = "Spontaneous Brain Trauma" typepath = /datum/round_event/brain_trauma weight = 25 + category = EVENT_CATEGORY_HEALTH + description = "A crewmember gains a random trauma." /datum/round_event/brain_trauma fakeable = FALSE diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 78469224b8d..2071495c3a6 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -2,6 +2,8 @@ name = "Brand Intelligence" typepath = /datum/round_event/brand_intelligence weight = 5 + category = EVENT_CATEGORY_AI + description = "Vending machines will attack people until the Patient Zero is disabled." min_players = 15 max_occurrences = 1 diff --git a/code/modules/events/bureaucratic_error.dm b/code/modules/events/bureaucratic_error.dm index f46775fc102..2df3a0fb4b7 100644 --- a/code/modules/events/bureaucratic_error.dm +++ b/code/modules/events/bureaucratic_error.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/bureaucratic_error max_occurrences = 1 weight = 5 + category = EVENT_CATEGORY_BUREAUCRATIC + description = "Randomly opens and closes job slots, along with changing the overflow role." /datum/round_event/bureaucratic_error announceWhen = 1 diff --git a/code/modules/events/camerafailure.dm b/code/modules/events/camerafailure.dm index 8d7ef3204ce..453b919c5b8 100644 --- a/code/modules/events/camerafailure.dm +++ b/code/modules/events/camerafailure.dm @@ -4,6 +4,8 @@ weight = 100 max_occurrences = 20 alert_observers = FALSE + category = EVENT_CATEGORY_ENGINEERING + description = "Turns off a random amount of cameras." /datum/round_event/camera_failure fakeable = FALSE diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index a8cb9867be1..9a9f560bd8f 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -5,6 +5,8 @@ min_players = 2 earliest_start = 10 MINUTES max_occurrences = 6 + category = EVENT_CATEGORY_ENTITIES + description = "Summons a school of space carp." /datum/round_event_control/carp_migration/New() . = ..() diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm index d9c45242989..2a85ce817de 100644 --- a/code/modules/events/communications_blackout.dm +++ b/code/modules/events/communications_blackout.dm @@ -2,6 +2,8 @@ name = "Communications Blackout" typepath = /datum/round_event/communications_blackout weight = 30 + category = EVENT_CATEGORY_ENGINEERING + description = "Heavily emps all telecommunication machines, blocking all communication for a while." /datum/round_event/communications_blackout announceWhen = 1 diff --git a/code/modules/events/creep_awakening.dm b/code/modules/events/creep_awakening.dm index ad2b86720a1..75cf51b53f5 100644 --- a/code/modules/events/creep_awakening.dm +++ b/code/modules/events/creep_awakening.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/obsessed max_occurrences = 1 min_players = 20 + category = EVENT_CATEGORY_HEALTH + description = "A random crewmember becomes obsessed with another." /datum/round_event/obsessed fakeable = FALSE diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 9cae45b5b8b..56798f2a919 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -4,6 +4,8 @@ max_occurrences = 1 min_players = 10 weight = 5 + category = EVENT_CATEGORY_HEALTH + description = "A classic or advanced disease will infect some crewmembers." /datum/round_event/disease_outbreak announceWhen = 15 diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 06c75c0c07f..20441a53aa2 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -5,6 +5,8 @@ max_occurrences = 1000 earliest_start = 0 MINUTES alert_observers = FALSE + category = EVENT_CATEGORY_SPACE + description = "A single space dust is hurled at the station." /datum/round_event/space_dust startWhen = 1 @@ -20,6 +22,8 @@ weight = 0 max_occurrences = 0 earliest_start = 0 MINUTES + category = EVENT_CATEGORY_SPACE + description = "The station is pelted by an extreme amount of sand for several minutes." /datum/round_event/sandstorm startWhen = 1 diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index e56fe25fbe0..b1503cd2275 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -4,7 +4,8 @@ earliest_start = 10 MINUTES min_players = 5 weight = 20 - alert_observers = FALSE + category = EVENT_CATEGORY_ENGINEERING + description = "Destroys all lights in a large area." /datum/round_event/electrical_storm var/lightsoutAmount = 1 diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm index a582832a0b6..b64080c22ac 100644 --- a/code/modules/events/fake_virus.dm +++ b/code/modules/events/fake_virus.dm @@ -2,7 +2,8 @@ name = "Fake Virus" typepath = /datum/round_event/fake_virus weight = 20 - alert_observers = FALSE + category = EVENT_CATEGORY_HEALTH + description = "Some crewmembers suffer from temporary hypochondria." /datum/round_event/fake_virus/start() var/list/fake_virus_victims = list() diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index 18913c73f12..e8d1a364421 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -4,7 +4,8 @@ weight = 20 max_occurrences = 5 var/forced_type //Admin abuse - + category = EVENT_CATEGORY_BUREAUCRATIC + description = "Fakes an event announcement." /datum/round_event_control/falsealarm/admin_setup() if(!check_rights(R_FUN)) diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm index e176a892323..f300f825596 100644 --- a/code/modules/events/fugitive_spawning.dm +++ b/code/modules/events/fugitive_spawning.dm @@ -4,6 +4,8 @@ max_occurrences = 1 min_players = 20 earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on. + category = EVENT_CATEGORY_INVASION + description = "Fugitives will hide on the station, followed by hunters." /datum/round_event/ghost_role/fugitives minimum_required = 1 diff --git a/code/modules/events/gravity_generator_blackout.dm b/code/modules/events/gravity_generator_blackout.dm index 39bd3c4850a..eb9301f3f78 100644 --- a/code/modules/events/gravity_generator_blackout.dm +++ b/code/modules/events/gravity_generator_blackout.dm @@ -2,6 +2,8 @@ name = "Gravity Generator Blackout" typepath = /datum/round_event/gravity_generator_blackout weight = 30 + category = EVENT_CATEGORY_ENGINEERING + description = "Turns off the gravity generator." /datum/round_event_control/gravity_generator_blackout/canSpawnEvent() var/station_generator_exists = FALSE diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 9d6913299ad..8b0b0ce72b3 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/grid_check weight = 10 max_occurrences = 3 + category = EVENT_CATEGORY_ENGINEERING + description = "Turns off all APCs for a while, or until they are manually rebooted." /datum/round_event/grid_check announceWhen = 1 diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index 8a29e7d3ac1..1d7757683a9 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -4,6 +4,8 @@ weight = 20 max_occurrences = 2 min_players = 40 // To avoid shafting lowpop + category = EVENT_CATEGORY_HEALTH + description = "A random crewmember's heart gives out." /datum/round_event/heart_attack/start() var/list/heart_attack_contestants = list() diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 978b122d777..def150407fb 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -5,6 +5,8 @@ weight = -1 //forces it to be called, regardless of weight max_occurrences = 1 earliest_start = 0 MINUTES + category = EVENT_CATEGORY_HOLIDAY + description = "Gives everyone treats, and turns Ian and Poly into their festive versions." /datum/round_event/spooky/start() ..() diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 23dc60ef6e0..8f2f6314de6 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -12,6 +12,8 @@ weight = -1 //forces it to be called, regardless of weight max_occurrences = 1 earliest_start = 0 MINUTES + category = EVENT_CATEGORY_HOLIDAY + description = "Puts people on dates! They must protect each other. Sometimes a vengeful third wheel spawns." /datum/round_event/valentines/start() ..() diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index 6535443083e..b0994996183 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -75,6 +75,8 @@ weight = 20 max_occurrences = 1 earliest_start = 30 MINUTES + category = EVENT_CATEGORY_HOLIDAY + description = "Spawns santa, who shall roam the station, handing out gifts." /datum/round_event/santa var/mob/living/carbon/human/santa //who is our santa? diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index ed428182f81..2cf4e59d398 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -14,6 +14,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 max_occurrences = 5 var/atom/special_target var/force_looping = FALSE + category = EVENT_CATEGORY_SPACE + description = "The station passes through an immovable rod." /datum/round_event_control/immovable_rod/admin_setup() if(!check_rights(R_FUN)) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index d6b98ec8f49..ef73da6f80d 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/ion_storm weight = 15 min_players = 2 + category = EVENT_CATEGORY_AI + description = "Gives the AI a new, randomized law." /datum/round_event/ion_storm var/replaceLawsetChance = 25 //chance the AI's lawset is completely replaced with something else per config weights diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm index 7fb00124a94..83458761772 100644 --- a/code/modules/events/major_dust.dm +++ b/code/modules/events/major_dust.dm @@ -2,6 +2,7 @@ name = "Major Space Dust" typepath = /datum/round_event/meteor_wave/major_dust weight = 8 + description = "The station is pelted by sand." /datum/round_event/meteor_wave/major_dust wave_name = "space dust" diff --git a/code/modules/events/market_crash.dm b/code/modules/events/market_crash.dm index 960f2ca1401..8a9c7f797a2 100644 --- a/code/modules/events/market_crash.dm +++ b/code/modules/events/market_crash.dm @@ -7,6 +7,8 @@ name = "Market Crash" typepath = /datum/round_event/market_crash weight = 10 + category = EVENT_CATEGORY_BUREAUCRATIC + description = "Temporarily increases the prices of vending machines." /datum/round_event/market_crash var/market_dip = 0 diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 2e40878d633..0844194c5f6 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -4,6 +4,8 @@ weight = 10 max_occurrences = 2 min_players = 1 + category = EVENT_CATEGORY_HEALTH + description = "Multiple crewmembers start to hallucinate the same thing." /datum/round_event/mass_hallucination fakeable = FALSE diff --git a/code/modules/events/meateor_wave.dm b/code/modules/events/meateor_wave.dm index e6859c51977..d13099dbe00 100644 --- a/code/modules/events/meateor_wave.dm +++ b/code/modules/events/meateor_wave.dm @@ -3,6 +3,7 @@ typepath = /datum/round_event/meteor_wave/meaty weight = 2 max_occurrences = 1 + description = "A meteor wave made of meat." /datum/round_event/meteor_wave/meaty wave_name = "meaty" diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 204436123c6..af783095842 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -7,6 +7,8 @@ min_players = 15 max_occurrences = 3 earliest_start = 25 MINUTES + category = EVENT_CATEGORY_SPACE + description = "A regular meteor wave." /datum/round_event/meteor_wave startWhen = 6 @@ -60,6 +62,7 @@ min_players = 20 max_occurrences = 3 earliest_start = 35 MINUTES + description = "A meteor wave with higher chance of big meteors." /datum/round_event/meteor_wave/threatening wave_name = "threatening" @@ -71,6 +74,7 @@ min_players = 25 max_occurrences = 3 earliest_start = 45 MINUTES + description = "A meteor wave that might summon a tunguska class meteor." /datum/round_event/meteor_wave/catastrophic wave_name = "catastrophic" diff --git a/code/modules/events/mice_migration.dm b/code/modules/events/mice_migration.dm index 19c1c5541c4..e7f31567f4c 100644 --- a/code/modules/events/mice_migration.dm +++ b/code/modules/events/mice_migration.dm @@ -2,6 +2,8 @@ name = "Mice Migration" typepath = /datum/round_event/mice_migration weight = 10 + category = EVENT_CATEGORY_ENTITIES + description = "A horde of mice arrives, and perhaps even the Rat King themselves." /datum/round_event/mice_migration var/minimum_mice = 5 diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm index 1541b1d2d32..2c65a6b76c9 100644 --- a/code/modules/events/nightmare.dm +++ b/code/modules/events/nightmare.dm @@ -4,6 +4,8 @@ max_occurrences = 1 min_players = 20 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a nightmare, aiming to darken the station." /datum/round_event/ghost_role/nightmare minimum_required = 1 diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm index 79540ffb803..bb3a5b8df1f 100644 --- a/code/modules/events/operative.dm +++ b/code/modules/events/operative.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/ghost_role/operative weight = 0 //its weight is relative to how much stationary and neglected the nuke disk is. See nuclearbomb.dm. Shouldn't be dynamic hijackable. max_occurrences = 1 + category = EVENT_CATEGORY_INVASION + description = "A single nuclear operative assaults the station." /datum/round_event/ghost_role/operative minimum_required = 1 diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 2a76e1df709..6a27b480b6e 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -5,6 +5,8 @@ max_occurrences = 1 min_players = 20 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_INVASION + description = "The crew will either pay up, or face a pirate assault." #define PIRATES_ROGUES "Rogues" #define PIRATES_SILVERSCALES "Silverscales" diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 757b5336805..5fb9dddf89e 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -4,6 +4,8 @@ weight = 2 min_players = 15 earliest_start = 30 MINUTES + category = EVENT_CATEGORY_ENTITIES + description = "Syndicate troops pour out of portals." /datum/round_event/portal_storm/syndicate_shocktroop boss_types = list(/mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper = 2) @@ -15,6 +17,8 @@ typepath = /datum/round_event/portal_storm/portal_storm_narsie weight = 0 max_occurrences = 0 + category = EVENT_CATEGORY_ENTITIES + description = "Nar'sie constructs pour out of portals." /datum/round_event/portal_storm/portal_storm_narsie boss_types = list(/mob/living/simple_animal/hostile/construct/artificer/hostile = 6) diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index 9bb2db6c5a2..04515edffcd 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/grey_tide max_occurrences = 2 min_players = 5 + category = EVENT_CATEGORY_ENGINEERING + description = "Bolts open all doors in one or more departments." /datum/round_event/grey_tide announceWhen = 50 diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm index d05badb8656..02551399e71 100644 --- a/code/modules/events/processor_overload.dm +++ b/code/modules/events/processor_overload.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/processor_overload weight = 15 min_players = 20 + category = EVENT_CATEGORY_ENGINEERING + description = "Emps the telecomm processors, scrambling radio speech. Might blow up a few." /datum/round_event/processor_overload announceWhen = 1 diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index f0a447c3c29..f5b2a1b7a04 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -2,6 +2,8 @@ name = "Radiation Storm" typepath = /datum/round_event/radiation_storm max_occurrences = 1 + category = EVENT_CATEGORY_SPACE + description = "Radiation storm affects the station, forcing the crew to escape to maintenance." /datum/round_event/radiation_storm diff --git a/code/modules/events/scrubber_clog.dm b/code/modules/events/scrubber_clog.dm index 2a253cacc0d..66b40d18c3a 100644 --- a/code/modules/events/scrubber_clog.dm +++ b/code/modules/events/scrubber_clog.dm @@ -4,6 +4,8 @@ weight = 25 max_occurrences = 3 earliest_start = 5 MINUTES + category = EVENT_CATEGORY_ENTITIES + description = "Harmless mobs climb out of a scrubber." /datum/round_event/scrubber_clog announceWhen = 10 @@ -124,6 +126,7 @@ weight = 12 max_occurrences = 3 earliest_start = 10 MINUTES + description = "Dangerous mobs climb out of a scrubber." /datum/round_event/scrubber_clog/major/setup() . = ..() @@ -148,6 +151,7 @@ min_players = 15 max_occurrences = 1 earliest_start = 25 MINUTES + description = "Really dangerous mobs climb out of a scrubber." /datum/round_event/scrubber_clog/critical maximum_spawns = 3 @@ -172,6 +176,7 @@ typepath = /datum/round_event/scrubber_clog/strange weight = 5 max_occurrences = 1 + description = "Strange mobs climb out of a scrubber, harmfulness varies." /datum/round_event/scrubber_clog/strange maximum_spawns = 3 diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index c968b6a7f0a..9880b32ee15 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -20,6 +20,8 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( name = "Random Human-level Intelligence" typepath = /datum/round_event/ghost_role/sentience weight = 10 + category = EVENT_CATEGORY_FRIENDLY + description = "An animal or robot becomes sentient!" /datum/round_event/ghost_role/sentience @@ -105,6 +107,8 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( name = "Station-wide Human-level Intelligence" typepath = /datum/round_event/ghost_role/sentience/all weight = 0 + category = EVENT_CATEGORY_FRIENDLY + description = "ALL animals and robots become sentient, provided there is enough ghosts." /datum/round_event/ghost_role/sentience/all one = "all" diff --git a/code/modules/events/shuttle_catastrophe.dm b/code/modules/events/shuttle_catastrophe.dm index d33f252129a..b9abf368794 100644 --- a/code/modules/events/shuttle_catastrophe.dm +++ b/code/modules/events/shuttle_catastrophe.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/shuttle_catastrophe weight = 10 max_occurrences = 1 + category = EVENT_CATEGORY_BUREAUCRATIC + description = "Replaces the emergency shuttle with a random one." /datum/round_event_control/shuttle_catastrophe/canSpawnEvent(players) if(SSshuttle.shuttle_purchased == SHUTTLEPURCHASE_FORCED) diff --git a/code/modules/events/shuttle_insurance.dm b/code/modules/events/shuttle_insurance.dm index 3e8ba81671c..5d8f0ba61b8 100644 --- a/code/modules/events/shuttle_insurance.dm +++ b/code/modules/events/shuttle_insurance.dm @@ -4,6 +4,8 @@ name = "Shuttle Insurance" typepath = /datum/round_event/shuttle_insurance max_occurrences = 1 + category = EVENT_CATEGORY_BUREAUCRATIC + description = "A sketchy but legit insurance offer." /datum/round_event_control/shuttle_insurance/canSpawnEvent(players) if(!SSeconomy.get_dep_account(ACCOUNT_CAR)) diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index bcd4f56550b..52d372cfe6e 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -13,6 +13,8 @@ typepath = /datum/round_event/shuttle_loan max_occurrences = 1 earliest_start = 7 MINUTES + category = EVENT_CATEGORY_BUREAUCRATIC + description = "If cargo accepts the offer, fills the shuttle with loot and/or enemies." /datum/round_event/shuttle_loan announceWhen = 1 diff --git a/code/modules/events/space_dragon.dm b/code/modules/events/space_dragon.dm index 0f106e7210f..f26d36e9645 100644 --- a/code/modules/events/space_dragon.dm +++ b/code/modules/events/space_dragon.dm @@ -5,6 +5,8 @@ max_occurrences = 1 min_players = 20 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "Spawns a space dragon, which will try to take over the station." /datum/round_event/ghost_role/space_dragon minimum_required = 1 diff --git a/code/modules/events/space_ninja.dm b/code/modules/events/space_ninja.dm index c81aa033e0d..ab4aef5bafa 100644 --- a/code/modules/events/space_ninja.dm +++ b/code/modules/events/space_ninja.dm @@ -6,6 +6,8 @@ earliest_start = 20 MINUTES min_players = 20 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_INVASION + description = "A space ninja infiltrates the station." /datum/round_event/ghost_role/space_ninja minimum_required = 1 diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 08b156c6e8f..3b87e47e49e 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -48,6 +48,8 @@ weight = 15 max_occurrences = 3 min_players = 10 + category = EVENT_CATEGORY_ENTITIES + description = "Kudzu begins to overtake the station. Might spawn man-traps." /datum/round_event/spacevine fakeable = FALSE diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index 1e5f5620f96..40646bb5322 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -5,6 +5,8 @@ max_occurrences = 1 min_players = 20 dynamic_should_hijack = TRUE + category = EVENT_CATEGORY_ENTITIES + description = "Spawns spider eggs, ready to hatch." /datum/round_event/spider_infestation announceWhen = 400 diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm index 603fe79ba97..74ef48d56d6 100644 --- a/code/modules/events/stray_cargo.dm +++ b/code/modules/events/stray_cargo.dm @@ -5,6 +5,8 @@ weight = 20 max_occurrences = 4 earliest_start = 10 MINUTES + category = EVENT_CATEGORY_BUREAUCRATIC + description = "A pod containing a random supply crate lands on the station." ///Spawns a cargo pod containing a random cargo supply pack on a random area of the station /datum/round_event/stray_cargo @@ -89,6 +91,7 @@ weight = 6 max_occurrences = 1 earliest_start = 30 MINUTES + description = "A pod containing syndicate gear lands on the station." /datum/round_event/stray_cargo/syndicate possible_pack_types = list(/datum/supply_pack/misc/syndicate) diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm index 05acb794cc8..04696a2b5d3 100644 --- a/code/modules/events/wisdomcow.dm +++ b/code/modules/events/wisdomcow.dm @@ -3,6 +3,8 @@ typepath = /datum/round_event/wisdomcow max_occurrences = 1 weight = 20 + category = EVENT_CATEGORY_FRIENDLY + description = "A cow appears to tell you wise words." /datum/round_event/wisdomcow/announce(fake) priority_announce("A wise cow has been spotted in the area. Be sure to ask for her advice.", "Nanotrasen Cow Ranching Agency") diff --git a/code/modules/events/wizard/aid.dm b/code/modules/events/wizard/aid.dm index 92747d2cd76..bed431cd92b 100644 --- a/code/modules/events/wizard/aid.dm +++ b/code/modules/events/wizard/aid.dm @@ -7,6 +7,7 @@ typepath = /datum/round_event/wizard/robelesscasting max_occurrences = 1 earliest_start = 0 MINUTES + description = "Wizard no longer needs robes to cast spells." /datum/round_event/wizard/robelesscasting/start() @@ -32,6 +33,7 @@ typepath = /datum/round_event/wizard/improvedcasting max_occurrences = 4 //because that'd be max level spells earliest_start = 0 MINUTES + description = "Levels up the wizard's spells." /datum/round_event/wizard/improvedcasting/start() for(var/mob/living/caster as anything in GLOB.mob_living_list) diff --git a/code/modules/events/wizard/blobies.dm b/code/modules/events/wizard/blobies.dm index 7438b462f60..6933847f808 100644 --- a/code/modules/events/wizard/blobies.dm +++ b/code/modules/events/wizard/blobies.dm @@ -3,6 +3,7 @@ weight = 3 typepath = /datum/round_event/wizard/blobies max_occurrences = 3 + description = "Spawns a blob spore on every corpse." /datum/round_event/wizard/blobies/start() diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index 2384901ef29..a634a6fc934 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/cursed_items max_occurrences = 3 earliest_start = 0 MINUTES + description = "Gives everyone a cursed item." //Note about adding items to this: Because of how NODROP_1 works if an item spawned to the hands can also be equiped to a slot //it will be able to be put into that slot from the hand, but then get stuck there. To avoid this make a new subtype of any diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm index 631a76711b8..478d2109670 100644 --- a/code/modules/events/wizard/departmentrevolt.dm +++ b/code/modules/events/wizard/departmentrevolt.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/deprevolt max_occurrences = 1 earliest_start = 0 MINUTES + description = "A department is turned into an independent state." ///manual choice of what department to revolt for admins to pick var/datum/job_department/picked_department diff --git a/code/modules/events/wizard/embeddies.dm b/code/modules/events/wizard/embeddies.dm index 6ea7b3f5ac6..6412ffb0a7b 100644 --- a/code/modules/events/wizard/embeddies.dm +++ b/code/modules/events/wizard/embeddies.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/embedpocalypse max_occurrences = 1 earliest_start = 0 MINUTES + description = "Everything becomes pointy enough to embed in people when thrown." ///behold... the only reason sticky is a subtype... /datum/round_event_control/wizard/embedpocalypse/canSpawnEvent(players_amt, gamemode) @@ -19,6 +20,7 @@ typepath = /datum/round_event/wizard/embedpocalypse/sticky max_occurrences = 1 earliest_start = 0 MINUTES + description = "Everything becomes sticky enough to be glued to people when thrown." /datum/round_event/wizard/embedpocalypse/sticky/start() GLOB.global_funny_embedding = new /datum/global_funny_embedding/sticky diff --git a/code/modules/events/wizard/fakeexplosion.dm b/code/modules/events/wizard/fakeexplosion.dm index 3d9be6a565d..4368f5dcc93 100644 --- a/code/modules/events/wizard/fakeexplosion.dm +++ b/code/modules/events/wizard/fakeexplosion.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/fake_explosion max_occurrences = 1 earliest_start = 0 MINUTES + description = "The nuclear explosion cutscene begins to play to scare the crew." /datum/round_event/wizard/fake_explosion/start() sound_to_playing_players('sound/machines/alarm.ogg') diff --git a/code/modules/events/wizard/ghost.dm b/code/modules/events/wizard/ghost.dm index 5db01bc93e3..b52bdd69352 100644 --- a/code/modules/events/wizard/ghost.dm +++ b/code/modules/events/wizard/ghost.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/ghost max_occurrences = 1 earliest_start = 0 MINUTES + description = "Ghosts become visible." /datum/round_event/wizard/ghost/start() var/msg = span_warning("You suddenly feel extremely obvious...") @@ -18,6 +19,7 @@ typepath = /datum/round_event/wizard/possession max_occurrences = 5 earliest_start = 0 MINUTES + description = "Ghosts become visible and gain the power of possession." /datum/round_event/wizard/possession/start() for(var/mob/dead/observer/G in GLOB.player_list) diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 9c35aceedb2..eec68e7f2d9 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/greentext max_occurrences = 1 earliest_start = 0 MINUTES + description = "The Green Text appears on the station, tempting people to try and pick it up." /datum/round_event/wizard/greentext/start() diff --git a/code/modules/events/wizard/identity_spoof.dm b/code/modules/events/wizard/identity_spoof.dm index 3032834b63a..4f562752df8 100644 --- a/code/modules/events/wizard/identity_spoof.dm +++ b/code/modules/events/wizard/identity_spoof.dm @@ -3,6 +3,7 @@ weight = 5 typepath = /datum/round_event/wizard/identity_spoof max_occurrences = 1 + description = "Makes everyone dressed up like a wizard." /datum/round_event_control/wizard/identity_spoof/canSpawnEvent(players_amt) . = ..() diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index 34bca08f3f9..4c69d5252fb 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/imposter max_occurrences = 1 earliest_start = 0 MINUTES + description = "Spawns a doppelganger of the wizard." /datum/round_event/wizard/imposter/start() for(var/datum/mind/M as anything in get_antag_minds(/datum/antagonist/wizard)) diff --git a/code/modules/events/wizard/invincible.dm b/code/modules/events/wizard/invincible.dm index 1bcde77cb37..015781c844c 100644 --- a/code/modules/events/wizard/invincible.dm +++ b/code/modules/events/wizard/invincible.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/invincible max_occurrences = 5 earliest_start = 0 MINUTES + description = "Everyone is invincible for a short time ticks." /datum/round_event/wizard/invincible/start() diff --git a/code/modules/events/wizard/lava.dm b/code/modules/events/wizard/lava.dm index 9a882b45dfd..2a69b8481e5 100644 --- a/code/modules/events/wizard/lava.dm +++ b/code/modules/events/wizard/lava.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/lava max_occurrences = 3 earliest_start = 0 MINUTES + description = "Turns the floor into hot lava." /datum/round_event/wizard/lava endWhen = 0 diff --git a/code/modules/events/wizard/madness.dm b/code/modules/events/wizard/madness.dm index a5964de1993..b960b074678 100644 --- a/code/modules/events/wizard/madness.dm +++ b/code/modules/events/wizard/madness.dm @@ -3,6 +3,7 @@ weight = 1 typepath = /datum/round_event/wizard/madness earliest_start = 0 MINUTES + description = "Reveals a horrifying truth to everyone, giving them a trauma." var/forced_secret diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index 5c884c56a8a..fb53fdbc3e0 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/magicarp max_occurrences = 1 earliest_start = 0 MINUTES + description = "Summons a school of carps with magic projectiles." /datum/round_event/wizard/magicarp announceWhen = 3 diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm index fb4d433905b..3345d1ef438 100644 --- a/code/modules/events/wizard/petsplosion.dm +++ b/code/modules/events/wizard/petsplosion.dm @@ -5,6 +5,7 @@ max_occurrences = 1 //Exponential growth is nothing to sneeze at! earliest_start = 0 MINUTES var/mobs_to_dupe = 0 + description = "Rapidly multiplies the animals on the station." /datum/round_event_control/wizard/petsplosion/preRunEvent() for(var/mob/living/simple_animal/F in GLOB.alive_mob_list) diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm index c00f44ea74e..1ff33ce37d8 100644 --- a/code/modules/events/wizard/race.dm +++ b/code/modules/events/wizard/race.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/race max_occurrences = 5 earliest_start = 0 MINUTES + description = "Gives everyone a random race." /datum/round_event/wizard/race/start() diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index a26be5c09e5..5775115fe46 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/rpgloot max_occurrences = 1 earliest_start = 0 MINUTES + description = "Every item in the world will have fantastical names." /datum/round_event/wizard/rpgloot/start() GLOB.rpgloot_controller = new /datum/rpgloot_controller diff --git a/code/modules/events/rpgtitles.dm b/code/modules/events/wizard/rpgtitles.dm similarity index 98% rename from code/modules/events/rpgtitles.dm rename to code/modules/events/wizard/rpgtitles.dm index edde7b87bc0..5d40ed541a9 100644 --- a/code/modules/events/rpgtitles.dm +++ b/code/modules/events/wizard/rpgtitles.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/rpgtitles max_occurrences = 1 earliest_start = 0 MINUTES + description = "Everyone gains an RPG title hovering above them." /datum/round_event/wizard/rpgtitles/start() GLOB.rpgtitle_controller = new /datum/rpgtitle_controller diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm index dce7d3fa20c..ef3ae4bfb77 100644 --- a/code/modules/events/wizard/shuffle.dm +++ b/code/modules/events/wizard/shuffle.dm @@ -7,6 +7,7 @@ typepath = /datum/round_event/wizard/shuffleloc max_occurrences = 5 earliest_start = 0 MINUTES + description = "Shuffles everyone around on the station." /datum/round_event/wizard/shuffleloc/start() var/list/moblocs = list() @@ -43,6 +44,7 @@ typepath = /datum/round_event/wizard/shufflenames max_occurrences = 5 earliest_start = 0 MINUTES + description = "Shuffles the names of everyone around the station." /datum/round_event/wizard/shufflenames/start() var/list/mobnames = list() @@ -77,6 +79,7 @@ typepath = /datum/round_event/wizard/shuffleminds max_occurrences = 3 earliest_start = 0 MINUTES + description = "Shuffles the minds of everyone around the station, except for the wizard." /datum/round_event/wizard/shuffleminds/start() var/list/mobs_to_swap = list() diff --git a/code/modules/events/wizard/summons.dm b/code/modules/events/wizard/summons.dm index 3a5150e39fc..c36e8bc137b 100644 --- a/code/modules/events/wizard/summons.dm +++ b/code/modules/events/wizard/summons.dm @@ -4,6 +4,7 @@ typepath = /datum/round_event/wizard/summonguns max_occurrences = 1 earliest_start = 0 MINUTES + description = "Summons a gun for everyone. Might turn people into survivalists." /datum/round_event_control/wizard/summonguns/New() if(CONFIG_GET(flag/no_summon_guns)) @@ -19,6 +20,7 @@ typepath = /datum/round_event/wizard/summonmagic max_occurrences = 1 earliest_start = 0 MINUTES + description = "Summons a magic item for everyone. Might turn people into survivalists." /datum/round_event_control/wizard/summonmagic/New() if(CONFIG_GET(flag/no_summon_magic)) diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index d5575ce6072..3ee31f96c41 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -6,6 +6,8 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to max_occurrences = 3 weight = 2 min_players = 2 + category = EVENT_CATEGORY_SPACE + description = "Space time anomalies appear on the station, randomly teleporting people who walk into them." /datum/round_event/wormholes diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index 3e1ab4d59a3..34b300102e9 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -5,6 +5,8 @@ weight = -1 max_occurrences = 1 earliest_start = 0 MINUTES + category = EVENT_CATEGORY_HOLIDAY + description = "Hides surprise filled easter eggs in maintenance." /datum/round_event/easter/announce(fake) priority_announce(pick("Hip-hop into Easter!","Find some Bunny's stash!","Today is National 'Hunt a Wabbit' Day.","Be kind, give Chocolate Eggs!")) @@ -16,6 +18,8 @@ typepath = /datum/round_event/rabbitrelease weight = 5 max_occurrences = 10 + category = EVENT_CATEGORY_HOLIDAY + description = "Summons a wave of cute rabbits." /datum/round_event/rabbitrelease/announce(fake) priority_announce("Unidentified furry objects detected coming aboard [station_name()]. Beware of Adorable-ness.", "Fluffy Alert", ANNOUNCER_ALIENS) diff --git a/code/modules/tgui/states/fun.dm b/code/modules/tgui/states/fun.dm new file mode 100644 index 00000000000..ba72f40fd08 --- /dev/null +++ b/code/modules/tgui/states/fun.dm @@ -0,0 +1,17 @@ +/*! + * Copyright (c) 2020 Aleksej Komarov + * SPDX-License-Identifier: MIT + */ + +/** + * tgui state: fun_state + * + * Checks that the user has the fun privilige. + */ + +GLOBAL_DATUM_INIT(fun_state, /datum/ui_state/fun_state, new) + +/datum/ui_state/fun_state/can_use_topic(src_object, mob/user) + if(check_rights_for(user.client, R_FUN)) + return UI_INTERACTIVE + return UI_CLOSE diff --git a/tgstation.dme b/tgstation.dme index ba79180c525..403469b6231 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1983,6 +1983,7 @@ #include "code\modules\admin\create_mob.dm" #include "code\modules\admin\create_object.dm" #include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\force_event.dm" #include "code\modules\admin\fun_balloon.dm" #include "code\modules\admin\greyscale_modify_menu.dm" #include "code\modules\admin\holder2.dm" @@ -2867,7 +2868,6 @@ #include "code\modules\events\prison_break.dm" #include "code\modules\events\processor_overload.dm" #include "code\modules\events\radiation_storm.dm" -#include "code\modules\events\rpgtitles.dm" #include "code\modules\events\scrubber_clog.dm" #include "code\modules\events\sentience.dm" #include "code\modules\events\shuttle_catastrophe.dm" @@ -2900,6 +2900,7 @@ #include "code\modules\events\wizard\petsplosion.dm" #include "code\modules\events\wizard\race.dm" #include "code\modules\events\wizard\rpgloot.dm" +#include "code\modules\events\wizard\rpgtitles.dm" #include "code\modules\events\wizard\shuffle.dm" #include "code\modules\events\wizard\summons.dm" #include "code\modules\experisci\destructive_scanner.dm" @@ -4402,6 +4403,7 @@ #include "code\modules\tgui\states\debug.dm" #include "code\modules\tgui\states\deep_inventory.dm" #include "code\modules\tgui\states\default.dm" +#include "code\modules\tgui\states\fun.dm" #include "code\modules\tgui\states\hands.dm" #include "code\modules\tgui\states\human_adjacent.dm" #include "code\modules\tgui\states\inventory.dm" diff --git a/tgui/packages/tgui/interfaces/ForceEvent.js b/tgui/packages/tgui/interfaces/ForceEvent.js new file mode 100644 index 00000000000..36da2962042 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ForceEvent.js @@ -0,0 +1,116 @@ +import { useBackend, useLocalState } from '../backend'; +import { Stack, Button, Icon, Input, Section, Table } from '../components'; +import { Window } from '../layouts'; +import { flow } from 'common/fp'; +import { filter, sortBy } from 'common/collections'; + +export const ForceEvent = (props, context) => { + return ( + + + + + + + + ); +}; + +export const EventSearch = (props, context) => { + const [searchQuery, setSearchQuery] = useLocalState( + context, + 'searchQuery', + '' + ); + + return ( +
+ + + + + + setSearchQuery(e.target.value)} + placeholder="Search..." + value={searchQuery} + /> + + +
+ ); +}; + +export const EventOptionsPanel = (props, context) => { + const { data } = useBackend(context); + + const [announce, setAnnounce] = useLocalState(context, 'announce', true); + + return ( + setAnnounce(!announce)}> + Announce event to the crew + + ); +}; + +export const EventContent = (props, context) => { + const { data } = useBackend(context); + + const categories = Object.values(data.categories); + const sortCategories = sortBy((category) => category.name); + + return sortCategories(categories).map((category) => ( + + )); +}; + +export const EventList = (props, context) => { + const { act } = useBackend(context); + const { category } = props; + const [searchQuery] = useLocalState(context, 'searchQuery', ''); + const [announce] = useLocalState(context, 'announce', true); + + const filtered_events = flow([ + filter((event) => + event.name?.toLowerCase().includes(searchQuery.toLowerCase()) + ), + sortBy((event) => event.name), + ])(category.events || []); + + if (!filtered_events.length) { + return null; + } + + return ( +
+ + {filtered_events.map((event) => { + return ( + + {event.name} + +
+
+ ); +};