diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index df837c86d9a31..b175acd65a615 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -112,6 +112,7 @@ #define SECHUD_SCIENTIST "hudscientist" #define SECHUD_SHAFT_MINER "hudshaftminer" #define SECHUD_STATION_ENGINEER "hudstationengineer" +#define SECHUD_VETERAN_ADVISOR "hudveteranadvisor" #define SECHUD_VIROLOGIST "hudvirologist" #define SECHUD_WARDEN "hudwarden" diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index 1d69d48e9d59f..fca771489558f 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -49,6 +49,7 @@ #define JOB_CHIEF_ENGINEER "Chief Engineer" #define JOB_CHIEF_MEDICAL_OFFICER "Chief Medical Officer" #define JOB_BRIDGE_ASSISTANT "Bridge Assistant" +#define JOB_VETERAN_ADVISOR "Veteran Security Advisor" //Silicon #define JOB_AI "AI" #define JOB_CYBORG "Cyborg" @@ -156,10 +157,11 @@ #define JOB_DISPLAY_ORDER_ROBOTICIST 33 #define JOB_DISPLAY_ORDER_GENETICIST 34 #define JOB_DISPLAY_ORDER_HEAD_OF_SECURITY 35 -#define JOB_DISPLAY_ORDER_WARDEN 36 -#define JOB_DISPLAY_ORDER_DETECTIVE 37 -#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 38 -#define JOB_DISPLAY_ORDER_PRISONER 39 +#define JOB_DISPLAY_ORDER_VETERAN_ADVISOR 36 +#define JOB_DISPLAY_ORDER_WARDEN 37 +#define JOB_DISPLAY_ORDER_DETECTIVE 38 +#define JOB_DISPLAY_ORDER_SECURITY_OFFICER 39 +#define JOB_DISPLAY_ORDER_PRISONER 40 #define DEPARTMENT_UNASSIGNED "No Department" diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index e24ecd99c6177..31f316221301e 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -426,3 +426,49 @@ to_chat(victim, "[span_name("[name]")] exclaims, \"[span_robot("[beepskys_cry]")]") if(victim.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) victim.create_chat_message(src, raw_message = beepskys_cry, spans = list("robotic")) + +// Used by Veteran Security Advisor job. +/datum/brain_trauma/special/ptsd + name = "Combat PTSD" + desc = "The patient is experiencing PTSD stemming from past combat exposure, resulting in a lack of emotions. Additionally, they are experiencing mild hallucinations." + scan_desc = "PTSD" + gain_text = span_warning("You're thrust back into the chaos of past! Explosions! Gunfire! Emotions, gone AWOL!") + lose_text = span_notice("You feel flashbacks of past fade, as your emotions return and mind clear.") + resilience = TRAUMA_RESILIENCE_ABSOLUTE + can_gain = TRUE + random_gain = FALSE + /// Our cooldown declare for causing hallucinations + COOLDOWN_DECLARE(ptsd_hallucinations) + var/list/ptsd_hallucinations_list = list( + /datum/hallucination/fake_sound/normal/boom, + /datum/hallucination/fake_sound/normal/distant_boom, + /datum/hallucination/stray_bullet, + /datum/hallucination/battle/gun/disabler, + /datum/hallucination/battle/gun/laser, + /datum/hallucination/battle/bomb, + /datum/hallucination/battle/e_sword, + /datum/hallucination/battle/harm_baton, + /datum/hallucination/battle/stun_prod, + ) + +/datum/brain_trauma/special/ptsd/on_life(seconds_per_tick, times_fired) + if(owner.stat != CONSCIOUS) + return + + if(!COOLDOWN_FINISHED(src, ptsd_hallucinations)) + return + + owner.cause_hallucination(pick(ptsd_hallucinations_list), "Caused by The Combat PTSD brain trauma") + COOLDOWN_START(src, ptsd_hallucinations, rand(10 SECONDS, 10 MINUTES)) + +/datum/brain_trauma/special/ptsd/on_gain() + owner.add_mood_event("combat_ptsd", /datum/mood_event/desentized) + owner.mob_mood?.mood_modifier -= 1 //Basically nothing can change your mood + owner.mob_mood?.sanity_level = SANITY_DISTURBED //Makes sanity on a unstable level unless cured + ..() + +/datum/brain_trauma/special/ptsd/on_lose() + owner.clear_mood_event("combat_ptsd") + owner.mob_mood?.mood_modifier += 1 + owner.mob_mood?.sanity_level = SANITY_GREAT + return ..() diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index ea46cc91319fa..46f691564bb4b 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -1183,6 +1183,36 @@ ) job = /datum/job/station_engineer +/datum/id_trim/job/veteran_advisor + assignment = "Veteran Security Advisor" + trim_state = "trim_veteranadvisor" + department_color = COLOR_SECURITY_RED + subdepartment_color = COLOR_COMMAND_BLUE + sechud_icon_state = SECHUD_VETERAN_ADVISOR + minimal_access = list( + ACCESS_COMMAND, + ACCESS_BRIG, + ACCESS_BRIG_ENTRANCE, + ACCESS_COURT, + ACCESS_MECH_SECURITY, + ACCESS_MINERAL_STOREROOM, + ACCESS_SECURITY, + ACCESS_WEAPONS, + ) + extra_access = list() + template_access = list() + job = /datum/job/veteran_advisor + +/datum/id_trim/job/veteran_advisor/refresh_trim_access() + . = ..() + + if(!.) + return + + // Config check for if sec has maint access. + if(CONFIG_GET(flag/security_has_maint_access)) + access |= list(ACCESS_MAINT_TUNNELS) + /datum/id_trim/job/virologist assignment = "Virologist" trim_state = "trim_virologist" diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 32b9772dc0709..0cfb48f7a9823 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -483,3 +483,9 @@ /datum/mood_event/all_nighter description = "I didn't sleep at all last night. I'm exhausted." mood_change = -5 + +//Used by the Veteran Advisor trait job +/datum/mood_event/desentized + description = "Nothing will ever rival with what I seen in the past..." + mood_change = -3 + special_screen_obj = "mood_desentized" diff --git a/code/datums/station_traits/job_traits.dm b/code/datums/station_traits/job_traits.dm index 8dea2f96bbf09..041f846424094 100644 --- a/code/datums/station_traits/job_traits.dm +++ b/code/datums/station_traits/job_traits.dm @@ -164,6 +164,19 @@ new /obj/item/reagent_containers/cup/coffeepot(picked_turf) new /obj/item/storage/box/coffeepack(picked_turf) +/datum/station_trait/job/veteran_advisor + name = "Veteran Advisor" + button_desc = "Sign up to become a DISABLED but hard boiled Veteran Advisor of Nanotrasen Security Force. Advise HoS and Captain, train Officers, all while fighting your PTSD." + weight = 2 + report_message = "Veteran Security Advisor has been assigned to your station to help with Security matters." + show_in_report = TRUE + can_roll_antag = CAN_ROLL_PROTECTED + job_to_add = /datum/job/veteran_advisor + +/datum/station_trait/job/veteran_advisor/on_lobby_button_update_overlays(atom/movable/screen/lobby/button/sign_up/lobby_button, list/overlays) + . = ..() + overlays += "veteran_advisor" + #undef CAN_ROLL_ALWAYS #undef CAN_ROLL_PROTECTED #undef CAN_ROLL_NEVER diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 45daf00db1ae3..1f06113158cef 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -244,6 +244,14 @@ GLOBAL_LIST_INIT(channel_tokens, list( worn_icon_state = "com_headset" keyslot = /obj/item/encryptionkey/heads/hos +/obj/item/radio/headset/heads/hos/advisor + name = "\proper the veteran security advisor headset" + desc = "The headset of the man who was in charge of keeping order and protecting the station..." + icon_state = "com_headset" + worn_icon_state = "com_headset" + keyslot = /obj/item/encryptionkey/heads/hos + command = FALSE + /obj/item/radio/headset/heads/hos/alt name = "\proper the head of security's bowman headset" desc = "The headset of the man in charge of keeping order and protecting the station. Protects ears from flashbangs." diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index e8338f4c95b19..0b0a6fb4d50cb 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -135,6 +135,15 @@ strip_delay = 60 dog_fashion = null +/obj/item/clothing/head/soft/veteran + name = "veteran cap" + desc = "It's a robust baseball hat in tasteful black colour with a golden connotation to \"REMEMBER\"." + icon_state = "veteransoft" + soft_type = "veteran" + armor_type = /datum/armor/cosmetic_sec + strip_delay = 60 + dog_fashion = null + /obj/item/clothing/head/soft/paramedic name = "paramedic cap" desc = "It's a baseball hat with a dark turquoise color and a reflective cross on the top." diff --git a/code/modules/jobs/job_types/station_trait/veteran_advisor.dm b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm new file mode 100644 index 0000000000000..87ad65c2c7a71 --- /dev/null +++ b/code/modules/jobs/job_types/station_trait/veteran_advisor.dm @@ -0,0 +1,76 @@ +/datum/job/veteran_advisor + title = JOB_VETERAN_ADVISOR + description = "Advise HoS, and Captain on matters of Security. Train green Officers. \ + Lay back in your wheelchair and say \"I told you\" to the HoS when all of the station collapses." + auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY + department_head = list(JOB_HEAD_OF_SECURITY) + faction = FACTION_STATION + total_positions = 0 + spawn_positions = 0 + supervisors = SUPERVISOR_HOS + minimal_player_age = 7 + exp_requirements = 6000 //100 HOURS! We want really hard boiled people + exp_required_type = EXP_TYPE_CREW + exp_required_type_department = EXP_TYPE_SECURITY + exp_granted_type = EXP_TYPE_CREW + config_tag = "VETERAN_ADVISOR" + + outfit = /datum/outfit/job/veteran_advisor + plasmaman_outfit = /datum/outfit/plasmaman/security + + paycheck = PAYCHECK_CREW + paycheck_department = ACCOUNT_SEC + + liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) + + display_order = JOB_DISPLAY_ORDER_VETERAN_ADVISOR + departments_list = list(/datum/job_department/security) + + family_heirlooms = list(/obj/item/plaque) + + mail_goodies = list( + /obj/item/clothing/accessory/medal/conduct = 1, + /obj/item/instrument/trumpet = 5, + /obj/item/storage/fancy/cigarettes/cigars = 10, + ) + rpg_title = "Royal Advisor" + allow_bureaucratic_error = FALSE + job_flags = STATION_JOB_FLAGS | STATION_TRAIT_JOB_FLAGS + +/datum/job/veteran_advisor/get_roundstart_spawn_point() //Spawning at Brig where Officers spawn + if (length(GLOB.start_landmarks_list["Security Officer"])) + return pick(GLOB.start_landmarks_list["Security Officer"]) + return ..() + +/datum/job/veteran_advisor/after_spawn(mob/living/spawned, client/player_client) + . = ..() + var/mob/living/carbon/veteran = spawned + spawned.add_quirk(/datum/quirk/paraplegic) //Even in 2300s veterans are getting it bad + if(veteran) + veteran.gain_trauma(/datum/brain_trauma/special/ptsd) //War, war never changes... + +/datum/outfit/job/veteran_advisor + name = "Veteran Security Advisor" + jobtype = /datum/job/veteran_advisor + + id_trim = /datum/id_trim/job/veteran_advisor + backpack_contents = list( + /obj/item/modular_computer/pda/veteran_advisor = 1, + /obj/item/storage/fancy/cigarettes/cigars = 1, + /obj/item/lighter = 1, + /obj/item/clothing/accessory/medal/bronze_heart = 1, + ) + + uniform = /obj/item/clothing/under/rank/security/officer/formal + head = /obj/item/clothing/head/soft/veteran + mask = /obj/item/clothing/mask/cigarette/cigar + suit = /obj/item/clothing/suit/jacket/trenchcoat + belt = /obj/item/storage/belt/holster/detective/full/ert //M1911 pistol + ears = /obj/item/radio/headset/heads/hos/advisor + glasses = /obj/item/clothing/glasses/eyepatch + shoes = /obj/item/clothing/shoes/jackboots + l_pocket = /obj/item/coin/antagtoken + r_pocket = /obj/item/melee/baton/telescopic + r_hand = /obj/item/cane + + implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/code/modules/modular_computers/computers/item/role_tablet_presets.dm index 904b9fc9837cd..205c6a0c422e5 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -429,6 +429,17 @@ /datum/computer_file/program/status, ) +/obj/item/modular_computer/pda/veteran_advisor + name = "security advisor PDA" + greyscale_colors = "#EA3232#FFD700" + inserted_item = /obj/item/pen/fountain + starting_programs = list( + /datum/computer_file/program/records/security, + /datum/computer_file/program/crew_manifest, + /datum/computer_file/program/coupon, //veteran discount + /datum/computer_file/program/skill_tracker, + ) + /** * Non-roles */ diff --git a/config/jobconfig.toml b/config/jobconfig.toml index c8a5c5c3dfa5d..7106d2f2a4ef5 100644 --- a/config/jobconfig.toml +++ b/config/jobconfig.toml @@ -263,6 +263,13 @@ "# Spawn Positions" = 5 "# Total Positions" = 5 +[VETERAN_ADVISOR] +"# Playtime Requirements" = 6000 +"# Required Account Age" = 7 +"# Required Character Age" = 0 +"# Spawn Positions" = 0 +"# Total Positions" = 0 + [VIROLOGIST] "# Playtime Requirements" = 60 "# Required Account Age" = 0 diff --git a/icons/hud/lobby/signup_button.dmi b/icons/hud/lobby/signup_button.dmi index a67cc5584424e..daa2669069742 100644 Binary files a/icons/hud/lobby/signup_button.dmi and b/icons/hud/lobby/signup_button.dmi differ diff --git a/icons/hud/screen_gen.dmi b/icons/hud/screen_gen.dmi index 1484e3f4042a9..608be00b2e1fb 100644 Binary files a/icons/hud/screen_gen.dmi and b/icons/hud/screen_gen.dmi differ diff --git a/icons/mob/clothing/head/hats.dmi b/icons/mob/clothing/head/hats.dmi index 0fd0de8e4250e..4183d5fa6cb4c 100644 Binary files a/icons/mob/clothing/head/hats.dmi and b/icons/mob/clothing/head/hats.dmi differ diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index 3dff7642a9613..7ee3267280d2a 100644 Binary files a/icons/mob/huds/hud.dmi and b/icons/mob/huds/hud.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 6397cf6fb5b5a..5bcd1df47d929 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/head/hats.dmi b/icons/obj/clothing/head/hats.dmi index 6cca3da61f41a..b655dd1756708 100644 Binary files a/icons/obj/clothing/head/hats.dmi and b/icons/obj/clothing/head/hats.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 5df1d8c26f7cb..6fae686f69add 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4254,6 +4254,7 @@ #include "code\modules\jobs\job_types\spawner\zombie.dm" #include "code\modules\jobs\job_types\station_trait\bridge_assistant.dm" #include "code\modules\jobs\job_types\station_trait\cargo_gorilla.dm" +#include "code\modules\jobs\job_types\station_trait\veteran_advisor.dm" #include "code\modules\keybindings\bindings_atom.dm" #include "code\modules\keybindings\bindings_client.dm" #include "code\modules\keybindings\focus.dm" diff --git a/tgui/packages/tgui/interfaces/common/JobToIcon.ts b/tgui/packages/tgui/interfaces/common/JobToIcon.ts index f3ce63bea57bf..98369c7902827 100644 --- a/tgui/packages/tgui/interfaces/common/JobToIcon.ts +++ b/tgui/packages/tgui/interfaces/common/JobToIcon.ts @@ -52,6 +52,7 @@ export const JOB2ICON = { 'Shaft Miner': 'digging', 'Station Engineer': 'gears', 'Syndicate Operative': 'dragon', + 'Veteran Security Advisor': 'ribbon', Virologist: 'virus', Warden: 'handcuffs', } as const;