mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
threat log (#21678)
This commit is contained in:
@@ -13,8 +13,13 @@ var/list/threat_by_job = list(
|
|||||||
|
|
||||||
/datum/gamemode/dynamic
|
/datum/gamemode/dynamic
|
||||||
name = "Dynamic Mode"
|
name = "Dynamic Mode"
|
||||||
var/threat_level = 0//rolled at the beginning of the round.
|
|
||||||
|
//Threat logging vars
|
||||||
|
var/threat_level = 0//the "threat cap", threat shouldn't normally go above this and is used in ruleset calculations
|
||||||
|
var/starting_threat = 0 //threat_level's initially rolled value. Threat_level isn't changed by many things.
|
||||||
var/threat = 0//set at the beginning of the round. Spent by the mode to "purchase" rules.
|
var/threat = 0//set at the beginning of the round. Spent by the mode to "purchase" rules.
|
||||||
|
var/list/threat_log = list() //Running information about the threat. Can store text or datum entries.
|
||||||
|
|
||||||
var/list/roundstart_rules = list()
|
var/list/roundstart_rules = list()
|
||||||
var/list/latejoin_rules = list()
|
var/list/latejoin_rules = list()
|
||||||
var/list/midround_rules = list()
|
var/list/midround_rules = list()
|
||||||
@@ -42,7 +47,7 @@ var/list/threat_by_job = list(
|
|||||||
/datum/gamemode/dynamic/AdminPanelEntry()
|
/datum/gamemode/dynamic/AdminPanelEntry()
|
||||||
var/dat = list()
|
var/dat = list()
|
||||||
dat += "Threat : <b>[threat_level]</b><br/>"
|
dat += "Threat : <b>[threat_level]</b><br/>"
|
||||||
dat += "Threat availaible : <b>[threat]</b><br/>"
|
dat += "Threat availaible : <b>[threat]</b> <a href='?_src_=holder;threatlog=1'>\[View Log\]</a><br/>"
|
||||||
dat += "Executed rulesets : "
|
dat += "Executed rulesets : "
|
||||||
if (executed_rules.len > 0)
|
if (executed_rules.len > 0)
|
||||||
dat += "<br/>"
|
dat += "<br/>"
|
||||||
@@ -59,6 +64,27 @@ var/list/threat_by_job = list(
|
|||||||
dat += "none."
|
dat += "none."
|
||||||
return jointext(dat, "")
|
return jointext(dat, "")
|
||||||
|
|
||||||
|
/datum/gamemode/dynamic/proc/show_threatlog(mob/admin)
|
||||||
|
if(!ticker || !ticker.mode)
|
||||||
|
alert("Ticker and Game Mode aren't initialized yet!", "Alert")
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!admin.check_rights(R_ADMIN))
|
||||||
|
return
|
||||||
|
|
||||||
|
var/out = "<TITLE>Threat Log</TITLE><B><font size='3'>Threat Log</font></B><br><B>Starting Threat:</B> [starting_threat]<BR>"
|
||||||
|
|
||||||
|
for(var/entry in threat_log)
|
||||||
|
if(istext(entry))
|
||||||
|
out += "[entry]<BR>"
|
||||||
|
if(istype(entry,/datum/role/catbeast))
|
||||||
|
var/datum/role/catbeast/C = entry
|
||||||
|
out += "Catbeast threat regenerated/threat_level inflated: [C.threat_generated]/[C.threat_level_inflated]<BR>"
|
||||||
|
|
||||||
|
out += "<B>Remaining threat/threat_level:</B> [threat]/[threat_level]"
|
||||||
|
|
||||||
|
usr << browse(out, "window=threatlog;size=700x500")
|
||||||
|
|
||||||
/datum/gamemode/dynamic/GetScoreboard()
|
/datum/gamemode/dynamic/GetScoreboard()
|
||||||
dat += "<h2>Dynamic Mode v1.0 - Threat Level = <font color='red'>[threat_level]%</font></h2>"
|
dat += "<h2>Dynamic Mode v1.0 - Threat Level = <font color='red'>[threat_level]%</font></h2>"
|
||||||
var/rules = list()
|
var/rules = list()
|
||||||
@@ -85,6 +111,7 @@ var/list/threat_by_job = list(
|
|||||||
/datum/gamemode/dynamic/can_start()
|
/datum/gamemode/dynamic/can_start()
|
||||||
threat_level = rand(1,100)*0.6 + rand(1,100)*0.4//https://docs.google.com/spreadsheets/d/1QLN_OBHqeL4cm9zTLEtxlnaJHHUu0IUPzPbsI-DFFmc/edit#gid=499381388
|
threat_level = rand(1,100)*0.6 + rand(1,100)*0.4//https://docs.google.com/spreadsheets/d/1QLN_OBHqeL4cm9zTLEtxlnaJHHUu0IUPzPbsI-DFFmc/edit#gid=499381388
|
||||||
threat = threat_level
|
threat = threat_level
|
||||||
|
starting_threat = threat_level
|
||||||
latejoin_injection_cooldown = rand(330,510)
|
latejoin_injection_cooldown = rand(330,510)
|
||||||
midround_injection_cooldown = rand(600,1050)
|
midround_injection_cooldown = rand(600,1050)
|
||||||
message_admins("Dynamic Mode initialized with a Threat Level of... <font size='8'>[threat_level]</font>!")
|
message_admins("Dynamic Mode initialized with a Threat Level of... <font size='8'>[threat_level]</font>!")
|
||||||
@@ -180,8 +207,9 @@ var/list/threat_by_job = list(
|
|||||||
roundstart_rules -= starting_rule
|
roundstart_rules -= starting_rule
|
||||||
drafted_rules -= starting_rule
|
drafted_rules -= starting_rule
|
||||||
|
|
||||||
threat = max(0,threat-starting_rule.cost)
|
spend_threat(starting_rule.cost)
|
||||||
if (starting_rule.execute(starting_rule.cost))//this should never fail since ready() returned 1
|
threat_log += "[worldtime2text()]: [starting_rule.name] spent [starting_rule.cost]"
|
||||||
|
if (starting_rule.execute())//this should never fail since ready() returned 1
|
||||||
executed_rules += starting_rule
|
executed_rules += starting_rule
|
||||||
if (starting_rule.persistent)
|
if (starting_rule.persistent)
|
||||||
current_rules += starting_rule
|
current_rules += starting_rule
|
||||||
@@ -201,7 +229,8 @@ var/list/threat_by_job = list(
|
|||||||
if (latejoin_rule)
|
if (latejoin_rule)
|
||||||
if (!latejoin_rule.repeatable)
|
if (!latejoin_rule.repeatable)
|
||||||
latejoin_rules -= latejoin_rule
|
latejoin_rules -= latejoin_rule
|
||||||
threat = max(0,threat-latejoin_rule.cost)
|
spend_threat(latejoin_rule.cost)
|
||||||
|
threat_log += "[worldtime2text()]: [latejoin_rule.name] spent [latejoin_rule.cost]"
|
||||||
dynamic_stats.measure_threat(threat)
|
dynamic_stats.measure_threat(threat)
|
||||||
if (latejoin_rule.execute())//this should never fail since ready() returned 1
|
if (latejoin_rule.execute())//this should never fail since ready() returned 1
|
||||||
var/mob/M = pick(latejoin_rule.assigned)
|
var/mob/M = pick(latejoin_rule.assigned)
|
||||||
@@ -219,7 +248,8 @@ var/list/threat_by_job = list(
|
|||||||
if (midround_rule)
|
if (midround_rule)
|
||||||
if (!midround_rule.repeatable)
|
if (!midround_rule.repeatable)
|
||||||
midround_rules -= midround_rule
|
midround_rules -= midround_rule
|
||||||
threat = max(0,threat-midround_rule.cost)
|
spend_threat(midround_rule.cost)
|
||||||
|
threat_log += "[worldtime2text()]: [midround_rule.name] spent [midround_rule.cost]"
|
||||||
dynamic_stats.measure_threat(threat)
|
dynamic_stats.measure_threat(threat)
|
||||||
if (midround_rule.execute())//this should never fail since ready() returned 1
|
if (midround_rule.execute())//this should never fail since ready() returned 1
|
||||||
message_admins("Injecting some threats...<font size='3'>[midround_rule.name]</font>!")
|
message_admins("Injecting some threats...<font size='3'>[midround_rule.name]</font>!")
|
||||||
@@ -243,7 +273,8 @@ var/list/threat_by_job = list(
|
|||||||
new_rule.candidates = current_players.Copy()
|
new_rule.candidates = current_players.Copy()
|
||||||
new_rule.trim_candidates()
|
new_rule.trim_candidates()
|
||||||
if (new_rule.ready(forced))
|
if (new_rule.ready(forced))
|
||||||
threat = max(0,threat-new_rule.cost)
|
spend_threat(new_rule.cost)
|
||||||
|
threat_log += "[worldtime2text()]: Forced rule [new_rule.name] spent [new_rule.cost]"
|
||||||
dynamic_stats.measure_threat(threat)
|
dynamic_stats.measure_threat(threat)
|
||||||
if (new_rule.execute())//this should never fail since ready() returned 1
|
if (new_rule.execute())//this should never fail since ready() returned 1
|
||||||
message_admins("Making a call to a specific ruleset...<font size='3'>[new_rule.name]</font>!")
|
message_admins("Making a call to a specific ruleset...<font size='3'>[new_rule.name]</font>!")
|
||||||
@@ -397,6 +428,16 @@ var/list/threat_by_job = list(
|
|||||||
for (var/datum/dynamic_ruleset/DR in midround_rules)
|
for (var/datum/dynamic_ruleset/DR in midround_rules)
|
||||||
DR.applicants -= M
|
DR.applicants -= M
|
||||||
|
|
||||||
|
//Regenerate threat, but no more than our original threat level.
|
||||||
/datum/gamemode/dynamic/proc/refund_threat(var/regain)
|
/datum/gamemode/dynamic/proc/refund_threat(var/regain)
|
||||||
threat = min(threat_level,threat+regain)
|
threat = min(threat_level,threat+regain)
|
||||||
//Regenerate threat, but no more than our original threat level.
|
|
||||||
|
//Generate threat and increase the threat_level if it goes beyond, capped at 100
|
||||||
|
/datum/gamemode/dynamic/proc/create_threat(var/gain)
|
||||||
|
threat = min(100, threat+gain)
|
||||||
|
if(threat>threat_level)
|
||||||
|
threat_level = threat
|
||||||
|
|
||||||
|
//Expend threat, but do not fall below 0.
|
||||||
|
/datum/gamemode/dynamic/proc/spend_threat(var/cost)
|
||||||
|
threat = max(threat-cost,0)
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
//write here your rule execution code, everything about faction/role spawning/populating.
|
//write here your rule execution code, everything about faction/role spawning/populating.
|
||||||
return
|
return
|
||||||
|
|
||||||
/datum/dynamic_ruleset/proc/execute(var/threat_cost)
|
/datum/dynamic_ruleset/proc/execute()
|
||||||
//write here your rule execution code, everything about faction/role spawning/populating.
|
//write here your rule execution code, everything about faction/role spawning/populating.
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@@ -72,9 +72,9 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
/datum/dynamic_ruleset/proc/send_applications(var/list/possible_volunteers = list(),var/threat_cost)
|
/datum/dynamic_ruleset/proc/send_applications(var/list/possible_volunteers = list())
|
||||||
if (possible_volunteers.len <= 0)//this shouldn't happen, as ready() should return 0 if there is not a single valid candidate
|
if (possible_volunteers.len <= 0)//this shouldn't happen, as ready() should return 0 if there is not a single valid candidate
|
||||||
message_admins("Possible volunteers was 0. This shouldn't appear, because of ready().")
|
message_admins("Possible volunteers was 0. This shouldn't appear, because of ready(), unless you forced it!")
|
||||||
return
|
return
|
||||||
message_admins("DYNAMIC MODE: Polling [possible_volunteers.len] players to apply for the [name] ruleset.")
|
message_admins("DYNAMIC MODE: Polling [possible_volunteers.len] players to apply for the [name] ruleset.")
|
||||||
log_admin("DYNAMIC MODE: Polling [possible_volunteers.len] players to apply for the [name] ruleset.")
|
log_admin("DYNAMIC MODE: Polling [possible_volunteers.len] players to apply for the [name] ruleset.")
|
||||||
@@ -97,7 +97,9 @@
|
|||||||
if(!applicants || applicants.len <= 0)
|
if(!applicants || applicants.len <= 0)
|
||||||
log_admin("DYNAMIC MODE: [name] received no applications.")
|
log_admin("DYNAMIC MODE: [name] received no applications.")
|
||||||
message_admins("DYNAMIC MODE: [name] received no applications.")
|
message_admins("DYNAMIC MODE: [name] received no applications.")
|
||||||
mode.threat = max(mode.threat_level,mode.threat+threat_cost) //Refund threat if no applications
|
mode.refund_threat(cost)
|
||||||
|
mode.threat_log += "[worldtime2text()]: Forced rule [name] refunded [cost] (no applications)"
|
||||||
|
mode.executed_rules -= src
|
||||||
return
|
return
|
||||||
|
|
||||||
log_admin("DYNAMIC MODE: [applicants.len] players volunteered for [name].")
|
log_admin("DYNAMIC MODE: [applicants.len] players volunteered for [name].")
|
||||||
|
|||||||
@@ -3,11 +3,11 @@
|
|||||||
/datum/dynamic_ruleset/midround/from_ghosts/
|
/datum/dynamic_ruleset/midround/from_ghosts/
|
||||||
weight = 0
|
weight = 0
|
||||||
|
|
||||||
/datum/dynamic_ruleset/midround/from_ghosts/execute(var/threat_cost)
|
/datum/dynamic_ruleset/midround/from_ghosts/execute()
|
||||||
var/list/possible_candidates = list()
|
var/list/possible_candidates = list()
|
||||||
possible_candidates.Add(dead_players)
|
possible_candidates.Add(dead_players)
|
||||||
possible_candidates.Add(list_observers)
|
possible_candidates.Add(list_observers)
|
||||||
send_applications(possible_candidates,threat_cost)
|
send_applications(possible_candidates)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/datum/dynamic_ruleset/midround/from_ghosts/review_applications()
|
/datum/dynamic_ruleset/midround/from_ghosts/review_applications()
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
wikiroute = ROLE_MINOR
|
wikiroute = ROLE_MINOR
|
||||||
var/ticks_survived = 0
|
var/ticks_survived = 0
|
||||||
var/threat_generated = 0
|
var/threat_generated = 0
|
||||||
|
var/threat_level_inflated = 0
|
||||||
var/list/areas_defiled = list()
|
var/list/areas_defiled = list()
|
||||||
|
|
||||||
/datum/role/catbeast/Greet()
|
/datum/role/catbeast/Greet()
|
||||||
@@ -18,6 +19,10 @@
|
|||||||
H.dna.ResetUI()
|
H.dna.ResetUI()
|
||||||
equip_catbeast(H)
|
equip_catbeast(H)
|
||||||
H.regenerate_icons()
|
H.regenerate_icons()
|
||||||
|
var/datum/gamemode/dynamic/D = ticker.mode
|
||||||
|
if(istype(D))
|
||||||
|
D.threat_log += "[worldtime2text()]: Loose catbeast created."
|
||||||
|
D.threat_log += src //The actual reporting on threat it made comes from this entry
|
||||||
spawn(1.5 MINUTES)
|
spawn(1.5 MINUTES)
|
||||||
if(antag.current.stat!=DEAD && OnStation())
|
if(antag.current.stat!=DEAD && OnStation())
|
||||||
command_alert("An escaped catbeast has been detected aboard your station. Crew should cooperate with security staff in its extermination or removal from the main station.", "Catbeast Detected",1)
|
command_alert("An escaped catbeast has been detected aboard your station. Crew should cooperate with security staff in its extermination or removal from the main station.", "Catbeast Detected",1)
|
||||||
@@ -72,13 +77,13 @@ var/list/catbeast_names = list("Meowth","Fluffy","Subject 246","Experiment 35a",
|
|||||||
return //It's not dynamic!
|
return //It's not dynamic!
|
||||||
threat_generated++
|
threat_generated++
|
||||||
if(D.threat >= D.threat_level)
|
if(D.threat >= D.threat_level)
|
||||||
D.threat_level = min(D.threat_level+1,100)
|
D.create_threat(1)
|
||||||
D.threat = D.threat_level
|
if(!threat_level_inflated) //Our first time raising the cap
|
||||||
//message_admins("[antag.current] increased the threat cap[reason ? " by [reason]" : ""]. It is now [D.threat_level].")
|
D.threat_log += "[worldtime2text()]: A catbeast started increasing the threat cap."
|
||||||
|
threat_level_inflated++
|
||||||
else
|
else
|
||||||
D.threat = min(D.threat+1,D.threat_level)
|
D.refund_threat(1)
|
||||||
//message_admins("[antag.current] increased the threat[reason ? " by [reason]" : ""]. It is now [D.threat]/[D.threat_level].")
|
|
||||||
|
|
||||||
/datum/role/catbeast/GetScoreboard()
|
/datum/role/catbeast/GetScoreboard()
|
||||||
. = ..()
|
. = ..()
|
||||||
. += "The catbeast survived on station for [ticks_survived*2] seconds, defiled [areas_defiled.len] rooms, and generated [threat_generated] threat!"
|
. += "The catbeast survived on station for [ticks_survived*2] seconds, defiled [areas_defiled.len] rooms, and generated [threat_generated] threat!<BR>"
|
||||||
@@ -480,8 +480,9 @@
|
|||||||
//Actions to be taken when antag.current is completely destroyed
|
//Actions to be taken when antag.current is completely destroyed
|
||||||
/datum/role/proc/RoleMobDestroyed()
|
/datum/role/proc/RoleMobDestroyed()
|
||||||
if(refund_value && istype(ticker.mode, /datum/gamemode/dynamic)) //Mode check for sanity
|
if(refund_value && istype(ticker.mode, /datum/gamemode/dynamic)) //Mode check for sanity
|
||||||
var/datum/gamemode/dynamic/mode = ticker.mode
|
var/datum/gamemode/dynamic/D = ticker.mode
|
||||||
mode.refund_threat(refund_value)
|
D.refund_threat(refund_value)
|
||||||
|
D.threat_log += "[worldtime2text()]: [name] refunded [refund_value] upon destruction."
|
||||||
|
|
||||||
/////////////////////////////THESE ROLES SHOULD GET MOVED TO THEIR OWN FILES ONCE THEY'RE GETTING ELABORATED/////////////////////////
|
/////////////////////////////THESE ROLES SHOULD GET MOVED TO THEIR OWN FILES ONCE THEY'RE GETTING ELABORATED/////////////////////////
|
||||||
|
|
||||||
|
|||||||
@@ -2632,6 +2632,20 @@
|
|||||||
return
|
return
|
||||||
show_role_panel(M)
|
show_role_panel(M)
|
||||||
|
|
||||||
|
else if(href_list["threatlog"])
|
||||||
|
if(!check_rights(R_ADMIN))
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!ticker || !ticker.mode)
|
||||||
|
alert("The game hasn't started yet!")
|
||||||
|
return
|
||||||
|
|
||||||
|
var/datum/gamemode/dynamic/D = ticker.mode
|
||||||
|
if(!istype(D))
|
||||||
|
alert("It's not dynamic!")
|
||||||
|
return
|
||||||
|
D.show_threatlog(usr)
|
||||||
|
|
||||||
// /vg/
|
// /vg/
|
||||||
else if(href_list["set_base_laws"])
|
else if(href_list["set_base_laws"])
|
||||||
if(!check_rights(R_FUN))
|
if(!check_rights(R_FUN))
|
||||||
|
|||||||
Reference in New Issue
Block a user