mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-21 04:48:18 +01:00
Backports the new zombification mechanics from the Konyang zombie event. (#18710)
* Reorder parasites * sounds * organ defines, dmdocs * maiming stuff * undead changes, abilities * hylemnomil, undead sprites * antibodies * antibody extractor code * icons * antibody fixes * antibodies vial, rock break sfx * You're all going to die down here. * hylemnomilz eta vial and attributions * zombified organs can't be removed * hylemnomil zeta edits * fixes * lmao * easier check --------- Co-authored-by: Matt Atlas <liermattia@gmail.com>
This commit is contained in:
@@ -502,8 +502,9 @@
|
||||
|
||||
var/edge_eligible = FALSE
|
||||
var/blunt_eligible = FALSE
|
||||
var/maim_bonus = 0
|
||||
var/dam_flags = 0
|
||||
/// Certain limbs like zombie limbs have an integrated maiming bonus that make them easier to delimb. Add that.
|
||||
var/maim_bonus_to_add = src.maim_bonus
|
||||
|
||||
if(isitem(used_weapon))
|
||||
var/obj/item/W = used_weapon
|
||||
@@ -512,17 +513,17 @@
|
||||
var/obj/item/projectile/P = W
|
||||
if(dam_flags & DAMAGE_FLAG_BULLET)
|
||||
blunt_eligible = TRUE
|
||||
maim_bonus += P.maim_rate
|
||||
maim_bonus_to_add += P.maim_rate
|
||||
if(W.w_class >= w_class && (dam_flags & DAMAGE_FLAG_EDGE))
|
||||
edge_eligible = TRUE
|
||||
|
||||
if(!blunt_eligible && edge_eligible && (brute >= max_damage / (DROPLIMB_THRESHOLD_EDGE + maim_bonus)))
|
||||
if(!blunt_eligible && edge_eligible && (brute >= max_damage / (DROPLIMB_THRESHOLD_EDGE + maim_bonus_to_add)))
|
||||
droplimb(0, DROPLIMB_EDGE)
|
||||
else if(burn >= max_damage / ((dam_flags & DAMAGE_FLAG_LASER ? DROPLIMB_THRESHOLD_DESTROY_PROJECTILE : DROPLIMB_THRESHOLD_DESTROY) + maim_bonus))
|
||||
else if(burn >= max_damage / ((dam_flags & DAMAGE_FLAG_LASER ? DROPLIMB_THRESHOLD_DESTROY_PROJECTILE : DROPLIMB_THRESHOLD_DESTROY) + maim_bonus_to_add))
|
||||
droplimb(0, DROPLIMB_BURN)
|
||||
else if(blunt_eligible && brute >= max_damage / ((dam_flags & DAMAGE_FLAG_BULLET ? DROPLIMB_THRESHOLD_DESTROY_PROJECTILE : DROPLIMB_THRESHOLD_DESTROY) + maim_bonus))
|
||||
else if(blunt_eligible && brute >= max_damage / ((dam_flags & DAMAGE_FLAG_BULLET ? DROPLIMB_THRESHOLD_DESTROY_PROJECTILE : DROPLIMB_THRESHOLD_DESTROY) + maim_bonus_to_add))
|
||||
droplimb(0, DROPLIMB_BLUNT)
|
||||
else if(brute >= max_damage / (DROPLIMB_THRESHOLD_TEAROFF + maim_bonus))
|
||||
else if(brute >= max_damage / (DROPLIMB_THRESHOLD_TEAROFF + maim_bonus_to_add))
|
||||
droplimb(0, DROPLIMB_EDGE)
|
||||
|
||||
/obj/item/organ/external/heal_damage(brute, burn, internal = 0, robo_repair = 0)
|
||||
|
||||
@@ -197,6 +197,10 @@
|
||||
mob_icon.ColorTone(rgb(10,50,0))
|
||||
mob_icon.SetIntensity(0.7)
|
||||
|
||||
if(status & ORGAN_ZOMBIFIED)
|
||||
mob_icon.ColorTone(rgb(30, 30, 30))
|
||||
mob_icon.SetIntensity(0.7)
|
||||
|
||||
if(skin_color)
|
||||
mob_icon.Blend(skin_color, ICON_ADD)
|
||||
|
||||
|
||||
@@ -1,520 +0,0 @@
|
||||
/obj/item/organ/internal/parasite
|
||||
name = "parasite"
|
||||
|
||||
organ_tag = "parasite"
|
||||
var/stage = 1
|
||||
var/max_stage = 4
|
||||
var/stage_ticker = 0
|
||||
var/recession = 0
|
||||
|
||||
///Infection progress speed, will be determined by get_infect_speed()
|
||||
var/infection_speed = 2
|
||||
|
||||
///The fastest the parasite will advance its stage
|
||||
var/infect_speed_high = 35
|
||||
|
||||
///The fastest the parasite will advance its stage
|
||||
var/infect_speed_low = 15
|
||||
|
||||
///Time between stages, in seconds. interval of 300 allows convenient treating with antiparasitics, higher will require spaced dosing of medications.
|
||||
var/stage_interval = 300
|
||||
|
||||
///Boolean, if the body should reject the parasite naturally
|
||||
var/subtle = FALSE
|
||||
|
||||
///Does the parasite have a reagent which seeds an infection?
|
||||
var/egg = null
|
||||
|
||||
//Boolean, if the parasite is resistant to antiparasitic medications
|
||||
var/drug_resistance = FALSE
|
||||
|
||||
/obj/item/organ/internal/parasite/Initialize()
|
||||
. = ..()
|
||||
get_infect_speed()
|
||||
|
||||
/obj/item/organ/internal/parasite/proc/get_infect_speed() //Slightly randomizes how fast each infection progresses.
|
||||
infection_speed = rand(infect_speed_low, infect_speed_high) / 10
|
||||
|
||||
/obj/item/organ/internal/parasite/process()
|
||||
..()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(owner.chem_effects[CE_ANTIPARASITE] && !drug_resistance)
|
||||
recession = owner.chem_effects[CE_ANTIPARASITE]/10
|
||||
|
||||
if((stage < max_stage) && !recession)
|
||||
stage_ticker = Clamp(stage_ticker+=infection_speed, 0, stage_interval*max_stage)
|
||||
if(stage_ticker >= stage*stage_interval)
|
||||
stage = min(stage+1,max_stage)
|
||||
get_infect_speed() //Each stage may progress faster or slower than the previous one
|
||||
stage_effect()
|
||||
|
||||
if(recession)
|
||||
stage_ticker = Clamp(stage_ticker-=recession, 0, stage_interval*max_stage)
|
||||
if(stage_ticker <= stage*stage_interval-stage_interval)
|
||||
stage = max(stage-1, 1)
|
||||
stage_effect()
|
||||
if(!owner.chem_effects[CE_ANTIPARASITE] || drug_resistance)
|
||||
recession = 0
|
||||
if(stage_ticker == 0)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/organ/internal/parasite/handle_rejection()
|
||||
if(subtle)
|
||||
return ..()
|
||||
else
|
||||
if(rejecting)
|
||||
rejecting = 0
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/parasite/proc/stage_effect()
|
||||
return
|
||||
|
||||
///////////////////
|
||||
///K'ois Mycosis///
|
||||
///////////////////
|
||||
|
||||
/obj/item/organ/internal/parasite/kois
|
||||
name = "k'ois mycosis"
|
||||
icon = 'icons/obj/organs/organs.dmi'
|
||||
icon_state = "kois-on"
|
||||
dead_icon = "kois-off"
|
||||
|
||||
organ_tag = "kois"
|
||||
|
||||
parent_organ = BP_CHEST
|
||||
stage_interval = 150
|
||||
drug_resistance = 1
|
||||
|
||||
origin_tech = list(TECH_BIO = 3)
|
||||
|
||||
egg = /singleton/reagent/kois
|
||||
|
||||
/obj/item/organ/internal/parasite/kois/process()
|
||||
..()
|
||||
|
||||
if (!owner)
|
||||
return
|
||||
|
||||
if(prob(10) && (owner.can_feel_pain()))
|
||||
to_chat(owner, "<span class='warning'>You feel a stinging pain in your abdomen!</span>")
|
||||
owner.visible_message("<b>[owner]</b> winces slightly.")
|
||||
owner.adjustHalLoss(5)
|
||||
|
||||
else if(prob(10) && !(owner.species.flags & NO_BREATHE))
|
||||
owner.emote("cough")
|
||||
|
||||
else if(prob(10) && !(owner.species.flags & NO_BREATHE))
|
||||
owner.visible_message("<b>[owner]</b> coughs up blood!")
|
||||
owner.drip(10)
|
||||
|
||||
if(stage >= 2)
|
||||
if(prob(10) && !(owner.species.flags & NO_BREATHE))
|
||||
owner.visible_message("<b>[owner]</b> gasps for air!")
|
||||
owner.losebreath += 5
|
||||
|
||||
if(stage >= 3)
|
||||
set_light(1, l_color = "#E6E600")
|
||||
if(prob(10))
|
||||
to_chat(owner, "<span class='warning'>You feel something squirming inside of you!</span>")
|
||||
owner.reagents.add_reagent(/singleton/reagent/toxin/phoron, 8)
|
||||
owner.reagents.add_reagent(/singleton/reagent/kois, 5)
|
||||
|
||||
if(stage >= 4)
|
||||
if(prob(10))
|
||||
to_chat(owner, "<span class='danger'>You feel something alien coming up your throat!</span>")
|
||||
owner.emote("cough")
|
||||
|
||||
var/turf/T = get_turf(owner)
|
||||
|
||||
var/datum/reagents/R = new/datum/reagents(100)
|
||||
R.add_reagent(/singleton/reagent/kois,10)
|
||||
R.add_reagent(/singleton/reagent/toxin/phoron,10)
|
||||
var/datum/effect/effect/system/smoke_spread/chem/spores/S = new("koisspore")
|
||||
|
||||
S.attach(T)
|
||||
S.set_up(R, 20, 0, T, 40)
|
||||
S.start()
|
||||
|
||||
if(owner.can_feel_pain())
|
||||
owner.emote("scream")
|
||||
owner.adjustHalLoss(15)
|
||||
owner.drip(15)
|
||||
owner.delayed_vomit()
|
||||
|
||||
///////////////////
|
||||
///Black Mycosis///
|
||||
///////////////////
|
||||
|
||||
/obj/item/organ/internal/parasite/blackkois
|
||||
name = "k'ois mycosis"
|
||||
icon = 'icons/obj/organs/organs.dmi'
|
||||
icon_state = "black-on"
|
||||
dead_icon = "black-off"
|
||||
subtle = 1
|
||||
|
||||
organ_tag = "blackkois"
|
||||
|
||||
parent_organ = BP_HEAD
|
||||
var/removed_langs = FALSE
|
||||
var/full_zombie = FALSE
|
||||
stage_interval = 150
|
||||
drug_resistance = 1
|
||||
max_stage = 5
|
||||
|
||||
origin_tech = list(TECH_BIO = 7)
|
||||
|
||||
egg = /singleton/reagent/kois/black
|
||||
|
||||
/obj/item/organ/internal/parasite/blackkois/process()
|
||||
..()
|
||||
|
||||
if(prob(10) && (owner.can_feel_pain()))
|
||||
if(stage < 3)
|
||||
to_chat(owner, "<span class='warning'>You feel a stinging pain in your head!</span>")
|
||||
else
|
||||
to_chat(owner, "A part of you tries to fight back, but the taste of the black k'ois puts you at ease.")
|
||||
owner.visible_message("<b>[owner]</b> winces slightly.")
|
||||
owner.adjustHalLoss(5)
|
||||
|
||||
if(stage >= 2)
|
||||
if(prob(10) && !(owner.species.flags & NO_BREATHE))
|
||||
owner.visible_message("<b>[owner]</b> gasps for air!")
|
||||
owner.losebreath += 5
|
||||
|
||||
if(stage >= 3)
|
||||
set_light(-1.5, 6, "#FFFFFF")
|
||||
if(!(GLOB.all_languages[LANGUAGE_VAURCA] in owner.languages))
|
||||
owner.add_language(LANGUAGE_VAURCA)
|
||||
to_chat(owner, "<span class='notice'> Your mind expands, and your thoughts join the unity of the Hivenet.</span>")
|
||||
|
||||
if(prob(5))
|
||||
if(stage < 4)
|
||||
to_chat(owner, SPAN_WARNING("You feel something squirming inside of you!"))
|
||||
else
|
||||
to_chat(owner, SPAN_GOOD("You feel it, within you. Its presence soothes, a constant companion. There is no need to resist. We are with you. We will not abandon you."))
|
||||
owner.reagents.add_reagent(/singleton/reagent/kois/black, 4)
|
||||
|
||||
else if(prob(5))
|
||||
if(stage < 4)
|
||||
to_chat(owner, SPAN_GOOD("In your struggle, a part of you wishes for the spread to continue."))
|
||||
else
|
||||
to_chat(owner, SPAN_GOOD("You cannot ever believe that you struggled against this feeling. You are home. You are happy."))
|
||||
|
||||
else if(prob(10))
|
||||
to_chat(owner, "<span class='warning'>You feel disorientated!</span>")
|
||||
switch(rand(1,3))
|
||||
if(1)
|
||||
owner.confused += 10
|
||||
owner.apply_effect(10,EYE_BLUR)
|
||||
if(2)
|
||||
owner.slurring += 30
|
||||
if(3)
|
||||
owner.make_dizzy(10)
|
||||
|
||||
if(stage >= 4)
|
||||
|
||||
var/obj/item/organ/internal/brain/B = owner.internal_organs_by_name[BP_BRAIN]
|
||||
|
||||
if(B && !B.prepared)
|
||||
to_chat(owner, SPAN_GOOD("As the K'ois consumes your mind, you feel your past self, your memories, your very being slip away. Do not resist it. Let Us in."))
|
||||
to_chat(owner, SPAN_HIGHDANGER("You have been lobotomized by K'ois infection."))
|
||||
to_chat(owner, SPAN_NOTICE("All of your previous memories up until this point are gone, and all of your ambitions are nothing. You live for only one purpose; to serve the Lii'dra hive."))
|
||||
|
||||
B.prepared = 1
|
||||
|
||||
|
||||
if(!removed_langs)
|
||||
for(var/datum/language/L in owner.languages)
|
||||
owner.remove_language(L.name)
|
||||
owner.add_language(LANGUAGE_VAURCA)
|
||||
owner.add_language(LANGUAGE_LIIDRA)
|
||||
owner.set_default_language(LANGUAGE_LIIDRA)
|
||||
removed_langs = TRUE
|
||||
|
||||
owner.set_see_invisible(SEE_INVISIBLE_NOLIGHTING)
|
||||
owner.add_client_color(/datum/client_color/vaurca)
|
||||
|
||||
if(prob(10))
|
||||
if(owner.can_feel_pain())
|
||||
to_chat(owner, SPAN_WARNING("You feel an unbearable pain in your mind!"))
|
||||
owner.emote("scream")
|
||||
else if(full_zombie)
|
||||
to_chat(owner, SPAN_GOOD("Your mind hums with a billion voices that are not your own. You will never be alone again. Unbidden, a smile comes to your face."))
|
||||
owner.adjustBrainLoss(1, 55)
|
||||
|
||||
else if(prob(0.5))
|
||||
if(stage <= 4)
|
||||
to_chat(owner, SPAN_DANGER("You feel something alien coming up your throat!"))
|
||||
else
|
||||
to_chat(owner, SPAN_GOOD("You can feel it, flowering within your lungs. What a beautiful feeling, to share it with the Spur. You exhale, and the companion nestled within your flesh blooms, drowning out the light."))
|
||||
var/turf/T = get_turf(owner)
|
||||
|
||||
var/datum/reagents/R = new/datum/reagents(20)
|
||||
R.add_reagent(/singleton/reagent/kois/black,5)
|
||||
var/datum/effect/effect/system/smoke_spread/chem/spores/S = new("blackkois")
|
||||
|
||||
S.attach(T)
|
||||
S.set_up(R, 20, 0, T, 40)
|
||||
S.start()
|
||||
|
||||
if(owner.can_feel_pain())
|
||||
owner.emote("scream")
|
||||
owner.adjustHalLoss(5)
|
||||
owner.drip(5)
|
||||
owner.delayed_vomit()
|
||||
|
||||
if(stage >= 5)
|
||||
if(!full_zombie)
|
||||
to_chat(owner, SPAN_GOOD("You are dying. But it does not matter. You will serve Our will, until you can serve no more."))
|
||||
to_chat(owner, SPAN_NOTICE("You are in the final stage of black k'ois mycosis. It cannot be removed, and you can no longer handle guns or other complex devices, as \
|
||||
your fine motor skills erode. However, you are stronger, and no longer affected by pain."))
|
||||
if(owner.can_feel_pain())
|
||||
owner.pain_immune = TRUE
|
||||
if(!owner.lobotomized)
|
||||
owner.lobotomized = TRUE //no guns for you, beat people to death as high queen lii'dra intended
|
||||
owner.max_stamina = 500 //you are a discount zombie, you run good
|
||||
add_verb(owner, /mob/living/carbon/human/proc/kois_cough)
|
||||
add_verb(owner, /mob/living/carbon/human/proc/kois_infect)
|
||||
full_zombie = TRUE
|
||||
|
||||
/obj/item/organ/internal/parasite/blackkois/removed(var/mob/living/carbon/human/target)
|
||||
var/obj/item/organ/internal/brain/B = target.internal_organs_by_name[BP_BRAIN]
|
||||
switch(stage)
|
||||
if(1)
|
||||
target.visible_message(SPAN_WARNING("As the black k'ois is cut from [target.name], [target.get_pronoun("he")] spasm[target.get_pronoun("end")] briefly, the black k'ois pulsing in [target.get_pronoun("his")] brain. You can see the scars it has left - it was not a clean surgery, but the damage is minor. [target.get_pronoun("He")] will likely fully recover, given time."),\
|
||||
SPAN_WARNING("They cut at your mind, removing the growth that infests it. Your head aches - but your mind is still intact."))
|
||||
to_chat(target, SPAN_CULT("A shiver passes over your mind, an odd sense of loneliness. But it lasts only a moment, and then it is gone."))
|
||||
B.max_damage = B.max_damage*0.95 //you got it early, good job
|
||||
if(2)
|
||||
target.visible_message(SPAN_WARNING("As the black k'ois is cut from [target.name], [target.get_pronoun("he")] spasm[target.get_pronoun("end")] wildly, the black k'ois embedded in [target.get_pronoun("his")] brain. You can see the scars it has left - though it was not a clean surgery, the damage is not too great. [target.get_pronoun("He")] may well fully recover."),\
|
||||
SPAN_WARNING("They cut at your mind, removing the growth that infests it. Your head hurts, and you find some things hard to recall - but you remember who you are, and you are free from a truly terrible fate. Perhaps that is some comfort."))
|
||||
to_chat(target, SPAN_CULT("Something lingers on you. You are free of the mycosis before it could kill you - and why does that fact make you feel almost sad?"))
|
||||
B.max_damage = B.max_damage*0.75 //bit more scarring but still ok
|
||||
if(3)
|
||||
target.visible_message(SPAN_WARNING("As the black k'ois is cut from [target.name], [target.get_pronoun("he")] spasm[target.get_pronoun("end")] wildly, the black k'ois deeply embedded in [target.get_pronoun("his")] brain. You can see the scars it has left - it was not a clean surgery, and [target.get_pronoun("he")] may not fully recover - but [target.get_pronoun("he")] will live, at least."),\
|
||||
SPAN_WARNING("They cut at your mind, removing the growth that infests it. Your head hurts, and you find some things hard to recall - but you remember who you are, and you are free from a truly terrible fate. Perhaps that is some comfort."))
|
||||
to_chat(target, SPAN_CULT("A part of you misses the feeling of it, pulsing inside your skull like a friend, a constant companion. You have survived - but you cannot help but feel empty."))
|
||||
B.max_damage = B.max_damage*0.65 //ok, now you have permanent brain damage
|
||||
if(4)
|
||||
target.visible_message(SPAN_WARNING("As the black k'ois is cut from [target.name], [target.get_pronoun("he")] spasm[target.get_pronoun("end")] wildly, the black k'ois deeply embedded in [target.get_pronoun("his")] brain. You can see the scars it has left - it was not a clean surgery, and [target.get_pronoun("he")] will never fully recover - but [target.get_pronoun("he")] will live, at least."),\
|
||||
SPAN_WARNING("They cut at your mind, removing the growth that infests it. It's hard to remember what you are, without it. Perhaps, if you think hard enough, you can remember your name."))
|
||||
to_chat(target, SPAN_CULT("You have failed Us. We will find another way. Releasing control."))
|
||||
B.max_damage = B.max_damage*0.45 //yeah your brain is severely messed up man
|
||||
if(5)
|
||||
target.visible_message(SPAN_WARNING("As the black k'ois is cut from [target.name], [target.get_pronoun("he")] spasm[target.get_pronoun("end")] wildly, [target.get_pronoun("his")] brain too damaged to function. A horrible choking sound emerges from [target.get_pronoun("his")] mouth, before it is mercifully silenced as [target.get_pronoun("he")] falls still."),\
|
||||
SPAN_DANGER("You feel the cold of the knife cutting and cutting, but it is too late. There is nothing left of you but the Lii'dra's will, now. A final cut - and then you are granted the only escape that still remains to you."))
|
||||
to_chat(target, SPAN_GOOD("Your function is fulfilled. We have no further need of you. Releasing control."))
|
||||
target.death(FALSE) //too late, there is no brain left to save
|
||||
if(GLOB.all_languages[LANGUAGE_VAURCA] in target.languages && stage >= 3 && !isvaurca(target))
|
||||
target.remove_language(LANGUAGE_VAURCA)
|
||||
to_chat(target, "<span class='warning'>Your mind suddenly grows dark as the unity of the Hive is torn from you.</span>")
|
||||
if(GLOB.all_languages[LANGUAGE_LIIDRA] in target.languages && stage >= 3)
|
||||
target.remove_language(LANGUAGE_LIIDRA)
|
||||
removed_langs = 0
|
||||
remove_verb(owner, /mob/living/carbon/human/proc/kois_cough)
|
||||
remove_verb(owner, /mob/living/carbon/human/proc/kois_infect)
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/parasite/zombie
|
||||
name = "black tumour"
|
||||
icon = 'icons/obj/organs/organs.dmi'
|
||||
icon_state = "black_tumour"
|
||||
dead_icon = "black_tumour"
|
||||
|
||||
organ_tag = BP_ZOMBIE_PARASITE
|
||||
parent_organ = BP_HEAD
|
||||
stage_interval = 110
|
||||
drug_resistance = TRUE
|
||||
relative_size = 0
|
||||
|
||||
egg = /singleton/reagent/toxin/trioxin
|
||||
|
||||
var/last_heal = 0
|
||||
var/heal_rate = 5 SECONDS
|
||||
|
||||
/obj/item/organ/internal/parasite/zombie/process()
|
||||
..()
|
||||
|
||||
if (!owner)
|
||||
return
|
||||
|
||||
if(length(owner.bad_external_organs) && last_heal + heal_rate < world.time && iszombie(owner))
|
||||
var/list/organs_to_heal = owner.bad_external_organs
|
||||
shuffle(organs_to_heal)
|
||||
for(var/thing in organs_to_heal)
|
||||
var/obj/item/organ/external/O = thing
|
||||
if(istype(O, /obj/item/organ/external/head)) // the head is the weak point
|
||||
continue
|
||||
var/healed = FALSE
|
||||
if(O.status & ORGAN_ARTERY_CUT)
|
||||
O.status &= ~ORGAN_ARTERY_CUT
|
||||
owner.visible_message(SPAN_WARNING("The severed artery in \the [owner]'s [O] stitches itself back together..."), SPAN_NOTICE("The severed artery in your [O] stitches itself back together..."))
|
||||
healed = TRUE
|
||||
else if((O.tendon_status() & TENDON_CUT) && O.tendon.can_recover())
|
||||
O.tendon.rejuvenate()
|
||||
owner.visible_message(SPAN_WARNING("The severed tendon in \the [owner]'s [O] stitches itself back together..."), SPAN_NOTICE("The severed tendon in your [O] stitches itself back together..."))
|
||||
healed = TRUE
|
||||
else if(O.status & ORGAN_BROKEN)
|
||||
var/list/brute_wounds = list()
|
||||
for(var/wound in O.wounds)
|
||||
var/datum/wound/W = wound
|
||||
if(W.damage_type in list(CUT, BRUISE, PIERCE))
|
||||
brute_wounds += W
|
||||
for(var/wound in brute_wounds)
|
||||
var/datum/wound/W = wound
|
||||
W.damage = max(min(W.damage, (O.min_broken_damage / length(brute_wounds))), 0)
|
||||
O.status &= ~ORGAN_BROKEN
|
||||
owner.visible_message(SPAN_WARNING("The shattered bone in \the [owner]'s [O] melds back together..."), SPAN_NOTICE("The shattered bone in your [O] melds back together..."))
|
||||
healed = TRUE
|
||||
if(healed)
|
||||
last_heal = world.time
|
||||
heal_rate += 2 SECONDS
|
||||
O.update_damages()
|
||||
break
|
||||
|
||||
if(prob(10) && (owner.can_feel_pain()))
|
||||
to_chat(owner, "<span class='warning'>You feel a burning sensation on your skin!</span>")
|
||||
owner.make_jittery(10)
|
||||
|
||||
else if(prob(10))
|
||||
owner.emote("moan")
|
||||
|
||||
if(stage >= 2)
|
||||
if(prob(15))
|
||||
owner.emote("scream")
|
||||
if(!isundead(owner))
|
||||
owner.adjustBrainLoss(2, 55)
|
||||
|
||||
else if(prob(10))
|
||||
if(!isundead(owner))
|
||||
to_chat(owner, "<span class='warning'>You feel sick.</span>")
|
||||
owner.adjustToxLoss(5)
|
||||
owner.delayed_vomit()
|
||||
|
||||
if(stage >= 3)
|
||||
if(prob(10))
|
||||
if(isundead(owner))
|
||||
owner.adjustBruteLoss(-30)
|
||||
owner.adjustFireLoss(-30)
|
||||
else
|
||||
to_chat(owner, "<span class='cult'>You feel an insatiable hunger.</span>")
|
||||
owner.nutrition = -1
|
||||
|
||||
if(stage >= 4)
|
||||
if(prob(10))
|
||||
if(!isundead(owner))
|
||||
if(owner.species.zombie_type)
|
||||
var/r = owner.r_skin
|
||||
var/g = owner.g_skin
|
||||
var/b = owner.b_skin
|
||||
|
||||
for(var/datum/language/L in owner.languages)
|
||||
owner.remove_language(L.name)
|
||||
to_chat(owner, "<span class='warning'>You feel life leaving your husk, but death rejects you...</span>")
|
||||
playsound(src.loc, 'sound/hallucinations/far_noise.ogg', 50, 1)
|
||||
to_chat(owner, "<font size='3'><span class='cult'>All that is left is a cruel hunger for the flesh of the living, and the desire to spread this infection. You must consume all the living!</font></span>")
|
||||
owner.set_species(owner.species.zombie_type, 0, 0, 0)
|
||||
owner.change_skin_color(r, g, b)
|
||||
owner.update_dna()
|
||||
else
|
||||
owner.adjustToxLoss(50)
|
||||
|
||||
//Parasitic Worms//
|
||||
|
||||
/obj/item/organ/internal/parasite/nerveworm
|
||||
name = "bundle of nerve flukes"
|
||||
icon = 'icons/obj/organs/organs.dmi'
|
||||
icon_state = "helminth"
|
||||
dead_icon = "helminth_dead"
|
||||
|
||||
organ_tag = BP_WORM_NERVE
|
||||
parent_organ = BP_L_ARM //if desperate, can lop your arm off to remove the infection :)
|
||||
subtle = 1
|
||||
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
egg = /singleton/reagent/toxin/nerveworm_eggs
|
||||
|
||||
/obj/item/organ/internal/parasite/nerveworm/process()
|
||||
..()
|
||||
|
||||
if (!owner)
|
||||
return
|
||||
|
||||
if(prob(4))
|
||||
owner.adjustNutritionLoss(10)
|
||||
|
||||
if(stage >= 2) //after ~5 minutes
|
||||
owner.confused = max(owner.confused, 10)
|
||||
|
||||
if(stage >= 3) //after ~10 minutes
|
||||
owner.slurring = max(owner.slurring, 100)
|
||||
owner.drowsiness = max(owner.drowsiness, 20)
|
||||
if(prob(1))
|
||||
owner.delayed_vomit()
|
||||
if(prob(2))
|
||||
to_chat(owner, SPAN_WARNING(pick("You feel a tingly sensation in your fingers.", "Is that pins and needles?", "An electric sensation jolts its way up your left arm.", "You smell something funny.", "You taste something funny.")))
|
||||
|
||||
if(stage >= 4) //after ~15 minutes
|
||||
if(prob(2))
|
||||
to_chat(owner, SPAN_WARNING(pick("A deep, tingling sensation paralyses your left arm.", "You feel as if you just struck your funny bone.", "You feel a pulsing sensation within your left arm.")))
|
||||
owner.emote(pick("twitch", "shiver"))
|
||||
owner.stuttering = 20
|
||||
if(prob(1))
|
||||
owner.seizure()
|
||||
if(prob(5))
|
||||
owner.reagents.add_reagent(/singleton/reagent/toxin/nerveworm_eggs, 2)
|
||||
owner.adjustHalLoss(15)
|
||||
to_chat(owner, SPAN_WARNING("An <b>extreme</b>, nauseating pain erupts from deep within your left arm!"))
|
||||
|
||||
|
||||
/obj/item/organ/internal/parasite/heartworm
|
||||
name = "bundle of heart flukes"
|
||||
icon = 'icons/obj/organs/organs.dmi'
|
||||
icon_state = "helminth"
|
||||
dead_icon = "helminth_dead"
|
||||
|
||||
organ_tag = BP_WORM_HEART
|
||||
parent_organ = BP_CHEST
|
||||
subtle = 1
|
||||
|
||||
stage_interval = 450 //~7.5 minutes/stage
|
||||
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
egg = /singleton/reagent/toxin/heartworm_eggs
|
||||
|
||||
/obj/item/organ/internal/parasite/heartworm/process()
|
||||
..()
|
||||
|
||||
var/obj/item/organ/internal/heart = owner.internal_organs_by_name[BP_HEART]
|
||||
|
||||
if (!owner)
|
||||
return
|
||||
|
||||
if(BP_IS_ROBOTIC(heart))
|
||||
recession = 10
|
||||
return
|
||||
|
||||
if(prob(4))
|
||||
owner.adjustNutritionLoss(10)
|
||||
|
||||
if(stage >= 2) //after ~7.5 minutes
|
||||
if(prob(2))
|
||||
owner.emote("cough")
|
||||
|
||||
if(stage >= 3) //after ~15 minutes
|
||||
if(prob(7))
|
||||
heart.take_damage(rand(2,5))
|
||||
if(prob(5))
|
||||
to_chat(owner, SPAN_WARNING(pick("Your chest feels tight.", "Your chest is aching.", "You feel a stabbing pain in your chest!", "You feel a painful, tickly sensation within your chest.")))
|
||||
owner.adjustHalLoss(15)
|
||||
|
||||
if(stage >= 4) //after ~22.5 minutes
|
||||
if(prob(5))
|
||||
owner.reagents.add_reagent(/singleton/reagent/toxin/heartworm_eggs, 2)
|
||||
owner.adjustHalLoss(15)
|
||||
to_chat(owner, SPAN_WARNING("An <b>extreme</b>, nauseating pain erupts from the centre of your chest!"))
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
/obj/item/organ/internal/parasite
|
||||
name = "parasite"
|
||||
|
||||
organ_tag = "parasite"
|
||||
var/stage = 1
|
||||
var/max_stage = 4
|
||||
var/stage_ticker = 0
|
||||
var/recession = 0
|
||||
|
||||
///Infection progress speed, will be determined by get_infect_speed()
|
||||
var/infection_speed = 2
|
||||
|
||||
///The fastest the parasite will advance its stage
|
||||
var/infect_speed_high = 35
|
||||
|
||||
///The fastest the parasite will advance its stage
|
||||
var/infect_speed_low = 15
|
||||
|
||||
///Time between stages, in seconds. interval of 300 allows convenient treating with antiparasitics, higher will require spaced dosing of medications.
|
||||
var/stage_interval = 300
|
||||
|
||||
///Boolean, if the body should reject the parasite naturally
|
||||
var/subtle = FALSE
|
||||
|
||||
///Does the parasite have a reagent which seeds an infection?
|
||||
var/egg = null
|
||||
|
||||
//Boolean, if the parasite is resistant to antiparasitic medications
|
||||
var/drug_resistance = FALSE
|
||||
|
||||
/obj/item/organ/internal/parasite/Initialize()
|
||||
. = ..()
|
||||
get_infect_speed()
|
||||
|
||||
/obj/item/organ/internal/parasite/proc/get_infect_speed() //Slightly randomizes how fast each infection progresses.
|
||||
infection_speed = rand(infect_speed_low, infect_speed_high) / 10
|
||||
|
||||
/obj/item/organ/internal/parasite/process()
|
||||
..()
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(owner.chem_effects[CE_ANTIPARASITE] && !drug_resistance)
|
||||
recession = owner.chem_effects[CE_ANTIPARASITE]/10
|
||||
|
||||
if((stage < max_stage) && !recession)
|
||||
stage_ticker = Clamp(stage_ticker+=infection_speed, 0, stage_interval*max_stage)
|
||||
if(stage_ticker >= stage*stage_interval)
|
||||
process_stage()
|
||||
get_infect_speed() //Each stage may progress faster or slower than the previous one
|
||||
stage_effect()
|
||||
|
||||
if(recession)
|
||||
stage_ticker = Clamp(stage_ticker-=recession, 0, stage_interval*max_stage)
|
||||
if(stage_ticker <= stage*stage_interval-stage_interval)
|
||||
stage = max(stage-1, 1)
|
||||
stage_effect()
|
||||
if(!owner.chem_effects[CE_ANTIPARASITE] || drug_resistance)
|
||||
recession = 0
|
||||
if(stage_ticker == 0)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/organ/internal/parasite/handle_rejection()
|
||||
if(subtle)
|
||||
return ..()
|
||||
else
|
||||
if(rejecting)
|
||||
rejecting = 0
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/parasite/proc/process_stage()
|
||||
stage = min(stage+1,max_stage)
|
||||
|
||||
/obj/item/organ/internal/parasite/proc/stage_effect()
|
||||
return
|
||||
@@ -0,0 +1,169 @@
|
||||
/obj/item/organ/internal/parasite/blackkois
|
||||
name = "k'ois mycosis"
|
||||
icon = 'icons/obj/organs/organs.dmi'
|
||||
icon_state = "black-on"
|
||||
dead_icon = "black-off"
|
||||
subtle = 1
|
||||
|
||||
organ_tag = "blackkois"
|
||||
|
||||
parent_organ = BP_HEAD
|
||||
var/removed_langs = FALSE
|
||||
var/full_zombie = FALSE
|
||||
stage_interval = 150
|
||||
drug_resistance = 1
|
||||
max_stage = 5
|
||||
|
||||
origin_tech = list(TECH_BIO = 7)
|
||||
|
||||
egg = /singleton/reagent/kois/black
|
||||
|
||||
/obj/item/organ/internal/parasite/blackkois/process()
|
||||
..()
|
||||
|
||||
if(prob(10) && (owner.can_feel_pain()))
|
||||
if(stage < 3)
|
||||
to_chat(owner, SPAN_WARNING("You feel a stinging pain in your head!"))
|
||||
else
|
||||
to_chat(owner, "A part of you tries to fight back, but the taste of the black k'ois puts you at ease.")
|
||||
owner.visible_message("<b>[owner]</b> winces slightly.")
|
||||
owner.adjustHalLoss(5)
|
||||
|
||||
if(stage >= 2)
|
||||
if(prob(10) && !(owner.species.flags & NO_BREATHE))
|
||||
owner.visible_message("<b>[owner]</b> gasps for air!")
|
||||
owner.losebreath += 5
|
||||
|
||||
if(stage >= 3)
|
||||
set_light(-1.5, 6, "#FFFFFF")
|
||||
if(!(GLOB.all_languages[LANGUAGE_VAURCA] in owner.languages))
|
||||
owner.add_language(LANGUAGE_VAURCA)
|
||||
to_chat(owner, SPAN_NOTICE("Your mind expands, and your thoughts join the unity of the Hivenet."))
|
||||
|
||||
if(prob(5))
|
||||
if(stage < 4)
|
||||
to_chat(owner, SPAN_WARNING("You feel something squirming inside of you!"))
|
||||
else
|
||||
to_chat(owner, SPAN_GOOD("You feel it, within you. Its presence soothes, a constant companion. There is no need to resist. We are with you. We will not abandon you."))
|
||||
owner.reagents.add_reagent(/singleton/reagent/kois/black, 4)
|
||||
|
||||
else if(prob(5))
|
||||
if(stage < 4)
|
||||
to_chat(owner, SPAN_GOOD("In your struggle, a part of you wishes for the spread to continue."))
|
||||
else
|
||||
to_chat(owner, SPAN_GOOD("You cannot ever believe that you struggled against this feeling. You are home. You are happy."))
|
||||
|
||||
else if(prob(10))
|
||||
to_chat(owner, SPAN_WARNING("You feel disorientated!"))
|
||||
switch(rand(1,3))
|
||||
if(1)
|
||||
owner.confused += 10
|
||||
owner.apply_effect(10,EYE_BLUR)
|
||||
if(2)
|
||||
owner.slurring += 30
|
||||
if(3)
|
||||
owner.make_dizzy(10)
|
||||
|
||||
if(stage >= 4)
|
||||
|
||||
var/obj/item/organ/internal/brain/B = owner.internal_organs_by_name[BP_BRAIN]
|
||||
|
||||
if(B && !B.prepared)
|
||||
to_chat(owner, SPAN_GOOD("As the K'ois consumes your mind, you feel your past self, your memories, your very being slip away. Do not resist it. Let Us in."))
|
||||
to_chat(owner, SPAN_HIGHDANGER("You have been lobotomized by K'ois infection."))
|
||||
to_chat(owner, SPAN_NOTICE("All of your previous memories up until this point are gone, and all of your ambitions are nothing. You live for only one purpose; to serve the Lii'dra hive."))
|
||||
|
||||
B.prepared = 1
|
||||
|
||||
|
||||
if(!removed_langs)
|
||||
for(var/datum/language/L in owner.languages)
|
||||
owner.remove_language(L.name)
|
||||
owner.add_language(LANGUAGE_VAURCA)
|
||||
owner.add_language(LANGUAGE_LIIDRA)
|
||||
owner.set_default_language(LANGUAGE_LIIDRA)
|
||||
removed_langs = TRUE
|
||||
|
||||
owner.set_see_invisible(SEE_INVISIBLE_NOLIGHTING)
|
||||
owner.add_client_color(/datum/client_color/vaurca)
|
||||
|
||||
if(prob(10))
|
||||
if(owner.can_feel_pain())
|
||||
to_chat(owner, SPAN_WARNING("You feel an unbearable pain in your mind!"))
|
||||
owner.emote("scream")
|
||||
else if(full_zombie)
|
||||
to_chat(owner, SPAN_GOOD("Your mind hums with a billion voices that are not your own. You will never be alone again. Unbidden, a smile comes to your face."))
|
||||
owner.adjustBrainLoss(1, 55)
|
||||
|
||||
else if(prob(0.5))
|
||||
if(stage <= 4)
|
||||
to_chat(owner, SPAN_DANGER("You feel something alien coming up your throat!"))
|
||||
else
|
||||
to_chat(owner, SPAN_GOOD("You can feel it, flowering within your lungs. What a beautiful feeling, to share it with the Spur. You exhale, and the companion nestled within your flesh blooms, drowning out the light."))
|
||||
var/turf/T = get_turf(owner)
|
||||
|
||||
var/datum/reagents/R = new/datum/reagents(20)
|
||||
R.add_reagent(/singleton/reagent/kois/black,5)
|
||||
var/datum/effect/effect/system/smoke_spread/chem/spores/S = new("blackkois")
|
||||
|
||||
S.attach(T)
|
||||
S.set_up(R, 20, 0, T, 40)
|
||||
S.start()
|
||||
|
||||
if(owner.can_feel_pain())
|
||||
owner.emote("scream")
|
||||
owner.adjustHalLoss(5)
|
||||
owner.drip(5)
|
||||
owner.delayed_vomit()
|
||||
|
||||
if(stage >= 5)
|
||||
if(!full_zombie)
|
||||
to_chat(owner, SPAN_GOOD("You are dying. But it does not matter. You will serve Our will, until you can serve no more."))
|
||||
to_chat(owner, SPAN_NOTICE("You are in the final stage of black k'ois mycosis. It cannot be removed, and you can no longer handle guns or other complex devices, as \
|
||||
your fine motor skills erode. However, you are stronger, and no longer affected by pain."))
|
||||
if(owner.can_feel_pain())
|
||||
owner.pain_immune = TRUE
|
||||
if(!owner.lobotomized)
|
||||
owner.lobotomized = TRUE //no guns for you, beat people to death as high queen lii'dra intended
|
||||
owner.max_stamina = 500 //you are a discount zombie, you run good
|
||||
add_verb(owner, /mob/living/carbon/human/proc/kois_cough)
|
||||
add_verb(owner, /mob/living/carbon/human/proc/kois_infect)
|
||||
full_zombie = TRUE
|
||||
|
||||
/obj/item/organ/internal/parasite/blackkois/removed(var/mob/living/carbon/human/target)
|
||||
var/obj/item/organ/internal/brain/B = target.internal_organs_by_name[BP_BRAIN]
|
||||
switch(stage)
|
||||
if(1)
|
||||
target.visible_message(SPAN_WARNING("As the black k'ois is cut from [target.name], [target.get_pronoun("he")] spasm[target.get_pronoun("end")] briefly, the black k'ois pulsing in [target.get_pronoun("his")] brain. You can see the scars it has left - it was not a clean surgery, but the damage is minor. [target.get_pronoun("He")] will likely fully recover, given time."),\
|
||||
SPAN_WARNING("They cut at your mind, removing the growth that infests it. Your head aches - but your mind is still intact."))
|
||||
to_chat(target, SPAN_CULT("A shiver passes over your mind, an odd sense of loneliness. But it lasts only a moment, and then it is gone."))
|
||||
B.max_damage = B.max_damage*0.95 //you got it early, good job
|
||||
if(2)
|
||||
target.visible_message(SPAN_WARNING("As the black k'ois is cut from [target.name], [target.get_pronoun("he")] spasm[target.get_pronoun("end")] wildly, the black k'ois embedded in [target.get_pronoun("his")] brain. You can see the scars it has left - though it was not a clean surgery, the damage is not too great. [target.get_pronoun("He")] may well fully recover."),\
|
||||
SPAN_WARNING("They cut at your mind, removing the growth that infests it. Your head hurts, and you find some things hard to recall - but you remember who you are, and you are free from a truly terrible fate. Perhaps that is some comfort."))
|
||||
to_chat(target, SPAN_CULT("Something lingers on you. You are free of the mycosis before it could kill you - and why does that fact make you feel almost sad?"))
|
||||
B.max_damage = B.max_damage*0.75 //bit more scarring but still ok
|
||||
if(3)
|
||||
target.visible_message(SPAN_WARNING("As the black k'ois is cut from [target.name], [target.get_pronoun("he")] spasm[target.get_pronoun("end")] wildly, the black k'ois deeply embedded in [target.get_pronoun("his")] brain. You can see the scars it has left - it was not a clean surgery, and [target.get_pronoun("he")] may not fully recover - but [target.get_pronoun("he")] will live, at least."),\
|
||||
SPAN_WARNING("They cut at your mind, removing the growth that infests it. Your head hurts, and you find some things hard to recall - but you remember who you are, and you are free from a truly terrible fate. Perhaps that is some comfort."))
|
||||
to_chat(target, SPAN_CULT("A part of you misses the feeling of it, pulsing inside your skull like a friend, a constant companion. You have survived - but you cannot help but feel empty."))
|
||||
B.max_damage = B.max_damage*0.65 //ok, now you have permanent brain damage
|
||||
if(4)
|
||||
target.visible_message(SPAN_WARNING("As the black k'ois is cut from [target.name], [target.get_pronoun("he")] spasm[target.get_pronoun("end")] wildly, the black k'ois deeply embedded in [target.get_pronoun("his")] brain. You can see the scars it has left - it was not a clean surgery, and [target.get_pronoun("he")] will never fully recover - but [target.get_pronoun("he")] will live, at least."),\
|
||||
SPAN_WARNING("They cut at your mind, removing the growth that infests it. It's hard to remember what you are, without it. Perhaps, if you think hard enough, you can remember your name."))
|
||||
to_chat(target, SPAN_CULT("You have failed Us. We will find another way. Releasing control."))
|
||||
B.max_damage = B.max_damage*0.45 //yeah your brain is severely messed up man
|
||||
if(5)
|
||||
target.visible_message(SPAN_WARNING("As the black k'ois is cut from [target.name], [target.get_pronoun("he")] spasm[target.get_pronoun("end")] wildly, [target.get_pronoun("his")] brain too damaged to function. A horrible choking sound emerges from [target.get_pronoun("his")] mouth, before it is mercifully silenced as [target.get_pronoun("he")] falls still."),\
|
||||
SPAN_DANGER("You feel the cold of the knife cutting and cutting, but it is too late. There is nothing left of you but the Lii'dra's will, now. A final cut - and then you are granted the only escape that still remains to you."))
|
||||
to_chat(target, SPAN_GOOD("Your function is fulfilled. We have no further need of you. Releasing control."))
|
||||
target.death(FALSE) //too late, there is no brain left to save
|
||||
if(GLOB.all_languages[LANGUAGE_VAURCA] in target.languages && stage >= 3 && !isvaurca(target))
|
||||
target.remove_language(LANGUAGE_VAURCA)
|
||||
to_chat(target, SPAN_WARNING("Your mind suddenly grows dark as the unity of the Hive is torn from you."))
|
||||
if(GLOB.all_languages[LANGUAGE_LIIDRA] in target.languages && stage >= 3)
|
||||
target.remove_language(LANGUAGE_LIIDRA)
|
||||
removed_langs = 0
|
||||
remove_verb(owner, /mob/living/carbon/human/proc/kois_cough)
|
||||
remove_verb(owner, /mob/living/carbon/human/proc/kois_infect)
|
||||
..()
|
||||
@@ -0,0 +1,47 @@
|
||||
/obj/item/organ/internal/parasite/heartworm
|
||||
name = "bundle of heart flukes"
|
||||
icon = 'icons/obj/organs/organs.dmi'
|
||||
icon_state = "helminth"
|
||||
dead_icon = "helminth_dead"
|
||||
|
||||
organ_tag = BP_WORM_HEART
|
||||
parent_organ = BP_CHEST
|
||||
subtle = 1
|
||||
|
||||
stage_interval = 450 //~7.5 minutes/stage
|
||||
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
egg = /singleton/reagent/toxin/heartworm_eggs
|
||||
|
||||
/obj/item/organ/internal/parasite/heartworm/process()
|
||||
..()
|
||||
|
||||
var/obj/item/organ/internal/heart = owner.internal_organs_by_name[BP_HEART]
|
||||
|
||||
if (!owner)
|
||||
return
|
||||
|
||||
if(BP_IS_ROBOTIC(heart))
|
||||
recession = 10
|
||||
return
|
||||
|
||||
if(prob(4))
|
||||
owner.adjustNutritionLoss(10)
|
||||
|
||||
if(stage >= 2) //after ~7.5 minutes
|
||||
if(prob(2))
|
||||
owner.emote("cough")
|
||||
|
||||
if(stage >= 3) //after ~15 minutes
|
||||
if(prob(7))
|
||||
heart.take_damage(rand(2,5))
|
||||
if(prob(5))
|
||||
to_chat(owner, SPAN_WARNING(pick("Your chest feels tight.", "Your chest is aching.", "You feel a stabbing pain in your chest!", "You feel a painful, tickly sensation within your chest.")))
|
||||
owner.adjustHalLoss(15)
|
||||
|
||||
if(stage >= 4) //after ~22.5 minutes
|
||||
if(prob(5))
|
||||
owner.reagents.add_reagent(/singleton/reagent/toxin/heartworm_eggs, 2)
|
||||
owner.adjustHalLoss(15)
|
||||
to_chat(owner, SPAN_WARNING("An <b>extreme</b>, nauseating pain erupts from the centre of your chest!"))
|
||||
@@ -0,0 +1,68 @@
|
||||
/obj/item/organ/internal/parasite/kois
|
||||
name = "k'ois mycosis"
|
||||
icon = 'icons/obj/organs/organs.dmi'
|
||||
icon_state = "kois-on"
|
||||
dead_icon = "kois-off"
|
||||
|
||||
organ_tag = "kois"
|
||||
|
||||
parent_organ = BP_CHEST
|
||||
stage_interval = 150
|
||||
drug_resistance = 1
|
||||
|
||||
origin_tech = list(TECH_BIO = 3)
|
||||
|
||||
egg = /singleton/reagent/kois
|
||||
|
||||
/obj/item/organ/internal/parasite/kois/process()
|
||||
..()
|
||||
|
||||
if (!owner)
|
||||
return
|
||||
|
||||
if(prob(10) && (owner.can_feel_pain()))
|
||||
to_chat(owner, SPAN_WARNING("You feel a stinging pain in your abdomen!"))
|
||||
owner.visible_message("<b>[owner]</b> winces slightly.")
|
||||
owner.adjustHalLoss(5)
|
||||
|
||||
else if(prob(10) && !(owner.species.flags & NO_BREATHE))
|
||||
owner.emote("cough")
|
||||
|
||||
else if(prob(10) && !(owner.species.flags & NO_BREATHE))
|
||||
owner.visible_message("<b>[owner]</b> coughs up blood!")
|
||||
owner.drip(10)
|
||||
|
||||
if(stage >= 2)
|
||||
if(prob(10) && !(owner.species.flags & NO_BREATHE))
|
||||
owner.visible_message("<b>[owner]</b> gasps for air!")
|
||||
owner.losebreath += 5
|
||||
|
||||
if(stage >= 3)
|
||||
set_light(1, l_color = "#E6E600")
|
||||
if(prob(10))
|
||||
to_chat(owner, SPAN_WARNING("You feel something squirming inside of you!"))
|
||||
owner.reagents.add_reagent(/singleton/reagent/toxin/phoron, 8)
|
||||
owner.reagents.add_reagent(/singleton/reagent/kois, 5)
|
||||
|
||||
if(stage >= 4)
|
||||
if(prob(10))
|
||||
to_chat(owner, SPAN_DANGER("You feel something alien coming up your throat!"))
|
||||
owner.emote("cough")
|
||||
|
||||
var/turf/T = get_turf(owner)
|
||||
|
||||
var/datum/reagents/R = new/datum/reagents(100)
|
||||
R.add_reagent(/singleton/reagent/kois,10)
|
||||
R.add_reagent(/singleton/reagent/toxin/phoron,10)
|
||||
var/datum/effect/effect/system/smoke_spread/chem/spores/S = new("koisspore")
|
||||
|
||||
S.attach(T)
|
||||
S.set_up(R, 20, 0, T, 40)
|
||||
S.start()
|
||||
|
||||
if(owner.can_feel_pain())
|
||||
owner.emote("scream")
|
||||
owner.adjustHalLoss(15)
|
||||
owner.drip(15)
|
||||
owner.delayed_vomit()
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/obj/item/organ/internal/parasite/nerveworm
|
||||
name = "bundle of nerve flukes"
|
||||
icon = 'icons/obj/organs/organs.dmi'
|
||||
icon_state = "helminth"
|
||||
dead_icon = "helminth_dead"
|
||||
|
||||
organ_tag = BP_WORM_NERVE
|
||||
parent_organ = BP_L_ARM //if desperate, can lop your arm off to remove the infection :)
|
||||
subtle = 1
|
||||
|
||||
origin_tech = list(TECH_BIO = 4)
|
||||
|
||||
egg = /singleton/reagent/toxin/nerveworm_eggs
|
||||
|
||||
/obj/item/organ/internal/parasite/nerveworm/process()
|
||||
..()
|
||||
|
||||
if (!owner)
|
||||
return
|
||||
|
||||
if(prob(4))
|
||||
owner.adjustNutritionLoss(10)
|
||||
|
||||
if(stage >= 2) //after ~5 minutes
|
||||
owner.confused = max(owner.confused, 10)
|
||||
|
||||
if(stage >= 3) //after ~10 minutes
|
||||
owner.slurring = max(owner.slurring, 100)
|
||||
owner.drowsiness = max(owner.drowsiness, 20)
|
||||
if(prob(1))
|
||||
owner.delayed_vomit()
|
||||
if(prob(2))
|
||||
to_chat(owner, SPAN_WARNING(pick("You feel a tingly sensation in your fingers.", "Is that pins and needles?", "An electric sensation jolts its way up your left arm.", "You smell something funny.", "You taste something funny.")))
|
||||
|
||||
if(stage >= 4) //after ~15 minutes
|
||||
if(prob(2))
|
||||
to_chat(owner, SPAN_WARNING(pick("A deep, tingling sensation paralyses your left arm.", "You feel as if you just struck your funny bone.", "You feel a pulsing sensation within your left arm.")))
|
||||
owner.emote(pick("twitch", "shiver"))
|
||||
owner.stuttering = 20
|
||||
if(prob(1))
|
||||
owner.seizure()
|
||||
if(prob(5))
|
||||
owner.reagents.add_reagent(/singleton/reagent/toxin/nerveworm_eggs, 2)
|
||||
owner.adjustHalLoss(15)
|
||||
to_chat(owner, SPAN_WARNING("An <b>extreme</b>, nauseating pain erupts from deep within your left arm!"))
|
||||
@@ -0,0 +1,189 @@
|
||||
/obj/item/organ/internal/parasite/zombie
|
||||
name = BP_ZOMBIE_PARASITE
|
||||
icon = 'icons/obj/organs/organs.dmi'
|
||||
icon_state = "black_tumour"
|
||||
dead_icon = "black_tumour"
|
||||
|
||||
organ_tag = BP_ZOMBIE_PARASITE
|
||||
parent_organ = BP_L_HAND
|
||||
stage_interval = 110
|
||||
drug_resistance = TRUE
|
||||
relative_size = 0
|
||||
status = ORGAN_ZOMBIFIED
|
||||
|
||||
egg = /singleton/reagent/toxin/hylemnomil
|
||||
|
||||
/// If the parasite is currently being cured by an antidote. Stops progression.
|
||||
var/curing = FALSE
|
||||
/// If the parasite has been cured. Stops the cure from happening twice.
|
||||
var/cured = FALSE
|
||||
/// Tracker for cure progress.
|
||||
var/cured_timer = 0
|
||||
/// The last world.time we were healed as a zombie.
|
||||
var/last_heal = 0
|
||||
/// The amount of seconds between each heal.
|
||||
var/heal_rate = 5 SECONDS
|
||||
|
||||
/obj/item/organ/internal/parasite/zombie/process()
|
||||
..()
|
||||
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(owner.stat >= DEAD)
|
||||
return
|
||||
|
||||
if(!iszombie(owner))
|
||||
var/obj/item/organ/external/E = owner.organs_by_name[parent_organ]
|
||||
if(curing && !cured)
|
||||
cured_timer += 5
|
||||
switch(cured_timer)
|
||||
if(10 to 40)
|
||||
if(prob(10))
|
||||
to_chat(owner, SPAN_DANGER("The veins in your [E.name] feel like they're coming apart!"))
|
||||
E.add_pain(10)
|
||||
if(40 to 80)
|
||||
if(prob(10))
|
||||
to_chat(owner, SPAN_DANGER(FONT_HUGE("Your [E.name] is burning as the black veins start retreating!")))
|
||||
E.add_pain(25)
|
||||
if(E.status & ORGAN_ZOMBIFIED)
|
||||
E.add_pain(25)
|
||||
E.status &= ~ORGAN_ZOMBIFIED
|
||||
owner.update_body(TRUE, TRUE)
|
||||
if(90 to INFINITY)
|
||||
to_chat(owner, SPAN_DANGER(FONT_HUGE("Your head, your whole body starts burning up...!")))
|
||||
owner.Paralyse(20)
|
||||
owner.Stun(20)
|
||||
owner.adjustHalLoss(50)
|
||||
cured = TRUE
|
||||
addtimer(CALLBACK(src, PROC_REF(cure_infection)), 10 SECONDS)
|
||||
|
||||
return
|
||||
|
||||
if(stage < 2)
|
||||
if(prob(2))
|
||||
to_chat(owner, SPAN_WARNING("The skin on your [E.name] itches a bit."))
|
||||
|
||||
if(stage >= 2)
|
||||
if(prob(2))
|
||||
to_chat(owner, SPAN_WARNING("Your stomach churns, and you feel sick. Something tries to come up your throat, but nothing comes out..."))
|
||||
owner.adjustHalLoss(5)
|
||||
|
||||
if(stage >= 3)
|
||||
if(prob(10))
|
||||
to_chat(owner, SPAN_CULT("Every beat of your heart hurts - an aching, dull pain. Cold sweat continues falling down your brows. You feel like you have a fever..."))
|
||||
owner.nutrition = max(0, owner.nutrition - 10)
|
||||
owner.hydration = max(0, owner.hydration - 10)
|
||||
E.add_pain(20)
|
||||
|
||||
if(stage >= 4)
|
||||
if(prob(10))
|
||||
if(!isundead(owner))
|
||||
if(owner.species.zombie_type)
|
||||
for(var/datum/language/L in owner.languages)
|
||||
owner.remove_language(L.name)
|
||||
owner.visible_message(SPAN_DANGER("<font size=4>[owner] falls to the ground and begins convulsing, their flesh turning green and rotting!</font>"))
|
||||
owner.seizure(FALSE, 5, 10, FALSE)
|
||||
addtimer(CALLBACK(src, PROC_REF(turn_into_zombie)), 5 SECONDS, TIMER_UNIQUE)
|
||||
else
|
||||
owner.adjustToxLoss(50)
|
||||
else
|
||||
if(length(owner.bad_external_organs) && last_heal + heal_rate < world.time)
|
||||
var/list/organs_to_heal = owner.bad_external_organs
|
||||
shuffle(organs_to_heal)
|
||||
for(var/thing in organs_to_heal)
|
||||
var/obj/item/organ/external/O = thing
|
||||
if(istype(O, /obj/item/organ/external/head)) // the head is the weak point
|
||||
continue
|
||||
var/healed = FALSE
|
||||
if(O.status & ORGAN_ARTERY_CUT)
|
||||
O.status &= ~ORGAN_ARTERY_CUT
|
||||
owner.visible_message(SPAN_WARNING("The severed artery in \the [owner]'s [O] stitches itself back together..."), SPAN_NOTICE("The severed artery in your [O] stitches itself back together..."))
|
||||
healed = TRUE
|
||||
else if((O.tendon_status() & TENDON_CUT) && O.tendon.can_recover())
|
||||
O.tendon.rejuvenate()
|
||||
owner.visible_message(SPAN_WARNING("The severed tendon in \the [owner]'s [O] stitches itself back together..."), SPAN_NOTICE("The severed tendon in your [O] stitches itself back together..."))
|
||||
healed = TRUE
|
||||
else if(O.status & ORGAN_BROKEN)
|
||||
var/list/brute_wounds = list()
|
||||
for(var/wound in O.wounds)
|
||||
var/datum/wound/W = wound
|
||||
if(W.damage_type in list(CUT, BRUISE, PIERCE))
|
||||
brute_wounds += W
|
||||
for(var/wound in brute_wounds)
|
||||
var/datum/wound/W = wound
|
||||
W.damage = max(min(W.damage, (O.min_broken_damage / length(brute_wounds))), 0)
|
||||
O.status &= ~ORGAN_BROKEN
|
||||
owner.visible_message(SPAN_WARNING("The shattered bone in \the [owner]'s [O] melds back together..."), SPAN_NOTICE("The shattered bone in your [O] melds back together..."))
|
||||
healed = TRUE
|
||||
if(healed)
|
||||
last_heal = world.time
|
||||
heal_rate += 2 SECONDS
|
||||
O.update_damages()
|
||||
break
|
||||
|
||||
if(prob(10) && (owner.can_feel_pain()))
|
||||
to_chat(owner, "<span class='warning'>You feel a burning sensation on your skin!</span>")
|
||||
owner.make_jittery(10)
|
||||
|
||||
/obj/item/organ/internal/parasite/zombie/process_stage()
|
||||
if(stage >= 4)
|
||||
return
|
||||
var/obj/item/organ/external/E = owner.organs_by_name[parent_organ]
|
||||
if(iszombie(owner))
|
||||
if(parent_organ != BP_HEAD)
|
||||
var/obj/item/organ/external/head = owner.organs_by_name[BP_HEAD]
|
||||
move_to(owner, head, E)
|
||||
stage = 4
|
||||
return
|
||||
if(E.parent)
|
||||
to_chat(owner, SPAN_WARNING("The veins in your [E.name] turn black..."))
|
||||
E.status |= ORGAN_ZOMBIFIED
|
||||
move_to(owner, E.parent, E)
|
||||
owner.update_body(TRUE, TRUE)
|
||||
else
|
||||
if(parent_organ == BP_CHEST)
|
||||
to_chat(owner, SPAN_DANGER("<font size=4>Every vein in your chest turns black. Your heart becomes heavy. Each breath becomes fatigued. \
|
||||
You feel your own breathing. Cold sweat goes down your brows...</span>"))
|
||||
E.status |= ORGAN_ZOMBIFIED
|
||||
var/obj/item/organ/external/head = owner.organs_by_name[BP_HEAD]
|
||||
move_to(owner, head, E)
|
||||
owner.update_body(TRUE, TRUE)
|
||||
. = ..()
|
||||
E = owner.organs_by_name[parent_organ]
|
||||
if(E.limb_name == BP_GROIN)
|
||||
stage = 2
|
||||
stage_interval = 110
|
||||
|
||||
/obj/item/organ/internal/parasite/zombie/proc/move_to(mob/living/carbon/human/H, obj/item/organ/external/new_organ, obj/item/organ/external/old_organ)
|
||||
to_chat(H, SPAN_WARNING("The veins in your [new_organ.name] start turning black, bit by bit..."))
|
||||
parent_organ = new_organ.limb_name
|
||||
old_organ.internal_organs -= src
|
||||
replaced(H, new_organ)
|
||||
|
||||
/obj/item/organ/internal/parasite/zombie/proc/turn_into_zombie()
|
||||
var/r = owner.r_skin
|
||||
var/g = owner.g_skin
|
||||
var/b = owner.b_skin
|
||||
to_chat(owner, "<font size=4><span class='warning'>You feel your flesh burning as it rots, and your head exploding as the virus reaches it...</font></span>")
|
||||
to_chat(owner, "<font size=4><span class='cult'>All that is left is a cruel hunger for the flesh of the living, and the desire to spread this infection. You must consume all the living!</font></span>")
|
||||
owner.set_species(owner.species.zombie_type, 0, 0, 0)
|
||||
var/list/wakeup_sounds = list(
|
||||
'sound/effects/zombies/zombie_1.ogg',
|
||||
'sound/effects/zombies/zombie_2.ogg',
|
||||
'sound/effects/zombies/zombie_3.ogg',
|
||||
'sound/effects/zombies/zombie_4.ogg'
|
||||
)
|
||||
playsound(owner, pick(wakeup_sounds))
|
||||
owner.change_skin_color(r, g, b)
|
||||
owner.update_dna()
|
||||
|
||||
/obj/item/organ/internal/parasite/zombie/proc/cure_infection()
|
||||
to_chat(owner, SPAN_GOOD(FONT_HUGE("...finally, relief. Your body starts cooling down. All your blackened veins go back to normal. It's over...")))
|
||||
for(var/obj/item/organ/external/E in owner.organs_by_name)
|
||||
if(E.status & ORGAN_ZOMBIFIED)
|
||||
E.status &= ~ORGAN_ZOMBIFIED
|
||||
owner.update_body(TRUE, TRUE)
|
||||
removed(owner)
|
||||
owner.adjustHalLoss(-50)
|
||||
qdel(src)
|
||||
@@ -1,33 +1,34 @@
|
||||
// Zombie limbs must be really easy to delimb.
|
||||
/obj/item/organ/external/chest/zombie
|
||||
max_damage = 100
|
||||
min_broken_damage = 35
|
||||
max_damage = 20
|
||||
min_broken_damage = 15
|
||||
|
||||
/obj/item/organ/external/groin/zombie
|
||||
maim_bonus = 5
|
||||
maim_bonus = 99
|
||||
|
||||
/obj/item/organ/external/arm/zombie
|
||||
maim_bonus = 15
|
||||
maim_bonus = 99
|
||||
|
||||
/obj/item/organ/external/arm/right/zombie
|
||||
maim_bonus = 15
|
||||
maim_bonus = 99
|
||||
|
||||
/obj/item/organ/external/leg/zombie
|
||||
maim_bonus = 15
|
||||
maim_bonus = 99
|
||||
|
||||
/obj/item/organ/external/leg/right/zombie
|
||||
maim_bonus = 15
|
||||
maim_bonus = 99
|
||||
|
||||
/obj/item/organ/external/foot/zombie
|
||||
maim_bonus = 15
|
||||
maim_bonus = 99
|
||||
|
||||
/obj/item/organ/external/foot/right/zombie
|
||||
maim_bonus = 15
|
||||
maim_bonus = 99
|
||||
|
||||
/obj/item/organ/external/hand/zombie
|
||||
maim_bonus = 15
|
||||
|
||||
/obj/item/organ/external/hand/right/zombie
|
||||
maim_bonus = 15
|
||||
maim_bonus = 99
|
||||
|
||||
/obj/item/organ/external/head/zombie
|
||||
maim_bonus = 3
|
||||
maim_bonus = 99
|
||||
|
||||
Reference in New Issue
Block a user