mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-22 16:12:19 +00:00
104 lines
3.0 KiB
Plaintext
104 lines
3.0 KiB
Plaintext
/****************************************************
|
|
INTERNAL ORGANS DEFINES
|
|
****************************************************/
|
|
/obj/item/organ/internal
|
|
var/dead_icon // Icon to use when the organ has died.
|
|
var/damage_reduction = 0.5 //modifier for internal organ injury
|
|
|
|
min_broken_damage = 10 //Internal organs are frail, man.
|
|
|
|
/obj/item/organ/internal/Destroy()
|
|
if(owner)
|
|
owner.internal_organs.Remove(src)
|
|
owner.internal_organs_by_name[organ_tag] = null
|
|
owner.internal_organs_by_name -= organ_tag
|
|
while(null in owner.internal_organs)
|
|
owner.internal_organs -= null
|
|
var/obj/item/organ/external/E = owner.organs_by_name[parent_organ]
|
|
if(istype(E)) E.internal_organs -= src
|
|
return ..()
|
|
|
|
/obj/item/organ/internal/replaced(var/mob/living/carbon/human/target, var/obj/item/organ/external/affected)
|
|
if(!istype(target))
|
|
return 0
|
|
|
|
if(status & ORGAN_CUT_AWAY)
|
|
return 0 //organs don't work very well in the body when they aren't properly attached
|
|
|
|
// robotic organs emulate behavior of the equivalent flesh organ of the species
|
|
if(BP_IS_ROBOTIC(src) || !species)
|
|
species = target.species
|
|
|
|
..()
|
|
|
|
STOP_PROCESSING(SSprocessing, src)
|
|
target.internal_organs |= src
|
|
affected.internal_organs |= src
|
|
target.internal_organs_by_name[organ_tag] = src
|
|
return 1
|
|
|
|
/obj/item/organ/internal/die()
|
|
..()
|
|
if((status & ORGAN_DEAD) && dead_icon)
|
|
icon_state = dead_icon
|
|
|
|
/obj/item/organ/internal/proc/is_usable()
|
|
return ..() && !is_broken()
|
|
|
|
/obj/item/organ/internal/robotize()
|
|
..()
|
|
min_bruised_damage += 5
|
|
min_broken_damage += 10
|
|
|
|
/obj/item/organ/internal/proc/getToxLoss()
|
|
if(BP_IS_ROBOTIC(src))
|
|
return damage * 0.5
|
|
return damage
|
|
|
|
/obj/item/organ/internal/proc/set_max_damage(var/ndamage)
|
|
max_damage = Floor(ndamage)
|
|
min_broken_damage = Floor(0.75 * max_damage)
|
|
min_bruised_damage = Floor(0.25 * max_damage)
|
|
|
|
/obj/item/organ/internal/proc/take_internal_damage(amount, var/silent=0)
|
|
if(BP_IS_ROBOTIC(src))
|
|
damage = between(0, src.damage + (amount * 0.8), max_damage)
|
|
else
|
|
damage = between(0, src.damage + amount, max_damage)
|
|
|
|
//only show this if the organ is not robotic
|
|
if(owner && can_feel_pain() && parent_organ && (amount > 5 || prob(10)))
|
|
var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
|
|
if(parent && !silent)
|
|
var/degree = ""
|
|
if(is_bruised())
|
|
degree = " a lot"
|
|
if(damage < 5)
|
|
degree = " a bit"
|
|
owner.custom_pain("Something inside your [parent.name] hurts[degree].", amount, affecting = parent)
|
|
|
|
/obj/item/organ/internal/proc/get_visible_state()
|
|
if(damage > max_damage)
|
|
. = "bits and pieces of a destroyed "
|
|
else if(is_broken())
|
|
. = "broken "
|
|
else if(is_bruised())
|
|
. = "badly damaged "
|
|
else if(damage > 5)
|
|
. = "damaged "
|
|
if(status & ORGAN_DEAD)
|
|
if(can_recover())
|
|
. = "decaying [.]"
|
|
else
|
|
. = "necrotic [.]"
|
|
. = "[.][name]"
|
|
|
|
/obj/item/organ/internal/process()
|
|
..()
|
|
handle_regeneration()
|
|
|
|
/obj/item/organ/internal/proc/handle_regeneration()
|
|
if(!damage || BP_IS_ROBOTIC(src) || !owner || owner.chem_effects[CE_TOXIN])
|
|
return
|
|
if(damage < 0.1*max_damage)
|
|
heal_damage(0.02) |