diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm index 069c73a421..56237ef897 100644 --- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm +++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm @@ -1,16 +1,22 @@ /datum/dynamic_storyteller - var/name = "none" - var/config_tag = null - var/desc = "A coder's idiocy." - var/list/property_weights = list() - var/curve_centre = 0 - var/curve_width = 1.8 + var/name = "none" // Name for voting. + var/config_tag = null // Config tag for config weights. + var/desc = "A coder's idiocy." // Description for voting. + var/list/property_weights = list() // See below. + var/curve_centre = 0 // As GLOB.dynamic_curve_centre. + var/curve_width = 1.8 // As GLOB.dynamic_curve_width. var/forced_threat_level = -1 + /* + NO_ASSASSIN: Will not have permanent assassination targets. + WAROPS_ALWAYS_ALLOWED: Can always do warops, regardless of threat level. + USE_PREF_WEIGHTS: Will use peoples' preferences to change the threat centre. + */ var/flags = 0 - var/weight = 3 // how many rounds need to have been recently played for this storyteller to be left out of the vote - var/event_frequency_lower = 6 MINUTES - var/event_frequency_upper = 20 MINUTES - var/datum/game_mode/dynamic/mode = null + var/weight = 3 // Weights for randomly picking storyteller. Multiplied by score after voting. + var/event_frequency_lower = 6 MINUTES // How rare events will be, at least. + var/event_frequency_upper = 20 MINUTES // How rare events will be, at most. + var/pop_antag_ratio = 5 // How many non-antags there should be vs antags. + var/datum/game_mode/dynamic/mode = null // Cached as soon as it's made, by dynamic. /** Property weights are: @@ -80,7 +86,7 @@ Property weights are: var/chance = 0 // If the high pop override is in effect, we reduce the impact of population on the antag injection chance var/high_pop_factor = (mode.current_players[CURRENT_LIVING_PLAYERS].len >= GLOB.dynamic_high_pop_limit) - var/max_pop_per_antag = max(5,15 - round(mode.threat_level/10) - round(mode.current_players[CURRENT_LIVING_PLAYERS].len/(high_pop_factor ? 10 : 5))) + var/max_pop_per_antag = max(pop_antag_ratio,15 - round(mode.threat_level/10) - round(mode.current_players[CURRENT_LIVING_PLAYERS].len/(high_pop_factor ? 10 : 5))) if (!mode.current_players[CURRENT_LIVING_ANTAGS].len) chance += 80 // No antags at all? let's boost those odds! else @@ -173,12 +179,13 @@ Property weights are: name = "Chaotic" config_tag = "chaotic" curve_centre = 10 - desc = "Chaos: high. Variation: high. Likely antags: clock cult, revs, wizard." + desc = "High chaos modes. Revs, wizard, clock cult. Multiple antags at once. Chaos is kept up all round." property_weights = list("extended" = -1, "chaos" = 10) weight = 1 event_frequency_lower = 2 MINUTES event_frequency_upper = 10 MINUTES flags = WAROPS_ALWAYS_ALLOWED + pop_antag_ratio = 4 var/refund_cooldown = 0 /datum/dynamic_storyteller/cowabunga/get_midround_cooldown() @@ -189,14 +196,14 @@ Property weights are: /datum/dynamic_storyteller/cowabunga/do_process() if(refund_cooldown < world.time) - mode.refund_threat(20) - mode.log_threat("Cowabunga it is. Refunded 20 threat. Threat is now [mode.threat].") - refund_cooldown = world.time + 600 SECONDS + mode.refund_threat(40) + mode.log_threat("Chaotic storyteller refunded 40 threat. Threat is now [mode.threat].") + refund_cooldown = world.time + 1200 SECONDS /datum/dynamic_storyteller/team name = "Teamwork" config_tag = "teamwork" - desc = "Chaos: high. Variation: low. Likely antags: nukies, clockwork cult, wizard, blob, xenomorph." + desc = "Modes where the crew must band together. Nukies, xenos, blob. Only one antag threat at once." curve_centre = 2 curve_width = 1.5 weight = 2 @@ -209,17 +216,17 @@ Property weights are: /datum/dynamic_storyteller/conversion name = "Conversion" config_tag = "conversion" - desc = "Chaos: high. Variation: medium. Likely antags: cults, bloodsuckers, revs." + desc = "Conversion antags. Cults, revs." curve_centre = 3 curve_width = 1 - weight = 2 + weight = 0 flags = WAROPS_ALWAYS_ALLOWED property_weights = list("valid" = 1, "conversion" = 20) /datum/dynamic_storyteller/classic name = "Random" config_tag = "random" - desc = "Chaos: varies. Variation: highest. No special weights attached." + desc = "No special weights attached. Anything goes." weight = 6 flags = USE_PREF_WEIGHTS curve_width = 4 @@ -227,38 +234,36 @@ Property weights are: /datum/dynamic_storyteller/memes name = "Story" config_tag = "story" - desc = "Chaos: varies. Variation: high. Likely antags: abductors, nukies, wizard, traitor." + desc = "Antags with options for loadouts and gimmicks. Traitor, wizard, nukies." weight = 4 - flags = USE_PREF_WEIGHTS curve_width = 4 + pop_antag_ratio = 7 property_weights = list("story_potential" = 10) /datum/dynamic_storyteller/suspicion name = "Intrigue" config_tag = "intrigue" - desc = "Chaos: low. Variation: high. Likely antags: traitor, bloodsucker. Rare: revs, blood cult." + desc = "Antags that instill distrust in the crew. Traitors, bloodsuckers." weight = 4 - flags = USE_PREF_WEIGHTS curve_width = 4 + pop_antag_ratio = 7 property_weights = list("trust" = -5) /datum/dynamic_storyteller/liteextended name = "Calm" config_tag = "calm" - desc = "Chaos: low. Variation: medium. Likely antags: bloodsuckers, traitors, sentient disease, revenant." + desc = "Low-chaos round. Few antags. No conversion." curve_centre = -5 curve_width = 0.5 flags = NO_ASSASSIN weight = 2 + pop_antag_ratio = 10 property_weights = list("extended" = 1, "chaos" = -1, "valid" = -1, "story_potential" = 1, "conversion" = -10) -/datum/dynamic_storyteller/liteextended/get_injection_chance(dry_run = FALSE) - return ..()/2 - /datum/dynamic_storyteller/extended name = "Extended" config_tag = "extended" - desc = "Chaos: none. Variation: none. Likely antags: none." + desc = "No antags. No dangerous events." curve_centre = -20 weight = 0 curve_width = 0.5