diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 0fd09d297d..9d5110daf5 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -388,6 +388,8 @@ Example config: var/list/probabilities = Get(/datum/config_entry/keyed_list/storyteller_weight) var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) var/list/min_player_counts = Get(/datum/config_entry/keyed_list/storyteller_min_players) + var/list/storyteller_min_chaos = Get(/datum/config_entry/keyed_list/storyteller_min_chaos) + var/list/storyteller_max_chaos = Get(/datum/config_entry/keyed_list/storyteller_max_chaos) for(var/T in storyteller_cache) var/datum/dynamic_storyteller/S = T var/config_tag = initial(S.config_tag) @@ -399,6 +401,13 @@ Example config: continue if(length(GLOB.player_list) < min_players) continue + if(!Get(/datum/config_entry/flag/no_storyteller_threat_removal)) + var/min_chaos = (probabilities in storyteller_min_chaos) ? storyteller_min_chaos[config_tag] : initial(S.min_chaos) + var/max_chaos = (probabilities in storyteller_max_chaos) ? storyteller_max_chaos[config_tag] : initial(S.max_chaos) + if(SSpersistence.average_dynamic_threat < min_chaos) + continue + if(SSpersistence.average_dynamic_threat > max_chaos) + continue if(SSpersistence.saved_storytellers.len == repeated_mode_adjust.len) var/name = initial(S.name) var/recent_round = min(SSpersistence.saved_storytellers.Find(name),3) diff --git a/code/controllers/configuration/entries/dynamic.dm b/code/controllers/configuration/entries/dynamic.dm index 44d9a041a6..1f16c1db2d 100644 --- a/code/controllers/configuration/entries/dynamic.dm +++ b/code/controllers/configuration/entries/dynamic.dm @@ -1,5 +1,7 @@ /datum/config_entry/flag/dynamic_voting +/datum/config_entry/flag/no_storyteller_threat_removal + /datum/config_entry/number/dynamic_high_pop_limit config_entry_value = 55 min_val = 1 @@ -74,7 +76,7 @@ /datum/config_entry/number/dynamic_hijack_cost config_entry_value = 5 - + /datum/config_entry/number/dynamic_glorious_death_cost config_entry_value = 5 @@ -96,3 +98,11 @@ /datum/config_entry/keyed_list/storyteller_min_players key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/storyteller_min_chaos + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/storyteller_max_chaos + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm index 1ebbfdacc3..56a80c6e72 100644 --- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm +++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm @@ -15,7 +15,9 @@ */ var/flags = 0 var/dead_player_weight = 1 // How much dead players matter for threat calculation - var/weight = 3 // Weights for randomly picking storyteller. Multiplied by score after voting. + var/weight = 0 // Weights for randomly picking storyteller. Multiplied by score after voting. + var/min_chaos = -1000 // Won't show up if recent rounds have been below this chaotic on average + var/max_chaos = 1000 // Won't show up if recent rounds have been above this chaotic on average 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/min_players = -1 // How many players are required for this one to start. @@ -212,6 +214,7 @@ Property weights are added to the config weight of the ruleset. They are: weight = 1 event_frequency_lower = 2 MINUTES event_frequency_upper = 10 MINUTES + max_chaos = 50 flags = WAROPS_ALWAYS_ALLOWED | FORCE_IF_WON min_players = 30 var/refund_cooldown = 0 @@ -234,12 +237,13 @@ Property weights are added to the config weight of the ruleset. They are: 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 + weight = 4 + max_chaos = 75 min_players = 20 flags = WAROPS_ALWAYS_ALLOWED | USE_PREV_ROUND_WEIGHTS property_weights = list("valid" = 3, "trust" = 5) -/datum/dynamic_storyteller/chaotic/minor_start_chance() +/datum/dynamic_storyteller/team/minor_start_chance() return 0 /datum/dynamic_storyteller/team/should_inject_antag(dry_run = FALSE) @@ -255,13 +259,14 @@ Property weights are added to the config weight of the ruleset. They are: flags = WAROPS_ALWAYS_ALLOWED property_weights = list("valid" = 1, "conversion" = 20) -/datum/dynamic_storyteller/chaotic/minor_start_chance() +/datum/dynamic_storyteller/conversion/minor_start_chance() return 0 /datum/dynamic_storyteller/random name = "Random" config_tag = "random" weight = 1 + max_chaos = 60 desc = "No weighting at all; every ruleset has the same chance of happening. Cooldowns vary wildly. As random as it gets." /datum/dynamic_storyteller/random/on_start() @@ -274,7 +279,7 @@ Property weights are added to the config weight of the ruleset. They are: /datum/dynamic_storyteller/random/should_inject_antag() return prob(50) -/datum/dynamic_storyteller/chaotic/minor_start_chance() +/datum/dynamic_storyteller/random/minor_start_chance() return 20 /datum/dynamic_storyteller/random/roundstart_draft() @@ -330,7 +335,7 @@ Property weights are added to the config weight of the ruleset. They are: name = "Story" config_tag = "story" desc = "Antags with options for loadouts and gimmicks. Traitor, wizard, nukies." - weight = 2 + weight = 4 curve_width = 2 flags = USE_PREV_ROUND_WEIGHTS property_weights = list("story_potential" = 2) @@ -338,6 +343,7 @@ Property weights are added to the config weight of the ruleset. They are: /datum/dynamic_storyteller/classic name = "Classic" config_tag = "classic" + weight = 8 desc = "No special antagonist weights. Good variety, but not like random. Uses your chaos preference to weight." flags = USE_PREF_WEIGHTS | USE_PREV_ROUND_WEIGHTS @@ -345,7 +351,7 @@ Property weights are added to the config weight of the ruleset. They are: name = "Intrigue" config_tag = "intrigue" desc = "Antags that instill distrust in the crew. Traitors, bloodsuckers." - weight = 2 + weight = 4 curve_width = 2 dead_player_weight = 2 flags = USE_PREV_ROUND_WEIGHTS @@ -358,7 +364,7 @@ Property weights are added to the config weight of the ruleset. They are: name = "Grab Bag" config_tag = "grabbag" desc = "Crew antags (e.g. traitor, changeling, bloodsucker, heretic) only, all mixed together." - weight = 2 + weight = 4 flags = USE_PREF_WEIGHTS | USE_PREV_ROUND_WEIGHTS /datum/dynamic_storyteller/grabbag/minor_start_chance() @@ -398,12 +404,13 @@ Property weights are added to the config weight of the ruleset. They are: curve_centre = -3 curve_width = 0.5 flags = NO_ASSASSIN - weight = 1 + min_chaos = 30 + weight = 3 dead_player_weight = 5 property_weights = list("extended" = 2, "chaos" = -1, "valid" = -1, "conversion" = -10) /datum/dynamic_storyteller/liteextended/minor_start_chance() - return 100 + return 90 /datum/dynamic_storyteller/no_antag name = "Extended" @@ -411,6 +418,7 @@ Property weights are added to the config weight of the ruleset. They are: desc = "No standard antags." curve_centre = -5 curve_width = 0.5 + min_chaos = 40 flags = NO_ASSASSIN | FORCE_IF_WON weight = 1 property_weights = list("extended" = 2) diff --git a/config/dynamic_config.txt b/config/dynamic_config.txt index c08b316e2e..480f6d8ed8 100644 --- a/config/dynamic_config.txt +++ b/config/dynamic_config.txt @@ -13,6 +13,9 @@ STORYTELLER_WEIGHT EXTENDED 0 STORYTELLER_MIN_PLAYERS CHAOTIC 30 STORYTELLER_MIN_PLAYERS TEAMWORK 30 +## If this is uncommented, Dynamic won't disable certain storytellers based on recent round threats +#NO_STORYTELLER_THREAT_REMOVAL + ## Injection delays: how long (in minutes) will pass before a midround or latejoin antag is injected. DYNAMIC_MIDROUND_DELAY_MIN 5 DYNAMIC_MIDROUND_DELAY_MAX 15 @@ -171,8 +174,8 @@ DYNAMIC_COST LATEJOIN_REVOLUTION 20 DYNAMIC_COST LATEJOIN_BLOODSUCKER 10 DYNAMIC_COST LATEJOIN_COLLECTOR 1 -## Rule will not be generated with threat levels below requirement at a pop value. Pop values are determined by dynamic's pop-per-requirement. -## By default it's 0-8, 9-17, 18-26, 27-35, 36-44, 45-53, 54-60, 61-69, 70-78, 79+. +## Rule will not be generated with threat levels below requirement at a pop value. Pop values are determined by dynamic's pop-per-requirement. +## By default it's 0-8, 9-17, 18-26, 27-35, 36-44, 45-53, 54-60, 61-69, 70-78, 79+. ## This means that 40 30 30 20 20 20 15 15 15 10 will not generate below 40 at 0-8, 30 at 9-17 etc. DYNAMIC_REQUIREMENTS TRAITOR 50 50 50 50 50 50 50 50 50 50 DYNAMIC_REQUIREMENTS TRAITORBRO 101 101 101 101 101 101 101 101 101 101 @@ -301,6 +304,6 @@ DYNAMIC_GLORIOUS_DEATH_COST 5 DYNAMIC_ASSASSINATE_COST 2 ## This requirement uses threat level, rather than current threat, which is why it's higher. -DYNAMIC_WAROPS_REQUIREMENT 60 +DYNAMIC_WAROPS_REQUIREMENT 60 DYNAMIC_WAROPS_COST 10