mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
Actually delayed revs this time (#21620)
* Delayed rulesets. Fixes revs properly * Delayed revs 4real this time * Atomic Aunty
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
Reference in New Issue
Block a user