diff --git a/code/datums/gamemode/dynamic/dynamic.dm b/code/datums/gamemode/dynamic/dynamic.dm index 153f3ea782e..7bde5f44850 100644 --- a/code/datums/gamemode/dynamic/dynamic.dm +++ b/code/datums/gamemode/dynamic/dynamic.dm @@ -138,7 +138,7 @@ var/stacking_limit = 90 /datum/gamemode/dynamic/GetScoreboard() - dat += "

Dynamic Mode v1.0 - Threat Level = [threat_level]%

\[View Log\]" + dat += "

Dynamic Mode - Threat Level = [threat_level]%

\[View Log\]" 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: [rule.name] successfully forced!") + log_admin("DYNAMIC MODE: [rule.name] 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...[starting_rule.name]!") - log_admin("Picking a [istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/) ? " delayed " : ""] ruleset...[starting_rule.name]!") + message_admins("DYNAMIC MODE: Picking a [istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/) ? " delayed " : ""] ruleset...[starting_rule.name]!") + log_admin("DYNAMIC MODE: Picking a [istype(starting_rule, /datum/dynamic_ruleset/roundstart/delayed/) ? " delayed " : ""] ruleset...[starting_rule.name]!") 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 [latejoin_rule.name] 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 [latejoin_rule.name] 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...[midround_rule.name]!") - log_admin("Injecting some threats...[midround_rule.name]!") + message_admins("DYNAMIC MODE: Injecting some threats...[midround_rule.name]!") + 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() diff --git a/code/datums/gamemode/dynamic/dynamic_rulesets.dm b/code/datums/gamemode/dynamic/dynamic_rulesets.dm index 71c502f15de..bdf67a61e40 100644 --- a/code/datums/gamemode/dynamic/dynamic_rulesets.dm +++ b/code/datums/gamemode/dynamic/dynamic_rulesets.dm @@ -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 diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 67f03b6232d..fa799a75bf4 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -679,7 +679,7 @@ var/global/floorIsLava = 0 dat += "(Force Roundstart Rulesets)
" dat += "(Dynamic mode options)
" 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 += {"-> [rule.name] <-
"} dat += "(Clear Rulesets)
" dat += "