Merge pull request #5330 from Citadel-Station-13/upstream-merge-35156

[MIRROR] Slaughter demon, Morph, ERT / Deathsquad antag datums.
This commit is contained in:
deathride58
2018-02-06 17:54:05 +00:00
committed by GitHub
13 changed files with 498 additions and 430 deletions

View File

@@ -11,4 +11,19 @@
#define APPRENTICE_DESTRUCTION "destruction" #define APPRENTICE_DESTRUCTION "destruction"
#define APPRENTICE_BLUESPACE "bluespace" #define APPRENTICE_BLUESPACE "bluespace"
#define APPRENTICE_ROBELESS "robeless" #define APPRENTICE_ROBELESS "robeless"
#define APPRENTICE_HEALING "healing" #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"

View File

@@ -40,7 +40,10 @@
// Jim (Status) FLW PM TP // Jim (Status) FLW PM TP
/datum/antagonist/proc/antag_listing_entry() /datum/antagonist/proc/antag_listing_entry()
var/list/parts = list() 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_status()
parts += antag_listing_commands() parts += antag_listing_commands()
return "<tr><td>[parts.Join("</td><td>")]</td></tr>" return "<tr><td>[parts.Join("</td><td>")]</td></tr>"

View File

@@ -271,77 +271,7 @@
// DEATH SQUADS // DEATH SQUADS
/datum/admins/proc/makeDeathsquad() /datum/admins/proc/makeDeathsquad()
var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.") return makeEmergencyresponseteam(ERT_DEATHSQUAD)
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, "<B><font size=3 color=red>You are the [numagents==1?"Deathsquad Officer":"Death Commando"].</font></B>")
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 += "<BR><B>Your Mission</B>: [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
/datum/admins/proc/makeOfficial() /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.") 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 return 0
// CENTCOM RESPONSE TEAM // CENTCOM RESPONSE TEAM
/datum/admins/proc/makeEmergencyresponseteam() /datum/admins/proc/makeEmergencyresponseteam(alert_type)
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") var/alert
if(!alert) if(!alert_type)
return 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) switch(alert)
if("Delta: Deathsquad") if("Delta: Deathsquad")
return makeDeathsquad() alert = ERT_DEATHSQUAD
teamsize = 5
deathsquad = TRUE
if("Red: Elite ERT (Armoury Access + Pulse Weapons)") if("Red: Elite ERT (Armoury Access + Pulse Weapons)")
alert = "Red" alert = ERT_RED
if("Amber: Full ERT (Armoury Access)") if("Amber: Full ERT (Armoury Access)")
alert = "Amber" alert = ERT_AMBER
if("Blue: Light ERT (No Armoury Access)") if("Blue: Light ERT (No Armoury Access)")
alert = "Blue" alert = ERT_BLUE
if("Green: CentCom Official") if("Green: CentCom Official")
return makeOfficial() return makeOfficial()
var/teamcheck = input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num else
if(isnull(teamcheck)) return
return
var/teamsize = min(7,teamcheck) if(!teamsize)
var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.") as null|text 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) if(!mission)
return 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 var/teamSpawned = 0
if(candidates.len > 0) if(candidates.len > 0)
//Pick the (un)lucky players //Pick the (un)lucky players
var/numagents = min(teamsize,candidates.len) //How many officers to spawn var/numagents = min(teamsize,candidates.len) //How many officers to spawn
var/redalert //If the ert gets super weapons
if (alert == "Red") //Create team
numagents = min(teamsize,candidates.len) var/datum/team/ert/ert_team = new
redalert = 1 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 var/list/spawnpoints = GLOB.emergencyresponseteamspawn
while(numagents && candidates.len) while(numagents && candidates.len)
if (numagents > spawnpoints.len) if (numagents > spawnpoints.len)
@@ -429,75 +391,38 @@
if(!chosen_candidate.key) if(!chosen_candidate.key)
continue continue
//Spawn and equip the officer //Spawn the body
var/mob/living/carbon/human/ERTOperative = new(spawnloc) var/mob/living/carbon/human/ERTOperative = new(spawnloc)
var/list/lastname = GLOB.last_names
chosen_candidate.client.prefs.copy_to(ERTOperative) 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.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, "<B><font size=3 color=red>You are [numagents==1?"the Emergency Response Team Commander":"an Emergency Response Officer"].</font></B>")
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 += "<BR><B>Your Mission</B>: [mission]"
to_chat(ERTOperative, missiondesc)
if(CONFIG_GET(flag/enforce_human_authority)) if(CONFIG_GET(flag/enforce_human_authority))
ERTOperative.set_species(/datum/species/human) 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) if(numagents == 1)
message_admins("A Code [alert] emergency response team has spawned with the mission: [mission]") ert_antag.role = deathsquad ? DEATHSQUAD_LEADER : ERT_LEADER
log_game("[key_name(ERTOperative)] has been selected as an Emergency Response Officer") 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-- numagents--
teamSpawned++ teamSpawned++
if (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 return 1
else else
return 0 return 0

View File

@@ -17,6 +17,7 @@ GLOBAL_LIST_EMPTY(antagonists)
//Antag panel properties //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/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/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() /datum/antagonist/New()
GLOB.antagonists += src GLOB.antagonists += src
@@ -206,6 +207,7 @@ GLOBAL_LIST_EMPTY(antagonists)
/datum/antagonist/auto_custom /datum/antagonist/auto_custom
show_in_antagpanel = FALSE show_in_antagpanel = FALSE
antagpanel_category = "Other" antagpanel_category = "Other"
show_name_in_check_antagonists = TRUE
/datum/antagonist/auto_custom/on_gain() /datum/antagonist/auto_custom/on_gain()
..() ..()
@@ -219,12 +221,10 @@ GLOBAL_LIST_EMPTY(antagonists)
already_registered_objectives |= A.objectives already_registered_objectives |= A.objectives
objectives = owner.objectives - already_registered_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 //This one is created by admin tools for custom objectives
/datum/antagonist/custom /datum/antagonist/custom
antagpanel_category = "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) /datum/antagonist/custom/admin_add(datum/mind/new_owner,mob/admin)
var/custom_name = stripped_input(admin, "Custom antagonist name:", "Custom antag", "Antagonist") var/custom_name = stripped_input(admin, "Custom antagonist name:", "Custom antag", "Antagonist")
@@ -232,7 +232,4 @@ GLOBAL_LIST_EMPTY(antagonists)
name = custom_name name = custom_name
else else
return return
..() ..()
/datum/antagonist/custom/antag_listing_name()
return ..() + "([name])"

View File

@@ -1,266 +1,252 @@
/obj/item/antag_spawner /obj/item/antag_spawner
throw_speed = 1 throw_speed = 1
throw_range = 5 throw_range = 5
w_class = WEIGHT_CLASS_TINY w_class = WEIGHT_CLASS_TINY
var/used = FALSE var/used = 0
/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) /obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
return return
/obj/item/antag_spawner/proc/equip_antag(mob/target) /obj/item/antag_spawner/proc/equip_antag(mob/target)
return return
///////////WIZARD ///////////WIZARD
/obj/item/antag_spawner/contract /obj/item/antag_spawner/contract
name = "contract" name = "contract"
desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid." desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid."
icon = 'icons/obj/wizard.dmi' icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2" icon_state ="scroll2"
/obj/item/antag_spawner/contract/attack_self(mob/user) /obj/item/antag_spawner/contract/attack_self(mob/user)
user.set_machine(src) user.set_machine(src)
var/dat var/dat
if(used) if(used)
dat = "<B>You have already summoned your apprentice.</B><BR>" dat = "<B>You have already summoned your apprentice.</B><BR>"
else else
dat = "<B>Contract of Apprenticeship:</B><BR>" dat = "<B>Contract of Apprenticeship:</B><BR>"
dat += "<I>Using this contract, you may summon an apprentice to aid you on your mission.</I><BR>" dat += "<I>Using this contract, you may summon an apprentice to aid you on your mission.</I><BR>"
dat += "<I>If you are unable to establish contact with your apprentice, you can feed the contract back to the spellbook to refund your points.</I><BR>" dat += "<I>If you are unable to establish contact with your apprentice, you can feed the contract back to the spellbook to refund your points.</I><BR>"
dat += "<B>Which school of magic is your apprentice studying?:</B><BR>" dat += "<B>Which school of magic is your apprentice studying?:</B><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_DESTRUCTION]'>Destruction</A><BR>" dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_DESTRUCTION]'>Destruction</A><BR>"
dat += "<I>Your apprentice is skilled in offensive magic. They know Magic Missile and Fireball.</I><BR>" dat += "<I>Your apprentice is skilled in offensive magic. They know Magic Missile and Fireball.</I><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_BLUESPACE]'>Bluespace Manipulation</A><BR>" dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_BLUESPACE]'>Bluespace Manipulation</A><BR>"
dat += "<I>Your apprentice is able to defy physics, melting through solid objects and travelling great distances in the blink of an eye. They know Teleport and Ethereal Jaunt.</I><BR>" dat += "<I>Your apprentice is able to defy physics, melting through solid objects and travelling great distances in the blink of an eye. They know Teleport and Ethereal Jaunt.</I><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_HEALING]'>Healing</A><BR>" dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_HEALING]'>Healing</A><BR>"
dat += "<I>Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.</I><BR>" dat += "<I>Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.</I><BR>"
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_ROBELESS]'>Robeless</A><BR>" dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_ROBELESS]'>Robeless</A><BR>"
dat += "<I>Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.</I><BR>" dat += "<I>Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.</I><BR>"
user << browse(dat, "window=radio") user << browse(dat, "window=radio")
onclose(user, "radio") onclose(user, "radio")
return return
/obj/item/antag_spawner/contract/Topic(href, href_list) /obj/item/antag_spawner/contract/Topic(href, href_list)
..() ..()
var/mob/living/carbon/human/H = usr var/mob/living/carbon/human/H = usr
if(H.stat || H.restrained()) if(H.stat || H.restrained())
return return
if(!ishuman(H)) if(!ishuman(H))
return 1 return 1
if(loc == H || (in_range(src, H) && isturf(loc))) if(loc == H || (in_range(src, H) && isturf(loc)))
H.set_machine(src) H.set_machine(src)
if(href_list["school"]) if(href_list["school"])
if(used) if(used)
to_chat(H, "You already used this contract!") to_chat(H, "You already used this contract!")
return return
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src) var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
if(LAZYLEN(candidates)) if(candidates.len)
if(used) if(used)
to_chat(H, "You already used this contract!") to_chat(H, "You already used this contract!")
return return
used = TRUE used = 1
var/client/C = pick(candidates) var/mob/dead/observer/theghost = pick(candidates)
spawn_antag(C, get_turf(src), href_list["school"],H.mind) spawn_antag(theghost.client, get_turf(src), href_list["school"],H.mind)
else else
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.") to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, kind ,datum/mind/user) /obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, kind ,datum/mind/user)
new /obj/effect/particle_effect/smoke(T) new /obj/effect/particle_effect/smoke(T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M) C.prefs.copy_to(M)
M.key = C.key M.key = C.key
var/datum/mind/app_mind = M.mind var/datum/mind/app_mind = M.mind
var/datum/antagonist/wizard/apprentice/app = new() var/datum/antagonist/wizard/apprentice/app = new()
app.master = user app.master = user
app.school = kind app.school = kind
var/datum/antagonist/wizard/master_wizard = user.has_antag_datum(/datum/antagonist/wizard) var/datum/antagonist/wizard/master_wizard = user.has_antag_datum(/datum/antagonist/wizard)
if(master_wizard) if(master_wizard)
if(!master_wizard.wiz_team) if(!master_wizard.wiz_team)
master_wizard.create_wiz_team() master_wizard.create_wiz_team()
app.wiz_team = master_wizard.wiz_team app.wiz_team = master_wizard.wiz_team
master_wizard.wiz_team.add_member(app_mind) master_wizard.wiz_team.add_member(app_mind)
app_mind.add_antag_datum(app) app_mind.add_antag_datum(app)
//TODO Kill these if possible //TODO Kill these if possible
app_mind.assigned_role = "Apprentice" app_mind.assigned_role = "Apprentice"
app_mind.special_role = "apprentice" app_mind.special_role = "apprentice"
// //
SEND_SOUND(M, sound('sound/effects/magic.ogg')) SEND_SOUND(M, sound('sound/effects/magic.ogg'))
///////////BORGS AND OPERATIVES ///////////BORGS AND OPERATIVES
/obj/item/antag_spawner/nuke_ops /obj/item/antag_spawner/nuke_ops
name = "syndicate operative teleporter" name = "syndicate operative teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field." desc = "A single-use teleporter designed to quickly reinforce operatives in the field."
icon = 'icons/obj/device.dmi' icon = 'icons/obj/device.dmi'
icon_state = "locator" icon_state = "locator"
var/borg_to_spawn var/borg_to_spawn
/obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user) /obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used) if(used)
to_chat(user, "<span class='warning'>[src] is out of power!</span>") to_chat(user, "<span class='warning'>[src] is out of power!</span>")
return FALSE return FALSE
if(!user.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE)) if(!user.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE))
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>") to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
return FALSE return FALSE
if(!user.onSyndieBase()) if(!user.onSyndieBase())
to_chat(user, "<span class='warning'>[src] is out of range! It can only be used at your base!</span>") to_chat(user, "<span class='warning'>[src] is out of range! It can only be used at your base!</span>")
return FALSE return FALSE
return TRUE return TRUE
/obj/item/antag_spawner/nuke_ops/attack_self(mob/user) /obj/item/antag_spawner/nuke_ops/attack_self(mob/user)
if(!(check_usability(user))) if(!(check_usability(user)))
return return
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>") to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
var/list/nuke_candidates = pollGhostCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE) var/list/nuke_candidates = pollGhostCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE)
if(LAZYLEN(nuke_candidates)) if(nuke_candidates.len)
if(!(check_usability(user))) if(!(check_usability(user)))
return return
used = TRUE used = TRUE
var/client/C = pick(nuke_candidates) var/mob/dead/observer/theghost = pick(nuke_candidates)
spawn_antag(C, get_turf(src), "syndieborg", user.mind) spawn_antag(theghost.client, get_turf(src), "syndieborg", user.mind)
do_sparks(4, TRUE, src) do_sparks(4, TRUE, src)
qdel(src) qdel(src)
else else
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>") to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user) /obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M) C.prefs.copy_to(M)
M.key = C.key M.key = C.key
var/datum/antagonist/nukeop/new_op = new() var/datum/antagonist/nukeop/new_op = new()
new_op.send_to_spawnpoint = FALSE new_op.send_to_spawnpoint = FALSE
new_op.nukeop_outfit = /datum/outfit/syndicate/no_crystals new_op.nukeop_outfit = /datum/outfit/syndicate/no_crystals
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE) var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE)
if(creator_op) if(creator_op)
M.mind.add_antag_datum(new_op,creator_op.nuke_team) M.mind.add_antag_datum(new_op,creator_op.nuke_team)
M.mind.special_role = "Nuclear Operative" M.mind.special_role = "Nuclear Operative"
//////SYNDICATE BORG //////SYNDICATE BORG
/obj/item/antag_spawner/nuke_ops/borg_tele /obj/item/antag_spawner/nuke_ops/borg_tele
name = "syndicate cyborg teleporter" name = "syndicate cyborg teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field.." desc = "A single-use teleporter designed to quickly reinforce operatives in the field.."
icon = 'icons/obj/device.dmi' icon = 'icons/obj/device.dmi'
icon_state = "locator" icon_state = "locator"
/obj/item/antag_spawner/nuke_ops/borg_tele/assault /obj/item/antag_spawner/nuke_ops/borg_tele/assault
name = "syndicate assault cyborg teleporter" name = "syndicate assault cyborg teleporter"
borg_to_spawn = "Assault" borg_to_spawn = "Assault"
/obj/item/antag_spawner/nuke_ops/borg_tele/medical /obj/item/antag_spawner/nuke_ops/borg_tele/medical
name = "syndicate medical teleporter" name = "syndicate medical teleporter"
borg_to_spawn = "Medical" borg_to_spawn = "Medical"
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user) /obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user)
var/mob/living/silicon/robot/R var/mob/living/silicon/robot/R
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE) var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE)
if(!creator_op) if(!creator_op)
return return
switch(borg_to_spawn) switch(borg_to_spawn)
if("Medical") if("Medical")
R = new /mob/living/silicon/robot/modules/syndicate/medical(T) R = new /mob/living/silicon/robot/modules/syndicate/medical(T)
else else
R = new /mob/living/silicon/robot/modules/syndicate(T) //Assault borg by default R = new /mob/living/silicon/robot/modules/syndicate(T) //Assault borg by default
var/brainfirstname = pick(GLOB.first_names_male) var/brainfirstname = pick(GLOB.first_names_male)
if(prob(50)) if(prob(50))
brainfirstname = pick(GLOB.first_names_female) brainfirstname = pick(GLOB.first_names_female)
var/brainopslastname = pick(GLOB.last_names) var/brainopslastname = pick(GLOB.last_names)
if(creator_op.nuke_team.syndicate_name) //the brain inside the syndiborg has the same last name as the other ops. if(creator_op.nuke_team.syndicate_name) //the brain inside the syndiborg has the same last name as the other ops.
brainopslastname = creator_op.nuke_team.syndicate_name brainopslastname = creator_op.nuke_team.syndicate_name
var/brainopsname = "[brainfirstname] [brainopslastname]" var/brainopsname = "[brainfirstname] [brainopslastname]"
R.mmi.name = "Man-Machine Interface: [brainopsname]" R.mmi.name = "Man-Machine Interface: [brainopsname]"
R.mmi.brain.name = "[brainopsname]'s brain" R.mmi.brain.name = "[brainopsname]'s brain"
R.mmi.brainmob.real_name = brainopsname R.mmi.brainmob.real_name = brainopsname
R.mmi.brainmob.name = brainopsname R.mmi.brainmob.name = brainopsname
R.real_name = R.name R.real_name = R.name
R.key = C.key R.key = C.key
var/datum/antagonist/nukeop/new_borg = new() var/datum/antagonist/nukeop/new_borg = new()
new_borg.send_to_spawnpoint = FALSE new_borg.send_to_spawnpoint = FALSE
R.mind.add_antag_datum(new_borg,creator_op.nuke_team) R.mind.add_antag_datum(new_borg,creator_op.nuke_team)
R.mind.special_role = "Syndicate Cyborg" R.mind.special_role = "Syndicate Cyborg"
///////////SLAUGHTER DEMON ///////////SLAUGHTER DEMON
/obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game /obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game
name = "vial of blood" name = "vial of blood"
desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures." desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
icon = 'icons/obj/wizard.dmi' icon = 'icons/obj/wizard.dmi'
icon_state = "vial" icon_state = "vial"
var/shatter_msg = "<span class='notice'>You shatter the bottle, no turning back now!</span>" var/shatter_msg = "<span class='notice'>You shatter the bottle, no turning back now!</span>"
var/veil_msg = "<span class='warning'>You sense a dark presence lurking just beyond the veil...</span>" var/veil_msg = "<span class='warning'>You sense a dark presence lurking just beyond the veil...</span>"
var/objective_verb = "Kill" var/mob/living/demon_type = /mob/living/simple_animal/slaughter
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) /obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
if(!is_station_level(user.z)) if(!is_station_level(user.z))
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>") to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
return return
if(used) if(used)
return return
var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src) var/list/demon_candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", null, null, ROLE_ALIEN, 50, src)
if(LAZYLEN(candidates)) if(demon_candidates.len)
if(used) if(used)
return return
used = TRUE used = 1
var/client/C = pick(candidates) var/mob/dead/observer/theghost = pick(demon_candidates)
spawn_antag(C, get_turf(src), initial(demon_type.name),user.mind) spawn_antag(theghost.client, get_turf(src), initial(demon_type.name),user.mind)
to_chat(user, shatter_msg) to_chat(user, shatter_msg)
to_chat(user, veil_msg) to_chat(user, veil_msg)
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1) playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
qdel(src) qdel(src)
else else
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>") to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user) /obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T) var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
var/mob/living/simple_animal/slaughter/S = new demon_type(holder) var/mob/living/simple_animal/slaughter/S = new demon_type(holder)
S.holder = holder S.holder = holder
S.key = C.key S.key = C.key
S.mind.assigned_role = S.name S.mind.assigned_role = S.name
S.mind.special_role = S.name S.mind.special_role = S.name
var/datum/objective/assassinate/new_objective S.mind.add_antag_datum(antag_type)
if(user) to_chat(S, S.playstyle_string)
new_objective = new /datum/objective/assassinate to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \
new_objective.owner = S.mind Ctrl+Click a blood pool to manifest.</B>")
new_objective.target = user
new_objective.explanation_text = "[objective_verb] [user.name], the one who summoned you." /obj/item/antag_spawner/slaughter_demon/laughter
S.mind.objectives += new_objective name = "vial of tickles"
var/datum/objective/new_objective2 = new /datum/objective desc = "A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures."
new_objective2.owner = S.mind icon = 'icons/obj/wizard.dmi'
new_objective2.explanation_text = "[objective_verb] everyone[user ? " else while you're at it":""]." icon_state = "vial"
S.mind.objectives += new_objective2 color = "#FF69B4" // HOT PINK
S.mind.add_antag_datum(/datum/antagonist/auto_custom)
to_chat(S, S.playstyle_string) veil_msg = "<span class='warning'>You sense an adorable presence lurking just beyond the veil...</span>"
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \ demon_type = /mob/living/simple_animal/slaughter/laughter
Ctrl+Click a blood pool to manifest.</B>") antag_type = /datum/antagonist/slaughter/laughter
if(new_objective)
to_chat(S, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
to_chat(S, "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]")
/obj/item/antag_spawner/slaughter_demon/laughter
name = "vial of tickles"
desc = "A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures."
icon = 'icons/obj/wizard.dmi'
icon_state = "vial"
color = "#FF69B4" // HOT PINK
veil_msg = "<span class='warning'>You sense an adorable presence lurking just beyond the veil...</span>"
objective_verb = "Hug and Tickle"
demon_type = /mob/living/simple_animal/slaughter/laughter

View File

@@ -27,8 +27,25 @@
/datum/team/proc/roundend_report() /datum/team/proc/roundend_report()
var/list/report = list() var/list/report = list()
report += "<b>[name]:</b>" report += "<span class='header'>[name]:</span>"
report += "The [member_name]s were:" report += "The [member_name]s were:"
report += printplayerlist(members) report += printplayerlist(members)
return report.Join("<br>") if(objectives.len)
report += "<span class='header'>Team had following objectives:</span>"
var/win = TRUE
var/objective_count = 1
for(var/datum/objective/objective in objectives)
if(objective.check_completion())
report += "<B>Objective #[objective_count]</B>: [objective.explanation_text] <span class='greentext'><B>Success!</span>"
else
report += "<B>Objective #[objective_count]</B>: [objective.explanation_text] <span class='redtext'>Fail.</span>"
win = FALSE
objective_count++
if(win)
report += "<span class='greentext'>The [name] was successful!</span>"
else
report += "<span class='redtext'>The [name] have failed!</span>"
return "<div class='panel redborder'>[report.Join("<br>")]</div>"

View File

@@ -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, "<B><font size=3 color=red>You are the [name].</font></B>")
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 += "<BR><B>Your Mission</B> : [ert_team.mission.explanation_text]"
to_chat(owner,missiondesc)

