mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-01-03 05:51:56 +00:00
Merge branch 'master' into BREATHE
This commit is contained in:
@@ -44,9 +44,24 @@
|
||||
if((status & ORGAN_DEAD) && dead_icon)
|
||||
icon_state = dead_icon
|
||||
|
||||
/obj/item/organ/internal/proc/surgical_fix() //to be used for scarring -mattatlas
|
||||
/obj/item/organ/internal/proc/surgical_fix(mob/user)
|
||||
if(damage > min_broken_damage)
|
||||
var/scarring = damage/max_damage
|
||||
scarring = 1 - 0.3 * scarring ** 2 // Between ~15 and 30 percent loss
|
||||
var/new_max_dam = Floor(scarring * max_damage)
|
||||
if(new_max_dam < max_damage)
|
||||
to_chat(user, "<span class='warning'>Not every part of [src] could be saved, some dead tissue had to be removed, making it more suspectable to damage in the future.</span>")
|
||||
set_max_damage(new_max_dam)
|
||||
heal_damage(damage)
|
||||
|
||||
/obj/item/organ/internal/proc/get_scarring_level()
|
||||
. = (initial(max_damage) - max_damage)/initial(max_damage)
|
||||
|
||||
/obj/item/organ/internal/proc/get_scarring_results()
|
||||
var/scar_level = get_scarring_level()
|
||||
if(scar_level > 0.01)
|
||||
. += "[get_wound_severity(get_scarring_level())] scarring"
|
||||
|
||||
/obj/item/organ/internal/is_usable()
|
||||
return ..() && !is_broken()
|
||||
|
||||
|
||||
@@ -28,6 +28,57 @@
|
||||
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/clear_screen), 5)
|
||||
|
||||
/obj/item/organ/internal/brain/Destroy()
|
||||
if(brainmob)
|
||||
qdel(brainmob)
|
||||
brainmob = null
|
||||
return ..()
|
||||
|
||||
/obj/item/organ/internal/brain/removed(var/mob/living/user)
|
||||
|
||||
for(var/X in traumas)
|
||||
var/datum/brain_trauma/BT = X
|
||||
BT.on_lose(TRUE)
|
||||
BT.owner = null
|
||||
|
||||
var/mob/living/simple_animal/borer/borer = owner.has_brain_worms()
|
||||
|
||||
if(borer)
|
||||
borer.detatch() //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
|
||||
|
||||
for(var/X in traumas)
|
||||
var/datum/brain_trauma/BT = X
|
||||
BT.owner = owner
|
||||
BT.on_gain()
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/brain/can_recover()
|
||||
return ~status & ORGAN_DEAD
|
||||
|
||||
@@ -41,15 +92,6 @@
|
||||
..()
|
||||
damage_threshold_value = round(max_damage / damage_threshold_count)
|
||||
|
||||
/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/clear_screen), 5)
|
||||
|
||||
/obj/item/organ/internal/brain/process()
|
||||
if(owner)
|
||||
if(damage > max_damage / 2 && healed_threshold)
|
||||
@@ -157,4 +199,108 @@
|
||||
if(is_broken())
|
||||
if(!owner.lying)
|
||||
to_chat(owner, "<span class='danger'>You black out!</span>")
|
||||
owner.Paralyse(10)
|
||||
owner.Paralyse(10)
|
||||
|
||||
/obj/item/organ/internal/brain/surgical_fix(mob/user)
|
||||
var/blood_volume = owner.get_blood_oxygenation()
|
||||
if(blood_volume < BLOOD_VOLUME_SURVIVE)
|
||||
to_chat(user, "<span class='danger'>Parts of [src] didn't survive the procedure due to lack of air supply!</span>")
|
||||
set_max_damage(Floor(max_damage - 0.25*damage))
|
||||
heal_damage(damage)
|
||||
|
||||
/obj/item/organ/internal/brain/get_scarring_level()
|
||||
. = (species.total_health - max_damage)/species.total_health
|
||||
|
||||
////////////////////////////////////TRAUMAS////////////////////////////////////////
|
||||
|
||||
/obj/item/organ/internal/brain/proc/has_trauma_type(brain_trauma_type, consider_permanent = FALSE)
|
||||
for(var/X in traumas)
|
||||
var/datum/brain_trauma/BT = X
|
||||
if(istype(BT, brain_trauma_type) && (consider_permanent || !BT.permanent))
|
||||
return BT
|
||||
|
||||
|
||||
//Add a specific trauma
|
||||
/obj/item/organ/internal/brain/proc/gain_trauma(datum/brain_trauma/trauma, permanent = FALSE, list/arguments)
|
||||
var/trauma_type
|
||||
if(ispath(trauma))
|
||||
trauma_type = trauma
|
||||
traumas += new trauma_type(arglist(list(src, permanent) + arguments))
|
||||
else
|
||||
traumas += trauma
|
||||
trauma.permanent = permanent
|
||||
|
||||
//Add a random trauma of a certain subtype
|
||||
/obj/item/organ/internal/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, permanent = FALSE)
|
||||
var/list/datum/brain_trauma/possible_traumas = list()
|
||||
for(var/T in subtypesof(brain_trauma_type))
|
||||
var/datum/brain_trauma/BT = T
|
||||
if(initial(BT.can_gain))
|
||||
possible_traumas += BT
|
||||
|
||||
var/trauma_type = pick(possible_traumas)
|
||||
traumas += new trauma_type(src, permanent)
|
||||
|
||||
//Cure a random trauma of a certain subtype
|
||||
/obj/item/organ/internal/brain/proc/cure_trauma_type(brain_trauma_type, cure_permanent = FALSE)
|
||||
var/datum/brain_trauma/trauma = has_trauma_type(brain_trauma_type)
|
||||
if(trauma && (cure_permanent || !trauma.permanent))
|
||||
qdel(trauma)
|
||||
|
||||
/obj/item/organ/internal/brain/proc/cure_all_traumas(cure_permanent = FALSE, cure_type = "")
|
||||
for(var/X in traumas)
|
||||
var/datum/brain_trauma/trauma = X
|
||||
if(trauma.cure_type == cure_type || cure_type == CURE_ADMIN)
|
||||
if(cure_permanent || !trauma.permanent)
|
||||
qdel(trauma)
|
||||
if(cure_type != CURE_ADMIN)
|
||||
break
|
||||
|
||||
//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 class='notice'>You feel slightly disoriented. That's normal when you're just a [initial(src.name)].</span>")
|
||||
callHook("debrain", list(brainmob))
|
||||
|
||||
/obj/item/organ/internal/brain/examine(mob/user) // -- TLE
|
||||
..(user)
|
||||
if(brainmob && brainmob.client)//if thar be a brain inside... the brain.
|
||||
to_chat(user, "You can feel the small spark of life still left in this one.")
|
||||
else
|
||||
to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later..")
|
||||
|
||||
/obj/item/organ/internal/brain/proc/lobotomize(mob/user as mob)
|
||||
lobotomized = 1
|
||||
|
||||
if(owner)
|
||||
to_chat(owner, "<span class='danger'>As part of your brain is drilled out, you feel your past self, your memories, your very being slip away...</span>")
|
||||
to_chat(owner, "<b>Your brain has been surgically altered to remove your memory recall. Your ability to recall your former life has been surgically removed from your brain, and while your brain is in this state you remember nothing that ever came before this moment.</b>")
|
||||
|
||||
else if(brainmob)
|
||||
to_chat(brainmob, "<span class='danger'>As part of your brain is drilled out, you feel your past self, your memories, your very being slip away...</span>")
|
||||
to_chat(brainmob, "<b>Your brain has been surgically altered to remove your memory recall. Your ability to recall your former life has been surgically removed from your brain, and while your brain is in this state you remember nothing that ever came before this moment.</b>")
|
||||
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/brain/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/surgicaldrill))
|
||||
if(!can_lobotomize)
|
||||
return
|
||||
if(!lobotomized)
|
||||
user.visible_message("<span class='danger'>[user] drills [src] deftly with [W] into the brain!</span>")
|
||||
lobotomize(user)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The brain has already been operated on!</span>")
|
||||
..()
|
||||
@@ -119,7 +119,7 @@
|
||||
var/blood_volume = round(owner.vessel.get_reagent_amount("blood"))
|
||||
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < DEFAULT_BLOOD_SPECIES && blood_volume)
|
||||
if(blood_volume < species.blood_volume && blood_volume)
|
||||
var/datum/reagent/blood/B = locate() in owner.vessel.reagent_list //Grab some blood
|
||||
if(B) // Make sure there's some blood at all
|
||||
if(weakref && B.data["donor"] != weakref) //If it's not theirs, then we look for theirs - donor is a weakref here, but it should be safe to just directly compare it.
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define PUKE_ACTION_NAME "Empty Stomach"
|
||||
|
||||
/obj/item/organ/internal/stomach
|
||||
name = "stomach"
|
||||
desc = "Gross. This is hard to stomach."
|
||||
@@ -18,6 +20,8 @@
|
||||
ingested = new /datum/reagents/metabolism(240, owner, CHEM_INGEST)
|
||||
if(!ingested.my_atom)
|
||||
ingested.my_atom = src
|
||||
if(species.gluttonous)
|
||||
action_button_name = PUKE_ACTION_NAME
|
||||
|
||||
/obj/item/organ/internal/stomach/removed()
|
||||
. = ..()
|
||||
@@ -29,6 +33,18 @@
|
||||
ingested.my_atom = owner
|
||||
ingested.parent = owner
|
||||
|
||||
/obj/item/organ/internal/stomach/refresh_action_button()
|
||||
. = ..()
|
||||
if(.)
|
||||
action.button_icon_state = "puke"
|
||||
if(action.button) action.button.UpdateIcon()
|
||||
|
||||
/obj/item/organ/internal/stomach/attack_self(mob/user)
|
||||
. = ..()
|
||||
if(. && action_button_name == PUKE_ACTION_NAME && owner && !owner.incapacitated())
|
||||
owner.vomit(deliberate = TRUE)
|
||||
refresh_action_button()
|
||||
|
||||
/obj/item/organ/internal/stomach/proc/can_eat_atom(var/atom/movable/food)
|
||||
return !isnull(get_devour_time(food))
|
||||
|
||||
@@ -113,4 +129,5 @@
|
||||
if(prob(vomit_probability))
|
||||
owner.vomit()
|
||||
|
||||
#undef STOMACH_VOLUME
|
||||
#undef STOMACH_VOLUME
|
||||
#undef PUKE_ACTION_NAME
|
||||
Reference in New Issue
Block a user