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"