View File

@@ -126,6 +126,7 @@
form = null form = null
alpha = initial(alpha) alpha = initial(alpha)
color = initial(color) color = initial(color)
maptext = null
visible_message("<span class='warning'>[src] suddenly collapses in on itself, dissolving into a pile of green flesh!</span>", \ visible_message("<span class='warning'>[src] suddenly collapses in on itself, dissolving into a pile of green flesh!</span>", \
"<span class='notice'>You reform to your normal body.</span>") "<span class='notice'>You reform to your normal body.</span>")
@@ -226,7 +227,7 @@
player_mind.transfer_to(S) player_mind.transfer_to(S)
player_mind.assigned_role = "Morph" player_mind.assigned_role = "Morph"
player_mind.special_role = "Morph" player_mind.special_role = "Morph"
player_mind.add_antag_datum(/datum/antagonist/auto_custom) player_mind.add_antag_datum(/datum/antagonist/morph)
to_chat(S, S.playstyle_string) to_chat(S, S.playstyle_string)
SEND_SOUND(S, sound('sound/magic/mutate.ogg')) SEND_SOUND(S, sound('sound/magic/mutate.ogg'))
message_admins("[key_name_admin(S)] has been made into a morph by an event.") message_admins("[key_name_admin(S)] has been made into a morph by an event.")

