diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index a17d4906..991e5562 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -68,26 +68,82 @@ /obj/item/organ/proc/on_find(mob/living/finder) return -/obj/item/organ/process() - on_death() //Kinda hate doing it like this, but I really don't want to call process directly. +//Sources; life.dm process_organs +/obj/item/organ/proc/on_death() //Runs when outside AND inside. + decay() -/obj/item/organ/proc/on_death() //runs decay when outside of a person - if(organ_flags & (ORGAN_SYNTHETIC | ORGAN_FROZEN | ORGAN_NO_SPOIL)) +//Applys the slow damage over time decay +/obj/item/organ/proc/decay() + if(!can_decay()) + STOP_PROCESSING(SSobj, src) + return + is_cold() + if(organ_flags & ORGAN_FROZEN) return applyOrganDamage(maxHealth * decay_factor) +/obj/item/organ/proc/can_decay() + if(CHECK_BITFIELD(organ_flags, ORGAN_NO_SPOIL | ORGAN_SYNTHETIC | ORGAN_FAILING)) + return FALSE + return TRUE + +//Checks to see if the organ is frozen from temperature +/obj/item/organ/proc/is_cold() + var/freezing_objects = list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon) + if(istype(loc, /obj/))//Freezer of some kind, I hope. + if(is_type_in_list(loc, freezing_objects)) + if(!(organ_flags & ORGAN_FROZEN))//Incase someone puts them in when cold, but they warm up inside of the thing. (i.e. they have the flag, the thing turns it off, this rights it.) + organ_flags |= ORGAN_FROZEN + return TRUE + return + + var/local_temp + if(istype(loc, /turf/))//Only concern is adding an organ to a freezer when the area around it is cold. + var/turf/T = loc + var/datum/gas_mixture/enviro = T.return_air() + local_temp = enviro.temperature + + else if(istype(loc, /mob/) && !owner) + var/mob/M = loc + if(is_type_in_list(M.loc, freezing_objects)) + if(!(organ_flags & ORGAN_FROZEN)) + organ_flags |= ORGAN_FROZEN + return TRUE + var/turf/T = M.loc + var/datum/gas_mixture/enviro = T.return_air() + local_temp = enviro.temperature + + if(owner) + //Don't interfere with bodies frozen by structures. + if(is_type_in_list(owner.loc, freezing_objects)) + if(!(organ_flags & ORGAN_FROZEN)) + organ_flags |= ORGAN_FROZEN + return TRUE + local_temp = owner.bodytemperature + + if(!local_temp)//Shouldn't happen but in case + return + if(local_temp < 154)//I have a pretty shaky citation that states -120 allows indefinite cyrostorage + organ_flags |= ORGAN_FROZEN + return TRUE + organ_flags &= ~ORGAN_FROZEN + return FALSE + /obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing - if(!(organ_flags & ORGAN_FAILING)) - ///Damage decrements by a percent of its maxhealth - var/healing_amount = -(maxHealth * healing_factor) - ///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's health - healing_amount -= owner.satiety > 0 ? 4 * healing_factor * owner.satiety / MAX_SATIETY : 0 - applyOrganDamage(healing_amount) //to FERMI_TWEAK - //Make it so each threshold is stuck. + if(organ_flags & ORGAN_FAILING) + return + if(is_cold()) + return + ///Damage decrements by a percent of its maxhealth + var/healing_amount = -(maxHealth * healing_factor) + ///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's health + healing_amount -= owner.satiety > 0 ? 4 * healing_factor * owner.satiety / MAX_SATIETY : 0 + applyOrganDamage(healing_amount) //to FERMI_TWEAK + //Make it so each threshold is stuck. /obj/item/organ/examine(mob/user) . = ..() - if(!organ_flags & ORGAN_FAILING) + if(organ_flags & ORGAN_FAILING) if(status == ORGAN_ROBOTIC) . += "[src] seems to be broken!" return @@ -177,6 +233,8 @@ return low_threshold_passed else organ_flags &= ~ORGAN_FAILING + if(!owner)//Processing is stopped when the organ is dead and outside of someone. This hopefully should restart it if a removed organ is repaired outside of a body. + START_PROCESSING(SSobj, src) if(prev_damage > low_threshold && damage <= low_threshold) return low_threshold_cleared if(prev_damage > high_threshold && damage <= high_threshold) diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index eed8ee64..7af16bea 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