Fixes everything????

This commit is contained in:
keronshb
2021-09-16 15:40:21 -04:00
parent 095a803cc5
commit 372725c1f4
8 changed files with 11 additions and 406 deletions

View File

@@ -370,7 +370,7 @@ Example config:
var/ct = initial(M.config_tag)
if(ct && ct == mode_name)
return new T
return new /datum/game_mode/extended()
return new /datum/game_mode/dynamic
/datum/controller/configuration/proc/get_runnable_modes()
var/list/datum/game_mode/runnable_modes = new

View File

@@ -1,7 +1,5 @@
/datum/config_entry/flag/allow_vote_restart // allow votes to restart
/datum/config_entry/flag/allow_vote_mode // allow votes to change mode
/datum/config_entry/number/vote_delay // minimum time between voting sessions (deciseconds, 10 minute default)
config_entry_value = 6000
min_val = 0

View File

@@ -68,10 +68,6 @@ SUBSYSTEM_DEF(vote)
//get the highest number of votes
var/greatest_votes = 0
var/total_votes = 0
if((mode == "gamemode" || mode == "roundtype") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode))
for(var/mob/dead/new_player/P in GLOB.player_list)
if(P.ready != PLAYER_READY_TO_PLAY && voted[P.ckey])
choices[choices[voted[P.ckey]]]--
for(var/option in choices)
var/votes = choices[option]
total_votes += votes
@@ -90,11 +86,6 @@ SUBSYSTEM_DEF(vote)
choices["Continue Playing"] += non_voters.len
if(choices["Continue Playing"] >= greatest_votes)
greatest_votes = choices["Continue Playing"]
else if(mode == "gamemode")
if(GLOB.master_mode in choices)
choices[GLOB.master_mode] += non_voters.len
if(choices[GLOB.master_mode] >= greatest_votes)
greatest_votes = choices[GLOB.master_mode]
//get all options with that many votes and return them in a list
. = list()
if(greatest_votes)
@@ -104,11 +95,6 @@ SUBSYSTEM_DEF(vote)
return .
/datum/controller/subsystem/vote/proc/calculate_condorcet_votes(var/blackbox_text)
// https://en.wikipedia.org/wiki/Schulze_method#Implementation
if((mode == "gamemode" || mode == "dynamic" || mode == "roundtype") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode))
for(var/mob/dead/new_player/P in GLOB.player_list)
if(P.ready != PLAYER_READY_TO_PLAY && voted[P.ckey])
voted -= P.ckey
var/list/d[][] = new/list(choices.len,choices.len) // the basic vote matrix, how many times a beats b
for(var/ckey in voted)
var/list/this_vote = voted[ckey]
@@ -155,10 +141,6 @@ SUBSYSTEM_DEF(vote)
for(var/choice in choices)
scores_by_choice += "[choice]"
scores_by_choice["[choice]"] = list()
if((mode == "gamemode" || mode == "dynamic" || mode == "roundtype") && CONFIG_GET(flag/must_be_readied_to_vote_gamemode))
for(var/mob/dead/new_player/P in GLOB.player_list)
if(P.ready != PLAYER_READY_TO_PLAY && voted[P.ckey])
voted -= P.ckey
for(var/ckey in voted)
var/list/this_vote = voted[ckey]
var/list/pretty_vote = list()
@@ -251,7 +233,7 @@ SUBSYSTEM_DEF(vote)
if(vote_system == HIGHEST_MEDIAN_VOTING)
calculate_highest_median(vote_title_text) // nothing uses this at the moment
var/list/winners = vote_system == INSTANT_RUNOFF_VOTING ? get_runoff_results() : get_result()
var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic"
var/was_roundtype_vote = mode == "dynamic"
if(winners.len > 0)
if(was_roundtype_vote)
stored_gamemode_votes = list()
@@ -322,38 +304,9 @@ SUBSYSTEM_DEF(vote)
var/restart = 0
if(.)
switch(mode)
if("roundtype") //CIT CHANGE - adds the roundstart extended/secret vote
if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started.
return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.")
GLOB.master_mode = .
SSticker.save_mode(.)
message_admins("The gamemode has been voted for, and has been changed to: [GLOB.master_mode]")
log_admin("Gamemode has been voted for and switched to: [GLOB.master_mode].")
if(CONFIG_GET(flag/modetier_voting))
reset()
started_time = 0
initiate_vote("mode tiers","server", votesystem=SCORE_VOTING, forced=TRUE, vote_time = 30 MINUTES)
to_chat(world,"<b>The vote will end right as the round starts.</b>")
return .
if("restart")
if(. == "Restart Round")
restart = 1
if("gamemode")
if(GLOB.master_mode != .)
SSticker.save_mode(.)
if(SSticker.HasRoundStarted())
restart = 1
else
GLOB.master_mode = .
if("mode tiers")
var/list/raw_score_numbers = list()
for(var/score_name in scores)
sorted_insert(raw_score_numbers,scores[score_name],/proc/cmp_numeric_asc)
stored_modetier_results = scores.Copy()
for(var/score_name in stored_modetier_results)
if(stored_modetier_results[score_name] <= raw_score_numbers[CONFIG_GET(number/dropped_modes)])
stored_modetier_results -= score_name
stored_modetier_results += "traitor"
if("map")
var/datum/map_config/VM = config.maplist[.]
message_admins("The map has been voted for and will change to: [VM.map_name]")
@@ -451,8 +404,6 @@ SUBSYSTEM_DEF(vote)
switch(vote_type)
if("restart")
choices.Add("Restart Round","Continue Playing")
if("gamemode")
choices.Add(config.votable_modes)
if("map")
var/players = GLOB.clients.len
var/list/lastmaps = SSpersistence.saved_maps?.len ? list("[SSmapping.config.map_name]") | SSpersistence.saved_maps : list("[SSmapping.config.map_name]")
@@ -469,16 +420,6 @@ SUBSYSTEM_DEF(vote)
choices |= M
if("transfer") // austation begin -- Crew autotranfer vote
choices.Add("Initiate Crew Transfer","Continue Playing") // austation end
if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote
choices.Add("secret", "extended")
if("mode tiers")
var/list/modes_to_add = config.votable_modes
var/list/probabilities = CONFIG_GET(keyed_list/probability)
for(var/tag in modes_to_add)
if(probabilities[tag] <= 0)
modes_to_add -= tag
modes_to_add -= "traitor" // makes it so that traitor is always available
choices.Add(modes_to_add)
if("custom")
question = stripped_input(usr,"What is the vote for?")
if(!question)
@@ -636,16 +577,6 @@ SUBSYSTEM_DEF(vote)
if(trialmin)
. += "\t(<a href='?src=[REF(src)];vote=toggle_restart'>[avr ? "Allowed" : "Disallowed"]</a>)"
. += "</li><li>"
//gamemode
var/avm = CONFIG_GET(flag/allow_vote_mode)
if(trialmin || avm)
. += "<a href='?src=[REF(src)];vote=gamemode'>GameMode</a>"
else
. += "<font color='grey'>GameMode (Disallowed)</font>"
if(trialmin)
. += "\t(<a href='?src=[REF(src)];vote=toggle_gamemode'>[avm ? "Allowed" : "Disallowed"]</a>)"
. += "</li>"
//custom
if(trialmin)
. += "<li><a href='?src=[REF(src)];vote=custom'>Custom</a></li>"
@@ -668,15 +599,9 @@ SUBSYSTEM_DEF(vote)
if("toggle_restart")
if(usr.client.holder)
CONFIG_SET(flag/allow_vote_restart, !CONFIG_GET(flag/allow_vote_restart))
if("toggle_gamemode")
if(usr.client.holder)
CONFIG_SET(flag/allow_vote_mode, !CONFIG_GET(flag/allow_vote_mode))
if("restart")
if(CONFIG_GET(flag/allow_vote_restart) || usr.client.holder)
initiate_vote("restart",usr.key)
if("gamemode")
if(CONFIG_GET(flag/allow_vote_mode) || usr.client.holder)
initiate_vote("gamemode",usr.key)
if("custom")
if(usr.client.holder)
initiate_vote("custom",usr.key)

