mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-31 20:11:56 +00:00
## About The Pull Request HackMD: https://hackmd.io/RE9uRwSYSjCch17-OQ4pjQ?view Feedback link: https://tgstation13.org/phpBB/viewtopic.php?f=10&t=33972 Adds a Coroner job to the game, they work in the Medical department and have their office in the Morgue. I was inspired to make this after I had played my first round on Paradise and messed around in there. The analyzer is copied from there (https://github.com/ParadiseSS13/Paradise/pull/20957), and their jumpsuit is also mostly stolen from it (i just copied the color scheme onto our own suits). Coroners can perform autopsies on people to see their stats, like this  They have access to Medbay, and on lowpop will get Pharmacy (to make their own formaldehyde). They also have their own Secure Morgue access for their office (doubles as a surgery room because they are edgelords or whatever) and the secure morgue trays. Secure Morgue trays spawn with their beepers off and is only accessible by them, the CMO, and HoS. It's used to morgue Antagonists. Security's own morgue trays have been removed. The job in action https://cdn.discordapp.com/attachments/950489581151735849/1102297675669442570/2023-04-30_14-16-06.mp4 ### Surgery changes Autopsies are a Surgery, and I tried to intertwine this with the Dissection surgery. Dissections and Autopsies both require the Autopsy scanner to perform them, however you can only perform one on any given body. Dissections are for experiments, Autopsies is for the paper of information. Dissected bodies now also give a ~20% surgery speed boost, this was added at the request of Fikou as a way to encourage Doctors to let the Coroner do their job before reviving a body. I also remember the Medical skill, which allowed Doctors to do surgery faster on people, and I hope that this can do something like that WITHOUT adding the potential for exploiting, which led to the skill's downfall. ### Morgue Improvements Morgue trays are no longer named with pens, they instead will steal the name of the last bodybag to be put in them. Morgue trays are also removed from Brig Medical areas and Robotics, now they have to bring their corpses to the Morgue where the Coroner can keep track and ensure records are properly updated. ### Sprite credits I can't fit it all in the Changelog, so this is who made what McRamon - Autopsy scanner Tattax - Table clock sprites and in-hands CoiledLamb - Coroner jumpsuits & labcoats (inhand, on sprite, and their respective alternatives) - Coroner gloves - CoronerDrobe (the vending machine) ## Why It's Good For The Game This is mostly explained in the hackmd, but the goal of this is: 1. Increase the use of the Medical Records console. 2. Add a new and interesting way for Detectives to uncover mysteries. 3. Add a more RP-flavored role in Medical that still has mechanics tied behind it. ## Changelog 🆑 JohnFulpWillard, sprites by McRamon, tattax, and Lamb add: The Coroner, a new Medical role revolving around dead corpses and autopsies. add: The Coroner's Autopsy Scanner, used for discovering the cause for someone's death, listing their wounds, the causes of them, their reagents, and diseases (including stealth ones!) qol: Morgue Trays are now named after the bodybags inside of them. balance: The morgue now has 'Secure' morgue trays which by default don't beep. balance: Security Medical area and Robotics no longer have their own morgue trays. balance: Dissected bodies now have faster surgery speed. Autopsies also count as dissections, however they're mutually exclusive. /🆑 --------- Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
114 lines
3.7 KiB
Plaintext
114 lines
3.7 KiB
Plaintext
/// What's the probability a clumsy person stabs themselves in the eyes?
|
|
#define CLUMSY_ATTACK_SELF_CHANCE 50
|
|
/// The damage threshold (of the victim's eyes) after which they start taking more serious effects
|
|
#define EYESTAB_BLEEDING_THRESHOLD 10
|
|
/// How much blur we can apply
|
|
#define EYESTAB_MAX_BLUR (4 MINUTES)
|
|
|
|
/// An element that lets you stab people in the eyes when targeting them
|
|
/datum/element/eyestab
|
|
element_flags = ELEMENT_BESPOKE
|
|
argument_hash_start_idx = 2
|
|
|
|
/// The amount of damage to do per eyestab
|
|
var/damage = 7
|
|
|
|
/datum/element/eyestab/Attach(datum/target, damage)
|
|
. = ..()
|
|
|
|
if (!isitem(target))
|
|
return ELEMENT_INCOMPATIBLE
|
|
|
|
if (!isnull(damage))
|
|
src.damage = damage
|
|
|
|
RegisterSignal(target, COMSIG_ITEM_ATTACK, PROC_REF(on_item_attack))
|
|
|
|
/datum/element/eyestab/Detach(datum/source, ...)
|
|
. = ..()
|
|
|
|
UnregisterSignal(source, COMSIG_ITEM_ATTACK)
|
|
|
|
/datum/element/eyestab/proc/on_item_attack(datum/source, mob/living/target, mob/living/user)
|
|
SIGNAL_HANDLER
|
|
|
|
if (user.zone_selected != BODY_ZONE_PRECISE_EYES)
|
|
return
|
|
|
|
if (HAS_TRAIT(user, TRAIT_PACIFISM))
|
|
return
|
|
|
|
if (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(CLUMSY_ATTACK_SELF_CHANCE))
|
|
target = user
|
|
|
|
if (target.is_eyes_covered() || isalien(target) || isbrain(target))
|
|
return
|
|
|
|
perform_eyestab(source, target, user)
|
|
|
|
return COMPONENT_SKIP_ATTACK
|
|
|
|
/datum/element/eyestab/proc/perform_eyestab(obj/item/item, mob/living/target, mob/living/user)
|
|
var/obj/item/bodypart/target_limb = target.get_bodypart(BODY_ZONE_HEAD)
|
|
if (ishuman(target) && isnull(target_limb))
|
|
return
|
|
|
|
item.add_fingerprint(user)
|
|
playsound(item, item.hitsound, 30, TRUE, -1)
|
|
user.do_attack_animation(target)
|
|
if (target == user)
|
|
user.visible_message(
|
|
span_danger("[user] stabs [user.p_them()]self in the eye with [item]!"),
|
|
span_userdanger("You stab yourself in the eye with [item]!"),
|
|
)
|
|
else
|
|
target.visible_message(
|
|
span_danger("[user] stabs [target] in the eye with [item]!"),
|
|
span_userdanger("[user] stabs you in the eye with [item]!"),
|
|
)
|
|
|
|
if (target_limb)
|
|
target.apply_damage(damage, BRUTE, target_limb, attacking_item = item)
|
|
else
|
|
target.take_bodypart_damage(damage)
|
|
|
|
target.add_mood_event("eye_stab", /datum/mood_event/eye_stab)
|
|
log_combat(user, target, "attacked", "[item.name]", "(Combat mode: [user.combat_mode ? "On" : "Off"])")
|
|
|
|
var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES)
|
|
if (!eyes)
|
|
return
|
|
|
|
target.adjust_eye_blur_up_to(6 SECONDS, EYESTAB_MAX_BLUR)
|
|
eyes.apply_organ_damage(rand(2, 4))
|
|
if(eyes.damage < EYESTAB_BLEEDING_THRESHOLD)
|
|
return
|
|
|
|
// At over 10 damage we apply a lot of eye blur
|
|
target.adjust_eye_blur_up_to(30 SECONDS, EYESTAB_MAX_BLUR)
|
|
if (target.stat != DEAD)
|
|
to_chat(target, span_danger("Your eyes start to bleed profusely!"))
|
|
|
|
// At over 10 damage, we cause at least enough eye damage to force nearsightedness
|
|
if (!target.is_nearsighted_from(EYE_DAMAGE) && eyes.damage <= eyes.low_threshold)
|
|
eyes.set_organ_damage(eyes.low_threshold)
|
|
|
|
// At over 10 damage, there is a 50% chance they drop all their items
|
|
if (prob(50))
|
|
if (target.stat != DEAD && target.drop_all_held_items())
|
|
to_chat(target, span_danger("You drop what you're holding and clutch at your eyes!"))
|
|
target.adjust_eye_blur_up_to(20 SECONDS, EYESTAB_MAX_BLUR)
|
|
target.Unconscious(2 SECONDS)
|
|
target.Paralyze(4 SECONDS)
|
|
|
|
// At over 10 damage, there is a chance (based on eye damage) of going blind
|
|
if (prob(eyes.damage - eyes.low_threshold + 1))
|
|
if (!target.is_blind_from(EYE_DAMAGE))
|
|
eyes.set_organ_damage(eyes.maxHealth)
|
|
// Also cause some temp blindness, so that they're still blind even if they get healed
|
|
target.adjust_temp_blindness_up_to(20 SECONDS, 1 MINUTES)
|
|
|
|
#undef CLUMSY_ATTACK_SELF_CHANCE
|
|
#undef EYESTAB_BLEEDING_THRESHOLD
|
|
#undef EYESTAB_MAX_BLUR
|