diff --git a/_maps/Prefab/Departments.dmm b/_maps/Prefab/Departments.dmm index bf4f39c690325..a407814bb9f91 100644 --- a/_maps/Prefab/Departments.dmm +++ b/_maps/Prefab/Departments.dmm @@ -360,20 +360,6 @@ "ic" = ( /turf/open/floor/wood, /area/security/detectives_office) -"ir" = ( -/obj/effect/turf_decal/tile/purple/fourcorners/contrasted, -/obj/item/reagent_containers/cup/bucket{ - pixel_x = 11; - pixel_y = -5 - }, -/obj/item/mop{ - pixel_x = -6; - pixel_y = 3 - }, -/obj/item/key/janitor, -/obj/vehicle/ridden/janicart, -/turf/open/floor/iron, -/area/janitor) "iw" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners/contrasted{ alpha = 180; @@ -1695,6 +1681,20 @@ /obj/machinery/deepfryer, /turf/open/floor/iron/freezer, /area/crew_quarters/kitchen) +"Rt" = ( +/obj/effect/turf_decal/tile/purple/fourcorners/contrasted, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = 11; + pixel_y = -5 + }, +/obj/item/mop{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/key/janitor, +/obj/vehicle/ridden/janicart, +/turf/open/floor/iron, +/area/janitor) "RA" = ( /obj/structure/closet/secure_closet/freezer/kitchen, /turf/open/floor/iron/freezer, @@ -2651,7 +2651,7 @@ Zj Bo "} (29,1,1) = {" -ir +Rt SY PP ZU diff --git a/_maps/shuttles/hunter/hunter_bounty.dmm b/_maps/shuttles/hunter/hunter_bounty.dmm index ec8b4afb4c495..30b300768d265 100644 --- a/_maps/shuttles/hunter/hunter_bounty.dmm +++ b/_maps/shuttles/hunter/hunter_bounty.dmm @@ -19,23 +19,6 @@ }, /turf/open/floor/iron/tech/grid, /area/shuttle/hunter) -"aw" = ( -/obj/effect/turf_decal/edges/techfloor/corners{ - dir = 8 - }, -/obj/structure/reagent_dispensers/watertank, -/obj/structure/railing{ - dir = 1 - }, -/obj/effect/turf_decal/delivery, -/obj/item/mop, -/obj/item/reagent_containers/cup/bucket, -/obj/machinery/airalarm/directional/east{ - req_access = null; - req_access_txt = "181" - }, -/turf/open/floor/iron/tech, -/area/shuttle/hunter) "az" = ( /obj/structure/lattice/catwalk/over, /obj/structure/cable/yellow{ @@ -624,6 +607,23 @@ /obj/effect/turf_decal/delivery/white, /turf/open/floor/iron/ridged/steel, /area/shuttle/hunter) +"CZ" = ( +/obj/effect/turf_decal/edges/techfloor/corners{ + dir = 8 + }, +/obj/structure/reagent_dispensers/watertank, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/item/mop, +/obj/item/reagent_containers/cup/bucket, +/obj/machinery/airalarm/directional/east{ + req_access = null; + req_access_txt = "181" + }, +/turf/open/floor/iron/tech, +/area/shuttle/hunter) "De" = ( /obj/structure/lattice/catwalk/over, /obj/effect/turf_decal/stripes/line{ @@ -1217,7 +1217,7 @@ nn (9,1,1) = {" Lo nn -aw +CZ sS nn jl diff --git a/beestation.dme b/beestation.dme index 2e6b25ac1173c..1be98654454c6 100644 --- a/beestation.dme +++ b/beestation.dme @@ -2129,7 +2129,6 @@ #include "code\modules\antagonists\obsessed\objectives\protect.dm" #include "code\modules\antagonists\obsessed\objectives\spend_time.dm" #include "code\modules\antagonists\obsessed\objectives\steal_heirloom.dm" -#include "code\modules\antagonists\official\official.dm" #include "code\modules\antagonists\pirate\pirate.dm" #include "code\modules\antagonists\prisoner\prisoner.dm" #include "code\modules\antagonists\revenant\revenant.dm" diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 221994f501551..0603a497c1046 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -391,7 +391,7 @@ if ("color") settings["mainsettings"][setting]["value"] = input(user, "Enter new value for [settings["mainsettings"][setting]["desc"]]", "Enter new value for [settings["mainsettings"][setting]["desc"]]", settings["mainsettings"][setting]["value"]) as color if ("boolean") - settings["mainsettings"][setting]["value"] = input(user, "[settings["mainsettings"][setting]["desc"]]?") in list("Yes","No") + settings["mainsettings"][setting]["value"] = (settings["mainsettings"][setting]["value"] == "Yes") ? "No" : "Yes" if ("ckey") settings["mainsettings"][setting]["value"] = input(user, "[settings["mainsettings"][setting]["desc"]]?") in list("none") + GLOB.directory if (settings["mainsettings"][setting]["callback"]) diff --git a/code/datums/ert.dm b/code/datums/ert.dm index 929f9b754ac2c..adac6d4d1a5db 100644 --- a/code/datums/ert.dm +++ b/code/datums/ert.dm @@ -10,6 +10,12 @@ var/mission = "Assist the station." var/teamsize = 5 var/polldesc + /// If TRUE, gives the team members "[role] [random last name]" style names + var/random_names = TRUE + /// If TRUE, the admin who created the response team will be spawned in the briefing room in their preferred briefing outfit (assuming they're a ghost) + var/spawn_admin = FALSE + /// If TRUE, we try and pick one of the most experienced players who volunteered to fill the leader slot + var/leader_experience = TRUE /datum/ert/New() if (!polldesc) @@ -39,10 +45,12 @@ code = "Green" teamsize = 1 opendoors = FALSE - leader_role = /datum/antagonist/official - roles = list(/datum/antagonist/official) + leader_role = /datum/antagonist/ert/official + roles = list(/datum/antagonist/ert/official) rename_team = "CentCom Officials" polldesc = "a CentCom Official" + random_names = FALSE + leader_experience = FALSE /datum/ert/centcom_official/New() mission = "Conduct a routine performance review of [station_name()] and its Captain." @@ -80,6 +88,12 @@ rename_team = "Horde of Interns" mission = "Assist in conflict resolution." polldesc = "an unpaid internship opportunity with Nanotrasen" + random_names = FALSE + +/datum/ert/intern/unarmed + roles = list(/datum/antagonist/ert/intern/unarmed) + leader_role = /datum/antagonist/ert/intern/leader/unarmed + rename_team = "Unarmed Horde of Interns" /datum/ert/lawyer roles = list(/datum/antagonist/ert/lawyer) @@ -127,3 +141,13 @@ mission = "Eliminate the kudzu with extreme prejudice" polldesc = "an elite gardening team" code = "Vine Green" + +/datum/ert/bounty_hunters + roles = list(/datum/antagonist/ert/bounty_armor, /datum/antagonist/ert/bounty_hook, /datum/antagonist/ert/bounty_synth) + leader_role = /datum/antagonist/ert/bounty_armor + teamsize = 3 + opendoors = FALSE + rename_team = "Bounty Hunters" + mission = "Assist the station in catching perps, dead or alive." + polldesc = "a Centcom-hired bounty hunting gang" + random_names = FALSE diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 85e3d42c0d997..417f8846f0796 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -769,6 +769,16 @@ update_label("John Doe", "Clowny") assignment = "CentCom Attorney" icon_state = "centcom" +/// Trim for Bounty Hunters hired by centcom. +/obj/item/card/id/silver/bounty/ert + registered_name = "Bounty Hunter" + assignment = "Bounty Hunter" + icon_state = "ert" + +/obj/item/card/id/silver/bounty/ert/Initialize(mapload) + . = ..() + access = list(ACCESS_CENT_GENERAL) + /obj/item/card/id/ert/lawyer/Initialize(mapload) . = ..() access = list(ACCESS_CENT_GENERAL, ACCESS_COURT, ACCESS_BRIG, ACCESS_FORENSICS_LOCKERS) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 99c15742591fe..ac936aa73f97c 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -1,3 +1,6 @@ +/// If we spawn an ERT with the "choose experienced leader" option, select the leader from the top X playtimes +#define ERT_EXPERIENCED_LEADER_CHOOSE_TOP 3 + /client/proc/one_click_antag() set name = "Create Antagonist" set desc = "Auto-create an antagonist of your choice" @@ -255,6 +258,9 @@ .["mainsettings"]["mission"]["value"] = newtemplate.mission .["mainsettings"]["polldesc"]["value"] = newtemplate.polldesc .["mainsettings"]["open_armory"]["value"] = newtemplate.opendoors ? "Yes" : "No" + .["mainsettings"]["leader_experience"]["value"] = newtemplate.leader_experience ? "Yes" : "No" + .["mainsettings"]["random_names"]["value"] = newtemplate.random_names ? "Yes" : "No" + .["mainsettings"]["spawn_admin"]["value"] = newtemplate.spawn_admin ? "Yes" : "No" /datum/admins/proc/equipAntagOnDummy(mob/living/carbon/human/dummy/mannequin, datum/antagonist/antag) @@ -263,8 +269,6 @@ 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) /datum/admins/proc/makeERTPreviewIcon(list/settings) // Set up the dummy for its photoshoot @@ -322,6 +326,9 @@ "polldesc" = list("desc" = "Ghost poll description", "type" = "string", "value" = ertemplate.polldesc), "enforce_human" = list("desc" = "Enforce human authority", "type" = "boolean", "value" = "[(CONFIG_GET(flag/enforce_human_authority) ? "Yes" : "No")]"), "open_armory" = list("desc" = "Open armory doors", "type" = "boolean", "value" = "[(ertemplate.opendoors ? "Yes" : "No")]"), + "leader_experience" = list("desc" = "Pick an experienced leader", "type" = "boolean", "value" = "[(ertemplate.leader_experience ? "Yes" : "No")]"), + "random_names" = list("desc" = "Randomize names", "type" = "boolean", "value" = "[(ertemplate.random_names ? "Yes" : "No")]"), + "spawn_admin" = list("desc" = "Spawn yourself as briefing officer", "type" = "boolean", "value" = "[(ertemplate.spawn_admin ? "Yes" : "No")]") ) ) @@ -343,77 +350,109 @@ 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 - ertemplate.opendoors = prefs["open_armory"]["value"] == "Yes" ? TRUE : FALSE + ertemplate.enforce_human = prefs["enforce_human"]["value"] == "Yes" // these next 5 are effectively toggles + ertemplate.opendoors = prefs["open_armory"]["value"] == "Yes" + ertemplate.leader_experience = prefs["leader_experience"]["value"] == "Yes" + ertemplate.random_names = prefs["random_names"]["value"] == "Yes" + ertemplate.spawn_admin = prefs["spawn_admin"]["value"] == "Yes" + + var/list/spawnpoints = GLOB.emergencyresponseteamspawn + var/index = 0 + + if(ertemplate.spawn_admin) + if(isobserver(usr)) + var/mob/living/carbon/human/admin_officer = new (spawnpoints[1]) + var/chosen_outfit = usr.client?.prefs?.read_preference(/datum/preference/choiced/brief_outfit) + usr.client.prefs.safe_transfer_prefs_to(admin_officer, is_antag = TRUE) + admin_officer.equipOutfit(chosen_outfit) + admin_officer.key = usr.key + else + to_chat(usr, "Could not spawn you in as briefing officer as you are not a ghost!") var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you wish to be considered for [ertemplate.polldesc] ?", ROLE_ERT, req_hours = 50) 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 + if(candidates.len == 0) + return FALSE - //Spawn the body - var/mob/living/carbon/human/ERTOperative = new ertemplate.mobtype(spawnloc) - chosen_candidate.client.prefs.safe_transfer_prefs_to(ERTOperative, is_antag = TRUE) - ERTOperative.key = chosen_candidate.key - log_objective(ERTOperative, missionobj.explanation_text) - - if(ertemplate.enforce_human || !(ERTOperative.dna.species.changesource_flags & ERT_SPAWN)) // 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-- - teamSpawned++ - - if (teamSpawned) - message_admins("[ertemplate.polldesc] has spawned with the mission: [ertemplate.mission]") - - //Open the Armory doors - if(ertemplate.opendoors) - for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks) - door.open() - CHECK_TICK - return TRUE + //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 + + //Assign 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/mob/dead/observer/earmarked_leader + var/leader_spawned = FALSE // just in case the earmarked leader disconnects or becomes unavailable, we can try giving leader to the last guy to get chosen + + if(ertemplate.leader_experience) + var/list/candidate_living_exps = list() + for(var/i in candidates) + var/mob/dead/observer/potential_leader = i + candidate_living_exps[potential_leader] = potential_leader.client?.get_exp_living(TRUE) + + candidate_living_exps = sort_list(candidate_living_exps, cmp=/proc/cmp_numeric_dsc) + if(candidate_living_exps.len > ERT_EXPERIENCED_LEADER_CHOOSE_TOP) + candidate_living_exps = candidate_living_exps.Cut(ERT_EXPERIENCED_LEADER_CHOOSE_TOP+1) // pick from the top ERT_EXPERIENCED_LEADER_CHOOSE_TOP contenders in playtime + earmarked_leader = pick(candidate_living_exps) else - return FALSE + earmarked_leader = pick(candidates) + + while(numagents && candidates.len) + var/spawnloc = spawnpoints[index+1] + //loop through spawnpoints one at a time + index = (index + 1) % spawnpoints.len + var/mob/dead/observer/chosen_candidate = earmarked_leader || pick(candidates) // this way we make sure that our leader gets chosen + candidates -= chosen_candidate + if(!chosen_candidate?.key) + continue + + //Spawn the body + var/mob/living/carbon/human/ert_operative = new ertemplate.mobtype(spawnloc) + chosen_candidate.client.prefs.safe_transfer_prefs_to(ert_operative, is_antag = TRUE) + ert_operative.key = chosen_candidate.key + + if(ertemplate.enforce_human || !(ert_operative.dna.species.changesource_flags & ERT_SPAWN)) // Don't want any exploding plasmemes + ert_operative.set_species(/datum/species/human) + + //Give antag datum + var/datum/antagonist/ert/ert_antag + + if((chosen_candidate == earmarked_leader) || (numagents == 1 && !leader_spawned)) + ert_antag = new ertemplate.leader_role () + earmarked_leader = null + leader_spawned = TRUE + else + ert_antag = ertemplate.roles[WRAP(numagents,1,length(ertemplate.roles) + 1)] + ert_antag = new ert_antag () + ert_antag.random_names = ertemplate.random_names + + ert_operative.mind.add_antag_datum(ert_antag,ert_team) + ert_operative.mind.assigned_role = ert_antag.name + + //Logging and cleanup + log_game("[key_name(ert_operative)] has been selected as an [ert_antag.name]") + numagents-- + teamSpawned++ + + if (teamSpawned) + message_admins("[ertemplate.polldesc] has spawned with the mission: [ertemplate.mission]") + + //Open the Armory doors + if(ertemplate.opendoors) + for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks) + door.open() + CHECK_TICK + return TRUE return @@ -425,3 +464,5 @@ /datum/admins/proc/makeRevenant() new /datum/round_event/ghost_role/revenant(TRUE, TRUE) return 1 + +#undef ERT_EXPERIENCED_LEADER_CHOOSE_TOP diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 4312278babd66..d9e8f23b62be3 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -12,7 +12,7 @@ name = "Emergency Response Officer" var/datum/team/ert/ert_team var/leader = FALSE - var/datum/outfit/outfit = /datum/outfit/ert/security + var/datum/outfit/outfit = /datum/outfit/centcom/ert/security var/datum/outfit/plasmaman_outfit = /datum/outfit/plasmaman/ert var/role = JOB_NAME_SECURITYOFFICER var/list/name_source @@ -55,47 +55,77 @@ /datum/antagonist/ert/deathsquad/remove_innate_effects(mob/living/mob_override) REMOVE_TRAIT(owner, TRAIT_DISK_VERIFIER, DEATHSQUAD_TRAIT) +/datum/antagonist/ert/official + name = JOB_CENTCOM_OFFICIAL + show_name_in_check_antagonists = TRUE + show_in_antagpanel = FALSE + can_elimination_hijack = ELIMINATION_PREVENT + var/datum/objective/mission + show_to_ghosts = TRUE + banning_key = ROLE_ERT + random_names = FALSE + outfit = /datum/outfit/centcom/centcom_official + +/datum/antagonist/ert/official/greet() + to_chat(owner, "You are a CentCom Official.") + if (ert_team) + to_chat(owner, "Central Command is sending you to [station_name()] with the task: [ert_team.mission.explanation_text]") + else + to_chat(owner, "Central Command is sending you to [station_name()] with the task: [mission.explanation_text]") + +/datum/antagonist/ert/official/forge_objectives() + if (ert_team) + return ..() + if(mission) + return + var/datum/objective/missionobj = new () + missionobj.owner = owner + missionobj.explanation_text = "Conduct a routine performance review of [station_name()] and its Captain." + missionobj.completed = TRUE + mission = missionobj + objectives |= mission + /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 + outfit = /datum/outfit/centcom/ert/security/alert /datum/antagonist/ert/engineer role = "Engineer" - outfit = /datum/outfit/ert/engineer + outfit = /datum/outfit/centcom/ert/engineer /datum/antagonist/ert/engineer/red - outfit = /datum/outfit/ert/engineer/alert + outfit = /datum/outfit/centcom/ert/engineer/alert /datum/antagonist/ert/medic role = JOB_CENTCOM_MEDICAL_DOCTOR - outfit = /datum/outfit/ert/medic + outfit = /datum/outfit/centcom/ert/medic /datum/antagonist/ert/medic/red - outfit = /datum/outfit/ert/medic/alert + outfit = /datum/outfit/centcom/ert/medic/alert /datum/antagonist/ert/commander role = "Commander" - outfit = /datum/outfit/ert/commander + outfit = /datum/outfit/centcom/ert/commander /datum/antagonist/ert/commander/red - outfit = /datum/outfit/ert/commander/alert + outfit = /datum/outfit/centcom/ert/commander/alert /datum/antagonist/ert/deathsquad name = "Deathsquad Trooper" - outfit = /datum/outfit/death_commando + outfit = /datum/outfit/centcom/death_commando role = "Trooper" plasmaman_outfit = /datum/outfit/plasmaman/death_commando /datum/antagonist/ert/medic/inquisitor - outfit = /datum/outfit/ert/medic/inquisitor + outfit = /datum/outfit/centcom/ert/medic/inquisitor /datum/antagonist/ert/medic/inquisitor/on_gain() . = ..() owner.holy_role = HOLY_ROLE_PRIEST /datum/antagonist/ert/security/inquisitor - outfit = /datum/outfit/ert/security/inquisitor + outfit = /datum/outfit/centcom/ert/security/inquisitor /datum/antagonist/ert/security/inquisitor/on_gain() . = ..() @@ -103,17 +133,17 @@ /datum/antagonist/ert/chaplain role = JOB_NAME_CHAPLAIN - outfit = /datum/outfit/ert/chaplain + outfit = /datum/outfit/centcom/ert/chaplain /datum/antagonist/ert/chaplain/inquisitor - outfit = /datum/outfit/ert/chaplain/inquisitor + outfit = /datum/outfit/centcom/ert/chaplain/inquisitor /datum/antagonist/ert/chaplain/on_gain() . = ..() owner.holy_role = HOLY_ROLE_PRIEST /datum/antagonist/ert/commander/inquisitor - outfit = /datum/outfit/ert/commander/inquisitor + outfit = /datum/outfit/centcom/ert/commander/inquisitor /datum/antagonist/ert/commander/inquisitor/on_gain() . = ..() @@ -121,54 +151,61 @@ /datum/antagonist/ert/janitor role = JOB_NAME_JANITOR - outfit = /datum/outfit/ert/janitor + outfit = /datum/outfit/centcom/ert/janitor /datum/antagonist/ert/janitor/heavy role = "Heavy Duty Janitor" - outfit = /datum/outfit/ert/janitor/heavy + outfit = /datum/outfit/centcom/ert/janitor/heavy /datum/antagonist/ert/kudzu role = "Weed Whacker" - outfit = /datum/outfit/ert/kudzu + outfit = /datum/outfit/centcom/ert/kudzu /datum/antagonist/ert/deathsquad/leader name = "Deathsquad Officer" - outfit = /datum/outfit/death_commando/officer + outfit = /datum/outfit/centcom/death_commando/officer role = "Officer" /datum/antagonist/ert/intern name = "CentCom Intern" - outfit = /datum/outfit/centcom_intern + outfit = /datum/outfit/centcom/centcom_intern random_names = FALSE role = "Intern" plasmaman_outfit = /datum/outfit/plasmaman/intern /datum/antagonist/ert/intern/leader name = "CentCom Head Intern" - outfit = /datum/outfit/centcom_intern/leader + outfit = /datum/outfit/centcom/centcom_intern/leader + random_names = FALSE role = "Head Intern" +/datum/antagonist/ert/intern/unarmed + outfit = /datum/outfit/centcom/centcom_intern/unarmed + +/datum/antagonist/ert/intern/leader/unarmed + outfit = /datum/outfit/centcom/centcom_intern/leader/unarmed + /datum/antagonist/ert/lawyer name = "CentCom Attorney" - outfit = /datum/outfit/centcom_attorney + outfit = /datum/outfit/centcom/centcom_attorney role = "Attorney" plasmaman_outfit = /datum/outfit/plasmaman/centcom_attorney /datum/antagonist/ert/doomguy name = "The Juggernaut" - outfit = /datum/outfit/death_commando/doomguy + outfit = /datum/outfit/centcom/death_commando/doomguy random_names = FALSE role = "The Juggernaut" /datum/antagonist/ert/clown name = "Comedy Response Officer" - outfit = /datum/outfit/centcom_clown + outfit = /datum/outfit/centcom/centcom_clown role = "Prankster" plasmaman_outfit = /datum/outfit/plasmaman/honk /datum/antagonist/ert/clown/honk name = "HONK Squad Trooper" - outfit = /datum/outfit/centcom_clown/honk_squad + outfit = /datum/outfit/centcom/centcom_clown/honk_squad role = "HONKER" plasmaman_outfit = /datum/outfit/plasmaman/honk_squad @@ -176,6 +213,18 @@ if(istype(new_team)) ert_team = new_team +/datum/antagonist/ert/bounty_armor + role = "Armored Bounty Hunter" + outfit = /datum/outfit/bounty/armor/ert + +/datum/antagonist/ert/bounty_hook + role = "Hookgun Bounty Hunter" + outfit = /datum/outfit/bounty/hook/ert + +/datum/antagonist/ert/bounty_synth + role = "Synthetic Bounty Hunter" + outfit = /datum/outfit/bounty/synth/ert + /datum/antagonist/ert/proc/forge_objectives() if(ert_team) objectives |= ert_team.objectives diff --git a/code/modules/antagonists/fugitive/hunter_outfits.dm b/code/modules/antagonists/fugitive/hunter_outfits.dm index 8de6a41edf768..3b6e786fb7fc9 100644 --- a/code/modules/antagonists/fugitive/hunter_outfits.dm +++ b/code/modules/antagonists/fugitive/hunter_outfits.dm @@ -64,7 +64,6 @@ if(visualsOnly) return var/obj/item/card/id/W = H.wear_id - W.assignment = "Bounty Hunter" W.registered_name = H.real_name W.update_label() @@ -146,3 +145,25 @@ gloves = /obj/item/clothing/gloves/combat else if(prob(30)) gloves = /obj/item/clothing/gloves/fingerless + + +//ids and ert code + +/obj/item/card/id/advanced/bountyhunter + assignment = "Bounty Hunter" + //icon_state = "card_flames" //oh SHIT + //trim = /datum/id_trim/bounty_hunter + +/datum/outfit/bounty/armor/ert + id = /obj/item/card/id/silver/bounty/ert + +/datum/outfit/bounty/hook/ert + id = /obj/item/card/id/silver/bounty/ert + +/datum/outfit/bounty/synth/ert + id = /obj/item/card/id/silver/bounty/ert + +/* +/obj/item/card/id/advanced/bountyhunter/ert + trim = /datum/id_trim/centcom/bounty_hunter +*/ diff --git a/code/modules/antagonists/official/official.dm b/code/modules/antagonists/official/official.dm deleted file mode 100644 index d9da780f26415..0000000000000 --- a/code/modules/antagonists/official/official.dm +++ /dev/null @@ -1,48 +0,0 @@ -/datum/antagonist/official - name = JOB_CENTCOM_OFFICIAL - show_name_in_check_antagonists = TRUE - show_in_antagpanel = FALSE - can_elimination_hijack = ELIMINATION_PREVENT - var/datum/objective/mission - var/datum/team/ert/ert_team - show_to_ghosts = TRUE - banning_key = ROLE_ERT - -/datum/antagonist/official/greet() - to_chat(owner, "You are a CentCom Official.") - if (ert_team) - to_chat(owner, "Central Command is sending you to [station_name()] with the task: [ert_team.mission.explanation_text]") - else - to_chat(owner, "Central Command is sending you to [station_name()] with the task: [mission.explanation_text]") - -/datum/antagonist/official/proc/equip_official() - var/mob/living/carbon/human/H = owner.current - if(!istype(H)) - return - if(isplasmaman(H)) - H.equipOutfit(/datum/outfit/plasmaman/official) - H.open_internals(H.get_item_for_held_index(2)) - H.equipOutfit(/datum/outfit/centcom_official) - if(CONFIG_GET(flag/enforce_human_authority)) - H.set_species(/datum/species/human) - -/datum/antagonist/official/create_team(datum/team/new_team) - if(istype(new_team)) - ert_team = new_team - -/datum/antagonist/official/proc/forge_objectives() - if (ert_team) - objectives |= ert_team.objectives - else if (!mission) - var/datum/objective/missionobj = new - missionobj.owner = owner - missionobj.explanation_text = "Conduct a routine performance review of [station_name()] and its Captain." - missionobj.completed = 1 - mission = missionobj - objectives |= mission - - -/datum/antagonist/official/on_gain() - forge_objectives() - . = ..() - equip_official() diff --git a/code/modules/client/preferences/entries/player/admin.dm b/code/modules/client/preferences/entries/player/admin.dm index 9037723a2282e..2bb8b76c034fe 100644 --- a/code/modules/client/preferences/entries/player/admin.dm +++ b/code/modules/client/preferences/entries/player/admin.dm @@ -12,6 +12,34 @@ return is_admin(preferences.parent) && CONFIG_GET(flag/allow_admin_asaycolor) +/// What outfit to equip when spawning as a briefing officer for an ERT +/datum/preference/choiced/brief_outfit + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + db_key = "brief_outfit" + preference_type = PREFERENCE_PLAYER + +/datum/preference/choiced/brief_outfit/deserialize(input, datum/preferences/preferences) + var/path = text2path(input) + if (!ispath(path, /datum/outfit)) + return create_default_value() + + return path + +/datum/preference/choiced/brief_outfit/serialize(input) + return "[input]" + +/datum/preference/choiced/brief_outfit/create_default_value() + return /datum/outfit/centcom/commander + +/datum/preference/choiced/brief_outfit/init_possible_values() + return subtypesof(/datum/outfit) + +/datum/preference/choiced/brief_outfit/is_accessible(datum/preferences/preferences, ignore_page = FALSE) + if (!..(preferences)) + return FALSE + + return is_admin(preferences.parent) + /datum/preference/toggle/announce_login category = PREFERENCE_CATEGORY_GAME_PREFERENCES db_key = "announce_login" diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index fb5d7c45375ae..057b15b91e30a 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -1,7 +1,13 @@ /datum/outfit/centcom name = "CentCom Base" -/datum/outfit/ert +/datum/outfit/centcom/post_equip(mob/living/carbon/human/centcom_member, visualsOnly = FALSE) + if(visualsOnly) + return + var/obj/item/implant/mindshield/mindshield = new /obj/item/implant/mindshield(centcom_member)//hmm lets have centcom officials become revs + mindshield.implant(centcom_member, null, silent = TRUE) + +/datum/outfit/centcom/ert name = "ERT Common" uniform = /obj/item/clothing/under/rank/centcom/official @@ -10,13 +16,10 @@ gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset/headset_cent/alt -/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H) - L.implant(H, null, 1) - var/obj/item/radio/R = H.ears R.set_frequency(FREQ_CENTCOM) R.freqlock = TRUE @@ -27,7 +30,7 @@ W.update_label() ..() -/datum/outfit/ert/commander +/datum/outfit/centcom/ert/commander name = "ERT Commander" id = /obj/item/card/id/ert @@ -42,7 +45,7 @@ l_pocket = /obj/item/switchblade r_pocket = /obj/item/door_remote/omni -/datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -51,7 +54,7 @@ R.keyslot = new /obj/item/encryptionkey/heads/captain R.recalculateChannels() -/datum/outfit/ert/commander/alert +/datum/outfit/centcom/ert/commander/alert name = "ERT Commander - High Alert" glasses = /obj/item/clothing/glasses/thermal/eyepatch @@ -61,7 +64,7 @@ /obj/item/gun/energy/pulse/pistol/loyalpin=1) l_pocket = /obj/item/melee/transforming/energy/sword/saber -/datum/outfit/ert/security +/datum/outfit/centcom/ert/security name = "ERT Security" id = /obj/item/card/id/ert/Security @@ -74,7 +77,7 @@ /obj/item/storage/box/handcuffs=1, /obj/item/melee/baton/loaded=1) -/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -84,7 +87,7 @@ R.keyslot = new /obj/item/encryptionkey/heads/hos R.recalculateChannels() -/datum/outfit/ert/security/alert +/datum/outfit/centcom/ert/security/alert name = "ERT Security - High Alert" mask = /obj/item/clothing/mask/gas/sechailer/swat @@ -94,7 +97,7 @@ /obj/item/gun/energy/pulse/carbine/loyalpin=1) -/datum/outfit/ert/medic +/datum/outfit/centcom/ert/medic name = "ERT Medic" id = /obj/item/card/id/ert/Medical @@ -108,7 +111,7 @@ /obj/item/reagent_containers/hypospray/combat=1, /obj/item/melee/baton/loaded=1) -/datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -118,7 +121,7 @@ R.keyslot = new /obj/item/encryptionkey/heads/cmo R.recalculateChannels() -/datum/outfit/ert/medic/alert +/datum/outfit/centcom/ert/medic/alert name = "ERT Medic - High Alert" mask = /obj/item/clothing/mask/gas/sechailer/swat @@ -128,7 +131,7 @@ /obj/item/gun/energy/pulse/pistol/loyalpin=1, /obj/item/reagent_containers/hypospray/combat/nanites=1) -/datum/outfit/ert/engineer +/datum/outfit/centcom/ert/engineer name = "ERT Engineer" id = /obj/item/card/id/ert/Engineer @@ -144,7 +147,7 @@ /obj/item/construction/rcd/loaded=1, /obj/item/bluespace_anchor=1) -/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -154,7 +157,7 @@ R.keyslot = new /obj/item/encryptionkey/heads/ce R.recalculateChannels() -/datum/outfit/ert/engineer/alert +/datum/outfit/centcom/ert/engineer/alert name = "ERT Engineer - High Alert" mask = /obj/item/clothing/mask/gas/sechailer/swat @@ -165,7 +168,7 @@ /obj/item/bluespace_anchor=1) -/datum/outfit/centcom_official +/datum/outfit/centcom/centcom_official name = JOB_CENTCOM_OFFICIAL uniform = /obj/item/clothing/under/rank/centcom/official @@ -182,7 +185,7 @@ id = /obj/item/card/id/centcom backpack_contents = list(/obj/item/stamp/centcom=1) -/datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return @@ -199,7 +202,7 @@ W.registered_name = H.real_name W.update_label() -/datum/outfit/ert/commander/inquisitor +/datum/outfit/centcom/ert/commander/inquisitor name = "Inquisition Commander" l_hand = /obj/item/nullrod/scythe/talking/chainsword suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal @@ -207,7 +210,7 @@ /obj/item/aiModule/core/full/ert=1, /obj/item/door_remote/omni=1) -/datum/outfit/ert/security/inquisitor +/datum/outfit/centcom/ert/security/inquisitor name = "Inquisition Security" suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor @@ -218,7 +221,7 @@ /obj/item/melee/baton/loaded=1, /obj/item/construction/rcd/loaded=1) -/datum/outfit/ert/medic/inquisitor +/datum/outfit/centcom/ert/medic/inquisitor name = "Inquisition Medic" suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor @@ -230,7 +233,7 @@ /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) +/datum/outfit/centcom/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -240,7 +243,7 @@ R.keyslot = new /obj/item/encryptionkey/heads/hop R.recalculateChannels() -/datum/outfit/ert/chaplain +/datum/outfit/centcom/ert/chaplain name = "ERT Chaplain" suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor // Chap role always gets this suit @@ -252,7 +255,7 @@ backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/nullrod=1) -/datum/outfit/ert/chaplain/inquisitor +/datum/outfit/centcom/ert/chaplain/inquisitor name = "Inquisition Chaplain" suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor @@ -263,7 +266,7 @@ /obj/item/grenade/chem_grenade/holy=1, /obj/item/nullrod=1) -/datum/outfit/ert/janitor +/datum/outfit/centcom/ert/janitor name = "ERT Janitor" id = /obj/item/card/id/ert/Janitor @@ -282,7 +285,7 @@ /obj/item/grenade/clusterbuster/cleaner=1, ) -/datum/outfit/ert/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -292,12 +295,12 @@ R.keyslot = new /obj/item/encryptionkey/headset_service R.recalculateChannels() -/datum/outfit/ert/janitor/heavy +/datum/outfit/centcom/ert/janitor/heavy name = "ERT Janitor - Heavy Duty" l_hand = /obj/item/reagent_containers/spray/chemsprayer/janitor -/datum/outfit/ert/kudzu +/datum/outfit/centcom/ert/kudzu name = "ERT Weed Whacker" id = /obj/item/card/id/ert/kudzu @@ -314,7 +317,7 @@ /obj/item/choice_beacon/pet/goat, /obj/item/grenade/clusterbuster/antiweed=2) -/datum/outfit/ert/kudzu/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/kudzu/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -324,7 +327,7 @@ R.keyslot = new /obj/item/encryptionkey/headset_service R.recalculateChannels() -/datum/outfit/centcom_attorney +/datum/outfit/centcom/centcom_attorney name = "CentCom Attorney" uniform = /obj/item/clothing/under/rank/centcom/intern @@ -340,7 +343,7 @@ id = /obj/item/card/id/ert/lawyer backpack_contents = list(/obj/item/storage/box/survival = 1) -/datum/outfit/centcom_intern +/datum/outfit/centcom/centcom_intern name = "CentCom Intern" uniform = /obj/item/clothing/under/rank/centcom/intern @@ -356,7 +359,7 @@ id = /obj/item/card/id/centcom backpack_contents = list(/obj/item/storage/box/survival = 1) -/datum/outfit/centcom_intern/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/centcom_intern/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return @@ -368,7 +371,14 @@ W.registered_name = H.real_name W.update_label() -/datum/outfit/centcom_intern/leader +/datum/outfit/centcom/centcom_intern/unarmed + name = "CentCom Intern (Unarmed)" + belt = null + l_hand = null + l_pocket = null + r_pocket = null + +/datum/outfit/centcom/centcom_intern/leader name = "CentCom Head Intern" belt = /obj/item/melee/baton/loaded uniform = /obj/item/clothing/under/rank/centcom/officer_skirt @@ -377,7 +387,13 @@ l_hand = /obj/item/megaphone head = /obj/item/clothing/head/hats/intern -/datum/outfit/centcom_clown +/datum/outfit/centcom/centcom_intern/leader/unarmed // i'll be nice and let the leader keep their baton and vest + name = "CentCom Head Intern (Unarmed)" + suit_store = null + l_pocket = null + r_pocket = null + +/datum/outfit/centcom/centcom_clown name = "Code Banana ERT" id = /obj/item/card/id/centcom belt = /obj/item/modular_computer/tablet/pda/clown @@ -398,13 +414,10 @@ implants = list(/obj/item/implant/sad_trombone) -/datum/outfit/centcom_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/centcom_clown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H) - L.implant(H, null, 1) - var/obj/item/radio/R = H.ears R.set_frequency(FREQ_CENTCOM) R.freqlock = TRUE @@ -417,7 +430,7 @@ W.update_label(W.registered_name, W.assignment) H.dna.add_mutation(CLOWNMUT) -/datum/outfit/centcom_clown/honk_squad +/datum/outfit/centcom/centcom_clown/honk_squad name = "HONK Squad Trooper" back = /obj/item/storage/backpack/holding/clown shoes = /obj/item/clothing/shoes/clown_shoes/taeclowndo @@ -435,7 +448,7 @@ /obj/item/reagent_containers/spray/chemsprayer/janitor/clown = 1, ) -/datum/outfit/death_commando +/datum/outfit/centcom/death_commando name = JOB_ERT_DEATHSQUAD uniform = /obj/item/clothing/under/rank/centcom/commander @@ -460,7 +473,7 @@ /obj/item/flashlight=1,\ /obj/item/grenade/plastic/x4=1) -/datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return @@ -468,10 +481,6 @@ R.set_frequency(FREQ_CENTCOM) R.freqlock = TRUE - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//Here you go Deuryn - L.implant(H, null, 1) - - var/obj/item/card/id/W = H.wear_id W.icon_state = "centcom" W.access = list() //wipe access first @@ -481,7 +490,7 @@ W.registered_name = H.real_name W.update_label(W.registered_name, W.assignment) -/datum/outfit/death_commando/officer +/datum/outfit/centcom/death_commando/officer name = "Death Commando Officer" head = /obj/item/clothing/head/helmet/space/beret backpack_contents = list(/obj/item/aiModule/core/full/deathsquad=1,\ @@ -492,7 +501,7 @@ /obj/item/grenade/plastic/x4=1, /obj/item/door_remote/omni=1) -/datum/outfit/death_commando/doomguy +/datum/outfit/centcom/death_commando/doomguy name = "The Juggernaut" suit = /obj/item/clothing/suit/space/hardsuit/shielded/doomguy diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx index 67211ce275200..c75b51b4c1be0 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx @@ -1,4 +1,4 @@ -import { FeatureColorInput, Feature, FeatureToggle, CheckboxInput } from '../base'; +import { CheckboxInput, FeatureColorInput, Feature, FeatureDropdownInput, FeatureToggle } from '../base'; export const asaycolor: Feature = { name: 'Admin chat color', @@ -8,6 +8,13 @@ export const asaycolor: Feature = { component: FeatureColorInput, }; +export const brief_outfit: Feature = { + name: 'Brief outfit', + category: 'ADMIN', + description: 'The outfit to gain when spawning as the briefing officer.', + component: FeatureDropdownInput, +}; + export const announce_login: FeatureToggle = { name: 'Announce Login', category: 'ADMIN',