diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index cd0a7ce97c..199535a04e 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -393,7 +393,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
//Dummy mob reserve slots
#define DUMMY_HUMAN_SLOT_PREFERENCES "dummy_preference_preview"
-
+#define DUMMY_HUMAN_SLOT_ADMIN "admintools"
#define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation"
#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
diff --git a/code/datums/browser.dm b/code/datums/browser.dm
index f1423bcf6e..fa5b054f48 100644
--- a/code/datums/browser.dm
+++ b/code/datums/browser.dm
@@ -312,8 +312,9 @@
/datum/browser/modal/preflikepicker
var/settings = list()
var/icon/preview_icon = null
+ var/datum/callback/preview_update
-/datum/browser/modal/preflikepicker/New(User,Message,Title,Button1="Ok",Button2,Button3,StealFocus = 1, Timeout = FALSE,list/settings,inputtype="checkbox", width = 400, height, slidecolor)
+/datum/browser/modal/preflikepicker/New(User,Message,Title,Button1="Ok",Button2,Button3,StealFocus = 1, Timeout = FALSE,list/settings,inputtype="checkbox", width = 600, height, slidecolor)
if (!User)
return
src.settings = settings
@@ -322,12 +323,20 @@
set_content(ShowChoices(User))
/datum/browser/modal/preflikepicker/proc/ShowChoices(mob/user)
+ if (settings["preview_callback"])
+ var/datum/callback/callback = settings["preview_callback"]
+ preview_icon = callback.Invoke(settings)
+ if (preview_icon)
+ user << browse_rsc(preview_icon, "previewicon.png")
var/dat = ""
for (var/name in settings["mainsettings"])
var/setting = settings["mainsettings"][name]
if (setting["type"] == "datum")
- dat += "[setting["desc"]]: [setting["value"]]
"
+ if (setting["subtypesonly"])
+ dat += "[setting["desc"]]: [setting["value"]]
"
+ else
+ dat += "[setting["desc"]]: [setting["value"]]
"
else
dat += "[setting["desc"]]: [setting["value"]]
"
@@ -354,7 +363,13 @@
var/setting = href_list["setting"]
switch (href_list["type"])
if ("datum")
- settings["mainsettings"][setting]["value"] = pick_closest_path(null, make_types_fancy(typesof(text2path(href_list["path"]))))
+ var/oldval = settings["mainsettings"][setting]["value"]
+ if (href_list["subtypesonly"])
+ settings["mainsettings"][setting]["value"] = pick_closest_path(null, make_types_fancy(subtypesof(text2path(href_list["path"]))))
+ else
+ settings["mainsettings"][setting]["value"] = pick_closest_path(null, make_types_fancy(typesof(text2path(href_list["path"]))))
+ if (isnull(settings["mainsettings"][setting]["value"]))
+ settings["mainsettings"][setting]["value"] = oldval
if ("string")
settings["mainsettings"][setting]["value"] = stripped_input(user, "Enter new value for [settings["mainsettings"][setting]["desc"]]", "Enter new value for [settings["mainsettings"][setting]["desc"]]")
if ("number")
@@ -363,6 +378,9 @@
settings["mainsettings"][setting]["value"] = input(user, "[settings["mainsettings"][setting]["desc"]]?") in list("Yes","No")
if ("ckey")
settings["mainsettings"][setting]["value"] = input(user, "[settings["mainsettings"][setting]["desc"]]?") in list("none") + GLOB.directory
+ if (settings["mainsettings"][setting]["callback"])
+ var/datum/callback/callback = settings["mainsettings"][setting]["callback"]
+ settings = callback.Invoke(settings)
if (href_list["button"])
var/button = text2num(href_list["button"])
if (button <= 3 && button >= 1)
diff --git a/code/datums/ert.dm b/code/datums/ert.dm
new file mode 100644
index 0000000000..d3c256308d
--- /dev/null
+++ b/code/datums/ert.dm
@@ -0,0 +1,55 @@
+/datum/ert
+ var/mobtype = /mob/living/carbon/human
+ var/team = /datum/team/ert
+ var/opendoors = TRUE
+ var/leader_role = /datum/antagonist/ert/commander
+ var/enforce_human = TRUE
+ var/roles = list(/datum/antagonist/ert/security, /datum/antagonist/ert/medic, /datum/antagonist/ert/engineer) //List of possible roles to be assigned to ERT members.
+ var/rename_team
+ var/code
+ var/mission = "Assist the station."
+ var/teamsize = 5
+ var/polldesc
+
+/datum/ert/New()
+ if (!polldesc)
+ polldesc = "a Code [code] Nanotrasen Emergency Response Team"
+
+/datum/ert/blue
+ opendoors = FALSE
+ code = "Blue"
+
+/datum/ert/amber
+ code = "Amber"
+
+/datum/ert/red
+ leader_role = /datum/antagonist/ert/commander/red
+ roles = list(/datum/antagonist/ert/security/red, /datum/antagonist/ert/medic/red, /datum/antagonist/ert/engineer/red)
+ code = "Red"
+
+/datum/ert/deathsquad
+ roles = list(/datum/antagonist/ert/deathsquad)
+ leader_role = /datum/antagonist/ert/deathsquad/leader
+ rename_team = "Deathsquad"
+ code = "Delta"
+ mission = "Leave no witnesses."
+ polldesc = "an elite Nanotrasen Strike Team"
+
+/datum/ert/centcom_official
+ code = "Green"
+ teamsize = 1
+ opendoors = FALSE
+ leader_role = /datum/antagonist/official
+ roles = list(/datum/antagonist/official)
+ rename_team = "CentCom Officials"
+ polldesc = "a CentCom Official"
+
+/datum/ert/centcom_official/New()
+ mission = "Conduct a routine performance review of [station_name()] and its Captain."
+
+/datum/ert/inquisition
+ roles = list(/datum/antagonist/ert/chaplain/inquisitor, /datum/antagonist/ert/security/inquisitor, /datum/antagonist/ert/medic/inquisitor)
+ leader_role = /datum/antagonist/ert/commander/inquisitor
+ rename_team = "Inquisition"
+ mission = "Destroy any traces of paranormal activity aboard the station."
+ polldesc = "a Nanotrasen paranormal response team"
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index f5d217f0b0..08e6204c63 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -293,6 +293,14 @@ update_label("John Doe", "Clowny")
access = get_all_accesses()+get_ert_access("med")-ACCESS_CHANGE_IDS
. = ..()
+/obj/item/card/id/ert/chaplain
+ registered_name = "Religious Response Officer"
+ assignment = "Religious Response Officer"
+
+/obj/item/card/id/ert/chaplain/Initialize()
+ access = get_all_accesses()+get_ert_access("sec")-ACCESS_CHANGE_IDS
+ . = ..()
+
/obj/item/card/id/prisoner
name = "prisoner ID card"
desc = "You are a number, you are not a free man."
diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm
index 2f08585309..a127201e41 100644
--- a/code/game/objects/items/grenades/chem_grenade.dm
+++ b/code/game/objects/items/grenades/chem_grenade.dm
@@ -550,3 +550,20 @@
beakers += B1
beakers += B2
+
+/obj/item/grenade/chem_grenade/holy
+ name = "holy hand grenade"
+ desc = "A vessel of concentrated religious might."
+ icon_state = "holy_grenade"
+ stage = READY
+
+/obj/item/grenade/chem_grenade/holy/Initialize()
+ . = ..()
+ var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src)
+
+ B1.reagents.add_reagent("potassium", 100)
+ B2.reagents.add_reagent("holywater", 100)
+
+ beakers += B1
+ beakers += B2
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 3c58cbb2a2..13ca2b35d6 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -274,6 +274,17 @@
qdel(S)
return ..()
+/obj/item/nullrod/scythe/talking/chainsword
+ icon_state = "chainswordon"
+ item_state = "chainswordon"
+ name = "possessed chainsaw sword"
+ desc = "Suffer not a heretic to live."
+ slot_flags = SLOT_BELT
+ force = 30
+ attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
+ hitsound = 'sound/weapons/chainsawhit.ogg'
+
+
/obj/item/nullrod/hammmer
icon_state = "hammeron"
item_state = "hammeron"
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index ca1e18af1b..9987784f97 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -942,3 +942,12 @@ obj/item/storage/box/clown
/obj/item/storage/box/fountainpens/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/pen/fountain(src)
+
+/obj/item/storage/box/holy_grenades
+ name = "box of holy hand grenades"
+ desc = "Contains several grenades used to rapidly purge heresy."
+ illustration = "flashbang"
+
+/obj/item/storage/box/holy_grenades/PopulateContents()
+ for(var/i in 1 to 7)
+ new/obj/item/grenade/chem_grenade/holy(src)
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 0246431e89..072c31b152 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -271,157 +271,177 @@
// DEATH SQUADS
/datum/admins/proc/makeDeathsquad()
- 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.")
- var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered to be a CentCom Official?", "deathsquad")
-
- if(candidates.len)
- var/mob/dead/observer/chosen_candidate = pick(candidates)
-
- //Create the official
- var/mob/living/carbon/human/newmob = new (pick(GLOB.emergencyresponseteamspawn))
- chosen_candidate.client.prefs.copy_to(newmob)
- newmob.real_name = newmob.dna.species.random_name(newmob.gender,1)
- newmob.dna.update_dna_identity()
- newmob.key = chosen_candidate.key
-
-
- //Job
- newmob.mind.assigned_role = "CentCom Official"
- newmob.mind.special_role = "official"
-
- //Mission
- var/datum/objective/missionobj = new
- missionobj.owner = newmob.mind
- missionobj.explanation_text = mission
- missionobj.completed = 1
-
- var/datum/antagonist/official/O = new
- O.mission = missionobj
-
- newmob.mind.add_antag_datum(O)
-
- //Logging and cleanup
- message_admins("CentCom Official [key_name_admin(newmob)] has spawned with the task: [mission]")
- log_game("[key_name(newmob)] has been selected as a CentCom Official")
-
- return 1
-
- return 0
+ return makeEmergencyresponseteam(/datum/ert/deathsquad)
// CENTCOM RESPONSE TEAM
-/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")
- alert = ERT_DEATHSQUAD
- teamsize = 5
- deathsquad = TRUE
- if("Red: Elite ERT (Armoury Access + Pulse Weapons)")
- alert = ERT_RED
- if("Amber: Full ERT (Armoury Access)")
- alert = ERT_AMBER
- if("Blue: Light ERT (No Armoury Access)")
- alert = ERT_BLUE
- if("Green: CentCom Official")
- return makeOfficial()
- 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)
+/datum/admins/proc/makeERTTemplateModified(list/settings)
+ . = settings
+ var/datum/ert/newtemplate = settings["mainsettings"]["template"]["value"]
+ if (isnull(newtemplate))
return
-
- 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 (!ispath(newtemplate))
+ newtemplate = text2path(newtemplate)
+ newtemplate = new newtemplate
+ .["mainsettings"]["teamsize"]["value"] = newtemplate.teamsize
+ .["mainsettings"]["mission"]["value"] = newtemplate.mission
+ .["mainsettings"]["polldesc"]["value"] = newtemplate.polldesc
- if(candidates.len > 0)
- //Pick the (un)lucky players
- var/numagents = min(teamsize,candidates.len) //How many officers to spawn
- //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
+/datum/admins/proc/equipAntagOnDummy(mob/living/carbon/human/dummy/mannequin, datum/antagonist/antag)
+ for(var/I in mannequin.get_equipped_items())
+ qdel(I)
+ if (ispath(antag, /datum/antagonist/ert))
+ var/datum/antagonist/ert/ert = antag
+ mannequin.equipOutfit(initial(ert.outfit), TRUE)
+ else if (ispath(antag, /datum/antagonist/official))
+ mannequin.equipOutfit(/datum/outfit/centcom_official, TRUE)
- //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)
+/datum/admins/proc/makeERTPreviewIcon(list/settings)
+ // Set up the dummy for its photoshoot
+ var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_ADMIN)
- var/list/spawnpoints = GLOB.emergencyresponseteamspawn
- while(numagents && candidates.len)
- if (numagents > spawnpoints.len)
+ var/prefs = settings["mainsettings"]
+ var/datum/ert/template = prefs["template"]["value"]
+ if (isnull(template))
+ return null
+ if (!ispath(template))
+ template = text2path(prefs["template"]["value"]) // new text2path ... doesn't compile in 511
+
+ template = new template
+ var/datum/antagonist/ert/ert = template.leader_role
+
+ equipAntagOnDummy(mannequin, ert)
+
+ COMPILE_OVERLAYS(mannequin)
+ CHECK_TICK
+ var/icon/preview_icon = icon('icons/effects/effects.dmi', "nothing")
+ preview_icon.Scale(48+32, 16+32)
+ CHECK_TICK
+ mannequin.setDir(NORTH)
+ var/icon/stamp = getFlatIcon(mannequin)
+ CHECK_TICK
+ preview_icon.Blend(stamp, ICON_OVERLAY, 25, 17)
+ CHECK_TICK
+ mannequin.setDir(WEST)
+ stamp = getFlatIcon(mannequin)
+ CHECK_TICK
+ preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9)
+ CHECK_TICK
+ mannequin.setDir(SOUTH)
+ stamp = getFlatIcon(mannequin)
+ CHECK_TICK
+ preview_icon.Blend(stamp, ICON_OVERLAY, 49, 1)
+ CHECK_TICK
+ preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser.
+ CHECK_TICK
+ unset_busy_human_dummy(DUMMY_HUMAN_SLOT_ADMIN)
+ return preview_icon
+
+/datum/admins/proc/makeEmergencyresponseteam(var/datum/ert/ertemplate = null)
+ if (ertemplate)
+ ertemplate = new ertemplate
+ else
+ ertemplate = new /datum/ert/centcom_official
+
+ var/list/settings = list(
+ "preview_callback" = CALLBACK(src, .proc/makeERTPreviewIcon),
+ "mainsettings" = list(
+ "template" = list("desc" = "Template", "callback" = CALLBACK(src, .proc/makeERTTemplateModified), "type" = "datum", "path" = "/datum/ert", "subtypesonly" = TRUE, "value" = ertemplate.type),
+ "teamsize" = list("desc" = "Team Size", "type" = "number", "value" = ertemplate.teamsize),
+ "mission" = list("desc" = "Mission", "type" = "string", "value" = ertemplate.mission),
+ "polldesc" = list("desc" = "Ghost poll description", "string" = "text", "value" = ertemplate.polldesc),
+ "enforce_human" = list("desc" = "Enforce human authority", "type" = "boolean", "value" = "[(CONFIG_GET(flag/enforce_human_authority) ? "Yes" : "No")]"),
+ )
+ )
+
+ var/list/prefreturn = presentpreflikepicker(usr,"Customize ERT", "Customize ERT", Button1="Ok", width = 600, StealFocus = 1,Timeout = 0, settings=settings)
+
+ if (isnull(prefreturn))
+ return FALSE
+
+ if (prefreturn["button"] == 1)
+ var/list/prefs = settings["mainsettings"]
+
+ var/templtype = prefs["template"]["value"]
+ if (!ispath(prefs["template"]["value"]))
+ templtype = text2path(prefs["template"]["value"]) // new text2path ... doesn't compile in 511
+
+ if (ertemplate.type != templtype)
+ ertemplate = new templtype
+
+ ertemplate.teamsize = prefs["teamsize"]["value"]
+ ertemplate.mission = prefs["mission"]["value"]
+ ertemplate.polldesc = prefs["polldesc"]["value"]
+ ertemplate.enforce_human = prefs["enforce_human"]["value"] == "Yes" ? TRUE : FALSE
+
+ var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null)
+ var/teamSpawned = FALSE
+
+ if(candidates.len > 0)
+ //Pick the (un)lucky players
+ var/numagents = min(ertemplate.teamsize,candidates.len)
+
+ //Create team
+ var/datum/team/ert/ert_team = new ertemplate.team
+ if(ertemplate.rename_team)
+ ert_team.name = ertemplate.rename_team
+
+ //Asign team objective
+ var/datum/objective/missionobj = new
+ missionobj.team = ert_team
+ missionobj.explanation_text = ertemplate.mission
+ missionobj.completed = TRUE
+ ert_team.objectives += missionobj
+ ert_team.mission = missionobj
+
+ 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 the body
+ var/mob/living/carbon/human/ERTOperative = new ertemplate.mobtype(spawnloc)
+ chosen_candidate.client.prefs.copy_to(ERTOperative)
+ ERTOperative.key = chosen_candidate.key
+
+ if(ertemplate.enforce_human || ERTOperative.dna.species.dangerous_existence) // Don't want any exploding plasmemes
+ ERTOperative.set_species(/datum/species/human)
+
+ //Give antag datum
+ var/datum/antagonist/ert/ert_antag
+
+ if(numagents == 1)
+ ert_antag = new ertemplate.leader_role
+ else
+ ert_antag = ertemplate.roles[WRAP(numagents,1,length(ertemplate.roles) + 1)]
+ ert_antag = new ert_antag
+
+ 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--
- 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
+ teamSpawned++
- //Spawn the body
- var/mob/living/carbon/human/ERTOperative = new(spawnloc)
- chosen_candidate.client.prefs.copy_to(ERTOperative)
- ERTOperative.key = chosen_candidate.key
-
- if(CONFIG_GET(flag/enforce_human_authority))
- ERTOperative.set_species(/datum/species/human)
+ if (teamSpawned)
+ message_admins("[ertemplate.polldesc] has spawned with the mission: [ertemplate.mission]")
- //Give antag datum
- var/datum/antagonist/ert/ert_antag = new
- ert_antag.high_alert = alert == ERT_RED
- if(numagents == 1)
- 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)
+ if(ertemplate.opendoors)
for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks)
- spawn(0)
- door.open()
- return 1
+ door.open()
+ CHECK_TICK
+ return TRUE
else
- return 0
+ return FALSE
return
diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm
index 7a573e34d1..f1e1d92c9d 100644
--- a/code/modules/antagonists/ert/ert.dm
+++ b/code/modules/antagonists/ert/ert.dm
@@ -6,8 +6,10 @@
/datum/antagonist/ert
name = "Emergency Response Officer"
var/datum/team/ert/ert_team
- var/role = ERT_SEC
- var/high_alert = FALSE
+ var/leader = FALSE
+ var/datum/outfit/outfit = /datum/outfit/ert/security
+ var/role = "Security Officer"
+ var/list/name_source
show_in_antagpanel = FALSE
antag_moodlet = /datum/mood_event/focused
@@ -20,25 +22,76 @@
/datum/antagonist/ert/get_team()
return ert_team
+/datum/antagonist/ert/New()
+ . = ..()
+ name_source = GLOB.last_names
+
/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)
+ owner.current.fully_replace_character_name(owner.current.real_name,"[role] [pick(name_source)]")
+
+/datum/antagonist/ert/deathsquad/New()
+ . = ..()
+ name_source = GLOB.commando_names
+
+/datum/antagonist/ert/security // kinda handled by the base template but here for completion
+
+/datum/antagonist/ert/security/red
+ outfit = /datum/outfit/ert/security/alert
+
+/datum/antagonist/ert/engineer
+ role = "Engineer"
+ outfit = /datum/outfit/ert/engineer
+
+/datum/antagonist/ert/engineer/red
+ outfit = /datum/outfit/ert/engineer/alert
+
+/datum/antagonist/ert/medic
+ role = "Medical Officer"
+ outfit = /datum/outfit/ert/medic
+
+/datum/antagonist/ert/medic/red
+ outfit = /datum/outfit/ert/medic/alert
+
+/datum/antagonist/ert/commander
+ role = "Commander"
+ outfit = /datum/outfit/ert/commander
+
+/datum/antagonist/ert/commander/red
+ outfit = /datum/outfit/ert/commander/alert
+
+/datum/antagonist/ert/deathsquad
+ name = "Deathsquad Trooper"
+ outfit = /datum/outfit/death_commando
+ role = "Trooper"
+
+/datum/antagonist/ert/medic/inquisitor
+ outfit = /datum/outfit/ert/medic/inquisitor
+
+/datum/antagonist/ert/security/inquisitor
+ outfit = /datum/outfit/ert/security/inquisitor
+
+/datum/antagonist/ert/chaplain
+ role = "Chaplain"
+ outfit = /datum/outfit/ert/chaplain
+
+/datum/antagonist/ert/chaplain/inquisitor
+ outfit = /datum/outfit/ert/chaplain/inquisitor
+
+/datum/antagonist/ert/chaplain/on_gain()
+ . = ..()
+ owner.isholy = TRUE
+
+/datum/antagonist/ert/commander/inquisitor
+ outfit = /datum/outfit/ert/commander/inquisitor
+
+/datum/antagonist/ert/commander/inquisitor/on_gain()
+ . = ..()
+ owner.isholy = TRUE
+
+/datum/antagonist/ert/deathsquad/leader
+ name = "Deathsquad Officer"
+ outfit = /datum/outfit/death_commando
+ role = "Officer"
/datum/antagonist/ert/create_team(datum/team/ert/new_team)
if(istype(new_team))
@@ -53,28 +106,12 @@
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."
@@ -82,8 +119,23 @@
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)
+
+/datum/antagonist/ert/deathsquad/greet()
+ if(!ert_team)
+ return
+
+ 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."
+
+ missiondesc += "
Your Mission : [ert_team.mission.explanation_text]"
+ to_chat(owner,missiondesc)
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 403b81211d..422d4735b2 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -191,3 +191,73 @@
W.assignment = "CentCom Official"
W.registered_name = H.real_name
W.update_label()
+
+/datum/outfit/ert/commander/inquisitor
+ name = "Inquisition Commander"
+ r_hand = /obj/item/nullrod/scythe/talking/chainsword
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal
+ backpack_contents = list(/obj/item/storage/box/engineer=1,
+ /obj/item/clothing/mask/gas/sechailer=1,
+ /obj/item/gun/energy/e_gun=1)
+
+/datum/outfit/ert/security/inquisitor
+ name = "Inquisition Security"
+
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
+
+ backpack_contents = list(/obj/item/storage/box/engineer=1,
+ /obj/item/storage/box/handcuffs=1,
+ /obj/item/clothing/mask/gas/sechailer=1,
+ /obj/item/gun/energy/e_gun/stun=1,
+ /obj/item/melee/baton/loaded=1,
+ /obj/item/construction/rcd/loaded=1)
+
+/datum/outfit/ert/medic/inquisitor
+ name = "Inquisition Medic"
+
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
+
+ backpack_contents = list(/obj/item/storage/box/engineer=1,
+ /obj/item/melee/baton/loaded=1,
+ /obj/item/clothing/mask/gas/sechailer=1,
+ /obj/item/gun/energy/e_gun=1,
+ /obj/item/reagent_containers/hypospray/combat=1,
+ /obj/item/reagent_containers/hypospray/combat/heresypurge=1,
+ /obj/item/gun/medbeam=1)
+
+/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ ..()
+
+ if(visualsOnly)
+ return
+
+ var/obj/item/device/radio/R = H.ears
+ R.keyslot = new /obj/item/device/encryptionkey/heads/hop
+ R.recalculateChannels()
+
+/datum/outfit/ert/chaplain
+ name = "ERT Chaplain"
+
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor // Chap role always gets this suit
+ id = /obj/item/card/id/ert/chaplain
+ glasses = /obj/item/clothing/glasses/hud/health
+ back = /obj/item/storage/backpack/cultpack
+ belt = /obj/item/storage/belt/soulstone
+ backpack_contents = list(/obj/item/storage/box/engineer=1,
+ /obj/item/nullrod=1,
+ /obj/item/clothing/mask/gas/sechailer=1,
+ /obj/item/gun/energy/e_gun=1,
+ )
+
+/datum/outfit/ert/chaplain/inquisitor
+ name = "Inquisition Chaplain"
+
+ suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
+
+ belt = /obj/item/storage/belt/soulstone/full
+ backpack_contents = list(/obj/item/storage/box/engineer=1,
+ /obj/item/storage/box/holy_grenades=1,
+ /obj/item/nullrod=1,
+ /obj/item/clothing/mask/gas/sechailer=1,
+ /obj/item/gun/energy/e_gun=1,
+ )
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 7afba472ba..5ae253022f 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -167,3 +167,10 @@
volume = 1
amount_per_transfer_from_this = 1
list_reagents = list("unstablemutationtoxin" = 1)
+
+/obj/item/reagent_containers/hypospray/combat/heresypurge
+ name = "holy water autoinjector"
+ desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with 5 doses of a holy water mixture."
+ volume = 250
+ list_reagents = list("holywater" = 150, "tiresolution" = 50, "dizzysolution" = 50)
+ amount_per_transfer_from_this = 50
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index 9be47e5ef2..c003cf238e 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 9a895971c3..ad9623390b 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -276,6 +276,7 @@
#include "code\datums\dog_fashion.dm"
#include "code\datums\embedding_behavior.dm"
#include "code\datums\emotes.dm"
+#include "code\datums\ert.dm"
#include "code\datums\explosion.dm"
#include "code\datums\forced_movement.dm"
#include "code\datums\holocall.dm"