Adds Round Canonicity to the game, and makes Storytellers able to edit round canonicity. (#22775)

To clear up when a round is canon, what type of canonicity it is and
what exactly it entails, canonicity information has been added to the
game. Through the Canon Panel, players can now see what exactly the
current round's rules on character deaths, antags, and character
interactions are. Additionally, this lets developers actually know
_when_ exactly a round is canon, which will be very useful for
persistence.

Storytellers and admins can change the canonicity of the round in the
panel as well.

Some examples:
<img width="400" height="600" alt="image"
src="https://github.com/user-attachments/assets/e71d2b18-0741-4bc0-aa98-979bb696d8a6"
/>
<img width="400" height="600" alt="image"
src="https://github.com/user-attachments/assets/29486039-7625-4443-af2e-3ac982727e5c"
/>
<img width="400" height="600" alt="image"
src="https://github.com/user-attachments/assets/7522f5f0-4d4e-4bae-906e-2b07067af3a5"
/>

---------

Signed-off-by: Matt Atlas <mattiathebest2000@hotmail.it>
Co-authored-by: Matt Atlas <liermattia@gmail.com>
Co-authored-by: Wowzewow (Wezzy) <42310821+alsoandanswer@users.noreply.github.com>
This commit is contained in:
Matt Atlas
2026-07-05 00:31:07 +02:00
committed by GitHub
parent 92e4ea7f7d
commit b5314566d5
18 changed files with 437 additions and 44 deletions
+27 -21
View File
@@ -1302,7 +1302,11 @@ var/global/enabled_spooking = 0
var/datum/antagonist/antag = GLOB.all_antag_types[antag_type]
message_admins("[key_name(usr)] attempting to force latespawn with template [antag.id].")
antag.attempt_auto_spawn()
if(antag.attempt_auto_spawn())
if(SSticker.round_canon.antagonist_actions_canon == ANTAGONIST_ACTIONS_NOT_EXPECTED)
var/change_canon = tgui_alert(usr, "You have added antagonists to a gamemode type that does not expect antagonists. Would you like to also change the round canon to Limited?", "Canon Change", list("Yes", "No"))
if(change_canon == "Yes")
SSticker.set_round_canon(/singleton/canonicity/limited)
/datum/admins/proc/force_mode_latespawn()
set category = "Admin"
@@ -1322,6 +1326,28 @@ var/global/enabled_spooking = 0
log_and_message_admins("attempting to force mode autospawn.")
SSticker.mode.process_autoantag()
/datum/admins/proc/force_round_canon_pregame()
set category = "Admin"
set name = "Set Pre-Game Round Canon"
if (!istype(src,/datum/admins))
src = usr.client.holder
if (!istype(src,/datum/admins) || !check_rights(R_ADMIN))
to_chat(usr, "Error: you are not an admin!")
return
if(SSticker.current_state == GAME_STATE_PLAYING)
to_chat(usr, SPAN_WARNING("You cannot use this verb after the round has started! Use the Canon Panel from the Status panel."))
return
var/singleton/canonicity/canon_type = tgui_input_list(usr, "Choose a round canon type.", "Force Round Canon", GET_SINGLETON_SUBTYPE_LIST(/singleton/canonicity))
if(!istype(canon_type))
return
SSticker.set_round_canon(canon_type, TRUE, TRUE)
SSticker.round_canon_admin_forced = TRUE
log_and_message_admins("forced the round canon to [canon_type.name].")
/datum/admins/proc/paralyze_mob(mob/living/H as mob)
set category = "Admin"
set name = "Toggle Winded"
@@ -1434,26 +1460,6 @@ var/global/enabled_spooking = 0
log_and_message_admins("has manually set the Odyssey to [chosen_scenario.name]", usr)
feedback_add_details("admin_verb","SEOT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/set_odyssey_canonicity()
set name = "Set Odyssey Canonicity"
set category = "Special Verbs"
if(!check_rights(R_ADMIN))
return
if(!SSodyssey.scenario)
to_chat(usr, SPAN_WARNING("There needs to be an Odyssey selected first! Use the Set Odyssey Type verb."))
return
var/canonicity = tgui_input_list(usr, "Set the Odyssey canonicity.", "Set Odyssey Canonicity", list(SCENARIO_TYPE_CANON, SCENARIO_TYPE_NONCANON))
if(!canonicity)
return
SSodyssey.scenario.scenario_type = canonicity
to_world(FONT_LARGE(EXAMINE_BLOCK_ODYSSEY(SPAN_NOTICE("The scenario canonicity has been changed to [SPAN_BOLD(canonicity)] by an administrator."))))
log_and_message_admins("has set the Odyssey canonicity to [canonicity]", usr)
feedback_add_details("admin_verb","SEOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/open_narrate_panel()
set category = "Special Verbs.Narration/Messaging"
set name = "Narrate Panel"
+2 -2
View File
@@ -18,6 +18,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, list(
// /datum/admins/proc/show_traitor_panel, /*interface which shows a mob's mind*/ -Removed due to rare practical use. Moved to debug verbs ~Errorage */
/datum/admins/proc/show_game_mode, /*Configuration window for the current game mode.*/
/datum/admins/proc/force_mode_latespawn, /*Force the mode to try a latespawn proc*/
/datum/admins/proc/force_round_canon_pregame,
/datum/admins/proc/force_antag_latespawn, /*Force a specific template to try a latespawn proc*/
/datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/
/datum/admins/proc/toggleguests, /*toggles whether guests can join the current game*/
@@ -149,7 +150,6 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list(
/client/proc/apply_sunstate,
/datum/admins/proc/ccannoucment,
/datum/admins/proc/set_odyssey,
/datum/admins/proc/set_odyssey_canonicity,
/datum/admins/proc/toggle_persistence
))
@@ -332,6 +332,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/colorooc,
/client/proc/add_client_color,
/datum/admins/proc/force_mode_latespawn,
/datum/admins/proc/force_round_canon_pregame,
/datum/admins/proc/toggleenter,
/datum/admins/proc/toggleguests,
/datum/admins/proc/capture_map_part,
@@ -413,7 +414,6 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list(
/client/proc/cmd_display_harddel_log,
/datum/admins/proc/ccannoucment,
/datum/admins/proc/set_odyssey,
/datum/admins/proc/set_odyssey_canonicity,
/client/proc/cmd_display_init_log,
/client/proc/cmd_generate_lag,
/client/proc/toggledebuglogs,