Files
Bubberstation/code/modules/zombie/organs.dm
LemonInTheDark 9b605b9cc0 Speeds up the preference menu, significantly. Adds object pooling, other stuff too (#63225)
* Removes like 50% of the cost of using the ui, it turns out that the storage component is fucking moronic. Likely significantly reduces the overtime of typecacheof

* Reduces the cost of reloading the dummy by ~50%
Turns out just initializing and deleting organs was like half the cost of reloading a default dummy.
It occured to me (Mothblocks) that we don't actually care about any organs we can't see or that don't effect visuals. So almost all of our organ loading can just be skipped.

This saves a significant chunk of cpu time, items next!

Co-authored-by: Seth Scherer <supernovaa41@gmx.com>
2021-12-08 16:20:03 -08:00

100 lines
3.4 KiB
Plaintext

/obj/item/organ/zombie_infection
name = "festering ooze"
desc = "A black web of pus and viscera."
zone = BODY_ZONE_HEAD
slot = ORGAN_SLOT_ZOMBIE
icon_state = "blacktumor"
visual = FALSE
var/causes_damage = TRUE
var/datum/species/old_species = /datum/species/human
var/living_transformation_time = 30
var/converts_living = FALSE
var/revive_time_min = 450
var/revive_time_max = 700
var/timer_id
/obj/item/organ/zombie_infection/Initialize(mapload)
. = ..()
if(iscarbon(loc))
Insert(loc)
GLOB.zombie_infection_list += src
/obj/item/organ/zombie_infection/Destroy()
GLOB.zombie_infection_list -= src
. = ..()
/obj/item/organ/zombie_infection/Insert(mob/living/carbon/M, special = 0)
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/organ/zombie_infection/Remove(mob/living/carbon/M, special = 0)
. = ..()
STOP_PROCESSING(SSobj, src)
if(iszombie(M) && old_species && !QDELETED(M))
M.set_species(old_species)
if(timer_id)
deltimer(timer_id)
/obj/item/organ/zombie_infection/on_find(mob/living/finder)
to_chat(finder, "<span class='warning'>Inside the head is a disgusting black \
web of pus and viscera, bound tightly around the brain like some \
biological harness.</span>")
/obj/item/organ/zombie_infection/process(delta_time)
if(!owner)
return
if(!(src in owner.internal_organs))
Remove(owner)
if(owner.mob_biotypes & MOB_MINERAL)//does not process in inorganic things
return
if (causes_damage && !iszombie(owner) && owner.stat != DEAD)
owner.adjustToxLoss(0.5 * delta_time)
if(DT_PROB(5, delta_time))
to_chat(owner, span_danger("You feel sick..."))
if(timer_id)
return
if(owner.suiciding)
return
if(owner.stat != DEAD && !converts_living)
return
if(!owner.getorgan(/obj/item/organ/brain))
return
if(!iszombie(owner))
to_chat(owner, "<span class='cultlarge'>You can feel your heart stopping, but something isn't right... \
life has not abandoned your broken form. You can only feel a deep and immutable hunger that \
not even death can stop, you will rise again!</span>")
var/revive_time = rand(revive_time_min, revive_time_max)
var/flags = TIMER_STOPPABLE
timer_id = addtimer(CALLBACK(src, .proc/zombify), revive_time, flags)
/obj/item/organ/zombie_infection/proc/zombify()
timer_id = null
if(!converts_living && owner.stat != DEAD)
return
if(!iszombie(owner))
old_species = owner.dna.species.type
owner.set_species(/datum/species/zombie/infectious)
var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS)
//Fully heal the zombie's damage the first time they rise
owner.setToxLoss(0, 0)
owner.setOxyLoss(0, 0)
owner.heal_overall_damage(INFINITY, INFINITY, INFINITY, null, TRUE)
if(!owner.revive(full_heal = FALSE, admin_revive = FALSE))
return
owner.grab_ghost()
owner.visible_message(span_danger("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!"), span_alien("You HUNGER!"))
playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, TRUE)
owner.do_jitter_animation(living_transformation_time)
owner.Stun(living_transformation_time)
to_chat(owner, span_alertalien("You are now a zombie! Do not seek to be cured, do not help any non-zombies in any way, do not harm your zombie brethren and spread the disease by killing others. You are a creature of hunger and violence."))
/obj/item/organ/zombie_infection/nodamage
causes_damage = FALSE