View File

@@ -166,7 +166,6 @@
.["mode"] = "hidden" //CIT CHANGE - hides the gamemode in topic() calls to prevent meta'ing the gamemode
.["respawn"] = config ? CONFIG_GET(flag/respawns_enabled) : FALSE
.["enter"] = GLOB.enter_allowed
.["vote"] = CONFIG_GET(flag/allow_vote_mode)
.["ai"] = CONFIG_GET(flag/allow_ai)
.["host"] = world.host ? world.host : null
.["round_id"] = GLOB.round_id

View File

@@ -53,7 +53,7 @@
/datum/dynamic_ruleset/latejoin/infiltrator
name = "Syndicate Infiltrator"
antag_datum = /datum/antagonist/traitor
antag_flag = ROLE_TRAITOR
antag_flag = "traitor late"
protected_roles = list("Security Officer", "Warden", "Head of Personnel", "Detective", "Head of Security", "Captain")
restricted_roles = list("AI","Cyborg")
required_candidates = 1
@@ -72,8 +72,8 @@
name = "Provocateur"
persistent = TRUE
antag_datum = /datum/antagonist/rev/head
antag_flag = ROLE_REV_HEAD
antag_flag_override = ROLE_REV
antag_flag = "rev head late"
antag_flag_override = "rev late"
restricted_roles = list("AI", "Cyborg", "Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director")
enemy_roles = list("AI", "Cyborg", "Security Officer","Detective","Head of Security", "Captain", "Warden")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
@@ -148,7 +148,7 @@
/datum/dynamic_ruleset/latejoin/heretic_smuggler
name = "Heretic Smuggler"
antag_datum = /datum/antagonist/heretic
antag_flag = ROLE_HERETIC
antag_flag = "heretic late"
protected_roles = list("Security Officer", "Warden", "Head of Personnel", "Detective", "Head of Security", "Captain","Prisoner")
restricted_roles = list("AI","Cyborg")
required_candidates = 1

