/**************************************************** 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)