From 05316726ecfd55fa73036b3645a1e2fcffdca14b Mon Sep 17 00:00:00 2001 From: Rhials Date: Sun, 21 May 2023 20:37:57 -0700 Subject: [PATCH] Ashwalker Tribe roundend reporting revamp (#75506) ## About The Pull Request This PR changes how ashwalkers are listed in the roundend report. Originally, they would be listed as individual "other" antagonists, which isn't a particularly great way of handling it and leads to weirdness like this: ![image](https://github.com/tgstation/tgstation/assets/28870487/c00a2cfc-3f08-46f6-a290-ef632cac0371) _(That's an authentic ninja greentext from a live server, by the by)_ Now, the roundend report gives each ashwalker team their own section within the report, whether or not they succeeded, and some bonus stats. ![image](https://github.com/tgstation/tgstation/assets/28870487/c2dc3c00-62a7-4784-90be-5a8bb5cc5a50) This new roundend report handling also supports having multiple Necropolises (Necropoli?) in the same round. Each tribe has their stats and success reported individually. This also slightly modifies the protect_object objective, preventing hard deletes when linked to objects that don't clear their own references. ## Why It's Good For The Game Gives Ashwalkers a much better roundend report, and handles how the reporting is done in a much more sensible manner. Reduces how much space that large nests take up with their individual listings. ## Changelog :cl: Rhials qol: Ashwalker roundend reporting has been revamped. Glory to the Necropolis! /:cl: --- code/__DEFINES/span.dm | 1 + code/game/gamemodes/objective.dm | 7 ++- .../antagonists/ashwalker/ashwalker.dm | 47 ++++++++++++++++--- .../ruins/objects_and_mobs/ash_walker_den.dm | 6 ++- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index aa11d23d34b..17dfc830b63 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -49,6 +49,7 @@ #define span_greenteamradio(str) ("" + str + "") #define span_greentext(str) ("" + str + "") #define span_grey(str) ("" + str + "") +#define span_header(str) ("" + str + "") #define span_hear(str) ("" + str + "") #define span_hidden(str) ("") #define span_hierophant(str) ("" + str + "") diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index a55a17172c0..fa1add2c43b 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -709,6 +709,7 @@ GLOBAL_LIST_EMPTY(possible_items) /datum/objective/protect_object/proc/set_target(obj/O) protect_target = O + RegisterSignal(protect_target, COMSIG_PARENT_QDELETING, PROC_REF(on_objective_qdel)) update_explanation_text() /datum/objective/protect_object/update_explanation_text() @@ -719,7 +720,11 @@ GLOBAL_LIST_EMPTY(possible_items) explanation_text = "Free objective." /datum/objective/protect_object/check_completion() - return !QDELETED(protect_target) + return !isnull(protect_target) + +/datum/objective/protect_object/proc/on_objective_qdel() + SIGNAL_HANDLER + protect_target = null //Changeling Objectives diff --git a/code/modules/antagonists/ashwalker/ashwalker.dm b/code/modules/antagonists/ashwalker/ashwalker.dm index 773e7894f37..7caa0d0a2fb 100644 --- a/code/modules/antagonists/ashwalker/ashwalker.dm +++ b/code/modules/antagonists/ashwalker/ashwalker.dm @@ -1,7 +1,3 @@ -/datum/team/ashwalkers - name = "Ashwalkers" - show_roundend_report = FALSE - /datum/antagonist/ashwalker name = "\improper Ash Walker" job_rank = ROLE_LAVALAND @@ -13,9 +9,9 @@ count_against_dynamic_roll_chance = FALSE var/datum/team/ashwalkers/ashie_team -/datum/antagonist/ashwalker/create_team(datum/team/team) - if(team) - ashie_team = team +/datum/antagonist/ashwalker/create_team(datum/team/ashwalkers/ashwalker_team) + if(ashwalker_team) + ashie_team = ashwalker_team objectives |= ashie_team.objectives else ashie_team = new @@ -42,3 +38,40 @@ if(istype(A, /obj/structure/headpike)) owner.current.add_mood_event("oogabooga", /datum/mood_event/sacrifice_good) + +/datum/team/ashwalkers + name = "Ash Walker Tribe" + member_name = "Ash Walker" + ///A list of "worthy" (meat-bearing) sacrifices made to the Necropolis + var/sacrifices_made = 0 + ///A list of how many eggs were created by the Necropolis + var/eggs_created = 0 + +/datum/team/ashwalkers/roundend_report() + var/list/report = list() + + report += span_header("An Ash Walker Tribe inhabited the wastes...
") + if(length(members)) //The team is generated alongside the tendril, and it's entirely possible that nobody takes the role. + report += "The [member_name]s were:" + report += printplayerlist(members) + + var/datum/objective/protect_object/necropolis_objective = locate(/datum/objective/protect_object) in objectives + + if(necropolis_objective) + objectives -= necropolis_objective //So we don't count it in the check for other objectives. + report += "The [name] was tasked with defending the Necropolis:" + if(necropolis_objective.check_completion()) + report += span_greentext("The nest stands! Glory to the Necropolis!
") + else + report += span_redtext("The Necropolis was destroyed, the tribe has fallen...
") + + if(length(objectives)) + report += span_header("The [name]'s other objectives were:") + printobjectives(objectives) + + report += "The [name] managed to perform [sacrifices_made] sacrifices to the Necropolis. From this, the Necropolis produced [eggs_created] Ash Walker eggs." + + else + report += "But none of its eggs hatched!" + + return "
[report.Join("
")]
" diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm index 42fdf621660..f478e7a93f5 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm @@ -24,14 +24,14 @@ ashies = new /datum/team/ashwalkers() var/datum/objective/protect_object/objective = new objective.set_target(src) + objective.team = ashies linked_objective = objective ashies.objectives += objective START_PROCESSING(SSprocessing, src) /obj/structure/lavaland/ash_walker/Destroy() - ashies.objectives -= linked_objective ashies = null - QDEL_NULL(linked_objective) + linked_objective = null STOP_PROCESSING(SSprocessing, src) return ..() @@ -90,6 +90,7 @@ L.add_mood_event("oogabooga", /datum/mood_event/sacrifice_good) else L.add_mood_event("oogabooga", /datum/mood_event/sacrifice_bad) + ashies.sacrifices_made++ /obj/structure/lavaland/ash_walker/proc/remake_walker(datum/mind/oldmind, oldname) var/mob/living/carbon/human/M = new /mob/living/carbon/human(get_step(loc, pick(GLOB.alldirs))) @@ -108,5 +109,6 @@ new /obj/effect/mob_spawn/ghost_role/human/ash_walker(get_step(loc, pick(GLOB.alldirs)), ashies) visible_message(span_danger("One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!")) meat_counter -= ASH_WALKER_SPAWN_THRESHOLD + ashies.eggs_created++ #undef ASH_WALKER_SPAWN_THRESHOLD