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 += "