Files
Bubberstation/code/controllers/subsystem/dynamic/dynamic_admin.dm
MrMelbert 5cddf64930 Fixes some cases of dynamic reading defined values over config values (#92126)
## About The Pull Request

Fixes #92125

Very simple, when working without an instantiated datum we would read
from the config manually, but some places neglected to do that.

So I added a macro to help in the future.

## Changelog

🆑 Melbert
fix: Fixes some places where dynamic configs were not being read
correctly
/🆑
2025-07-14 16:46:28 -06:00

255 lines
12 KiB
Plaintext

ADMIN_VERB(dynamic_panel, R_ADMIN, "Dynamic Panel", "Mess with dynamic.", ADMIN_CATEGORY_GAME)
dynamic_panel(user.mob)
/proc/dynamic_panel(mob/user)
if(!check_rights(R_ADMIN))
return
var/datum/dynamic_panel/tgui = new()
tgui.ui_interact(user)
log_admin("[key_name(user)] opened the Dynamic Panel.")
if(!isobserver(user))
message_admins("[key_name_admin(user)] opened the Dynamic Panel.")
BLACKBOX_LOG_ADMIN_VERB("Dynamic Panel")
/datum/dynamic_panel
/datum/dynamic_panel/ui_state(mob/user)
return ADMIN_STATE(R_ADMIN)
/datum/dynamic_panel/ui_close()
qdel(src)
/datum/dynamic_panel/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "DynamicAdmin")
ui.open()
/datum/dynamic_panel/ui_data(mob/user)
var/list/data = list()
if(SSdynamic.current_tier)
data["current_tier"] = list(
"number" = SSdynamic.current_tier.tier,
"name" = SSdynamic.current_tier.name,
)
data["ruleset_count"] = list()
for(var/category in SSdynamic.rulesets_to_spawn)
data["ruleset_count"][category] = max(SSdynamic.rulesets_to_spawn[category], 0)
data["full_config"] = SSdynamic.get_config()
data["config_even_enabled"] = CONFIG_GET(flag/dynamic_config_enabled) && length(data["full_config"])
data["queued_rulesets"] = list()
for(var/i in 1 to length(SSdynamic.queued_rulesets))
data["queued_rulesets"] += list(ruleset_to_data(SSdynamic.queued_rulesets[i]) + list("index" = i))
data["active_rulesets"] = list()
for(var/i in 1 to length(SSdynamic.executed_rulesets))
data["active_rulesets"] += list(ruleset_to_data(SSdynamic.executed_rulesets[i]) + list("index" = i))
data["all_rulesets"] = list()
for(var/ruleset_type in subtypesof(/datum/dynamic_ruleset/roundstart))
data["all_rulesets"][ROUNDSTART] += list(ruleset_to_data(ruleset_type))
for(var/ruleset_type in subtypesof(/datum/dynamic_ruleset/midround))
var/datum/dynamic_ruleset/midround/midround = ruleset_type
switch(initial(midround.midround_type))
if(HEAVY_MIDROUND)
data["all_rulesets"][HEAVY_MIDROUND] += list(ruleset_to_data(ruleset_type))
if(LIGHT_MIDROUND)
data["all_rulesets"][LIGHT_MIDROUND] += list(ruleset_to_data(ruleset_type))
for(var/ruleset_type in subtypesof(/datum/dynamic_ruleset/latejoin))
data["all_rulesets"][LATEJOIN] += list(ruleset_to_data(ruleset_type))
data["time_until_lights"] = COOLDOWN_TIMELEFT(SSdynamic, light_ruleset_start)
data["time_until_heavies"] = COOLDOWN_TIMELEFT(SSdynamic, heavy_ruleset_start)
data["time_until_latejoins"] = COOLDOWN_TIMELEFT(SSdynamic, latejoin_ruleset_start)
data["time_until_next_midround"] = COOLDOWN_TIMELEFT(SSdynamic, midround_cooldown)
data["time_until_next_latejoin"] = COOLDOWN_TIMELEFT(SSdynamic, latejoin_cooldown)
data["failed_latejoins"] = SSdynamic.failed_latejoins
data["light_midround_chance"] = SSdynamic.get_midround_chance(LIGHT_MIDROUND)
data["heavy_midround_chance"] = SSdynamic.get_midround_chance(HEAVY_MIDROUND)
data["latejoin_chance"] = SSdynamic.get_latejoin_chance()
data["roundstarted"] = SSticker.HasRoundStarted()
data["light_chance_maxxed"] = SSdynamic.admin_forcing_next_light
data["heavy_chance_maxxed"] = SSdynamic.admin_forcing_next_heavy
data["latejoin_chance_maxxed"] = SSdynamic.admin_forcing_next_latejoin
data["next_dynamic_tick"] = SSdynamic.next_fire ? SSdynamic.next_fire - world.time : SSticker.GetTimeLeft()
data["antag_events_enabled"] = SSdynamic.antag_events_enabled
return data
/// Pass a ruleset typepath or a ruleset instance
/datum/dynamic_panel/proc/ruleset_to_data(datum/dynamic_ruleset/ruleset)
var/list/data = list()
var/ruleset_path = isdatum(ruleset) ? ruleset.type : ruleset
data["name"] = initial(ruleset.name)
data["id"] = initial(ruleset.config_tag)
data["typepath"] = ruleset_path
data["selected_players"] = list()
data["admin_disabled"] = (ruleset_path in SSdynamic.admin_disabled_rulesets)
if(isdatum(ruleset))
for(var/datum/mind/player as anything in ruleset.selected_minds)
data["selected_players"] += list(list(
"key" = player.key,
))
data["hidden"] = (ruleset in SSdynamic.unreported_rulesets)
return data
/datum/dynamic_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
switch(action)
if("remove_queued_ruleset")
var/index = params["ruleset_index"]
if(length(SSdynamic.queued_rulesets) < index)
return
var/datum/dynamic_ruleset/ruleset = SSdynamic.queued_rulesets[index]
if(!ruleset)
return
SSdynamic.queued_rulesets -= ruleset
message_admins("[key_name_admin(ui.user)] removed [ruleset.config_tag] from the dynamic ruleset queue.")
log_admin("[key_name_admin(ui.user)] removed [ruleset.config_tag] from the dynamic ruleset queue.")
qdel(ruleset)
return TRUE
if("add_queued_ruleset")
var/datum/dynamic_ruleset/ruleset_path = text2path(params["ruleset_type"])
if(!ruleset_path)
return
SSdynamic.queue_ruleset(ruleset_path)
message_admins("[key_name_admin(ui.user)] added [initial(ruleset_path.config_tag)] to the dynamic ruleset queue.")
log_admin("[key_name_admin(ui.user)] added [initial(ruleset_path.config_tag)] to the dynamic ruleset queue.")
return TRUE
if("dynamic_vv")
ui.user?.client?.debug_variables(SSdynamic)
return TRUE
if("add_ruleset_category_count")
var/category = params["ruleset_category"]
if(!category)
return
SSdynamic.rulesets_to_spawn[category] += 1
message_admins("[key_name_admin(ui.user)] added 1 to the [category] ruleset category.")
log_admin("[key_name_admin(ui.user)] added 1 to the [category] ruleset category.")
return TRUE
if("set_ruleset_category_count")
var/category = params["ruleset_category"]
var/count = params["ruleset_count"]
if(!category || !isnum(count))
return
SSdynamic.rulesets_to_spawn[category] = count
message_admins("[key_name_admin(ui.user)] set the [category] ruleset category to [count].")
log_admin("[key_name_admin(ui.user)] set the [category] ruleset category to [count].")
return TRUE
if("execute_ruleset")
var/datum/dynamic_ruleset/ruleset_path = text2path(params["ruleset_type"])
if(!ruleset_path)
return
message_admins("[key_name_admin(ui.user)] executed the ruleset [initial(ruleset_path.config_tag)].")
log_admin("[key_name_admin(ui.user)] executed the ruleset [initial(ruleset_path.config_tag)].")
ASYNC
SSdynamic.force_run_midround(ruleset_path, alert_admins_on_fail = TRUE, admin = ui.user)
return TRUE
if("disable_ruleset")
var/ruleset_path = text2path(params["ruleset_type"])
if(!ruleset_path)
return
if(ruleset_path in SSdynamic.admin_disabled_rulesets)
SSdynamic.admin_disabled_rulesets -= ruleset_path
message_admins("[key_name_admin(ui.user)] enabled [ruleset_path] to be selected.")
log_admin("[key_name_admin(ui.user)] enabled [ruleset_path] to be selected.")
else
SSdynamic.admin_disabled_rulesets += ruleset_path
message_admins("[key_name_admin(ui.user)] disabled [ruleset_path] from being selected.")
log_admin("[key_name_admin(ui.user)] disabled [ruleset_path] from being selected.")
return TRUE
if("disable_all")
SSdynamic.admin_disabled_rulesets |= subtypesof(/datum/dynamic_ruleset)
message_admins("[key_name_admin(ui.user)] disabled all rulesets from being selected.")
log_admin("[key_name_admin(ui.user)] disabled all rulesets from being selected.")
if("enable_all")
SSdynamic.admin_disabled_rulesets.Cut()
message_admins("[key_name_admin(ui.user)] re-enabled all rulesets.")
log_admin("[key_name_admin(ui.user)] re_enabled all rulesets.")
if("set_tier")
if(SSdynamic.current_tier && SSticker.HasRoundStarted())
return TRUE
var/list/tiers = list()
for(var/datum/dynamic_tier/tier as anything in subtypesof(/datum/dynamic_tier))
tiers[tier::config_tag] = tier
var/picked = tgui_input_list(ui.user, "Pick a dynamic tier before the game starts", "Pick tier", tiers, ui_state = ADMIN_STATE(R_ADMIN))
if(picked && !SSticker.HasRoundStarted())
SSdynamic.set_tier(tiers[picked])
message_admins("[key_name_admin(ui.user)] set the dynamic tier to [picked].")
log_admin("[key_name_admin(ui.user)] set the dynamic tier to [picked].")
return TRUE
if("max_light_chance")
SSdynamic.admin_forcing_next_light = !SSdynamic.admin_forcing_next_light
message_admins("[key_name_admin(ui.user)] [SSdynamic.admin_forcing_next_light ? "forced" : "reset"] the next light ruleset chance.")
log_admin("[key_name_admin(ui.user)] [SSdynamic.admin_forcing_next_light ? "forced" : "reset"] the next light ruleset chance.")
return TRUE
if("max_heavy_chance")
SSdynamic.admin_forcing_next_heavy = !SSdynamic.admin_forcing_next_heavy
message_admins("[key_name_admin(ui.user)] [SSdynamic.admin_forcing_next_heavy ? "forced" : "reset"] the next heavy ruleset chance.")
log_admin("[key_name_admin(ui.user)] [SSdynamic.admin_forcing_next_heavy ? "forced" : "reset"] the next heavy ruleset chance.")
return TRUE
if("max_latejoin_chance")
SSdynamic.admin_forcing_next_latejoin = !SSdynamic.admin_forcing_next_latejoin
message_admins("[key_name_admin(ui.user)] [SSdynamic.admin_forcing_next_latejoin ? "forced" : "reset"] the next latejoin ruleset chance.")
log_admin("[key_name_admin(ui.user)] [SSdynamic.admin_forcing_next_latejoin ? "forced" : "reset"] the next latejoin ruleset chance.")
return TRUE
if("light_start_now")
COOLDOWN_RESET(SSdynamic, light_ruleset_start)
message_admins("[key_name_admin(ui.user)] reset the light ruleset start cooldown.")
log_admin("[key_name_admin(ui.user)] reset the light ruleset start cooldown.")
return TRUE
if("heavy_start_now")
COOLDOWN_RESET(SSdynamic, heavy_ruleset_start)
message_admins("[key_name_admin(ui.user)] reset the heavy ruleset start cooldown.")
log_admin("[key_name_admin(ui.user)] reset the heavy ruleset start cooldown.")
return TRUE
if("latejoin_start_now")
COOLDOWN_RESET(SSdynamic, latejoin_ruleset_start)
message_admins("[key_name_admin(ui.user)] reset the latejoin ruleset start cooldown.")
log_admin("[key_name_admin(ui.user)] reset the latejoin ruleset start cooldown.")
return TRUE
if("reset_midround_cooldown")
COOLDOWN_RESET(SSdynamic, midround_cooldown)
message_admins("[key_name_admin(ui.user)] reset the midround cooldown.")
log_admin("[key_name_admin(ui.user)] reset the midround cooldown.")
return TRUE
if("reset_latejoin_cooldown")
COOLDOWN_RESET(SSdynamic, latejoin_cooldown)
message_admins("[key_name_admin(ui.user)] reset the latejoin cooldown.")
log_admin("[key_name_admin(ui.user)] reset the latejoin cooldown.")
return TRUE
if("hide_ruleset")
var/index = params["ruleset_index"]
if(length(SSdynamic.executed_rulesets) < index)
return
var/datum/dynamic_ruleset/ruleset = SSdynamic.executed_rulesets[index]
if(!ruleset)
return
if(ruleset in SSdynamic.unreported_rulesets)
SSdynamic.unreported_rulesets -= ruleset
message_admins("[key_name_admin(ui.user)] hid [ruleset] from the roundend report.")
log_admin("[key_name_admin(ui.user)] hid [ruleset] from the roundend report.")
else
SSdynamic.unreported_rulesets += ruleset
message_admins("[key_name_admin(ui.user)] unhid [ruleset] from the roundend report.")
log_admin("[key_name_admin(ui.user)] unhid [ruleset] from the roundend report.")
return TRUE
if("toggle_antag_events")
SSdynamic.antag_events_enabled = !SSdynamic.antag_events_enabled
message_admins("[key_name_admin(ui.user)] [SSdynamic.antag_events_enabled ? "enabled" : "disabled"] antag events.")
log_admin("[key_name_admin(ui.user)] [SSdynamic.antag_events_enabled ? "enabled" : "disabled"] antag events.")
return TRUE