From 0075037d0ff11785484b5605c9d098fc65c7c8e6 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sun, 24 Nov 2019 17:09:38 -0800 Subject: [PATCH 1/4] Makes (most) dynamic rulesets lower weight if recently fired --- code/controllers/subsystem/persistence.dm | 38 +++++++++++++------ .../gamemodes/dynamic/dynamic_rulesets.dm | 12 +++++- .../dynamic/dynamic_rulesets_events.dm | 4 ++ .../dynamic/dynamic_rulesets_latejoin.dm | 1 + .../dynamic/dynamic_rulesets_midround.dm | 1 + .../dynamic/dynamic_rulesets_roundstart.dm | 1 + 6 files changed, 44 insertions(+), 13 deletions(-) diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index c3db8552c6..8329493818 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -12,6 +12,7 @@ SUBSYSTEM_DEF(persistence) var/list/obj/structure/chisel_message/chisel_messages = list() var/list/saved_messages = list() var/list/saved_modes = list(1,2,3) + var/list/saved_dynamic_rules = list(list(),list(),list()) var/list/saved_threat_levels = list(1,1,1) var/list/saved_maps var/list/saved_trophies = list() @@ -227,7 +228,10 @@ SUBSYSTEM_DEF(persistence) CollectSecretSatchels() CollectTrophies() CollectRoundtype() - CollectThreatLevel() + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + CollectThreatLevel(mode) + CollectRulesets(mode) RecordMaps() SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. if(CONFIG_GET(flag/use_antag_rep)) @@ -384,17 +388,27 @@ SUBSYSTEM_DEF(persistence) fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) -/datum/controller/subsystem/persistence/proc/CollectThreatLevel() - if(istype(SSticker.mode, /datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - saved_threat_levels[3] = saved_threat_levels[2] - saved_threat_levels[2] = saved_threat_levels [1] - saved_threat_levels[1] = mode.threat_level - var/json_file = file("data/RecentThreatLevels.json") - var/list/file_data = list() - file_data["data"] = saved_threat_levels - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) +/datum/controller/subsystem/persistence/proc/CollectThreatLevel(var/datum/game_mode/dynamic/mode) + saved_threat_levels[3] = saved_threat_levels[2] + saved_threat_levels[2] = saved_threat_levels [1] + saved_threat_levels[1] = mode.threat_level + var/json_file = file("data/RecentThreatLevels.json") + var/list/file_data = list() + file_data["data"] = saved_threat_levels + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/CollectRulesets(var/datum/game_mode/dynamic/mode) + saved_dynamic_rules[3] = saved_dynamic_rules[2] + saved_dynamic_rules[2] = saved_dynamic_rules[1] + saved_dynamic_rules[1] = list() + for(var/datum/dynamic_ruleset/ruleset in mode.executed_rules) + saved_dynamic_rules[1] += ruleset.config_tag + var/json_file = file("data/RecentRulesets.json") + var/list/file_data = list() + file_data["data"] = saved_dynamic_rules + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) /datum/controller/subsystem/persistence/proc/RecordMaps() saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]") diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 0c8ec0a2b8..b82b1fcaff 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -80,6 +80,9 @@ /// Delay for when execute will get called from the time of post_setup (roundstart) or process (midround/latejoin). /// Make sure your ruleset works with execute being called during the game when using this, and that the clean_up proc reverts it properly in case of faliure. var/delay = 0 + /// Whether or not previous-round weight values are taken into account for this ruleset. + /// Uses the same values as secret's rulesets. + var/always_max_weight = FALSE /datum/dynamic_ruleset/New() ..() @@ -91,8 +94,15 @@ var/costs = CONFIG_GET(keyed_list/dynamic_cost) var/requirementses = CONFIG_GET(keyed_list/dynamic_requirements) // can't damn well use requirements var/high_population_requirements = CONFIG_GET(keyed_list/dynamic_high_population_requirement) + var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) if(config_tag in weights) - weight = weights[config_tag] + var/weight_mult = 1 + if(!always_max_weight && SSpersistence.saved_dynamic_rules.len == 3 && repeated_mode_adjust.len == 3) + var/saved_dynamic_rules = SSpersistence.saved_dynamic_rules.len + for(var/i in 1 to 3) + if(config_tag in saved_dynamic_rules[i]) + weight_mult -= (adjustment/100) + weight = weights[config_tag] * weight_mult if(config_tag in costs) cost = costs[config_tag] if(config_tag in requirementses) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm index 4ac8cc91d3..a1483f3477 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm @@ -125,6 +125,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + always_max_weight = TRUE ////////////////////////////////////////////// // // @@ -280,6 +281,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + always_max_weight = TRUE /datum/dynamic_ruleset/event/space_dust name = "Minor Space Dust" @@ -293,6 +295,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + always_max_weight = TRUE /datum/dynamic_ruleset/event/major_dust name = "Major Space Dust" @@ -332,6 +335,7 @@ requirements = list(101,101,101,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + always_max_weight = TRUE /datum/dynamic_ruleset/event/radiation_storm name = "Radiation Storm" diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 5810fd0ae0..38efc0e7d0 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -69,6 +69,7 @@ high_population_requirement = 15 repeatable = TRUE flags = TRAITOR_RULESET + always_max_weight = TRUE ////////////////////////////////////////////// // // diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 41de85f7ee..cd0e6115c4 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -186,6 +186,7 @@ repeatable = TRUE high_population_requirement = 15 flags = TRAITOR_RULESET + always_max_weight = TRUE /datum/dynamic_ruleset/midround/autotraitor/acceptable(population = 0, threat = 0) var/player_count = mode.current_players[CURRENT_LIVING_PLAYERS].len diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 56b02a1364..4a35f979bd 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -21,6 +21,7 @@ requirements = list(50,50,50,50,50,50,50,50,50,50) high_population_requirement = 40 antag_cap = list(1,1,1,1,2,2,2,2,3,3) + always_max_weight = TRUE var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec) /datum/dynamic_ruleset/roundstart/traitor/pre_execute() From 4bfc7c262d3de4aeeac437d75d218639e5a43016 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sun, 24 Nov 2019 21:46:15 -0800 Subject: [PATCH 2/4] minor comment fix --- code/game/gamemodes/dynamic/dynamic_rulesets.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index b82b1fcaff..5ef7767964 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -80,8 +80,8 @@ /// Delay for when execute will get called from the time of post_setup (roundstart) or process (midround/latejoin). /// Make sure your ruleset works with execute being called during the game when using this, and that the clean_up proc reverts it properly in case of faliure. var/delay = 0 - /// Whether or not previous-round weight values are taken into account for this ruleset. - /// Uses the same values as secret's rulesets. + /// Whether or not recent-round weight values are taken into account for this ruleset. + /// Weight reduction uses the same values as secret's recent-round mode weight reduction. var/always_max_weight = FALSE /datum/dynamic_ruleset/New() From 0d58e78779fd6590a5c070a4b1a80f6c6c7186a2 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sun, 24 Nov 2019 21:54:28 -0800 Subject: [PATCH 3/4] it's nice for things to compile --- code/game/gamemodes/dynamic/dynamic_rulesets.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 5ef7767964..2d2670ecea 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -94,14 +94,14 @@ var/costs = CONFIG_GET(keyed_list/dynamic_cost) var/requirementses = CONFIG_GET(keyed_list/dynamic_requirements) // can't damn well use requirements var/high_population_requirements = CONFIG_GET(keyed_list/dynamic_high_population_requirement) - var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) + var/list/repeated_mode_adjust = CONFIG_GET(number_list/repeated_mode_adjust) if(config_tag in weights) var/weight_mult = 1 if(!always_max_weight && SSpersistence.saved_dynamic_rules.len == 3 && repeated_mode_adjust.len == 3) var/saved_dynamic_rules = SSpersistence.saved_dynamic_rules.len for(var/i in 1 to 3) if(config_tag in saved_dynamic_rules[i]) - weight_mult -= (adjustment/100) + weight_mult -= (repeated_mode_adjust[i]/100) weight = weights[config_tag] * weight_mult if(config_tag in costs) cost = costs[config_tag] From d0a5c447ce25215599cb7b23a0c0436c8d6b2cf6 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sun, 24 Nov 2019 22:04:05 -0800 Subject: [PATCH 4/4] and THIS is why you always double check your code --- code/game/gamemodes/dynamic/dynamic_rulesets.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 2d2670ecea..ddb26010b6 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -98,7 +98,7 @@ if(config_tag in weights) var/weight_mult = 1 if(!always_max_weight && SSpersistence.saved_dynamic_rules.len == 3 && repeated_mode_adjust.len == 3) - var/saved_dynamic_rules = SSpersistence.saved_dynamic_rules.len + var/saved_dynamic_rules = SSpersistence.saved_dynamic_rules for(var/i in 1 to 3) if(config_tag in saved_dynamic_rules[i]) weight_mult -= (repeated_mode_adjust[i]/100)