"Dynamic" Gamemode using rulesets (#27600)

* yeah

* yeah

* lock tf in

* aaaa

* fix

* im going to have a fucking stroke i hate mindflayers

* dynamic is ready

* fucking hell

* yes

* warrior review

* blah blah

* updates based on #27811

* ok fix

* makes the menu usable during secret

* ok RANDOM BULLSHIT GO!

* Dynamic final changes

* fixes some missing budget
This commit is contained in:
Contrabang
2025-01-19 19:39:55 +00:00
committed by GitHub
parent fa333bba93
commit 8954a8e401
16 changed files with 469 additions and 17 deletions
+2
View File
@@ -327,6 +327,8 @@ GLOBAL_VAR_INIT(disable_explosions, FALSE)
dat += "<p><a href='byond://?src=[cached_UID];c_mode=1'>Change Game Mode</a><br></p>"
if(GLOB.master_mode == "secret")
dat += "<p><a href='byond://?src=[cached_UID];f_secret=1'>(Force Secret Mode)</a><br></p>"
if(GLOB.master_mode == "dynamic" || (GLOB.master_mode == "secret" && GLOB.secret_force_mode == "dynamic"))
dat += "<p><a href='byond://?src=[cached_UID];f_dynamic=1'>(Force Dynamic Rulesets)</a><br></p>"
dat += "<hr><br>"
dat += "<p><a href='byond://?src=[cached_UID];create_object=1'>Create Object</a><br></p>"
dat += "<p><a href='byond://?src=[cached_UID];quick_create_object=1'>Quick Create Object</a><br></p>"
+3
View File
@@ -355,6 +355,9 @@
if(SSticker && SSticker.current_state >= GAME_STATE_PLAYING)
var/dat = "<html><meta charset='utf-8'><head><title>Round Status</title></head><body><h1><b>Round Status</b></h1>"
dat += "Current Game Mode: <b>[SSticker.mode.name]</b><br>"
if(istype(SSticker.mode, /datum/game_mode/dynamic))
var/datum/game_mode/dynamic/dynamic = SSticker.mode
dat += "Rulesets: <b>[english_list(dynamic.rulesets + dynamic.implied_rulesets)]</b><br>"
dat += "Round Duration: <b>[round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)]:[add_zero(num2text(ROUND_TIME / 10 % 60), 2)]</b><br>"
dat += "<b>Emergency shuttle</b><br>"
if(SSshuttle.emergency.mode < SHUTTLE_CALL)
+52
View File
@@ -1041,6 +1041,20 @@
dat += {"Now: [GLOB.secret_force_mode]"}
usr << browse(dat, "window=f_secret")
else if(href_list["f_dynamic"])
if(!check_rights(R_ADMIN)) return
if(SSticker && SSticker.mode)
return alert(usr, "The game has already started.", null, null, null, null)
if(GLOB.master_mode != "dynamic" && !(GLOB.master_mode == "secret" && GLOB.secret_force_mode == "dynamic"))
return alert(usr, "The game mode has to be dynamic!", null, null, null, null)
var/dat = {"<!DOCTYPE html><b>Possible Rulesets:</b><hr>"}
var/list/rulesets = subtypesof(/datum/ruleset) - typesof(/datum/ruleset/implied)
dat += {"Budget: <a href='byond://?src=[UID()];f_dynamic2=budget'>[isnull(GLOB.dynamic_forced_rulesets["budget"]) ? "Random" : GLOB.dynamic_forced_rulesets["budget"]]</a><hr>"}
for(var/datum/ruleset/ruleset as anything in rulesets)
dat += {"[ruleset.name]: <a href='byond://?src=[UID()];f_dynamic2=[ruleset.type]'>[GLOB.dynamic_forced_rulesets[ruleset] || DYNAMIC_RULESET_NORMAL]</a><br>"}
usr << browse(dat, "window=f_dynamic")
else if(href_list["c_mode2"])
if(!check_rights(R_ADMIN|R_SERVER)) return
@@ -1067,6 +1081,44 @@
Game() // updates the main game menu
.(href, list("f_secret"=1))
else if(href_list["f_dynamic2"])
if(!check_rights(R_ADMIN|R_SERVER)) return
if(SSticker && SSticker.mode)
return alert(usr, "The game has already started.", null, null, null, null)
if(GLOB.master_mode != "dynamic" && !(GLOB.master_mode == "secret" && GLOB.secret_force_mode == "dynamic"))
return alert(usr, "The game mode has to be dynamic!", null, null, null, null)
if(href_list["f_dynamic2"] == "budget")
var/budget = input(usr, "Pick a budget for the dynamic gamemode (-1 to randomize)", "Gamemode Budget") as num|null
if(isnull(budget))
return
if(budget < 0)
GLOB.dynamic_forced_rulesets -= "budget"
log_admin("[key_name(usr)] set the ruleset budget to random.")
message_admins("<span class='notice'>[key_name_admin(usr)] set the ruleset budget to random.</span>")
else
GLOB.dynamic_forced_rulesets["budget"] = budget
log_admin("[key_name(usr)] set the ruleset budget to [budget]")
message_admins("<span class='notice'>[key_name_admin(usr)] set the ruleset budget to [budget].</span>")
.(href, list("f_dynamic"=1))
return
var/datum/ruleset/ruleset = text2path(href_list["f_dynamic2"])
switch(GLOB.dynamic_forced_rulesets[ruleset])
if(DYNAMIC_RULESET_FORCED)
log_admin("[key_name(usr)] banned the [ruleset] ruleset.")
message_admins("<span class='notice'>[key_name_admin(usr)] banned the [ruleset.name] ([ruleset.type]) ruleset.</span>")
GLOB.dynamic_forced_rulesets[ruleset] = DYNAMIC_RULESET_BANNED
if(DYNAMIC_RULESET_BANNED)
log_admin("[key_name(usr)] set the [ruleset] ruleset to normal.")
message_admins("<span class='notice'>[key_name_admin(usr)] set the [ruleset.name] ([ruleset.type]) ruleset to normal.</span>")
GLOB.dynamic_forced_rulesets[ruleset] = DYNAMIC_RULESET_NORMAL
else // not set, and already at normal
log_admin("[key_name(usr)] forced the [ruleset] ruleset.")
message_admins("<span class='notice'>[key_name_admin(usr)] forced the [ruleset.name] ([ruleset.type]) ruleset.</span>")
GLOB.dynamic_forced_rulesets[ruleset] = DYNAMIC_RULESET_FORCED
.(href, list("f_dynamic"=1))
else if(href_list["monkeyone"])
if(!check_rights(R_SPAWN)) return