View File

@@ -184,7 +184,7 @@
/datum/dynamic_ruleset/midround/autotraitor
name = "Syndicate Sleeper Agent"
antag_datum = /datum/antagonist/traitor
antag_flag = ROLE_TRAITOR
antag_flag = "traitor mid"
protected_roles = list("Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
restricted_roles = list("Cyborg", "AI", "Positronic Brain")
required_candidates = 1
@@ -298,7 +298,7 @@
/datum/dynamic_ruleset/midround/from_ghosts/wizard
name = "Wizard"
antag_datum = /datum/antagonist/wizard
antag_flag = ROLE_WIZARD
antag_flag = "wizard mid"
enemy_roles = list("Security Officer","Detective","Head of Security", "Captain")
required_enemies = list(2,2,1,1,1,1,1,0,0,0)
required_candidates = 1
@@ -328,7 +328,7 @@
/datum/dynamic_ruleset/midround/from_ghosts/nuclear
name = "Nuclear Assault"
antag_flag = ROLE_OPERATIVE
antag_flag = "nukie mid"
antag_datum = /datum/antagonist/nukeop
enemy_roles = list("AI", "Cyborg", "Security Officer", "Warden","Detective","Head of Security", "Captain")
required_enemies = list(3,3,3,3,3,2,1,1,0,0)
@@ -388,7 +388,7 @@
/datum/dynamic_ruleset/midround/blob_infection
name = "Blob Infection"
antag_datum = /datum/antagonist/blob
antag_flag = ROLE_BLOB
antag_flag = "blob mid"
protected_roles = list("Prisoner", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
restricted_roles = list("Cyborg", "AI", "Positronic Brain")
enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain")

View File

@@ -520,6 +520,7 @@
/datum/dynamic_ruleset/roundstart/nuclear/clown_ops
name = "Clown Ops"
antag_flag = "clown ops"
antag_datum = /datum/antagonist/nukeop/clownop
antag_leader_datum = /datum/antagonist/nukeop/leader/clownop
requirements = list(101,101,101,101,101,101,101,101,101,101)

View File

@@ -1,318 +0,0 @@
## Dynamic storytellers weights: how likely each storyteller is to show up. This is adjusted by voting and recency.
STORYTELLER_WEIGHT CHAOTIC 2
STORYTELLER_WEIGHT TEAMWORK 4
STORYTELLER_WEIGHT CONVERSION 0
STORYTELLER_WEIGHT RANDOM 2
STORYTELLER_WEIGHT CLASSIC 6
STORYTELLER_WEIGHT INTRIGUE 6
STORYTELLER_WEIGHT STORY 6
STORYTELLER_WEIGHT CALM 6
STORYTELLER_WEIGHT EXTENDED 0
## Dynamic storyteller minimum player coutns: how many players before this storyteller can be rolled.
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
DYNAMIC_LATEJOIN_DELAY_MIN 10
DYNAMIC_LATEJOIN_DELAY_MAX 30
DYNAMIC_FIRST_MIDROUND_DELAY_MIN 20
DYNAMIC_FIRST_MIDROUND_DELAY_MAX 30
DYNAMIC_FIRST_LATEJOIN_DELAY_MIN 2
DYNAMIC_FIRST_LATEJOIN_DELAY_MAX 30
## How many roundstart players required for high population override to take effect.
DYNAMIC_HIGH_POP_LIMIT 80 #80 instead of 55 because fewer robust players
## Threat requirements for a second roundstart ruleset being drafted
DYNAMIC_SECOND_RULE_REQUIREMENTS 101 101 101 101 100 90 80 70 60 50
## Threat requirements for a *third* roundstart ruleset being drafted
DYNAMIC_THIRD_RULE_REQUIREMENTS 101 101 101 101 101 100 90 80 70 60
## As above, but if there's 79+ players
DYNAMIC_SECOND_RULE_HIGH_POP_REQUIREMENT 50
DYNAMIC_THIRD_RULE_HIGH_POP_REQUIREMENT 60
## Pop range per requirement.
## If the value is five the range is:
## 0-4, 5-9, 10-14, 15-19, 20-24, 25-29, 30-34, 35-39, 40-54, 45+
## If it is six the range is:
## 0-5, 6-11, 12-17, 18-23, 24-29, 30-35, 36-41, 42-47, 48-53, 54+
## If it is seven the range is:
## 0-6, 7-13, 14-20, 21-27, 28-34, 35-41, 42-48, 49-55, 56-62, 63+
## Options outside this range can be used, of course.
DYNAMIC_POP_PER_REQUIREMENT 9 # 9 instead of 6 because 1/3 of players are probably not doing much?
## 1 -> 9, probability for this rule to be picked against other rules.
## Note that requirements must also be met, and some requirements are impossible to meet.
DYNAMIC_WEIGHT TRAITOR 5
DYNAMIC_WEIGHT MALF_AI 1
DYNAMIC_WEIGHT TRAITORBRO 4
DYNAMIC_WEIGHT CHANGELING 1
DYNAMIC_WEIGHT WIZARD 1
DYNAMIC_WEIGHT CULT 3
DYNAMIC_WEIGHT NUCLEAR 3
DYNAMIC_WEIGHT REVOLUTION 2
DYNAMIC_WEIGHT BLOODSUCKER 4
# All below are impossible-by-default
DYNAMIC_WEIGHT EXTENDED 3
DYNAMIC_WEIGHT CLOCKWORK_CULT 3
DYNAMIC_WEIGHT CLOWNOPS 3
DYNAMIC_WEIGHT DEVIL 3
DYNAMIC_WEIGHT MONKEY 3
DYNAMIC_WEIGHT METEOR 3
## Midround antags
DYNAMIC_WEIGHT MIDROUND_TRAITOR 9
DYNAMIC_WEIGHT MIDROUND_MALF_AI 5
DYNAMIC_WEIGHT MIDROUND_WIZARD 4
DYNAMIC_WEIGHT MIDROUND_NUCLEAR 2
DYNAMIC_WEIGHT BLOB 2
DYNAMIC_WEIGHT XENOS 2
DYNAMIC_WEIGHT NIGHTMARE 3
DYNAMIC_WEIGHT SENTIENT_DISEASE 4
DYNAMIC_WEIGHT REVENANT 2
DYNAMIC_WEIGHT SLAUGHTER_DEMON 1
DYNAMIC_WEIGHT ABDUCTORS 3
DYNAMIC_WEIGHT SPACE_NINJA 3
## Events
DYNAMIC_WEIGHT SPIDERS 5
DYNAMIC_WEIGHT VENTCLOG_NORMAL 3
DYNAMIC_WEIGHT VENTCLOG_THREATENING 3
DYNAMIC_WEIGHT VENTCLOG_CATASTROPHIC 3
DYNAMIC_WEIGHT ION_STORM 7
DYNAMIC_WEIGHT METEOR_WAVE_NORMAL 3
DYNAMIC_WEIGHT METEOR_WAVE_THREATENING 2
DYNAMIC_WEIGHT METEOR_WAVE_CATASTROPHIC 1
DYNAMIC_WEIGHT PIRATES 8
DYNAMIC_WEIGHT ANOMALY_BLUESPACE 2
DYNAMIC_WEIGHT ANOMALY_FLUX 2
DYNAMIC_WEIGHT ANOMALY_GRAVITATIONAL 2
DYNAMIC_WEIGHT ANOMALY_PYROCLASTIC 2
DYNAMIC_WEIGHT ANOMALY_VORTEX 2
DYNAMIC_WEIGHT BRAND_INTELLIGENCE 1
DYNAMIC_WEIGHT CARP_MIGRATION 7
DYNAMIC_WEIGHT COMMUNICATIONS_BLACKOUT 2
DYNAMIC_WEIGHT PROCESSOR_OVERLOAD 2
DYNAMIC_WEIGHT SPACE_DUST 2
DYNAMIC_WEIGHT MAJOR_DUST 1
DYNAMIC_WEIGHT ELECTRICAL_STORM 2
DYNAMIC_WEIGHT HEART_ATTACK 2
DYNAMIC_WEIGHT RADIATION_STORM 1
## Latejoin antags
DYNAMIC_WEIGHT LATEJOIN_TRAITOR 7
DYNAMIC_WEIGHT LATEJOIN_REVOLUTION 2
DYNAMIC_WEIGHT LATEJOIN_BLOODSUCKER 4
DYNAMIC_WEIGHT LATEJOIN_COLLECTOR 5
## Threat cost. This is decreased from the mode's threat when the rule is executed.
DYNAMIC_COST TRAITOR 10
DYNAMIC_COST MALF_AI 35
DYNAMIC_COST TRAITORBRO 10
DYNAMIC_COST CHANGELING 30
DYNAMIC_COST WIZARD 30
DYNAMIC_COST CULT 35
DYNAMIC_COST NUCLEAR 45
DYNAMIC_COST REVOLUTION 40
DYNAMIC_cOST BLOODSUCKER 15
DYNAMIC_COST EXTENDED 0
DYNAMIC_COST CLOCKWORK_CULT 35
DYNAMIC_COST CLOWNOPS 40
DYNAMIC_COST DEVIL 0
DYNAMIC_COST MONKEY 0
DYNAMIC_COST METEOR 0
## Midround antags
DYNAMIC_COST MIDROUND_TRAITOR 10
DYNAMIC_COST MIDROUND_MALF_AI 35
DYNAMIC_COST MIDROUND_WIZARD 20
DYNAMIC_COST MIDROUND_NUCLEAR 35
DYNAMIC_COST BLOB 10
DYNAMIC_COST XENOS 20
DYNAMIC_COST NIGHTMARE 10
DYNAMIC_COST SENTIENT_DISEASE 5
DYNAMIC_COST REVENANT 5
DYNAMIC_COST SLAUGHTER_DEMON 15
DYNAMIC_COST ABDUCTORS 10
DYNAMIC_COST SPACE_NINJA 15
## Events
DYNAMIC_COST SPIDERS 10
DYNAMIC_COST VENTCLOG_NORMAL 2
DYNAMIC_COST VENTCLOG_THREATENING 5
DYNAMIC_COST VENTCLOG_CATASTROPHIC 15
DYNAMIC_COST ION_STORM 3
DYNAMIC_COST METEOR_WAVE_NORMAL 15
DYNAMIC_COST METEOR_WAVE_THREATENING 25
DYNAMIC_COST METEOR_WAVE_CATASTROPHIC 40
DYNAMIC_COST PIRATES 10
DYNAMIC_COST ANOMALY_BLUESPACE 3
DYNAMIC_COST ANOMALY_FLUX 2
DYNAMIC_COST ANOMALY_GRAVITATIONAL 3
DYNAMIC_COST ANOMALY_PYROCLASTIC 5
DYNAMIC_COST ANOMALY_VORTEX 5
DYNAMIC_COST BRAND_INTELLIGENCE 5
DYNAMIC_COST CARP_MIGRATION 3
DYNAMIC_COST COMMUNICATIONS_BLACKOUT 5
DYNAMIC_COST PROCESSOR_OVERLOAD 5
DYNAMIC_COST SPACE_DUST 2
DYNAMIC_COST MAJOR_DUST 4
DYNAMIC_COST ELECTRICAL_STORM 1
DYNAMIC_COST HEART_ATTACK 1
DYNAMIC_COST RADIATION_STORM 3
## Latejoin antags
DYNAMIC_COST LATEJOIN_TRAITOR 5
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+.
## 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
DYNAMIC_REQUIREMENTS CHANGELING 101 101 101 101 101 101 101 101 101 101
DYNAMIC_REQUIREMENTS WIZARD 101 101 60 60 50 50 50 50 50 50
DYNAMIC_REQUIREMENTS CULT 101 101 101 60 50 50 50 50 50 50
DYNAMIC_REQUIREMENTS NUCLEAR 101 101 101 60 50 50 50 50 50 50
DYNAMIC_REQUIREMENTS REVOLUTION 101 101 101 60 50 50 50 50 50 50
DYNAMIC_REQUIREMENTS EXTENDED 101 101 101 101 101 101 101 101 101 101
DYNAMIC_REQUIREMENTS CLOCKWORK_CULT 101 101 101 70 60 60 50 50 50 50
DYNAMIC_REQUIREMENTS CLOWNOPS 101 101 101 101 101 101 101 101 101 101
DYNAMIC_REQUIREMENTS DEVIL 101 101 101 101 101 101 101 101 101 101
DYNAMIC_REQUIREMENTS MONKEY 101 101 101 101 101 101 101 101 101 101
DYNAMIC_REQUIREMENTS METEOR 101 101 101 101 101 101 101 101 101 101
## Midround antags
DYNAMIC_REQUIREMENTS MIDROUND_TRAITOR 30 25 20 15 15 15 15 15 15 15
DYNAMIC_REQUIREMENTS MIDROUND_MALF_AI 101 101 70 50 50 50 40 30 30 30
DYNAMIC_REQUIREMENTS MIDROUND_WIZARD 90 90 60 40 30 30 30 30 30 30
DYNAMIC_REQUIREMENTS MIDROUND_NUCLEAR 90 90 90 80 70 60 50 40 40 40
DYNAMIC_REQUIREMENTS BLOB 101 101 101 80 60 50 50 50 50 50
DYNAMIC_REQUIREMENTS XENOS 101 101 101 70 50 50 50 50 50 50
DYNAMIC_REQUIREMENTS NIGHTMARE 101 101 101 70 50 40 20 15 15 15
DYNAMIC_REQUIREMENTS SENTIENT_DISEASE 30 30 20 20 15 10 10 10 10 5
DYNAMIC_REQUIREMENTS REVENANT 30 30 30 30 20 15 15 15 15 15
DYNAMIC_REQUIREMENTS SLAUGHTER_DEMON 101 101 101 90 80 70 60 50 50 50
DYNAMIC_REQUIREMENTS ABDUCTORS 80 80 70 50 40 30 30 20 15 15
DYNAMIC_REQUIREMENTS SPACE_NINJA 101 101 101 90 80 70 60 50 40 30
## Events
DYNAMIC_REQUIREMENTS SPIDERS 70 60 50 50 40 40 40 30 20 15
DYNAMIC_REQUIREMENTS VENTCLOG 5 5 5 5 5 5 5 5 5 5
DYNAMIC_REQUIREMENTS ION_STORM 5 5 5 5 5 5 5 5 5 5
DYNAMIC_REQUIREMENTS METEOR_WAVE 60 50 40 30 30 30 30 30 30 30
DYNAMIC_REQUIREMENTS PIRATES 70 60 50 50 40 40 40 30 20 15
DYNAMIC_REQUIREMENTS ANOMALY_BLUESPACE 5 5 5 5 5 5 5 5 5 5
DYNAMIC_REQUIREMENTS ANOMALY_FLUX 5 5 5 5 5 5 5 5 5 5
DYNAMIC_REQUIREMENTS ANOMALY_GRAVITATIONAL 5 5 5 5 5 5 5 5 5 5
DYNAMIC_REQUIREMENTS ANOMALY_PYROCLASTIC 10 10 10 10 10 10 10 10 10 10
DYNAMIC_REQUIREMENTS ANOMALY_VORTEX 10 10 10 10 10 10 10 10 10 10
DYNAMIC_REQUIREMENTS BRAND_INTELLIGENCE 10 10 10 10 10 10 10 10 10 10
DYNAMIC_REQUIREMENTS CARP_MIGRATION 10 10 10 10 10 10 10 10 10 10
DYNAMIC_REQUIREMENTS COMMUNICATIONS_BLACKOUT 5 5 5 5 5 5 5 5 5 5
DYNAMIC_REQUIREMENTS PROCESSOR_OVERLOAD 5 5 5 5 5 5 5 5 5 5
DYNAMIC_REQUIREMENTS SPACE_DUST 5 5 5 5 5 5 5 5 5 5
DYNAMIC_REQUIREMENTS MAJOR_DUST 10 10 10 10 10 10 10 10 10 10
DYNAMIC_REQUIREMENTS ELECTRICAL_STORM 5 5 5 5 5 5 5 5 5 5
DYNAMIC_REQUIREMENTS HEART_ATTACK 5 5 5 5 5 5 5 5 5 5
DYNAMIC_REQUIREMENTS RADIATION_STORM 5 5 5 5 5 5 5 5 5 5
## Latejoin antags
DYNAMIC_REQUIREMENTS LATEJOIN_TRAITOR 40 30 20 15 15 15 15 15 15 15
DYNAMIC_REQUIREMENTS LATEJOIN_REVOLUTION 101 101 70 40 40 40 40 40 40 40
DYNAMIC_REQUIREMENTS LATEJOIN_BLOODSUCKER 40 30 20 15 15 15 15 15 15 15
DYNAMIC_REQUIREMENTS LATEJOIN_COLLECTOR 10 10 10 10 10 10 10 10 10 10
## An alternative, static requirement used instead when pop is over mode's high_pop_limit.
DYNAMIC_HIGH_POPULATION_REQUIREMENT TRAITOR 50
DYNAMIC_HIGH_POPULATION_REQUIREMENT MALF_AI 50
DYNAMIC_HIGH_POPULATION_REQUIREMENT TRAITORBRO 101
DYNAMIC_HIGH_POPULATION_REQUIREMENT CHANGELING 101
DYNAMIC_HIGH_POPULATION_REQUIREMENT WIZARD 50
DYNAMIC_HIGH_POPULATION_REQUIREMENT CULT 50
DYNAMIC_HIGH_POPULATION_REQUIREMENT NUCLEAR 50
DYNAMIC_HIGH_POPULATION_REQUIREMENT REVOLUTION 50
# All below are impossible-by-default
DYNAMIC_HIGH_POPULATION_REQUIREMENT EXTENDED 101
DYNAMIC_HIGH_POPULATION_REQUIREMENT CLOCKWORK_CULT 50
DYNAMIC_HIGH_POPULATION_REQUIREMENT CLOWNOPS 101
DYNAMIC_HIGH_POPULATION_REQUIREMENT DEVIL 101
DYNAMIC_HIGH_POPULATION_REQUIREMENT MONKEY 101
DYNAMIC_HIGH_POPULATION_REQUIREMENT METEOR 101
## Midround antags
DYNAMIC_HIGH_POPULATION_REQUIREMENT MIDROUND_TRAITOR 15
DYNAMIC_HIGH_POPULATION_REQUIREMENT MIDROUND_MALF_AI 35
DYNAMIC_HIGH_POPULATION_REQUIREMENT MIDROUND_WIZARD 50
DYNAMIC_HIGH_POPULATION_REQUIREMENT MIDROUND_NUCLEAR 35
DYNAMIC_HIGH_POPULATION_REQUIREMENT BLOB 50
DYNAMIC_HIGH_POPULATION_REQUIREMENT XENOS 50
DYNAMIC_HIGH_POPULATION_REQUIREMENT NIGHTMARE 15
DYNAMIC_HIGH_POPULATION_REQUIREMENT SENTIENT_DISEASE 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT REVENANT 15
DYNAMIC_HIGH_POPULATION_REQUIREMENT SLAUGHTER_DEMON 30
DYNAMIC_HIGH_POPULATION_REQUIREMENT ABDUCTORS 15
DYNAMIC_HIGH_POPULATION_REQUIREMENT SPACE_NINJA 30
## Events
DYNAMIC_HIGH_POPULATION_REQUIREMENT SPIDERS 15
DYNAMIC_HIGH_POPULATION_REQUIREMENT VENTCLOG 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT ION_STORM 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT METEOR_WAVE 30
DYNAMIC_HIGH_POPULATION_REQUIREMENT PIRATES 15
DYNAMIC_HIGH_POPULATION_REQUIREMENT ANOMALY_BLUESPACE 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT ANOMALY_FLUX 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT ANOMALY_GRAVITATIONAL 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT ANOMALY_PYROCLASTIC 10
DYNAMIC_HIGH_POPULATION_REQUIREMENT ANOMALY_VORTEX 10
DYNAMIC_HIGH_POPULATION_REQUIREMENT BRAND_INTELLIGENCE 10
DYNAMIC_HIGH_POPULATION_REQUIREMENT CARP_MIGRATION 10
DYNAMIC_HIGH_POPULATION_REQUIREMENT COMMUNICATIONS_BLACKOUT 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT PROCESSOR_OVERLOAD 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT SPACE_DUST 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT MAJOR_DUST 10
DYNAMIC_HIGH_POPULATION_REQUIREMENT ELECTRICAL_STORM 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT HEART_ATTACK 5
DYNAMIC_HIGH_POPULATION_REQUIREMENT RADIATION_STORM 5
## Latejoin antags
DYNAMIC_HIGH_POPULATION_REQUIREMENT LATEJOIN_TRAITOR 15
DYNAMIC_HIGH_POPULATION_REQUIREMENT LATEJOIN_REVOLUTION 50
DYNAMIC_HIGH_POPULATION_REQUIREMENT LATEJOIN_BLOODSUCKER 15
DYNAMIC_HIGH_POPULATION_REQUIREMENT LATEJOIN_COLLECTOR 10
## Dynamic traitor stuff
## Requirements for "hijack the shuttle" goals.
DYNAMIC_HIJACK_REQUIREMENTS 101 101 101 95 80 70 60 50 40 30
DYNAMIC_HIJACK_HIGH_POPULATION_REQUIREMENT 25
DYNAMIC_HIJACK_COST 10
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_COST 10
## Storyteller min players
# STORYTELLER_MIN_PLAYERS CHAOTIC 35
## Storyteller minimum chaos
# STORYTELLER_MIN_CHAOS CHAOTIC 75
## Storyteller maximum chaos
# STORYTELLER_MAX_CHAOS CHAOTIC 250