mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-20 19:49:39 +01:00
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.
171 lines
7.6 KiB
Plaintext
171 lines
7.6 KiB
Plaintext
/// Manager for the lost crew bodies, for spawning and granting rewards
|
|
GLOBAL_DATUM_INIT(lost_crew_manager, /datum/lost_crew_manager, new)
|
|
|
|
/// Handles procs and timers for the lost crew bodies
|
|
/datum/lost_crew_manager
|
|
/// How many credits we reward the medical budget on a successful revive
|
|
var/credits_on_succes = /datum/supply_pack/medical/lost_crew::cost + CARGO_CRATE_VALUE * 2
|
|
/// 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 = 200
|
|
|
|
/**
|
|
* Creates a body with random background and injuries
|
|
*
|
|
* Arguments:
|
|
* * revivable - Whether or not we can be revived to grand a ghost controle
|
|
* * container - Humans really dont like not having a loc, so please either give the container where you want to spawn it or a turf
|
|
* * forced_class - To force a specific damage class for some specific lore reason
|
|
* * recovered_items - Items recovered, such as some organs, dropped directly with the body
|
|
* * protected_items - Items that can only be recovered by the revived player
|
|
* * body_data - Debug data we can use to get a readout of what has been done
|
|
*/
|
|
/datum/lost_crew_manager/proc/create_lost_crew(revivable = TRUE, datum/corpse_damage_class/forced_class, list/recovered_items, list/protected_items, list/body_data = list())
|
|
var/mob/living/carbon/human/new_body = new()
|
|
new_body.death()
|
|
|
|
var/static/list/scenarios = list()
|
|
if(!scenarios.len)
|
|
var/list/types = subtypesof(/datum/corpse_damage_class)
|
|
for(var/datum/corpse_damage_class/scenario as anything in types)
|
|
scenarios[scenario] = initial(scenario.weight)
|
|
|
|
var/list/datum/callback/on_revive_and_player_occupancy = list()
|
|
|
|
var/datum/corpse_damage_class/scenario = forced_class || pick_weight(scenarios)
|
|
scenario = new scenario ()
|
|
|
|
scenario.apply_character(new_body, protected_items, recovered_items, on_revive_and_player_occupancy, body_data)
|
|
scenario.apply_injuries(new_body, recovered_items, on_revive_and_player_occupancy, body_data)
|
|
scenario.death_lore += "I should get a formalized assignment!"
|
|
|
|
. = new_body
|
|
// so bodies can also be used for runes, morgue, etc
|
|
if(!revivable)
|
|
return
|
|
|
|
//it's not necessary since we dont spawn the body until we open the bodybag, but why not be nice for once
|
|
new_body.reagents.add_reagent(/datum/reagent/toxin/formaldehyde, 5)
|
|
|
|
if(!recovered_items)
|
|
return
|
|
|
|
var/obj/item/paper/paper = new()
|
|
recovered_items += paper
|
|
|
|
if(!HAS_TRAIT(new_body, TRAIT_HUSK))
|
|
paper.name = "DO NOT REMOVE BRAIN"
|
|
paper.add_raw_text("Body swapping is not covered by medical insurance for unhusked bodies. Chemical brain explosives have been administered to enforce stipend.")
|
|
var/obj/item/organ/brain/boombrain = new_body.get_organ_by_type(/obj/item/organ/brain)
|
|
//I swear to fuck I will explode you. you're not clever
|
|
//everyone thought of this, but I am the fool for having any faith
|
|
//in people actually wanting to play the job in an interesting manner
|
|
//instead of just taking the easiest way out and learning nothing
|
|
//(no one abused it yet but I am already getting pinged by people who think they've broken the system when really I just expected better of them)
|
|
boombrain.AddElement(/datum/element/dangerous_organ_removal)
|
|
else
|
|
paper.name = "BODYSWAPPING PERMITTED"
|
|
paper.add_raw_text("Body swapping is covered by medical insurance in case of husking and a lack of skill in the practictioner.")
|
|
|
|
var/obj/item/organ/brain/hersens = new_body.get_organ_by_type(/obj/item/organ/brain)
|
|
hersens.AddComponent(
|
|
/datum/component/ghostrole_on_revive, \
|
|
/* refuse_revival_if_failed = */ TRUE, \
|
|
/*on_revival = */ CALLBACK(src, PROC_REF(on_successful_revive), hersens, scenario.death_lore, on_revive_and_player_occupancy) \
|
|
)
|
|
|
|
/// Set a timer for awarding succes and drop some awesome deathlore
|
|
/datum/lost_crew_manager/proc/on_successful_revive(obj/item/organ/brain/brain, list/death_lore, list/datum/callback/on_revive_and_player_occupancy)
|
|
var/mob/living/carbon/human/owner = brain.owner
|
|
|
|
owner.mind.add_antag_datum(/datum/antagonist/recovered_crew) //for tracking mostly
|
|
|
|
var/datum/bank_account/bank_account = new(owner.real_name, owner.mind.assigned_role, owner.dna.species.payday_modifier)
|
|
bank_account.adjust_money(starting_funds, "[starting_funds]cr given to [owner.name] as starting fund.")
|
|
owner.account_id = bank_account.account_id
|
|
bank_account.replaceable = FALSE
|
|
|
|
owner.add_mob_memory(/datum/memory/key/account, remembered_id = owner.account_id)
|
|
|
|
death_lore += "My account number was [owner.account_id]."
|
|
|
|
brain.RemoveElement(/datum/element/dangerous_organ_removal)
|
|
|
|
// Drop the sick ass death lore and give them an indicator of who they were and what they can do
|
|
for(var/i in 1 to death_lore.len)
|
|
addtimer(CALLBACK(src, GLOBAL_PROC_REF(to_chat), owner, span_boldnotice(death_lore[i])), 10 SECONDS + 2 SECONDS * i)
|
|
|
|
addtimer(CALLBACK(src, PROC_REF(award_succes), owner.mind, death_lore), succes_check_time)
|
|
|
|
// Run any callbacks our characters or damages may have placed for some effects for when the player is revived
|
|
for(var/datum/callback/callback as anything in on_revive_and_player_occupancy)
|
|
callback.Invoke()
|
|
|
|
/// Give medbay a happy announcement and put some money into their budget
|
|
/datum/lost_crew_manager/proc/award_succes(datum/mind/revived_mind, list/death_lore)
|
|
// I am incredibly disappointed in you
|
|
if(revived_mind.current.stat == DEAD)
|
|
aas_config_announce(/datum/aas_config_entry/medical_lost_crew_reward, list("PERSON" = revived_mind.name, "AWARD" = 0), null, list(RADIO_CHANNEL_MEDICAL), "Deceased")
|
|
return
|
|
|
|
// You are a credit to society
|
|
aas_config_announce(/datum/aas_config_entry/medical_lost_crew_reward, list("PERSON" = revived_mind.name, "AWARD" = credits_on_succes), null, list(RADIO_CHANNEL_MEDICAL), "Revived")
|
|
|
|
var/datum/bank_account/medical_budget = SSeconomy.get_dep_account(ACCOUNT_MED)
|
|
medical_budget.adjust_money(credits_on_succes)
|
|
|
|
/// A box for recovered items that can only be opened by the new crewmember
|
|
/obj/item/storage/lockbox/mind
|
|
name = "mind lockbox"
|
|
desc = "A locked box, openable only by one mind."
|
|
|
|
/// The mind needed to unlock the box
|
|
var/datum/mind/mind
|
|
|
|
/obj/item/storage/lockbox/mind/attack_hand(mob/user, list/modifiers)
|
|
if (!(src in user.held_items))
|
|
return ..()
|
|
if(atom_storage.locked && can_unlock(user, silent = TRUE))
|
|
toggle_locked(user)
|
|
return
|
|
return ..()
|
|
|
|
/obj/item/storage/lockbox/mind/attack_self(mob/user, modifiers)
|
|
if (atom_storage.locked && can_unlock(user))
|
|
toggle_locked(user)
|
|
return
|
|
return ..()
|
|
|
|
/obj/item/storage/lockbox/mind/can_unlock(mob/living/user, obj/item/card/id/id_card, silent = FALSE)
|
|
if (user.mind == mind)
|
|
return TRUE
|
|
if (!silent)
|
|
balloon_alert(user, "access denied!")
|
|
return FALSE
|
|
|
|
/obj/item/storage/lockbox/mind/toggle_locked(mob/living/user)
|
|
if(!atom_storage.locked)
|
|
return
|
|
|
|
atom_storage.set_locked(STORAGE_NOT_LOCKED)
|
|
balloon_alert(user, "unlocked")
|
|
|
|
/obj/item/storage/lockbox/mind/add_context(atom/source, list/context, obj/item/held_item, mob/user)
|
|
if(broken || user.mind != mind)
|
|
return NONE
|
|
context[SCREENTIP_CONTEXT_LMB] = "Use in-hand to unlock"
|
|
return CONTEXTUAL_SCREENTIP_SET
|
|
|
|
/datum/aas_config_entry/medical_lost_crew_reward
|
|
name = "Medical Alert: Lost Crew Revival Program"
|
|
announcement_lines_map = list(
|
|
"Deceased" = "Sensors indicate lifesigns of %PERSON have seized. Please inform their family of your failure.",
|
|
"Revived" = "Sensors indicate continued survival of %PERSON. Well done, %AWARDcr has been transferred to the medical budget."
|
|
)
|
|
vars_and_tooltips_map = list(
|
|
"PERSON" = "will be replaced with body's name",
|
|
"AWARD" = "with money that medical department receive, if any"
|
|
)
|
|
modifiable = FALSE
|