Some Dynamic Logging QoL and Fix'd Forced Rulesets (#28206)

* fix forced rulesets

* better
This commit is contained in:
DeityLink
2020-11-21 17:50:21 +01:00
committed by GitHub
parent d6130140fd
commit 60bd0b21c6
4 changed files with 114 additions and 52 deletions

View File

@@ -138,7 +138,7 @@ var/stacking_limit = 90
/datum/gamemode/dynamic/GetScoreboard()
dat += "<h2>Dynamic Mode v1.0 - Threat Level = <font color='red'>[threat_level]%</font></h2><a href='?src=\ref[src];threatlog=1'>\[View Log\]</a>"
dat += "<h2>Dynamic Mode - Threat Level = <font color='red'>[threat_level]%</font></h2><a href='?src=\ref[src];threatlog=1'>\[View Log\]</a>"
var/rules = list()
if (executed_rules.len > 0)
@@ -198,16 +198,16 @@ var/stacking_limit = 90
if(player.ready && player.mind)
rst_pop++
if (rst_pop >= high_pop_limit)
message_admins("High Population Override is in effect! ([rst_pop]/[high_pop_limit]) Threat Level will have more impact on which roles will appear, and player population less.")
log_admin("High Population Override is in effect! ([rst_pop]/[high_pop_limit]) Threat Level will have more impact on which roles will appear, and player population less.")
message_admins("DYNAMIC MODE: Mode: High Population Override is in effect! ([rst_pop]/[high_pop_limit]) Threat Level will have more impact on which roles will appear, and player population less.")
log_admin("DYNAMIC MODE: High Population Override is in effect! ([rst_pop]/[high_pop_limit]) Threat Level will have more impact on which roles will appear, and player population less.")
dynamic_stats = new
dynamic_stats.starting_threat_level = threat_level
if (round(threat_level*10) == 666)
forced_roundstart_ruleset += new /datum/dynamic_ruleset/roundstart/bloodcult()
forced_roundstart_ruleset += new /datum/dynamic_ruleset/roundstart/vampire()
log_admin("666 threat override.")
message_admins("666 threat override.", 1)
log_admin("DYNAMIC MODE: 666 threat override.")
message_admins("DYNAMIC MODE: 666 threat override.", 1)
return 1
@@ -239,12 +239,15 @@ var/stacking_limit = 90
if(player.ready && player.mind)
roundstart_pop_ready++
candidates.Add(player)
message_admins("Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.")
message_admins("DYNAMIC MODE: Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.")
log_admin("DYNAMIC MODE: Listing [roundstart_rules.len] round start rulesets, and [candidates.len] players ready.")
if (candidates.len <= 0)
message_admins("Not a single player readied-up. The round will begin without any roles assigned.")
message_admins("DYNAMIC MODE: Not a single player readied-up. The round will begin without any roles assigned.")
log_admin("DYNAMIC MODE: Not a single player readied-up. The round will begin without any roles assigned.")
return 1
if (roundstart_rules.len <= 0)
message_admins("There are no roundstart rules within the code, what the fuck? The round will begin without any roles assigned.")
message_admins("DYNAMIC MODE: There are no roundstart rules within the code, what the fuck? The round will begin without any roles assigned.")
log_admin("DYNAMIC MODE: There are no roundstart rules within the code, what the fuck? The round will begin without any roles assigned.")
return 1
if (forced_roundstart_ruleset.len > 0)
rigged_roundstart()
@@ -261,23 +264,50 @@ var/stacking_limit = 90
return 1
/datum/gamemode/dynamic/proc/rigged_roundstart()
message_admins("[forced_roundstart_ruleset.len] rulesets being forced. Will now attempt to draft players for them.")
message_admins("DYNAMIC MODE: [forced_roundstart_ruleset.len] rulesets being forced. Will now attempt to draft players for them.")
log_admin("DYNAMIC MODE: [forced_roundstart_ruleset.len] rulesets being forced. Will now attempt to draft players for them.")
var/forced_rules = 0
for (var/datum/dynamic_ruleset/roundstart/rule in forced_roundstart_ruleset)
rule.mode = src
rule.candidates = candidates.Copy()
rule.trim_candidates()
if (rule.ready(1))//ignoring enemy job requirements
picking_roundstart_rule(list(rule))
forced_rules++
for (var/datum/forced_ruleset/forced_rule in forced_roundstart_ruleset)//By checking in this order we allow admins to set up priorities among the forced rulesets.
for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules)
if (forced_rule.name == rule.name)
rule.candidates = candidates.Copy()
rule.trim_candidates()
if (rule.ready(TRUE))
forced_rules++
rule.calledBy = forced_rule.calledBy
message_admins("DYNAMIC MODE: <font size='3'>[rule.name]</font> successfully forced!")
log_admin("DYNAMIC MODE: <font size='3'>[rule.name]</font> successfully forced!")
//we don't spend threat on forced rulesets
threat_log += "[worldtime2text()]: Roundstart [rule.name] forced"
if (istype(rule, /datum/dynamic_ruleset/roundstart/delayed/))
message_admins("DYNAMIC MODE: with a delay of [rule:delay/10] seconds.")
log_admin("DYNAMIC MODE: with a delay of [rule:delay/10] seconds.")
return pick_delay(rule)
if (rule.execute())//this should never fail since ready() returned 1
executed_rules += rule
if (rule.persistent)
current_rules += rule
for(var/mob/M in rule.assigned)
candidates -= M
return 1
else
message_admins("DYNAMIC MODE: ....except not because whomever coded that ruleset forgot some cases in ready() apparently! execute() returned 0.")
log_admin("DYNAMIC MODE: ....except not because whomever coded that ruleset forgot some cases in ready() apparently! execute() returned 0.")
if (forced_rules == 0)
message_admins("Not a single forced ruleset could be executed. Sad! Will now start a regular round of dynamic.")
message_admins("DYNAMIC MODE: Not a single forced ruleset could be executed. Sad! Will now start a regular round of dynamic.")
log_admin("DYNAMIC MODE: Not a single forced ruleset could be executed. Sad! Will now start a regular round of dynamic.")
roundstart()
/datum/gamemode/dynamic/proc/roundstart()
if (forced_extended)
message_admins("Starting a round of forced extended.")
message_admins("DYNAMIC MODE: Starting a round of forced extended.")
log_admin("DYNAMIC MODE: Starting a round of forced extended.")
return 1
var/indice_pop = min(10,round(roundstart_pop_ready/5)+1)
@@ -302,7 +332,8 @@ var/stacking_limit = 90
extra_rulesets_amount++
if (extra_rulesets_amount && prob(50))
message_admins("Rather than extra rulesets, we'll try to draft spicier ones.")
message_admins("DYNAMIC MODE: Rather than extra rulesets, we'll try to draft spicier ones.")
log_admin("DYNAMIC MODE: Rather than extra rulesets, we'll try to draft spicier ones.")
for (var/datum/dynamic_ruleset/rule in roundstart_rules)
if (rule.flags & HIGHLANDER_RULESET)
rule.weight += extra_rulesets_amount
@@ -326,27 +357,34 @@ var/stacking_limit = 90
drafted_rules[rule] = rule.get_weight()
if (classic_secret)
message_admins("Classic secret was forced.")
message_admins("DYNAMIC MODE: Classic secret was forced.")
log_admin("DYNAMIC MODE: Classic secret was forced.")
else
message_admins("[i] rulesets qualify for the current pop and threat level, including [drafted_rules.len] with eligible candidates.")
message_admins("DYNAMIC MODE: [i] rulesets qualify for the current pop and threat level, including [drafted_rules.len] with eligible candidates.")
log_admin("DYNAMIC MODE: [i] rulesets qualify for the current pop and threat level, including [drafted_rules.len] with eligible candidates.")
if (drafted_rules.len > 0 && picking_roundstart_rule(drafted_rules))
if (extra_rulesets_amount > 0)//we've got enough population and threat for a second rulestart rule
for (var/datum/dynamic_ruleset/roundstart/rule in drafted_rules)
if (rule.cost > threat)
drafted_rules -= rule
message_admins("The current pop and threat level allow for a second round start ruleset, there remains [candidates.len] eligible candidates and [drafted_rules.len] eligible rulesets")
message_admins("DYNAMIC MODE: The current pop and threat level allow for a second round start ruleset, there remains [candidates.len] eligible candidates and [drafted_rules.len] eligible rulesets")
log_admin("DYNAMIC MODE: The current pop and threat level allow for a second round start ruleset, there remains [candidates.len] eligible candidates and [drafted_rules.len] eligible rulesets")
if (drafted_rules.len > 0 && picking_roundstart_rule(drafted_rules))
if (extra_rulesets_amount > 1)//we've got enough population and threat for a third rulestart rule
for (var/datum/dynamic_ruleset/roundstart/rule in drafted_rules)
if (rule.cost > threat)
drafted_rules -= rule
message_admins("The current pop and threat level allow for a third round start ruleset, there remains [candidates.len] eligible candidates and [drafted_rules.len] eligible rulesets")
message_admins("DYNAMIC MODE: The current pop and threat level allow for a third round start ruleset, there remains [candidates.len] eligible candidates and [drafted_rules.len] eligible rulesets")
log_admin("DYNAMIC MODE: The current pop and threat level allow for a third round start ruleset, there remains [candidates.len] eligible candidates and [drafted_rules.len] eligible rulesets")
if (!drafted_rules.len > 0 || !picking_roundstart_rule(drafted_rules))
message_admins("The mode failed to pick a third ruleset.")
message_admins("DYNAMIC MODE: The mode failed to pick a third ruleset.")
log_admin("DYNAMIC MODE: The mode failed to pick a third ruleset.")
else
message_admins("The mode failed to pick a second ruleset.")
message_admins("DYNAMIC MODE: The mode failed to pick a second ruleset.")
log_admin("DYNAMIC MODE: The mode failed to pick a second ruleset.")
else
message_admins("The mode failed to pick a first ruleset. The round will begin without any roles assigned.")
message_admins("DYNAMIC MODE: The mode failed to pick a first ruleset. The round will begin without any roles assigned.")
log_admin("DYNAMIC MODE: The mode failed to pick a first ruleset. The round will begin without any roles assigned.")
return 0
return 1
@@ -354,25 +392,27 @@ var/stacking_limit = 90
var/datum/dynamic_ruleset/roundstart/starting_rule
while(!starting_rule && drafted_rules.len > 0)
message_admins("Drafted rules: [json_encode(drafted_rules)]")
message_admins("DYNAMIC MODE: Drafted rules: [json_encode(drafted_rules)]")
log_admin("DYNAMIC MODE: Drafted rules: [json_encode(drafted_rules)]")
starting_rule = pickweight(drafted_rules)
if (threat < stacking_limit && no_stacking)
for (var/datum/dynamic_ruleset/roundstart/DR in executed_rules)
if ((DR.flags & HIGHLANDER_RULESET) && (starting_rule.flags & HIGHLANDER_RULESET))
message_admins("Ruleset [starting_rule.name] refused as we already have a round-ending ruleset.")
log_admin("Ruleset [starting_rule.name] refused as we already have a round-ending ruleset.")
message_admins("DYNAMIC MODE: Ruleset [starting_rule.name] refused as we already have a round-ending ruleset.")
log_admin("DYNAMIC MODE: Ruleset [starting_rule.name] refused as we already have a round-ending ruleset.")
drafted_rules -= starting_rule
starting_rule = null
if (starting_rule)
message_admins("Picking a [istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/) ? " delayed " : ""] ruleset...<font size='3'>[starting_rule.name]</font>!")
log_admin("Picking a [istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/) ? " delayed " : ""] ruleset...<font size='3'>[starting_rule.name]</font>!")
message_admins("DYNAMIC MODE: Picking a [istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/) ? " delayed " : ""] ruleset...<font size='3'>[starting_rule.name]</font>!")
log_admin("DYNAMIC MODE: Picking a [istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/) ? " delayed " : ""] ruleset...<font size='3'>[starting_rule.name]</font>!")
roundstart_rules -= starting_rule
drafted_rules -= starting_rule
if (istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/))
message_admins("Delayed ruleset, with a delay of [starting_rule:delay/10] seconds.")
message_admins("DYNAMIC MODE: Delayed ruleset, with a delay of [starting_rule:delay/10] seconds.")
log_admin("DYNAMIC MODE: Delayed ruleset, with a delay of [starting_rule:delay/10] seconds.")
spend_threat(starting_rule.cost)
return pick_delay(starting_rule)
@@ -390,7 +430,8 @@ var/stacking_limit = 90
drafted_rules -= rule//and removing rules that are no longer eligible
return 1
else
message_admins("....except not because whomever coded that ruleset forgot some cases in ready() apparently! execute() returned 0.")
message_admins("DYNAMIC MODE: ....except not because whomever coded that ruleset forgot some cases in ready() apparently! execute() returned 0.")
log_admin("DYNAMIC MODE: ....except not because whomever coded that ruleset forgot some cases in ready() apparently! execute() returned 0.")
return 0
/datum/gamemode/dynamic/proc/pick_delay(var/datum/dynamic_ruleset/roundstart/delayed/rule)
@@ -403,7 +444,8 @@ var/stacking_limit = 90
if (rule.persistent)
current_rules += rule
else
message_admins("....except not because whomever coded that ruleset forgot some cases in ready() apparently! execute() returned 0.")
message_admins("DYNAMIC MODE: ....except not because whomever coded that ruleset forgot some cases in ready() apparently! execute() returned 0.")
log_admin("DYNAMIC MODE: ....except not because whomever coded that ruleset forgot some cases in ready() apparently! execute() returned 0.")
return 1
@@ -417,8 +459,8 @@ var/stacking_limit = 90
dynamic_stats.measure_threat(threat)
if (latejoin_rule.execute())//this should never fail since ready() returned 1
var/mob/M = pick(latejoin_rule.assigned)
message_admins("[key_name(M)] joined the station, and was selected by the <font size='3'>[latejoin_rule.name]</font> ruleset.")
log_admin("[key_name(M)] joined the station, and was selected by the [latejoin_rule.name] ruleset.")
message_admins("DYNAMIC MODE: [key_name(M)] joined the station, and was selected by the <font size='3'>[latejoin_rule.name]</font> ruleset.")
log_admin("DYNAMIC MODE: [key_name(M)] joined the station, and was selected by the [latejoin_rule.name] ruleset.")
executed_rules += latejoin_rule
dynamic_stats.successful_injection(latejoin_rule)
if (latejoin_rule.persistent)
@@ -435,8 +477,8 @@ var/stacking_limit = 90
threat_log += "[worldtime2text()]: Midround [midround_rule.name] spent [midround_rule.cost]"
dynamic_stats.measure_threat(threat)
if (midround_rule.execute())//this should never fail since ready() returned 1
message_admins("Injecting some threats...<font size='3'>[midround_rule.name]</font>!")
log_admin("Injecting some threats...[midround_rule.name]!")
message_admins("DYNAMIC MODE: Injecting some threats...<font size='3'>[midround_rule.name]</font>!")
log_admin("DYNAMIC MODE: Injecting some threats...[midround_rule.name]!")
dynamic_stats.successful_injection(midround_rule)
executed_rules += midround_rule
if (midround_rule.persistent)
@@ -451,7 +493,8 @@ var/stacking_limit = 90
else if(istype(ruletype,/datum/dynamic_ruleset))
new_rule = ruletype
else
message_admins("The specific ruleset failed beacuse a type other than a path or rule was sent.")
message_admins("DYNAMIC MODE: The specific ruleset failed beacuse a type other than a path or rule was sent.")
log_admin("DYNAMIC MODE: The specific ruleset failed beacuse a type other than a path or rule was sent.")
return
if(caller)
new_rule.calledBy = caller
@@ -477,8 +520,8 @@ var/stacking_limit = 90
current_rules += new_rule
return 1
else if (forced)
message_admins("The ruleset couldn't be executed due to lack of eligible players.")
log_admin("The ruleset couldn't be executed due to lack of eligible players.")
message_admins("DYNAMIC MODE: The ruleset couldn't be executed due to lack of eligible players.")
log_admin("DYNAMIC MODE: The ruleset couldn't be executed due to lack of eligible players.")
return 0
/datum/gamemode/dynamic/process()

