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) ("" + 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 "