From 1d980ae50d93bd2ab047a433eafe605f22ddb74e Mon Sep 17 00:00:00 2001 From: Time-Green <7501474+Time-Green@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:56:34 +0200 Subject: [PATCH] Three Recovered Crew QoL's (#91983) Three quality of life additions for recovered crew: 1. Jumpsuits are spawned in the crate, and no longer in the lockbox 2. Formaldehyde will no longer metabolize during the "soul pending" fase so you don't have to constantly re-up them with it 3. Gives them 200cr starting money instead of 100. Also get a headset in their lockbox now ## Why It's Good For The Game 1. This lets the reviver know what job they can expect to have, and make more informed choices about which organs, implants and surgeries are most beneficial to them. They can still change their mind, but it's something I've always missed having and can help to tailor the experience a bit 2. This is just annoying. Trying to revive them and not realizing the formaldehyde is gone, and then realizing absolutely everything decayed, is super fucking ass. 3. They get barely any starting gear, so some more money to help them buy gear is really needed. The headset is just there to make it easier to communicate with the department head or the HoP, it just gets you going faster. --- code/__DEFINES/traits/declarations.dm | 3 ++ code/_globalvars/traits/_traits.dm | 1 + code/datums/components/ghostrole_on_revive.dm | 7 ++++ .../lost_crew/character/_assignment.dm | 36 ++++++++++++------- code/modules/lost_crew/damages/_damages.dm | 2 +- code/modules/lost_crew/lost_crew_manager.dm | 2 +- .../chemistry/reagents/toxin_reagents.dm | 8 ++++- 7 files changed, 43 insertions(+), 16 deletions(-) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index b5993e8c8ba..dce0d06c113 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -1539,6 +1539,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait that signals to objects on this turf that its open (has UNDERFLOOR_INTERACTIBLE) but still covers them #define TRAIT_UNCOVERED_TURF "uncovered_turf" +/// A trait that blocks the metabolism of formaldehyde +#define TRAIT_BLOCK_FORMALDEHYDE_METABOLISM "block_formaldehyde_metabolism" + ///Attached to objects currently on tables and such, allowing them to walk on other objects without the climbing delay #define TRAIT_ON_CLIMBABLE "on_climbable" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 16f28002588..75d60c41e21 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -194,6 +194,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BIRTHDAY_BOY" = TRAIT_BIRTHDAY_BOY, "TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY, "TRAIT_BLOCKING_PROJECTILES" = TRAIT_BLOCKING_PROJECTILES, + "TRAIT_BLOCK_FORMALDEHYDE_METABOLISM" = TRAIT_BLOCK_FORMALDEHYDE_METABOLISM, "TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT, "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, "TRAIT_BLOODY_MESS" = TRAIT_BLOODY_MESS, diff --git a/code/datums/components/ghostrole_on_revive.dm b/code/datums/components/ghostrole_on_revive.dm index af8892d3e40..8eb118d335c 100644 --- a/code/datums/components/ghostrole_on_revive.dm +++ b/code/datums/components/ghostrole_on_revive.dm @@ -81,6 +81,10 @@ soul_eyes = new /datum/bodypart_overlay/simple/soul_pending_eyes() head.add_bodypart_overlay(soul_eyes) + // So during the potentially short period of time we're revived, we don't metabolize formaldehyde + // Really just a QOL for coroners, so we dont suddenly start decaying + ADD_TRAIT(aliver, TRAIT_BLOCK_FORMALDEHYDE_METABOLISM, type) + var/mob/dead/observer/chosen_one = SSpolling.poll_ghosts_for_target( question = "Would you like to play as a recovered crewmember?", role = null, @@ -91,6 +95,9 @@ alert_pic = aliver, role_name_text = "recovered crew", ) + + REMOVE_TRAIT(aliver, TRAIT_BLOCK_FORMALDEHYDE_METABOLISM, type) + if(head) head.remove_bodypart_overlay(soul_eyes) diff --git a/code/modules/lost_crew/character/_assignment.dm b/code/modules/lost_crew/character/_assignment.dm index 8471d9d0aa4..456ddfc3be8 100644 --- a/code/modules/lost_crew/character/_assignment.dm +++ b/code/modules/lost_crew/character/_assignment.dm @@ -3,19 +3,23 @@ /// Message we send to the player upon revival concerning their job var/job_lore /// Gear to give to the crewie in a special locked box - var/list/job_stuffs + var/list/protected_job_stuffs + /// Gear that arrives with the crewie in the crate + var/list/recovered_job_stuffs /// Trim on the ID we give to the revived person (no trim = no id) var/datum/id_trim/trim /// Job datum to apply to the human var/datum/job/job_datum -/datum/corpse_assignment/proc/apply_assignment(mob/living/carbon/human/working_dead, list/job_gear, list/datum/callback/on_revive_and_player_occupancy) - if(!job_gear) +/datum/corpse_assignment/proc/apply_assignment(mob/living/carbon/human/working_dead, list/protected_job_gear, list/recovered_job_gear, list/datum/callback/on_revive_and_player_occupancy) + if(!protected_job_gear && !recovered_job_gear && !trim) return - for(var/item in job_stuffs) - job_gear += new item () - job_gear += job_stuffs + for(var/item in protected_job_stuffs) + protected_job_gear += new item () + + for(var/item in recovered_job_stuffs) + recovered_job_gear += new item () if(job_datum) on_revive_and_player_occupancy += CALLBACK(src, PROC_REF(assign_job), working_dead) //this needs to happen once the body has been successfully occupied and revived @@ -25,14 +29,15 @@ card.registered_name = working_dead.name card.registered_age = working_dead.age SSid_access.apply_trim_to_card(card, trim) - job_gear += card + protected_job_gear += card /datum/corpse_assignment/proc/assign_job(mob/living/carbon/human/working_undead) working_undead.mind.set_assigned_role_with_greeting(new job_datum (), working_undead.client) /datum/corpse_assignment/engineer job_lore = "I was employed as an engineer" - job_stuffs = list(/obj/item/clothing/under/rank/engineering/engineer) + protected_job_stuffs = list(/obj/item/radio/headset/headset_eng) + recovered_job_stuffs = list(/obj/item/clothing/under/rank/engineering/engineer) trim = /datum/id_trim/job/visiting_engineer job_datum = /datum/job/recovered_crew/engineer @@ -50,7 +55,8 @@ /datum/corpse_assignment/medical job_lore = "I was employed as a doctor" - job_stuffs = list(/obj/item/clothing/under/rank/medical/doctor) + protected_job_stuffs = list(/obj/item/radio/headset/headset_med) + recovered_job_stuffs = list(/obj/item/clothing/under/rank/medical/doctor) trim = /datum/id_trim/job/visiting_doctor job_datum = /datum/job/recovered_crew/doctor @@ -67,7 +73,8 @@ /datum/corpse_assignment/security job_lore = "I was employed as security" - job_stuffs = list(/obj/item/clothing/under/rank/security/officer) + protected_job_stuffs = list(/obj/item/radio/headset/headset_sec) + recovered_job_stuffs = list(/obj/item/clothing/under/rank/security/officer) trim = /datum/id_trim/job/visiting_security job_datum = /datum/job/recovered_crew/security @@ -90,7 +97,8 @@ /datum/corpse_assignment/science job_lore = "I was employed as a scientist" - job_stuffs = list(/obj/item/clothing/under/rank/rnd/scientist) + protected_job_stuffs = list(/obj/item/radio/headset/headset_sci) + recovered_job_stuffs = list(/obj/item/clothing/under/rank/rnd/scientist) trim = /datum/id_trim/job/visiting_scientist job_datum = /datum/job/recovered_crew/scientist @@ -107,7 +115,8 @@ /datum/corpse_assignment/cargo job_lore = "I was employed as a technician" - job_stuffs = list(/obj/item/clothing/under/rank/cargo/tech) + protected_job_stuffs = list(/obj/item/radio/headset/headset_cargo) + recovered_job_stuffs = list(/obj/item/clothing/under/rank/cargo/tech) trim = /datum/id_trim/job/visiting_technician job_datum = /datum/job/recovered_crew/cargo @@ -124,7 +133,8 @@ /datum/corpse_assignment/civillian job_lore = "I was employed as a civllian" - job_stuffs = list(/obj/item/clothing/under/color/grey) + protected_job_stuffs = list(/obj/item/radio/headset) + recovered_job_stuffs = list(/obj/item/clothing/under/color/grey) trim = /datum/id_trim/job/visiting_civillian job_datum = /datum/job/recovered_crew/civillian diff --git a/code/modules/lost_crew/damages/_damages.dm b/code/modules/lost_crew/damages/_damages.dm index 6bf0088265f..8478e51ec71 100644 --- a/code/modules/lost_crew/damages/_damages.dm +++ b/code/modules/lost_crew/damages/_damages.dm @@ -37,7 +37,7 @@ var/datum/corpse_assignment/assignment = pick_weight(possible_character_assignments) if(ispath(assignment)) assignment = new assignment() - assignment.apply_assignment(fashion_corpse, protected_objects, on_revive_and_player_occupancy) + assignment.apply_assignment(fashion_corpse, protected_objects, recovered_items, on_revive_and_player_occupancy) body_data += assignment.type var/datum/corpse_flavor/flavor = pick_weight(possible_flavor_types) diff --git a/code/modules/lost_crew/lost_crew_manager.dm b/code/modules/lost_crew/lost_crew_manager.dm index 79efd7a62d2..22dc887393a 100644 --- a/code/modules/lost_crew/lost_crew_manager.dm +++ b/code/modules/lost_crew/lost_crew_manager.dm @@ -8,7 +8,7 @@ GLOBAL_DATUM_INIT(lost_crew_manager, /datum/lost_crew_manager, new) /// How long after successful revival we check to see if theyre still alive, and give rewards var/succes_check_time = 3 MINUTES /// How much the revived crew start with on their cards - var/starting_funds = 100 + var/starting_funds = 200 /** * Creates a body with random background and injuries diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index d5c06ee07af..94dcfe27877 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -713,11 +713,17 @@ if(affected_mob.adjustToxLoss(-1 * REM * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)) //it counteracts its own toxin damage. return UPDATE_MOB_HEALTH return - else if(SPT_PROB(2.5, seconds_per_tick)) + else if(SPT_PROB(2.5, seconds_per_tick) && !HAS_TRAIT(affected_mob, TRAIT_BLOCK_FORMALDEHYDE_METABOLISM)) holder.add_reagent(/datum/reagent/toxin/histamine, pick(5,15)) holder.remove_reagent(/datum/reagent/toxin/formaldehyde, 1.2) return ..() +/datum/reagent/toxin/formaldehyde/metabolize_reagent(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(HAS_TRAIT(affected_mob, TRAIT_BLOCK_FORMALDEHYDE_METABOLISM)) + return + + return ..() + /datum/reagent/toxin/venom name = "Venom" description = "An exotic poison extracted from highly toxic fauna. Causes scaling amounts of toxin damage and bruising depending and dosage. Often decays into Histamine."