Actually delayed revs this time (#21620)

* Delayed rulesets. Fixes revs properly

* Delayed revs 4real this time

* Atomic Aunty
This commit is contained in:
ShiftyRail
2019-02-18 17:31:36 +00:00
committed by jknpj
parent 27d8c6f600
commit 9fd08d92d3
8 changed files with 62 additions and 13 deletions

View File

@@ -128,7 +128,7 @@ var/list/threat_by_job = list(
return 1
/datum/gamemode/dynamic/Setup()
for (var/rule in subtypesof(/datum/dynamic_ruleset/roundstart))
for (var/rule in subtypesof(/datum/dynamic_ruleset/roundstart) - /datum/dynamic_ruleset/roundstart/delayed/)
roundstart_rules += new rule()
for (var/rule in subtypesof(/datum/dynamic_ruleset/latejoin))
latejoin_rules += new rule()
@@ -199,14 +199,19 @@ var/list/threat_by_job = list(
/datum/gamemode/dynamic/proc/picking_roundstart_rule(var/list/drafted_rules = list())
var/datum/dynamic_ruleset/roundstart/starting_rule = pickweight(drafted_rules)
if (starting_rule)
message_admins("Picking a ruleset...<font size='3'>[starting_rule.name]</font>!")
log_admin("Picking a ruleset...[starting_rule.name]!")
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>!")
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.")
return pick_delay(starting_rule)
threat = max(0,threat-starting_rule.cost)
spend_threat(starting_rule.cost)
threat_log += "[worldtime2text()]: [starting_rule.name] spent [starting_rule.cost]"
if (starting_rule.execute())//this should never fail since ready() returned 1
@@ -224,6 +229,20 @@ var/list/threat_by_job = list(
message_admins("....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)
spawn()
sleep(rule.delay)
rule.candidates = player_list.Copy()
rule.trim_candidates()
if (rule.execute())//this should never fail since ready() returned 1
executed_rules += rule
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.")
return 0
/datum/gamemode/dynamic/proc/picking_latejoin_rule(var/list/drafted_rules = list())
var/datum/dynamic_ruleset/latejoin/latejoin_rule = pickweight(drafted_rules)
if (latejoin_rule)

View File

@@ -41,6 +41,9 @@
/datum/dynamic_ruleset/roundstart//One or more of those drafted at roundstart
/datum/dynamic_ruleset/roundstart/delayed/ // Executed with a 30 seconds delay
var/delay = 30 SECONDS
/datum/dynamic_ruleset/latejoin//Can be drafted when a player joins the server
/datum/dynamic_ruleset/midround//Can be drafted once in a while during a round
@@ -166,6 +169,29 @@
candidates.Remove(P)
continue
/datum/dynamic_ruleset/roundstart/delayed/trim_candidates()
if (ticker && ticker.current_state < GAME_STATE_PLAYING)
return ..() // If the game didn't start, we'll use the parent's method to see if we have enough people desiring the role & what not.
var/role_id = initial(role_category.id)
for(var/mob/living/carbon/human/P in candidates)
if (!P.client || !P.mind || !P.mind.assigned_role)//are they connected?
candidates.Remove(P)
continue
if (!P.client.desires_role(role_id) || jobban_isbanned(P, role_id) || isantagbanned(P) || (role_category_override && jobban_isbanned(P, role_category_override)))//are they willing and not antag-banned?
candidates.Remove(P)
continue
if (P.mind.assigned_role in protected_from_jobs)
var/probability = initial(role_category.protected_traitor_prob)
if (prob(probability))
candidates.Remove(P)
continue
if (P.mind.assigned_role in restricted_from_jobs)//does their job allow for it?
candidates.Remove(P)
continue
if ((exclusive_to_jobs.len > 0) && !(P.mind.assigned_role in exclusive_to_jobs))//is the rule exclusive to their job?
candidates.Remove(P)
continue
/datum/dynamic_ruleset/roundstart/ready(var/forced = 0)
if (!forced)
var/job_check = 0

View File

@@ -366,7 +366,7 @@
// //
//////////////////////////////////////////////
/datum/dynamic_ruleset/roundstart/revs
/datum/dynamic_ruleset/roundstart/delayed/revs
name = "Revolution"
role_category = /datum/role/revolutionary
restricted_from_jobs = list("Merchant","AI", "Cyborg", "Mobile MMI", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Internal Affairs Agent")
@@ -376,21 +376,22 @@
weight = 2
cost = 45
requirements = list(101,101,70,40,30,20,10,10,10,10)
delay = 5 MINUTES
var/required_heads = 3
/datum/dynamic_ruleset/roundstart/revs/ready(var/forced = 0)
/datum/dynamic_ruleset/roundstart/delayed/revs/ready(var/forced = 0)
if (forced)
required_heads = 1
required_candidates = 1
if (!..())
return FALSE
var/head_check = 0
for (var/mob/new_player/player in player_list)
if (player.mind.assigned_role in command_positions)
head_check++
if (forced)
required_heads = 1
required_candidates = 1
return (head_check >= required_heads)
/datum/dynamic_ruleset/roundstart/revs/execute()
/datum/dynamic_ruleset/roundstart/delayed/revs/execute()
var/datum/faction/revolution/R = find_active_faction_by_type(/datum/faction/revolution)
if (!R)
R = ticker.mode.CreateFaction(/datum/faction/revolution, null, 1)

View File

@@ -90,6 +90,7 @@
if(A.set_target(L.mind))
R.AppendObjective(A, TRUE) // We will have more than one kill objective
/datum/faction/revolution/proc/end(var/result)
. = TRUE
switch (result)

View File

@@ -246,7 +246,7 @@
/datum/gamemode/proc/check_finished()
for(var/datum/faction/F in factions)
if(F.check_win())
if (F.check_win())
return 1
if(emergency_shuttle.location==2 || ticker.station_was_nuked)
return 1

View File

@@ -10,7 +10,7 @@
// Which is outside the z-level of the main station.
/datum/role/revolutionary/AssignToRole(var/datum/mind/M, var/override = 0, var/roundstart = 0)
if (!(M.current) || (M.current.z != map.zMainStation && !roundstart))
if (!(M && M.current) || (M.current.z != map.zMainStation && !roundstart))
message_admins("Error: cannot create a revolutionary off the main z-level.")
return FALSE
return ..()