From c91006c27f1ef0c7d418518b9c2b54701099e663 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 12 Mar 2018 07:30:03 -0500 Subject: [PATCH] [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 --- code/__DEFINES/misc.dm | 2 +- code/datums/browser.dm | 24 +- code/datums/ert.dm | 55 ++++ code/game/objects/items/cards_ids.dm | 8 + .../objects/items/grenades/chem_grenade.dm | 17 + code/game/objects/items/holy_weapons.dm | 11 + code/game/objects/items/storage/boxes.dm | 9 + code/modules/admin/verbs/one_click_antag.dm | 294 ++++++++++-------- code/modules/antagonists/ert/ert.dm | 126 +++++--- code/modules/clothing/outfits/ert.dm | 70 +++++ .../reagents/reagent_containers/hypospray.dm | 7 + icons/obj/grenade.dmi | Bin 24053 -> 25246 bytes tgstation.dme | 1 + 13 files changed, 446 insertions(+), 178 deletions(-) create mode 100644 code/datums/ert.dm 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 9be47e5ef271622f57c48314d5aedd89477a2fb1..c003cf238e1dc4ec45ccfeaa0c1f1ae8de552fef 100644 GIT binary patch delta 5486 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 SZv3^XAVmdL`Eps);Qs+w-`>Fh delta 4284 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 J)o8lL{~waLKNSD~ 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"