Merge branch 'master' into BREATHE

This commit is contained in:
Werner
2019-12-21 14:45:17 +01:00
committed by GitHub
336 changed files with 11622 additions and 9853 deletions

View File

@@ -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()

View File

@@ -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>")
..()

View File

@@ -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.

View File

@@ -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