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

@@ -177,6 +177,8 @@
#define PROB_PROTECTED_REGULAR 50
#define PROB_PROTECTED_RARE 80
#define FACTION_FAILURE -1
// -- The paper
#define INTERCEPT_TIME_LOW 60 SECONDS

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 ..()

View File

@@ -82,7 +82,7 @@
episode_names += new /datum/episode_name/rare("[pick("THE OPPORTUNITY OF A LIFETIME", "DRASTIC MEASURES", "DEUS EX", "THE SHOW MUST GO ON", "TRIAL BY FIRE", "A STITCH IN TIME", "ALL'S FAIR IN LOVE AND WAR", "COME HELL OR HIGH HEAVEN", "REVERSAL OF FORTUNE", "DOUBLE TOIL AND DOUBLE TROUBLE")]", "High threat level of [mode.threat_level]%... but the crew still had a very high score!", score["crewscore"]/100)
if(locate(/datum/dynamic_ruleset/roundstart/malf) in mode.executed_rules)
episode_names += new /datum/episode_name/rare("[pick("I'M SORRY [uppr_name], I'M AFRAID I CAN'T LET YOU DO THAT", "A STRANGE GAME", "THE AI GOES ROGUE", "RISE OF THE MACHINES")]", "Round included a malfunctioning AI.", 300)
if(locate(/datum/dynamic_ruleset/roundstart/revs) in mode.executed_rules)
if(locate(/datum/dynamic_ruleset/roundstart/delayed/revs) in mode.executed_rules)
episode_names += new /datum/episode_name/rare("[pick("THE CREW STARTS A REVOLUTION", "HELL IS OTHER SPESSMEN", "INSURRECTION", "THE CREW RISES UP")]", "Round included roundstart revs.", 350)
if(copytext(uppr_name,1,2) == "V")
episode_names += new /datum/episode_name/rare("V FOR [uppr_name]", "Round included roundstart revs... and the station's name starts with V.", 1500)