Files
Aurora.3/code/modules/organs/internal/brain.dm
Fluffy a3a4d46fa7 Hitby refactor (#19624)
Refactored hitby to be in line with TG's version.
Refactored item weight defines to a more clear naming scheme, also in
line with TG's version.
Refactored how the movement bumps are handled, ported signals to handle
them, in preparation for the movement update.
Fixed disposal hit bouncing the hitting atom on the wall.
Items do not push other items anymore if they are tiny.
2024-07-28 20:52:08 +00:00

233 lines
8.2 KiB
Plaintext

/obj/item/organ/internal/brain
name = "brain"
desc = "A piece of juicy meat found in a person's head."
organ_tag = BP_BRAIN
parent_organ = BP_HEAD
possible_modifications = list ("Normal","Assisted")
vital = TRUE
icon_state = "brain"
force = 1
w_class = WEIGHT_CLASS_SMALL
throwforce = 1.0
throw_speed = 3
throw_range = 5
origin_tech = list(TECH_BIO = 3)
attack_verb = list("attacked", "slapped", "whacked")
toxin_type = CE_NEUROTOXIC
damage_reduction = 0
relative_size = 85
var/mob/living/carbon/brain/brainmob = null
var/prepared = FALSE
var/can_prepare = TRUE
var/const/damage_threshold_count = 10
var/damage_threshold_value
var/healed_threshold = 1
var/oxygen_reserve = 6
/obj/item/organ/internal/brain/Initialize(mapload)
. = ..()
if(species)
set_max_damage(species.total_health)
else
set_max_damage(200)
if(!mapload)
addtimer(CALLBACK(src, PROC_REF(clear_screen)), 5)
/obj/item/organ/internal/brain/Destroy()
if(brainmob)
QDEL_NULL(brainmob)
return ..()
/obj/item/organ/internal/brain/removed(var/mob/living/user)
var/mob/living/simple_animal/borer/borer = owner.has_brain_worms()
if(borer)
borer.detach() //Should remove borer if the brain is removed - RR
var/obj/item/organ/internal/brain/B = src
if(istype(B) && istype(owner))
B.transfer_identity(owner)
..()
/obj/item/organ/internal/brain/replaced(var/mob/living/target)
if(target.key)
target.ghostize()
if(brainmob)
if(brainmob.mind)
brainmob.mind.transfer_to(target)
else
target.key = brainmob.key
..()
/obj/item/organ/internal/brain/getToxLoss()
return 0
/obj/item/organ/internal/brain/can_recover()
return ~status & ORGAN_DEAD
/obj/item/organ/internal/brain/proc/get_current_damage_threshold()
return round(damage / damage_threshold_value)
/obj/item/organ/internal/brain/proc/past_damage_threshold(var/threshold)
return (get_current_damage_threshold() > threshold)
/obj/item/organ/internal/brain/set_max_damage(var/ndamage)
..()
damage_threshold_value = round(max_damage / damage_threshold_count)
/obj/item/organ/internal/brain/process()
if(owner)
if(damage > (max_damage * 0.75) && healed_threshold)
handle_severe_brain_damage()
if(damage < (max_damage / 4))
healed_threshold = 1
handle_damage_effects()
// Brain damage from low oxygenation or lack of blood.
if(owner.should_have_organ(BP_HEART))
// No heart? You are going to have a very bad time. Not 100% lethal because heart transplants should be a thing.
var/blood_volume = owner.get_blood_oxygenation()
if(blood_volume < BLOOD_VOLUME_SURVIVE)
if(!owner.chem_effects[CE_STABLE] || prob(60))
oxygen_reserve = max(0, oxygen_reserve-1)
else
oxygen_reserve = min(initial(oxygen_reserve), oxygen_reserve+1)
if(!oxygen_reserve) //(hardcrit)
owner.Paralyse(10)
var/can_heal = (damage && damage < max_damage && (damage % damage_threshold_value || owner.chem_effects[CE_BRAIN_REGEN] || (!past_damage_threshold(3) && owner.chem_effects[CE_STABLE]))) && (!(owner.chem_effects[CE_NEUROTOXIC]) || owner.chem_effects[CE_ANTITOXIN])
var/damprob
var/brain_regen_amount = owner.chem_effects[CE_BRAIN_REGEN] / 10
//Effects of bloodloss
switch(blood_volume)
if(BLOOD_VOLUME_SAFE to INFINITY)
if(can_heal && owner.chem_effects[CE_BRAIN_REGEN])
damage = max(damage - brain_regen_amount, 0)
else if(can_heal)
damage = max(damage-1, 0)
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
owner.notify_message(SPAN_WARNING("You feel a bit [pick("lightheaded","dizzy","pale")]..."), rand(20 SECONDS, 40 SECONDS), key = "blood_volume_okay")
damprob = owner.chem_effects[CE_STABLE] ? 30 : 60
if(!past_damage_threshold(2) && prob(damprob))
take_internal_damage(1)
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
owner.notify_message(SPAN_WARNING("You feel [pick("weak","disoriented","faint","cold")]."), rand(20 SECONDS, 40 SECONDS), key = "blood_volume_bad")
owner.eye_blurry = max(owner.eye_blurry,6)
damprob = owner.chem_effects[CE_STABLE] ? 40 : 80
if(!past_damage_threshold(4) && prob(damprob))
take_internal_damage(1)
if(!owner.paralysis && prob(10))
owner.Paralyse(rand(1,3))
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
owner.notify_message(SPAN_WARNING("You feel <b>extremely</b> [pick("cold","woozy","faint","weak","confused","tired","lethargic")]."), rand(20 SECONDS, 40 SECONDS), key = "blood_volume_survive")
owner.eye_blurry = max(owner.eye_blurry,6)
damprob = owner.chem_effects[CE_STABLE] ? 60 : 100
if(!past_damage_threshold(6) && prob(damprob))
take_internal_damage(1)
if(!owner.paralysis && prob(15))
owner.Paralyse(rand(3, 5))
if(-(INFINITY) to BLOOD_VOLUME_SURVIVE) // Also see heart.dm, being below this point puts you into cardiac arrest.
owner.notify_message(SPAN_DANGER("You feel feel like death is imminent."), rand(20 SECONDS, 40 SECONDS), key = "blood_volume_dying")
owner.eye_blurry = max(owner.eye_blurry,6)
damprob = owner.chem_effects[CE_STABLE] ? 80 : 100
if(prob(damprob))
take_internal_damage(1)
if(prob(damprob))
take_internal_damage(1)
..()
/obj/item/organ/internal/brain/proc/handle_severe_brain_damage()
set waitfor = FALSE
healed_threshold = 0
to_chat(owner, "<span class = 'notice'><font size=4><B>Where am I...?</B></font></span>")
owner.Paralyse(20)
sleep(5 SECONDS)
if(!owner)
return
to_chat(owner, "<span class = 'notice'><font size=4><B>What's going on...?</B></font></span>")
sleep(10 SECONDS)
if(!owner)
return
to_chat(owner, "<span class = 'notice'><font size=4><B>What happened...?</B></font></span>")
alert(owner.find_mob_consciousness(), "You have taken massive brain damage! You will not be able to remember the events leading up to your injury.", "Brain Damaged")
/obj/item/organ/internal/brain/proc/handle_damage_effects()
if(owner.stat)
return
if(damage > 0 && prob(1))
owner.custom_pain("Your head feels numb and painful.",10)
if(is_bruised() && prob(1) && owner.eye_blurry <= 0)
to_chat(owner, SPAN_WARNING("It becomes hard to see for some reason."))
owner.eye_blurry = 10
if(damage >= 0.5*max_damage && prob(1) && owner.get_active_hand())
to_chat(owner, SPAN_DANGER("Your hand won't respond properly, and you drop what you are holding!"))
owner.drop_item()
if(damage >= 0.6*max_damage)
owner.stuttering = max(owner.slurring, 2)
if(is_broken())
if(!owner.lying && prob(5))
to_chat(owner, SPAN_DANGER("You black out!"))
owner.Paralyse(10)
/obj/item/organ/internal/brain/surgical_fix(mob/user)
var/blood_volume = owner.get_blood_oxygenation()
if(blood_volume < BLOOD_VOLUME_BAD)
to_chat(user, SPAN_DANGER("Parts of [src] didn't survive the procedure due to lack of air supply!"))
set_max_damage(FLOOR(max_damage - 0.25*damage, 1))
heal_damage(damage)
/obj/item/organ/internal/brain/get_scarring_level()
. = (species.total_health - max_damage)/species.total_health
//Miscellaneous
/obj/item/organ/internal/brain/proc/clear_screen()
if (brainmob && brainmob.client)
brainmob.client.screen.Cut()
/obj/item/organ/internal/brain/proc/transfer_identity(var/mob/living/carbon/H)
brainmob = new(src)
brainmob.name = H.real_name
brainmob.real_name = H.real_name
brainmob.dna = H.dna.Clone()
brainmob.timeofhostdeath = H.timeofdeath
if(H.mind)
H.mind.transfer_to(brainmob)
to_chat(brainmob, SPAN_NOTICE("You feel slightly disoriented. That's normal when you're just a [initial(src.name)]."))
callHook("debrain", list(brainmob))
/obj/item/organ/internal/brain/get_examine_text(mob/user, distance, is_adjacent, infix, suffix)
. = ..()
if(brainmob && brainmob.client)//if thar be a brain inside... the brain.
. += "You can feel the small spark of life still left in this one."
else
. += "This one seems particularly lifeless. Perhaps it will regain some of its luster later.."
/obj/item/organ/internal/brain/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/surgery/surgicaldrill))
if(!can_prepare)
to_chat(user, SPAN_WARNING("\The [src] cannot be prepared!"))
return
if(!prepared)
user.visible_message(SPAN_DANGER("[user] deftly uses \the [attacking_item] to drill into \the [src]!"))
prepared = TRUE
else
to_chat(user, SPAN_WARNING("The brain has already been prepared!"))
return
return ..()
/obj/item/organ/internal/brain/zombie
relative_size = 100