View File

@@ -46,7 +46,7 @@
if (istype(ticker.mode, /datum/gamemode/dynamic))
mode = ticker.mode
else
//message_admins("A dynamic ruleset was created but server isn't on Dynamic Mode!")
message_admins("A dynamic ruleset was created but server isn't on Dynamic Mode!")
qdel(src)
/datum/dynamic_ruleset/roundstart//One or more of those drafted at roundstart
@@ -225,6 +225,14 @@
candidates -= M
return M
////////////////////////////////////////////////////////////////////////
/datum/forced_ruleset
var/name = ""
var/ruleType
var/calledBy
//////////////////////////////////////////////
// //
// ROUNDSTART RULESETS ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -236,6 +244,7 @@
var/cand = candidates.len
var/a = 0
var/b = 0
var/b1 = 0
var/c = 0
var/c1 = 0
var/d = 0
@@ -248,10 +257,14 @@
candidates.Remove(P)
a++
continue
if (!P.client.desires_role(role_pref) || jobban_isbanned(P, role_id) || isantagbanned(P) || (role_category_override && jobban_isbanned(P, role_category_override)))//are they willing and not antag-banned?
if (!P.client.desires_role(role_pref))//are they willing?
candidates.Remove(P)
b++
continue
else if (jobban_isbanned(P, role_id) || isantagbanned(P) || (role_category_override && jobban_isbanned(P, role_category_override)))//are they not antag-banned?
candidates.Remove(P)
b1++//we only count banned ones if they actually wanted to play the role
continue
if ((protected_from_jobs.len > 0) && P.mind.assigned_role && (P.mind.assigned_role in protected_from_jobs))
var/probability = initial(role_category.protected_traitor_prob)
if (prob(probability))
@@ -267,8 +280,8 @@
candidates.Remove(P)
e++
continue
message_admins("Dynamic Mode: Trimming [name]'s candidates: [candidates.len] remaining out of [cand] ([a],[b],[c] ([c1]),[d],[e])")
log_admin("Dynamic Mode: Trimming [name]'s candidates: [candidates.len] remaining out of [cand] ([a],[b],[c] ([c1]),[d],[e])")
message_admins("DYNAMIC MODE: [name] has [candidates.len] valid candidates out of [cand] players ([a ? "[a] disconnected, ":""][b ? "[b] didn't want the role, ":""][b1 ? "[b1] wanted the role but are banned from it, ":""][c1 ? "[c1] out of [c] were protected from the role, " : ""][d ? "[d] were restricted from the role, " : ""][e ? "[e] didn't pick the job necessary for the role" : ""])")
log_admin("DYNAMIC MODE: [name] has [candidates.len] valid candidates out of [cand] players ([a ? "[a] disconnected, ":""][b ? "[b] didn't want the role, ":""][b1 ? "[b1] wanted the role but are banned from it, ":""][c1 ? "[c1] out of [c] were protected from the role, " : ""][d ? "[d] were restricted from the role, " : ""][e ? "[e] didn't pick the job necessary for the role" : ""])")
/datum/dynamic_ruleset/roundstart/delayed/trim_candidates()
if (ticker && ticker.current_state < GAME_STATE_PLAYING)
@@ -297,7 +310,6 @@
continue
/datum/dynamic_ruleset/roundstart/ready(var/forced = 0)
message_admins("[name]: [length(candidates)] candidates")
if (!forced)
if(!check_enemy_jobs(FALSE))
return 0

