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:
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user