diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index c82404fd002..97d4126e351 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -11,4 +11,19 @@
#define APPRENTICE_DESTRUCTION "destruction"
#define APPRENTICE_BLUESPACE "bluespace"
#define APPRENTICE_ROBELESS "robeless"
-#define APPRENTICE_HEALING "healing"
\ No newline at end of file
+#define APPRENTICE_HEALING "healing"
+
+
+//ERT Types
+#define ERT_BLUE "Blue"
+#define ERT_RED "Red"
+#define ERT_AMBER "Amber"
+#define ERT_DEATHSQUAD "Deathsquad"
+
+//ERT subroles
+#define ERT_SEC "sec"
+#define ERT_MED "med"
+#define ERT_ENG "eng"
+#define ERT_LEADER "leader"
+#define DEATHSQUAD "ds"
+#define DEATHSQUAD_LEADER "ds_leader"
\ No newline at end of file
diff --git a/code/modules/admin/check_antagonists.dm b/code/modules/admin/check_antagonists.dm
index f1ad21ded3b..b4c72d2f0e6 100644
--- a/code/modules/admin/check_antagonists.dm
+++ b/code/modules/admin/check_antagonists.dm
@@ -40,7 +40,10 @@
// Jim (Status) FLW PM TP
/datum/antagonist/proc/antag_listing_entry()
var/list/parts = list()
- parts += antag_listing_name()
+ if(show_name_in_check_antagonists)
+ parts += "[antag_listing_name()]([name])"
+ else
+ parts += antag_listing_name()
parts += antag_listing_status()
parts += antag_listing_commands()
return "
| [parts.Join(" | ")] |
"
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 759cc97dbb0..c886a77e883 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -271,77 +271,7 @@
// DEATH SQUADS
/datum/admins/proc/makeDeathsquad()
- var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.")
- var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null)
- var/squadSpawned = 0
-
- if(candidates.len >= 2) //Minimum 2 to be considered a squad
- //Pick the lucky players
- var/numagents = min(5,candidates.len) //How many commandos to spawn
- var/list/spawnpoints = GLOB.emergencyresponseteamspawn
- while(numagents && candidates.len)
- if (numagents > spawnpoints.len)
- numagents--
- continue // This guy's unlucky, not enough spawn points, we skip him.
- var/spawnloc = spawnpoints[numagents]
- var/mob/dead/observer/chosen_candidate = pick(candidates)
- candidates -= chosen_candidate
- if(!chosen_candidate.key)
- continue
-
- //Spawn and equip the commando
- var/mob/living/carbon/human/Commando = new(spawnloc)
- chosen_candidate.client.prefs.copy_to(Commando)
- if(numagents == 1) //If Squad Leader
- Commando.real_name = "Officer [pick(GLOB.commando_names)]"
- Commando.equipOutfit(/datum/outfit/death_commando/officer)
- else
- Commando.real_name = "Trooper [pick(GLOB.commando_names)]"
- Commando.equipOutfit(/datum/outfit/death_commando)
- Commando.dna.update_dna_identity()
- Commando.key = chosen_candidate.key
- Commando.mind.assigned_role = "Death Commando"
- for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
- spawn(0)
- door.open()
-
- //Assign antag status and the mission
- Commando.mind.special_role = "deathsquad"
-
- var/datum/objective/missionobj = new
- missionobj.owner = Commando.mind
- missionobj.explanation_text = mission
- missionobj.completed = 1
- Commando.mind.objectives += missionobj
-
- Commando.mind.add_antag_datum(/datum/antagonist/auto_custom)
-
- //Greet the commando
- to_chat(Commando, "You are the [numagents==1?"Deathsquad Officer":"Death Commando"].")
- var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division."
- if(numagents == 1) //If Squad Leader
- missiondesc += " Lead your squad to ensure the completion of the mission. Board the shuttle when your team is ready."
- else
- missiondesc += " Follow orders given to you by your squad leader."
- missiondesc += "
Your Mission: [mission]"
- to_chat(Commando, missiondesc)
-
- if(CONFIG_GET(flag/enforce_human_authority))
- Commando.set_species(/datum/species/human)
-
- //Logging and cleanup
- if(numagents == 1)
- message_admins("The deathsquad has spawned with the mission: [mission].")
- log_game("[key_name(Commando)] has been selected as a Death Commando")
- numagents--
- squadSpawned++
-
- if (squadSpawned)
- return 1
- else
- return 0
-
- return
+ return makeEmergencyresponseteam(ERT_DEATHSQUAD)
/datum/admins/proc/makeOfficial()
var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.")
@@ -386,38 +316,70 @@
return 0
// CENTCOM RESPONSE TEAM
-/datum/admins/proc/makeEmergencyresponseteam()
- var/alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: CentCom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad")
- if(!alert)
- return
+/datum/admins/proc/makeEmergencyresponseteam(alert_type)
+ var/alert
+ if(!alert_type)
+ alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: CentCom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad")
+ if(!alert)
+ return
+ else
+ alert = alert_type
+
+ var/teamsize = 0
+ var/deathsquad = FALSE
+
switch(alert)
if("Delta: Deathsquad")
- return makeDeathsquad()
+ alert = ERT_DEATHSQUAD
+ teamsize = 5
+ deathsquad = TRUE
if("Red: Elite ERT (Armoury Access + Pulse Weapons)")
- alert = "Red"
+ alert = ERT_RED
if("Amber: Full ERT (Armoury Access)")
- alert = "Amber"
+ alert = ERT_AMBER
if("Blue: Light ERT (No Armoury Access)")
- alert = "Blue"
+ alert = ERT_BLUE
if("Green: CentCom Official")
return makeOfficial()
- var/teamcheck = input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num
- if(isnull(teamcheck))
- return
- var/teamsize = min(7,teamcheck)
- var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.") as null|text
+ else
+ return
+
+ if(!teamsize)
+ var/teamcheck = input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num
+ if(isnull(teamcheck))
+ return
+ teamsize = min(7,teamcheck)
+
+
+ var/default_mission = deathsquad ? "Leave no witnesses." : "Assist the station."
+ var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", default_mission) as null|text
if(!mission)
return
- var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for a Code [alert] Nanotrasen Emergency Response Team?", "deathsquad", null)
+
+ var/prompt_name = deathsquad ? "an elite Nanotrasen Strike Team" : "a Code [alert] Nanotrasen Emergency Response Team"
+ var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [prompt_name] ?", "deathsquad", null)
var/teamSpawned = 0
if(candidates.len > 0)
//Pick the (un)lucky players
var/numagents = min(teamsize,candidates.len) //How many officers to spawn
- var/redalert //If the ert gets super weapons
- if (alert == "Red")
- numagents = min(teamsize,candidates.len)
- redalert = 1
+
+ //Create team
+ var/datum/team/ert/ert_team = new
+ if(deathsquad)
+ ert_team.name = "Death Squad"
+
+ //Asign team objective
+ var/datum/objective/missionobj = new
+ missionobj.team = ert_team
+ missionobj.explanation_text = mission
+ missionobj.completed = 1
+ ert_team.objectives += missionobj
+ ert_team.mission = missionobj
+
+ //We give these out in order, then back from the start if there's more than 3
+ var/list/role_order = list(ERT_SEC,ERT_MED,ERT_ENG)
+
var/list/spawnpoints = GLOB.emergencyresponseteamspawn
while(numagents && candidates.len)
if (numagents > spawnpoints.len)
@@ -429,75 +391,38 @@
if(!chosen_candidate.key)
continue
- //Spawn and equip the officer
+ //Spawn the body
var/mob/living/carbon/human/ERTOperative = new(spawnloc)
- var/list/lastname = GLOB.last_names
chosen_candidate.client.prefs.copy_to(ERTOperative)
- var/ertname = pick(lastname)
- switch(numagents)
- if(1)
- ERTOperative.real_name = "Commander [ertname]"
- ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/commander/alert : /datum/outfit/ert/commander)
- if(2)
- ERTOperative.real_name = "Security Officer [ertname]"
- ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/security/alert : /datum/outfit/ert/security)
- if(3)
- ERTOperative.real_name = "Medical Officer [ertname]"
- ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/medic/alert : /datum/outfit/ert/medic)
- if(4)
- ERTOperative.real_name = "Engineer [ertname]"
- ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer)
- if(5)
- ERTOperative.real_name = "Security Officer [ertname]"
- ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/security/alert : /datum/outfit/ert/security)
- if(6)
- ERTOperative.real_name = "Medical Officer [ertname]"
- ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/medic/alert : /datum/outfit/ert/medic)
- if(7)
- ERTOperative.real_name = "Engineer [ertname]"
- ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer)
- ERTOperative.dna.update_dna_identity()
ERTOperative.key = chosen_candidate.key
- ERTOperative.mind.assigned_role = "ERT"
-
- //Open the Armory doors
- if(alert != "Blue")
- for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
- spawn(0)
- door.open()
-
- //Assign antag status and the mission
- ERTOperative.mind.special_role = "ERT"
-
- var/datum/objective/missionobj = new
- missionobj.owner = ERTOperative.mind
- missionobj.explanation_text = mission
- missionobj.completed = 1
- ERTOperative.mind.objectives += missionobj
-
- ERTOperative.mind.add_antag_datum(/datum/antagonist/auto_custom)
-
- //Greet the commando
- to_chat(ERTOperative, "You are [numagents==1?"the Emergency Response Team Commander":"an Emergency Response Officer"].")
- var/missiondesc = "Your squad is being sent on a Code [alert] mission to [station_name()] by Nanotrasen's Security Division."
- if(numagents == 1) //If Squad Leader
- missiondesc += " Lead your squad to ensure the completion of the mission. Avoid civilian casualites when possible. Board the shuttle when your team is ready."
- else
- missiondesc += " Follow orders given to you by your commander. Avoid civilian casualites when possible."
- missiondesc += "
Your Mission: [mission]"
- to_chat(ERTOperative, missiondesc)
-
+
if(CONFIG_GET(flag/enforce_human_authority))
ERTOperative.set_species(/datum/species/human)
- //Logging and cleanup
+ //Give antag datum
+ var/datum/antagonist/ert/ert_antag = new
+ ert_antag.high_alert = alert == ERT_RED
if(numagents == 1)
- message_admins("A Code [alert] emergency response team has spawned with the mission: [mission]")
- log_game("[key_name(ERTOperative)] has been selected as an Emergency Response Officer")
+ ert_antag.role = deathsquad ? DEATHSQUAD_LEADER : ERT_LEADER
+ else
+ ert_antag.role = deathsquad ? DEATHSQUAD : role_order[WRAP(numagents,1,role_order.len + 1)]
+ ERTOperative.mind.add_antag_datum(ert_antag,ert_team)
+
+ ERTOperative.mind.assigned_role = ert_antag.name
+
+ //Logging and cleanup
+ log_game("[key_name(ERTOperative)] has been selected as an [ert_antag.name]")
numagents--
teamSpawned++
if (teamSpawned)
+ message_admins("[prompt_name] has spawned with the mission: [mission]")
+
+ //Open the Armory doors
+ if(alert != ERT_BLUE)
+ for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
+ spawn(0)
+ door.open()
return 1
else
return 0
diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm
index 10842997599..48e7cf896fc 100644
--- a/code/modules/antagonists/_common/antag_datum.dm
+++ b/code/modules/antagonists/_common/antag_datum.dm
@@ -17,6 +17,7 @@ GLOBAL_LIST_EMPTY(antagonists)
//Antag panel properties
var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind
var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED
+ var/show_name_in_check_antagonists = FALSE //Will append antagonist name in admin listings - use for categories that share more than one antag type
/datum/antagonist/New()
GLOB.antagonists += src
@@ -205,6 +206,7 @@ GLOBAL_LIST_EMPTY(antagonists)
/datum/antagonist/auto_custom
show_in_antagpanel = FALSE
antagpanel_category = "Other"
+ show_name_in_check_antagonists = TRUE
/datum/antagonist/auto_custom/on_gain()
..()
@@ -218,12 +220,10 @@ GLOBAL_LIST_EMPTY(antagonists)
already_registered_objectives |= A.objectives
objectives = owner.objectives - already_registered_objectives
-/datum/antagonist/auto_custom/antag_listing_name()
- return ..() + "([name])"
-
//This one is created by admin tools for custom objectives
/datum/antagonist/custom
antagpanel_category = "Custom"
+ show_name_in_check_antagonists = TRUE //They're all different
/datum/antagonist/custom/admin_add(datum/mind/new_owner,mob/admin)
var/custom_name = stripped_input(admin, "Custom antagonist name:", "Custom antag", "Antagonist")
@@ -231,7 +231,4 @@ GLOBAL_LIST_EMPTY(antagonists)
name = custom_name
else
return
- ..()
-
-/datum/antagonist/custom/antag_listing_name()
- return ..() + "([name])"
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index 2ced63535a1..5695a8c480f 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -203,8 +203,8 @@
var/shatter_msg = "You shatter the bottle, no turning back now!"
var/veil_msg = "You sense a dark presence lurking just beyond the veil..."
- var/objective_verb = "Kill"
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
+ var/antag_type = /datum/antagonist/slaughter
/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
@@ -235,24 +235,10 @@
S.key = C.key
S.mind.assigned_role = S.name
S.mind.special_role = S.name
- var/datum/objective/assassinate/new_objective
- if(user)
- new_objective = new /datum/objective/assassinate
- new_objective.owner = S.mind
- new_objective.target = user
- new_objective.explanation_text = "[objective_verb] [user.name], the one who summoned you."
- S.mind.objectives += new_objective
- var/datum/objective/new_objective2 = new /datum/objective
- new_objective2.owner = S.mind
- new_objective2.explanation_text = "[objective_verb] everyone[user ? " else while you're at it":""]."
- S.mind.objectives += new_objective2
- S.mind.add_antag_datum(/datum/antagonist/auto_custom)
+ S.mind.add_antag_datum(antag_type)
to_chat(S, S.playstyle_string)
to_chat(S, "You are currently not currently in the same plane of existence as the station. \
Ctrl+Click a blood pool to manifest.")
- if(new_objective)
- to_chat(S, "Objective #[1]: [new_objective.explanation_text]")
- to_chat(S, "Objective #[new_objective ? "[2]":"[1]"]: [new_objective2.explanation_text]")
/obj/item/antag_spawner/slaughter_demon/laughter
name = "vial of tickles"
@@ -262,5 +248,5 @@
color = "#FF69B4" // HOT PINK
veil_msg = "You sense an adorable presence lurking just beyond the veil..."
- objective_verb = "Hug and Tickle"
demon_type = /mob/living/simple_animal/slaughter/laughter
+ antag_type = /datum/antagonist/slaughter/laughter
diff --git a/code/modules/antagonists/_common/antag_team.dm b/code/modules/antagonists/_common/antag_team.dm
index c458b5a9fb6..486b5b04147 100644
--- a/code/modules/antagonists/_common/antag_team.dm
+++ b/code/modules/antagonists/_common/antag_team.dm
@@ -27,8 +27,25 @@
/datum/team/proc/roundend_report()
var/list/report = list()
- report += "[name]:"
+ report += ""
report += "The [member_name]s were:"
report += printplayerlist(members)
- return report.Join("
")
+ if(objectives.len)
+ report += ""
+ var/win = TRUE
+ var/objective_count = 1
+ for(var/datum/objective/objective in objectives)
+ if(objective.check_completion())
+ report += "Objective #[objective_count]: [objective.explanation_text] Success!"
+ else
+ report += "Objective #[objective_count]: [objective.explanation_text] Fail."
+ win = FALSE
+ objective_count++
+ if(win)
+ report += "The [name] was successful!"
+ else
+ report += "The [name] have failed!"
+
+
+ return "[report.Join("
")]
"
diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm
new file mode 100644
index 00000000000..c49b7246339
--- /dev/null
+++ b/code/modules/antagonists/ert/ert.dm
@@ -0,0 +1,87 @@
+//Both ERT and DS are handled by the same datums since they mostly differ in equipment in objective.
+/datum/team/ert
+ name = "Emergency Response Team"
+ var/datum/objective/mission //main mission
+
+/datum/antagonist/ert
+ name = "Emergency Response Officer"
+ var/datum/team/ert/ert_team
+ var/role = ERT_SEC
+ var/high_alert = FALSE
+ show_in_antagpanel = FALSE
+
+/datum/antagonist/ert/on_gain()
+ update_name()
+ forge_objectives()
+ equipERT()
+ . = ..()
+
+/datum/antagonist/ert/get_team()
+ return ert_team
+
+/datum/antagonist/ert/proc/update_name()
+ var/new_name
+ switch(role)
+ if(ERT_ENG)
+ new_name = "Engineer [pick(GLOB.last_names)]"
+ if(ERT_MED)
+ new_name = "Medical Officer [pick(GLOB.last_names)]"
+ if(ERT_SEC)
+ new_name = "Security Officer [pick(GLOB.last_names)]"
+ if(ERT_LEADER)
+ new_name = "Commander [pick(GLOB.last_names)]"
+ name = "Emergency Response Commander"
+ if(DEATHSQUAD)
+ new_name = "Trooper [pick(GLOB.commando_names)]"
+ name = "Deathsquad Trooper"
+ if(DEATHSQUAD_LEADER)
+ new_name = "Officer [pick(GLOB.commando_names)]"
+ name = "Deathsquad Officer"
+ owner.current.fully_replace_character_name(owner.current.real_name,new_name)
+
+/datum/antagonist/ert/create_team(datum/team/ert/new_team)
+ if(istype(new_team))
+ ert_team = new_team
+
+/datum/antagonist/ert/proc/forge_objectives()
+ if(ert_team)
+ objectives |= ert_team.objectives
+
+/datum/antagonist/ert/proc/equipERT()
+ var/mob/living/carbon/human/H = owner.current
+ if(!istype(H))
+ return
+ var/outfit
+ switch(role)
+ if(ERT_LEADER)
+ outfit = high_alert ? /datum/outfit/ert/commander/alert : /datum/outfit/ert/commander
+ if(ERT_ENG)
+ outfit = high_alert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer
+ if(ERT_MED)
+ outfit = high_alert ? /datum/outfit/ert/medic/alert : /datum/outfit/ert/medic
+ if(ERT_SEC)
+ outfit = high_alert ? /datum/outfit/ert/security/alert : /datum/outfit/ert/security
+ if(DEATHSQUAD)
+ outfit = /datum/outfit/death_commando/officer
+ if(DEATHSQUAD_LEADER)
+ outfit = /datum/outfit/death_commando
+ H.equipOutfit(outfit)
+
+/datum/antagonist/ert/greet()
+ if(!ert_team)
+ return
+
+ var/leader = role == ERT_LEADER || role == DEATHSQUAD_LEADER
+
+ to_chat(owner, "You are the [name].")
+
+ var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division."
+ if(leader) //If Squad Leader
+ missiondesc += " Lead your squad to ensure the completion of the mission. Board the shuttle when your team is ready."
+ else
+ missiondesc += " Follow orders given to you by your squad leader."
+ if(role != DEATHSQUAD && role != DEATHSQUAD_LEADER)
+ missiondesc += "Avoid civilian casualites when possible."
+
+ missiondesc += "
Your Mission : [ert_team.mission.explanation_text]"
+ to_chat(owner,missiondesc)
diff --git a/code/modules/antagonists/morph/morph_antag.dm b/code/modules/antagonists/morph/morph_antag.dm
new file mode 100644
index 00000000000..e01751946d2
--- /dev/null
+++ b/code/modules/antagonists/morph/morph_antag.dm
@@ -0,0 +1,6 @@
+/datum/antagonist/morph
+ name = "Morph"
+ show_name_in_check_antagonists = TRUE
+ show_in_antagpanel = FALSE
+
+//It does nothing! (Besides tracking)
\ No newline at end of file
diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm
index e8a1c140ea4..cb6f8ad6e10 100644
--- a/code/modules/antagonists/ninja/ninja.dm
+++ b/code/modules/antagonists/ninja/ninja.dm
@@ -2,11 +2,11 @@
name = "Ninja"
antagpanel_category = "Ninja"
job_rank = ROLE_NINJA
+ show_name_in_check_antagonists = TRUE
var/helping_station = FALSE
var/give_objectives = TRUE
var/give_equipment = TRUE
-
/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override)
var/mob/living/M = mob_override || owner.current
update_ninja_icons_added(M)
@@ -141,9 +141,6 @@
message_admins("[key_name_admin(admin)] has [adj] ninja'ed [new_owner.current].")
log_admin("[key_name(admin)] has [adj] ninja'ed [new_owner.current].")
-/datum/antagonist/ninja/antag_listing_name()
- return ..() + "(Ninja)"
-
/datum/antagonist/ninja/proc/update_ninja_icons_added(var/mob/living/carbon/human/ninja)
var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA]
ninjahud.join_hud(ninja)
diff --git a/code/modules/antagonists/slaughter/slaughter_antag.dm b/code/modules/antagonists/slaughter/slaughter_antag.dm
new file mode 100644
index 00000000000..a018603cf11
--- /dev/null
+++ b/code/modules/antagonists/slaughter/slaughter_antag.dm
@@ -0,0 +1,31 @@
+/datum/antagonist/slaughter
+ name = "Slaughter demon"
+ show_name_in_check_antagonists = TRUE
+ var/objective_verb = "Kill"
+ var/datum/mind/summoner
+ job_rank = ROLE_ALIEN
+ show_in_antagpanel = FALSE
+
+/datum/antagonist/slaughter/on_gain()
+ forge_objectives()
+ . = ..()
+
+/datum/antagonist/slaughter/greet()
+ . = ..()
+ owner.announce_objectives()
+
+/datum/antagonist/slaughter/proc/forge_objectives()
+ if(summoner)
+ var/datum/objective/assassinate/new_objective = new /datum/objective/assassinate
+ new_objective.owner = owner
+ new_objective.target = summoner
+ new_objective.explanation_text = "[objective_verb] [summoner.name], the one who summoned you."
+ objectives += new_objective
+ var/datum/objective/new_objective2 = new /datum/objective
+ new_objective2.owner = owner
+ new_objective2.explanation_text = "[objective_verb] everyone[summoner ? " else while you're at it":""]."
+ objectives += new_objective2
+
+/datum/antagonist/slaughter/laughter
+ name = "Laughter demon"
+ objective_verb = "Hug and Tickle"
\ No newline at end of file
diff --git a/tgstation.dme b/tgstation.dme
index 2786f4ed3d4..6e34d666325 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1159,8 +1159,10 @@
#include "code\modules\antagonists\devil\sintouched\objectives.dm"
#include "code\modules\antagonists\devil\true_devil\_true_devil.dm"
#include "code\modules\antagonists\devil\true_devil\inventory.dm"
+#include "code\modules\antagonists\ert\ert.dm"
#include "code\modules\antagonists\monkey\monkey.dm"
#include "code\modules\antagonists\morph\morph.dm"
+#include "code\modules\antagonists\morph\morph_antag.dm"
#include "code\modules\antagonists\ninja\ninja.dm"
#include "code\modules\antagonists\nukeop\nukeop.dm"
#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm"
@@ -1173,6 +1175,7 @@
#include "code\modules\antagonists\revenant\revenant_spawn_event.dm"
#include "code\modules\antagonists\revolution\revolution.dm"
#include "code\modules\antagonists\slaughter\slaughter.dm"
+#include "code\modules\antagonists\slaughter\slaughter_antag.dm"
#include "code\modules\antagonists\slaughter\slaughterevent.dm"
#include "code\modules\antagonists\swarmer\swarmer.dm"
#include "code\modules\antagonists\swarmer\swarmer_event.dm"