View File

@@ -0,0 +1,6 @@
/datum/antagonist/morph
name = "Morph"
show_name_in_check_antagonists = TRUE
show_in_antagpanel = FALSE
//It does nothing! (Besides tracking)

View File

@@ -2,11 +2,11 @@
name = "Ninja" name = "Ninja"
antagpanel_category = "Ninja" antagpanel_category = "Ninja"
job_rank = ROLE_NINJA job_rank = ROLE_NINJA
show_name_in_check_antagonists = TRUE
var/helping_station = FALSE var/helping_station = FALSE
var/give_objectives = TRUE var/give_objectives = TRUE
var/give_equipment = TRUE var/give_equipment = TRUE
/datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override) /datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override)
var/mob/living/M = mob_override || owner.current var/mob/living/M = mob_override || owner.current
update_ninja_icons_added(M) update_ninja_icons_added(M)
@@ -141,9 +141,6 @@
message_admins("[key_name_admin(admin)] has [adj] ninja'ed [new_owner.current].") 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].") 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) /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] var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA]
ninjahud.join_hud(ninja) ninjahud.join_hud(ninja)

View File

@@ -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"

View File

@@ -37,7 +37,7 @@
player_mind.transfer_to(S) player_mind.transfer_to(S)
player_mind.assigned_role = "Slaughter Demon" player_mind.assigned_role = "Slaughter Demon"
player_mind.special_role = "Slaughter Demon" player_mind.special_role = "Slaughter Demon"
player_mind.add_antag_datum(/datum/antagonist/auto_custom) player_mind.add_antag_datum(/datum/antagonist/slaughter)
to_chat(S, S.playstyle_string) to_chat(S, S.playstyle_string)
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.</B>") to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.</B>")
SEND_SOUND(S, 'sound/magic/demon_dies.ogg') SEND_SOUND(S, 'sound/magic/demon_dies.ogg')

View File

@@ -1207,8 +1207,10 @@
#include "code\modules\antagonists\devil\sintouched\objectives.dm" #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\_true_devil.dm"
#include "code\modules\antagonists\devil\true_devil\inventory.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\monkey\monkey.dm"
#include "code\modules\antagonists\morph\morph.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\ninja\ninja.dm"
#include "code\modules\antagonists\nukeop\nukeop.dm" #include "code\modules\antagonists\nukeop\nukeop.dm"
#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm" #include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm"
@@ -1221,6 +1223,7 @@
#include "code\modules\antagonists\revenant\revenant_spawn_event.dm" #include "code\modules\antagonists\revenant\revenant_spawn_event.dm"
#include "code\modules\antagonists\revolution\revolution.dm" #include "code\modules\antagonists\revolution\revolution.dm"
#include "code\modules\antagonists\slaughter\slaughter.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\slaughter\slaughterevent.dm"
#include "code\modules\antagonists\swarmer\swarmer.dm" #include "code\modules\antagonists\swarmer\swarmer.dm"
#include "code\modules\antagonists\swarmer\swarmer_event.dm" #include "code\modules\antagonists\swarmer\swarmer_event.dm"