diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 180bb317fed..d2e6633e1dd 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -124,6 +124,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 38aeef7a7cb..0e13dda4a97 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" @@ -180,10 +181,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 JOB_DISPLAY_ORDER_SECURITY_MEDIC 100 //SKYRAT EDIT ADDITON #define JOB_DISPLAY_ORDER_CORRECTIONS_OFFICER 101 //SKYRAT EDIT ADDITON #define JOB_DISPLAY_ORDER_NANOTRASEN_CONSULTANT 102 //SKYRAT EDIT ADDITON diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index e24ecd99c61..31f31622130 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 ea46cc91319..46f691564bb 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 32b9772dc07..0cfb48f7a98 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 cefc2b1a236..c588475094b 100644 --- a/code/datums/station_traits/job_traits.dm +++ b/code/datums/station_traits/job_traits.dm @@ -162,6 +162,21 @@ 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 + +/* SKYRAT EDIT -- REMOVAL -- We handle the lobby a bit differently for time being +/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 08bf47dcc07..4d6b8edbd2d 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -250,6 +250,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 e8338f4c95b..0b0a6fb4d50 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 00000000000..87ad65c2c7a --- /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 9d42ec8c554..f47a8c9a4e6 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -433,6 +433,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/icons/hud/lobby/signup_button.dmi b/icons/hud/lobby/signup_button.dmi index a67cc558442..307869b0492 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 1484e3f4042..ad2f140360f 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 0fd0de8e425..bdf9980b9f2 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 eb7007c9c45..e701303aa85 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 da8c2bda657..5df6e03de70 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 6cca3da61f4..14b0fdf8b4c 100644 Binary files a/icons/obj/clothing/head/hats.dmi and b/icons/obj/clothing/head/hats.dmi differ diff --git a/modular_skyrat/modules/primitive_cooking_additions/code/cookware.dm b/modular_skyrat/modules/primitive_cooking_additions/code/cookware.dm index 6b90c469c1a..aa96e10b062 100644 --- a/modular_skyrat/modules/primitive_cooking_additions/code/cookware.dm +++ b/modular_skyrat/modules/primitive_cooking_additions/code/cookware.dm @@ -1,53 +1,33 @@ /obj/item/reagent_containers/cup/soup_pot/material icon = 'modular_skyrat/modules/primitive_cooking_additions/icons/cookware.dmi' - custom_materials = null // We're going to apply custom materials when this baby is actually made material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS // A few random preset types as well /obj/item/reagent_containers/cup/soup_pot/material/fake_copper - -/obj/item/reagent_containers/cup/soup_pot/material/fake_copper/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/copporcitite) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/copporcitite=SHEET_MATERIAL_AMOUNT) /obj/item/reagent_containers/cup/soup_pot/material/fake_brass - -/obj/item/reagent_containers/cup/soup_pot/material/fake_brass/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/brussite) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/brussite=SHEET_MATERIAL_AMOUNT) /obj/item/reagent_containers/cup/soup_pot/material/fake_tin - -/obj/item/reagent_containers/cup/soup_pot/material/fake_tin/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/tinumium) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/tinumium=SHEET_MATERIAL_AMOUNT) // Oven Trays /obj/item/plate/oven_tray/material desc = "Time to bake hardtack!" icon = 'modular_skyrat/modules/primitive_cooking_additions/icons/cookware.dmi' - custom_materials = null // We're going to apply custom materials when this baby is actually made material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS fragile = FALSE // A few random preset types as well /obj/item/plate/oven_tray/material/fake_copper - -/obj/item/plate/oven_tray/material/fake_copper/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/copporcitite) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/copporcitite=SHEET_MATERIAL_AMOUNT) /obj/item/plate/oven_tray/material/fake_brass - -/obj/item/plate/oven_tray/material/fake_brass/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/brussite) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/brussite=SHEET_MATERIAL_AMOUNT) /obj/item/plate/oven_tray/material/fake_tin - -/obj/item/plate/oven_tray/material/fake_tin/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/tinumium) = SHEET_MATERIAL_AMOUNT)) + custom_materials = list(/datum/material/tinumium=SHEET_MATERIAL_AMOUNT) diff --git a/modular_skyrat/modules/primitive_production/code/glassblowing.dm b/modular_skyrat/modules/primitive_production/code/glassblowing.dm index 8dcc4f3cd3a..ed7b4a31ff8 100644 --- a/modular_skyrat/modules/primitive_production/code/glassblowing.dm +++ b/modular_skyrat/modules/primitive_production/code/glassblowing.dm @@ -41,37 +41,24 @@ desc = "A glass bowl that is capable of carrying things." icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi' icon_state = "glass_bowl" - custom_materials = null + custom_materials = list(/datum/material/glass=SHEET_MATERIAL_AMOUNT) material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR -/obj/item/reagent_containers/cup/bowl/blowing_glass/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/glass) = SHEET_MATERIAL_AMOUNT)) - /obj/item/reagent_containers/cup/beaker/large/blowing_glass name = "glass cup" desc = "A glass cup that is capable of carrying liquids." icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi' icon_state = "glass_cup" - custom_materials = null material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR -/obj/item/reagent_containers/cup/beaker/large/blowing_glass/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/glass) = SHEET_MATERIAL_AMOUNT)) - /obj/item/plate/blowing_glass name = "glass plate" desc = "A glass plate that is capable of carrying things." icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi' icon_state = "glass_plate" - custom_materials = null + custom_materials = list(/datum/material/glass=SHEET_MATERIAL_AMOUNT) material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR -/obj/item/plate/blowing_glass/Initialize(mapload) - . = ..() - set_custom_materials(list(GET_MATERIAL_REF(/datum/material/glass) = SHEET_MATERIAL_AMOUNT)) - /obj/item/glassblowing/molten_glass name = "molten glass" desc = "A glob of molten glass, ready to be shaped into art." diff --git a/tgstation.dme b/tgstation.dme index cbf2ab5e07b..2aa29fd9be1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4351,6 +4351,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 47d3e24de67..d363f6cfc26 100644 --- a/tgui/packages/tgui/interfaces/common/JobToIcon.ts +++ b/tgui/packages/tgui/interfaces/common/JobToIcon.ts @@ -54,6 +54,7 @@ const BASEICONS = { 'Shaft Miner': 'digging', 'Station Engineer': 'gears', 'Syndicate Operative': 'dragon', + 'Veteran Security Advisor': 'ribbon', Virologist: 'virus', Warden: 'handcuffs', // SKYRAT EDIT START - Skyrat-exclusive jobs have icons too