View File

@@ -679,7 +679,7 @@ var/global/floorIsLava = 0
dat += "<A href='?src=\ref[src];f_dynamic_roundstart=1'>(Force Roundstart Rulesets)</A><br>"
dat += "<A href='?src=\ref[src];f_dynamic_options=1'>(Dynamic mode options)</A><br>"
if (forced_roundstart_ruleset.len > 0)
for(var/datum/dynamic_ruleset/roundstart/rule in forced_roundstart_ruleset)
for(var/datum/forced_ruleset/rule in forced_roundstart_ruleset)
dat += {"<A href='?src=\ref[src];f_dynamic_roundstart_remove=\ref[rule]'>-> [rule.name] <-</A><br>"}
dat += "<A href='?src=\ref[src];f_dynamic_roundstart_clear=1'>(Clear Rulesets)</A><br>"
dat += "<A href='?src=\ref[src];f_dynamic_options=1>Dynamic mode options</a><br/>"

View File

@@ -1644,14 +1644,18 @@
return alert(usr, "The game has already started.", null, null, null, null)
if(master_mode != "Dynamic Mode")
return alert(usr, "The game mode has to be Dynamic Mode!", null, null, null, null)
if (forced_roundstart_ruleset.len > 30)
return alert(usr, "Haven't you already forced enough rulesets?", null, null, null, null)
var/list/datum/dynamic_ruleset/roundstart/roundstart_rules = list()
for (var/rule in subtypesof(/datum/dynamic_ruleset/roundstart))
var/datum/dynamic_ruleset/roundstart/newrule = new rule()
roundstart_rules[newrule.name] = newrule
var/datum/dynamic_ruleset/roundstart/newrule = rule
roundstart_rules += initial(newrule.name)
var/added_rule = input(usr,"What ruleset do you want to force? This will bypass threat level and population restrictions.", "Rigging Roundstart", null) as null|anything in roundstart_rules
if (added_rule)
roundstart_rules[added_rule].calledBy = "[key_name(usr)]"
forced_roundstart_ruleset += roundstart_rules[added_rule]
var/datum/forced_ruleset/forcedrule = new
forcedrule.name = added_rule
forcedrule.calledBy = "[key_name(usr)]"
forced_roundstart_ruleset += forcedrule
log_admin("[key_name(usr)] set [added_rule] to be a forced roundstart ruleset.")
message_admins("[key_name(usr)] set [added_rule] to be a forced roundstart ruleset.", 1)
Game()
@@ -1660,6 +1664,8 @@
if(!check_rights(R_ADMIN))
return
for (var/datum/forced_ruleset/rule in forced_roundstart_ruleset)
qdel(rule)
forced_roundstart_ruleset = list()
Game()
log_admin("[key_name(usr)] cleared the rigged roundstart rulesets. The mode will pick them as normal.")
@@ -1670,8 +1676,9 @@
if(!check_rights(R_ADMIN))
return
var/datum/dynamic_ruleset/roundstart/rule = locate(href_list["f_dynamic_roundstart_remove"])
var/datum/forced_ruleset/rule = locate(href_list["f_dynamic_roundstart_remove"])
forced_roundstart_ruleset -= rule
qdel(rule)
Game()
log_admin("[key_name(usr)] removed [rule] from the forced roundstart rulesets.")
message_admins("[key_name(usr)] removed [rule] from the forced roundstart rulesets.", 1)