mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 09:54:52 +00:00
[MIRROR] Create ERT refactor (#5924)
* Create ERT refactor (#36321) cl Naksu admin: ERT creation has been refactored to allow for easier customization and deployment via templates and settings /cl * Create ERT refactor
This commit is contained in:
committed by
Poojawa
parent
6a65ed49d0
commit
c91006c27f
@@ -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
|
||||
|
||||
@@ -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 += "<b>[setting["desc"]]:</b> <a href='?src=[REF(src)];setting=[name];task=input;type=datum;path=[setting["path"]]'>[setting["value"]]</a><BR>"
|
||||
if (setting["subtypesonly"])
|
||||
dat += "<b>[setting["desc"]]:</b> <a href='?src=[REF(src)];setting=[name];task=input;subtypesonly=1;type=datum;path=[setting["path"]]'>[setting["value"]]</a><BR>"
|
||||
else
|
||||
dat += "<b>[setting["desc"]]:</b> <a href='?src=[REF(src)];setting=[name];task=input;type=datum;path=[setting["path"]]'>[setting["value"]]</a><BR>"
|
||||
else
|
||||
dat += "<b>[setting["desc"]]:</b> <a href='?src=[REF(src)];setting=[name];task=input;type=[setting["type"]]'>[setting["value"]]</a><BR>"
|
||||
|
||||
@@ -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)
|
||||
|
||||
55
code/datums/ert.dm
Normal file
55
code/datums/ert.dm
Normal file
@@ -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"
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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, "<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."
|
||||
@@ -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 += "<BR><B>Your Mission</B> : [ert_team.mission.explanation_text]"
|
||||
to_chat(owner,missiondesc)
|
||||
|
||||
/datum/antagonist/ert/deathsquad/greet()
|
||||
if(!ert_team)
|
||||
return
|
||||
|
||||
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."
|
||||
|
||||
missiondesc += "<BR><B>Your Mission</B> : [ert_team.mission.explanation_text]"
|
||||
to_chat(owner,missiondesc)
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 25 KiB |
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user