//Programs that heal the host in some way. /datum/nanite_program/regenerative name = "Accelerated Regeneration" desc = "The nanites boost the host's natural regeneration, increasing their healing speed. Will not consume nanites while the host is unharmed." use_rate = 0.5 rogue_types = list(/datum/nanite_program/necrotic) /datum/nanite_program/regenerative/check_conditions() if(!host_mob.getBruteLoss() && !host_mob.getFireLoss()) return FALSE if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob var/list/parts = C.get_damaged_bodyparts(TRUE,TRUE, status = list(BODYPART_ORGANIC, BODYPART_NANITES)) if(!parts.len) return FALSE return ..() /datum/nanite_program/regenerative/active_effect() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob var/list/parts = C.get_damaged_bodyparts(TRUE,TRUE, status = list(BODYPART_ORGANIC, BODYPART_NANITES)) if(!parts.len) return for(var/obj/item/bodypart/L in parts) if(L.heal_damage(0.5/parts.len, 0.5/parts.len)) host_mob.update_damage_overlays() else host_mob.adjustBruteLoss(-0.5, TRUE) host_mob.adjustFireLoss(-0.5, TRUE) /datum/nanite_program/temperature name = "Temperature Adjustment" desc = "The nanites adjust the host's internal temperature to an ideal level. Will not consume nanites while the host is at a normal body temperature." use_rate = 3.5 rogue_types = list(/datum/nanite_program/skin_decay) /datum/nanite_program/temperature/check_conditions() if(host_mob.bodytemperature > (BODYTEMP_NORMAL - 30) && host_mob.bodytemperature < (BODYTEMP_NORMAL + 30)) return FALSE return ..() /datum/nanite_program/temperature/active_effect() if(host_mob.bodytemperature > BODYTEMP_NORMAL) host_mob.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL) else if(host_mob.bodytemperature < (BODYTEMP_NORMAL + 1)) host_mob.adjust_bodytemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) /datum/nanite_program/purging name = "Blood Purification" desc = "The nanites purge toxins and chemicals from the host's bloodstream, however it is dangerous to slime biology due to inaccuracy." use_rate = 1 rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic) /datum/nanite_program/purging/check_conditions() . = ..() if(!. || !host_mob.reagents) return FALSE // No trying to purge simple mobs var/foreign_reagent = length(host_mob.reagents?.reagent_list) if(!host_mob.getToxLoss() && !foreign_reagent) return FALSE /datum/nanite_program/purging/active_effect() host_mob.adjustToxLoss(-1) for(var/datum/reagent/R in host_mob.reagents.reagent_list) if(R.type == /datum/reagent/fermi/nanite_b_gone) host_mob.adjustToxLoss(4) continue host_mob.reagents.remove_reagent(R.type,1) /datum/nanite_program/brain_heal name = "Neural Regeneration" desc = "The nanites fix neural connections in the host's brain, reversing brain damage and minor traumas. Will not consume nanites while it would not have an effect." use_rate = 1.5 rogue_types = list(/datum/nanite_program/brain_decay) /datum/nanite_program/brain_heal/check_conditions() var/problems = FALSE if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) if(length(B?.get_traumas_type(TRAUMA_RESILIENCE_BASIC))) problems = TRUE if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN) > 0) problems = TRUE return problems ? ..() : FALSE /datum/nanite_program/brain_heal/active_effect() host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1) if(iscarbon(host_mob) && prob(10)) var/mob/living/carbon/C = host_mob C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) /datum/nanite_program/blood_restoring name = "Blood Regeneration" desc = "The nanites stimulate and boost blood cell production in the host. Will not consume nanites while the host has a safe blood level." use_rate = 1 rogue_types = list(/datum/nanite_program/suffocating) /datum/nanite_program/blood_restoring/check_conditions() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob if(C.blood_volume >= (BLOOD_VOLUME_SAFE*C.blood_ratio) || (HAS_TRAIT(C, TRAIT_NOMARROW))) return FALSE else return FALSE return ..() /datum/nanite_program/blood_restoring/active_effect() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob C.adjust_integration_blood(2) /datum/nanite_program/repairing name = "Mechanical Repair" desc = "The nanites fix damage in the host's mechanical limbs. Will not consume nanites while the host's mechanical limbs are undamaged, or while the host has no mechanical limbs." use_rate = 0.5 rogue_types = list(/datum/nanite_program/necrotic) /datum/nanite_program/repairing/check_conditions() if(!host_mob.getBruteLoss() && !host_mob.getFireLoss()) return FALSE if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob var/list/parts = C.get_damaged_bodyparts(TRUE, TRUE, status = list(BODYPART_ROBOTIC, BODYPART_HYBRID, BODYPART_NANITES)) if(!parts.len) return FALSE else if(!(host_mob.mob_biotypes & MOB_ROBOTIC)) return FALSE return ..() /datum/nanite_program/repairing/active_effect(mob/living/M) if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob var/list/parts = C.get_damaged_bodyparts(TRUE, TRUE, status = list(BODYPART_ROBOTIC, BODYPART_HYBRID, BODYPART_NANITES)) if(!parts.len) return var/update = FALSE for(var/obj/item/bodypart/L in parts) if(L.heal_damage(1.5/parts.len, 1.5/parts.len, null, TRUE, FALSE)) //much faster than organic healing update = TRUE if(update) host_mob.update_damage_overlays() else host_mob.adjustBruteLoss(-1.5, TRUE) host_mob.adjustFireLoss(-1.5, TRUE) /datum/nanite_program/purging_advanced name = "Selective Blood Purification" desc = "The nanites purge toxins and dangerous chemicals from the host's bloodstream, while ignoring beneficial chemicals. \ The added processing power required to analyze the chemicals severely increases the nanite consumption rate. This program is safe with slime biology due to the increased precision." use_rate = 2 rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic) /datum/nanite_program/purging_advanced/check_conditions() . = ..() if(!. || !host_mob.reagents) return FALSE var/foreign_reagent = FALSE for(var/datum/reagent/toxin/R in host_mob.reagents.reagent_list) foreign_reagent = TRUE break if(!host_mob.getToxLoss() && !foreign_reagent) return FALSE /datum/nanite_program/purging_advanced/active_effect() host_mob.adjustToxLoss(-1, forced = TRUE) for(var/datum/reagent/toxin/R in host_mob.reagents.reagent_list) host_mob.reagents.remove_reagent(R.type,1) /datum/nanite_program/regenerative_advanced name = "Bio-Reconstruction" desc = "The nanites manually repair and replace organic cells, acting much faster than normal regeneration. \ However, this program cannot detect the difference between harmed and unharmed, causing it to consume nanites even if it has no effect." use_rate = 5.5 rogue_types = list(/datum/nanite_program/suffocating, /datum/nanite_program/necrotic) /datum/nanite_program/regenerative_advanced/active_effect() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob var/list/parts = C.get_damaged_bodyparts(TRUE,TRUE, status = list(BODYPART_ORGANIC, BODYPART_NANITES)) if(!parts.len) return var/update = FALSE for(var/obj/item/bodypart/L in parts) if(L.heal_damage(3/parts.len, 3/parts.len, 0)) update = TRUE if(update) host_mob.update_damage_overlays() else host_mob.adjustBruteLoss(-3, TRUE) host_mob.adjustFireLoss(-3, TRUE) /datum/nanite_program/brain_heal_advanced name = "Neural Reimaging" desc = "The nanites are able to backup and restore the host's neural connections, potentially replacing entire chunks of missing or damaged brain matter." use_rate = 3 rogue_types = list(/datum/nanite_program/brain_decay, /datum/nanite_program/brain_misfire) /datum/nanite_program/brain_heal_advanced/check_conditions() var/problems = FALSE if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) if(length(B?.get_traumas_type(TRAUMA_RESILIENCE_SURGERY))) problems = TRUE if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN) > 0) problems = TRUE return problems ? ..() : FALSE /datum/nanite_program/brain_heal_advanced/active_effect() host_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2) if(iscarbon(host_mob) && prob(10)) var/mob/living/carbon/C = host_mob C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_SURGERY) /datum/nanite_program/defib name = "Defibrillation" desc = "The nanites shock the host's heart when triggered, bringing them back to life if the body can sustain it." can_trigger = TRUE trigger_cost = 25 trigger_cooldown = 120 rogue_types = list(/datum/nanite_program/shocking) /datum/nanite_program/defib/on_trigger(comm_message) host_mob.notify_ghost_cloning("Your heart is being defibrillated by nanites. Re-enter your corpse if you want to be revived!") addtimer(CALLBACK(src, PROC_REF(zap)), 50) /datum/nanite_program/defib/proc/check_revivable() if(!iscarbon(host_mob)) //nonstandard biology return FALSE var/mob/living/carbon/C = host_mob if(C.get_ghost()) return FALSE return C.can_revive() /datum/nanite_program/defib/proc/zap() var/mob/living/carbon/C = host_mob playsound(C, 'sound/machines/defib_charge.ogg', 50, FALSE) sleep(30) playsound(C, 'sound/machines/defib_zap.ogg', 50, FALSE) if(check_revivable()) var/tplus = world.time - C.timeofdeath playsound(C, 'sound/machines/defib_success.ogg', 50, FALSE) C.set_heartattack(FALSE) var/oxydamage = C.getOxyLoss() if(C.health < HEALTH_THRESHOLD_FULLCRIT && oxydamage) var/diff = C.health - HEALTH_THRESHOLD_FULLCRIT C.adjustOxyLoss(diff) //Heal their oxydamage up to hardcrit (or if less, as much as they have, since the proc has sanity) C.revive(full_heal = FALSE, admin_revive = FALSE) C.emote("gasp") C.Jitter(100) SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) var/list/policies = CONFIG_GET(keyed_list/policy) var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds var/late = timelimit && (tplus > timelimit) var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] if(policy) to_chat(C, policy) C.log_message("has been successfully defibrillated by nanites, [tplus] deciseconds from time of death, considered [late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME) else playsound(C, 'sound/machines/defib_failed.ogg', 50, FALSE)