Skip to content

Commit

Permalink
NEW TRAIT ROLE: Veteran Advisor (tgstation#81667)
Browse files Browse the repository at this point in the history
## About The Pull Request
Adds a new Trait Job (jobs which only appear when the station gets a
trait for it) - Veteran Advisor.
The weight of the trait is 2 which makes it very rare.

Veteran Security Advisor is a role designated as a (duh) Advisor for the
HoS and Captain, as well as a mentor for all of the Officers. This is
because it has an experience requirement of **100 SECURITY HOURS**, so
no green Veterans.

Veteran Security Advisors are paraplegic (bonded to a wheelchair) and
with PTSD which freezes their mood and sometimes causes hallucinations.
They get an M1911 pistol in a holster because that's badass.

<details>
<summary>THE IMAGES</summary>

ADVISOR
![veteran advisor
chair](https://github.com/tgstation/tgstation/assets/42353186/e094669c-002f-4552-9692-c8f055a042eb)

THINGS HE SPAWNS WITH
![veteran advisor
shit](https://github.com/tgstation/tgstation/assets/42353186/27ed7e8a-bcd0-4ec2-9504-135a443492f0)

HIS UNIQUE MOODLET
![veteran advisor
desentized](https://github.com/tgstation/tgstation/assets/42353186/6fc04a24-b4fc-40bd-938f-c32389ac9eab)

SIGNUP BUTTON
![signup
button](https://github.com/tgstation/tgstation/assets/42353186/f10020c7-69fe-47f0-aa5f-7b56dfbc8200)

</details>

## Why It's Good For The Game
More funny Trait Jobs to the game!
There is a certain lack of those, there is only Cargorilla and Bridge
Assistant.

This job has big opportunities. Advisors can behave themselves like
drill sergeants, or wise old mentors. Because they are kinda, as people
only with 100 Security hours (yes those masochists exist) could play it
when it appears. This will also open opportunities for retired Sec mains
to tutor new generations without being directly involved in all of the
stress.
I mostly took a look at the Goonstation "Nanotrasen Security Consultant"
and Baystation "Senior Enlisted Advisor" as inspiration.

I tried to cut down any chances of this role being abused by power
gamers for its M1911 pistol and Bridge access, due to this they are
paraplegic so power gamers get disgusted, and if someone does somehow
win Antagonists while in a wheelchair - props to them, pure skill.

**REMEMBER THAT THIS IS A TRAIT JOB!** This means they won't appear
every round, but rather rarely! So they fit in as an occasional extra
fun for the round.
## Changelog
:cl:
add: NEW TRAIT JOB: Veteran Security Advisor! Advise HoS and Captain on
Security matters, mentor Security Officers. Note that they are
paraplegic and fully emotional desensitized due to their past
experience.
/:cl:

---------

Co-authored-by: Ghom <[email protected]>
  • Loading branch information
DrDiasyl and Ghommie authored Feb 27, 2024
1 parent 3a5a25c commit 35242b4
Show file tree
Hide file tree
Showing 19 changed files with 215 additions and 4 deletions.
1 change: 1 addition & 0 deletions code/__DEFINES/atom_hud.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
10 changes: 6 additions & 4 deletions code/__DEFINES/jobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"

Expand Down
46 changes: 46 additions & 0 deletions code/datums/brain_damage/special.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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 ..()
30 changes: 30 additions & 0 deletions code/datums/id_trim/jobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
6 changes: 6 additions & 0 deletions code/datums/mood_events/generic_negative_events.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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"
13 changes: 13 additions & 0 deletions code/datums/station_traits/job_traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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
8 changes: 8 additions & 0 deletions code/game/objects/items/devices/radio/headset.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand Down
9 changes: 9 additions & 0 deletions code/modules/clothing/head/soft_caps.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand Down
76 changes: 76 additions & 0 deletions code/modules/jobs/job_types/station_trait/veteran_advisor.dm
Original file line number Diff line number Diff line change
@@ -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)
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down
7 changes: 7 additions & 0 deletions config/jobconfig.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Binary file modified icons/hud/lobby/signup_button.dmi
Binary file not shown.
Binary file modified icons/hud/screen_gen.dmi
Binary file not shown.
Binary file modified icons/mob/clothing/head/hats.dmi
Binary file not shown.
Binary file modified icons/mob/huds/hud.dmi
Binary file not shown.
Binary file modified icons/obj/card.dmi
Binary file not shown.
Binary file modified icons/obj/clothing/head/hats.dmi
Binary file not shown.
1 change: 1 addition & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
1 change: 1 addition & 0 deletions tgui/packages/tgui/interfaces/common/JobToIcon.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;

0 comments on commit 35242b4

Please sign in to comment.