Virology Update #3 (#17227)

* Base stuff

* Thresholds

* Cockroaches, adjustments

* Extrapolator + TGUI Update

* Adjustments

* Updoot

* Revert "Updoot"

This reverts commit 8c27a2525e.

* Gwuh

* test

* heals

* Genetic

* Holder and vomit

* Indents

* Compilable :)

* Various fixes

* Updates Symptoms

* Genevirus

* Neutered Symptoms

* Adjustments

* rads

* Extra symptoms

* Extra extra symptoms

* Adjustments, fixes, more symptoms

* Powder that makes the linter green

* Finishing touches?

* Fixup maps in TGM format

5041170ae1: maps/expedition_vr/beach/submaps/quarantineshuttle.dmm

Automatically commited by: tools\mapmerge2\fixup.py

* Last bits

* Defines

* Oxy heal

* I crave the green check

* fix

* Maps

* Macrophages to turf

* Fimxes

* Fixes :)

* Vomit

* Preset

* Fire desc

* SPELLING MISTAKE

* Extra stuffs

* types

Allows infecting children of a type

* feet

paws?

* fix

* Fixes

* Update

* Flags

* Update _disease.dm

* Infinite blood glitch (100% real)

* virus data properly carries over

* GODSPEED, KELENIUS

YOUR 10 YEAR TODO IS FINALLY DONE

* define

* U2

* Implicit

* Damn it Fleming

* oops

linter is kill

* Update _reagents.dm

* Extra check

* .

* ough

* fixes

* Small changes

---------

Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
Guti
2025-04-21 06:12:15 -04:00
committed by GitHub
co-authored by Cameron Lennox
parent a0d1eae5d1
commit 640cab345e
121 changed files with 3669 additions and 1903 deletions
+95 -45
View File
@@ -5,8 +5,22 @@
return TRUE
return FALSE
/mob/proc/RemoveDisease(datum/disease/D)
viruses -= D
return TRUE
/mob/proc/HasResistance(resistance)
if(resistances.Find(resistance))
return TRUE
return FALSE
/mob/proc/IsInfected()
if(isemptylist(GetViruses()))
return FALSE
return TRUE
/mob/proc/CanContractDisease(datum/disease/D)
if(stat == DEAD && !D.allow_dead)
if(stat == DEAD && !global_flag_check(D.virus_modifiers, SPREAD_DEAD))
return FALSE
if(D.GetDiseaseID() in GetResistances())
@@ -18,17 +32,22 @@
if(istype(D, /datum/disease/advance) && count_by_type(GetViruses(), /datum/disease/advance) > 0)
return FALSE
if(!(type in D.viable_mobtypes))
return -1
var/compatible_type = FALSE
for(var/type_to_test in D.viable_mobtypes)
if(ispath(type, type_to_test))
compatible_type = TRUE
break
if(!compatible_type)
return FALSE
if(isSynthetic())
if(D.infect_synthetics)
if(global_flag_check(D.virus_modifiers, INFECT_SYNTHETICS))
return TRUE
return FALSE
return TRUE
/mob/proc/ContractDisease(datum/disease/D)
/mob/proc/ContractDisease(datum/disease/D, var/target_zone)
if(!CanContractDisease(D))
return 0
AddDisease(D)
@@ -41,7 +60,7 @@
DD.affected_mob = src
GLOB.active_diseases += DD
var/list/skipped = list("affected_mob", "holder", "carrier", "stage", "type", "parent_type", "vars", "transformed")
var/list/skipped = list("affected_mob", "holder", "carrier", "stage", "type", "parent_type", "vars", "transformed", "_active_timers")
if(respect_carrier)
skipped -= "carrier"
for(var/V in DD.vars)
@@ -49,35 +68,24 @@
continue
if(istype(DD.vars[V],/list))
var/list/L = D.vars[V]
if(L)
if(islist(L))
DD.vars[V] = L.Copy()
else
DD.vars[V] = D.vars[V]
log_admin("[key_name(src)] has contracted the virus \"[DD]\"")
/mob/living/carbon/ContractDisease(datum/disease/D)
/mob/living/carbon/human/ContractDisease(datum/disease/D, target_zone)
if(!CanContractDisease(D))
return 0
return FALSE
var/obj/item/clothing/Cl = null
var/passed = 1
var/passed = TRUE
var/head_ch = 100
var/body_ch = 100
var/hands_ch = 25
var/feet_ch = 25
if(D.spread_flags & CONTACT_HANDS)
head_ch = 0
body_ch = 0
hands_ch = 100
feet_ch = 0
if(D.spread_flags & CONTACT_FEET)
head_ch = 0
body_ch = 0
hands_ch = 0
feet_ch = 100
var/head_chance = 80
var/body_chance = 100
var/hands_chance = 35/2
var/feet_chance = 15/2
if(prob(15/D.permeability_mod))
return
@@ -85,27 +93,37 @@
if(nutrition > 300 && prob(nutrition/50))
return
var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4)
if(!target_zone)
target_zone = pick(list(
BP_HEAD = head_chance,
BP_TORSO = body_chance,
BP_R_HAND = hands_chance,
BP_L_HAND = hands_chance,
BP_R_FOOT = feet_chance,
BP_L_FOOT = feet_chance
))
else
target_zone = check_zone(target_zone)
if(ishuman(src))
var/mob/living/carbon/human/H = src
switch(target_zone)
if(1)
if(BP_HEAD)
if(isobj(H.head) && !istype(H.head, /obj/item/paper))
Cl = H.head
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(H.wear_mask))
Cl = H.wear_mask
passed = prob((Cl.permeability_coefficient*100) - 1)
if(2)
if(BP_TORSO)
if(isobj(H.wear_suit))
Cl = H.wear_suit
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed && isobj(H.w_uniform))
Cl = H.w_uniform
passed = prob((Cl.permeability_coefficient*100) - 1)
if(3)
if(BP_L_HAND, BP_R_HAND)
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered & HANDS)
Cl = H.wear_suit
passed = prob((Cl.permeability_coefficient*100) - 1)
@@ -113,7 +131,7 @@
if(passed && isobj(H.gloves))
Cl = H.gloves
passed = prob((Cl.permeability_coefficient*100) - 1)
if(4)
if(BP_L_FOOT, BP_R_FOOT)
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered & FEET)
Cl = H.wear_suit
passed = prob((Cl.permeability_coefficient*100) - 1)
@@ -121,12 +139,20 @@
if(passed && isobj(H.shoes))
Cl = H.shoes
passed = prob((Cl.permeability_coefficient*100) - 1)
if(!passed && (D.spread_flags & AIRBORNE) && !internal)
passed = (prob((50*D.permeability_mod) -1))
if(passed)
AddDisease(D)
return passed
/mob/living/proc/AirborneContractDisease(datum/disease/D, force_spread)
if(((D.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob(50*D.spreading_modifier) - 1)
ForceContractDisease(D)
/mob/living/carbon/AirborneContractDisease(datum/disease/D, force_spread)
if(internal)
return
if(mNobreath in mutations)
return
..()
/mob/proc/ForceContractDisease(datum/disease/D, respect_carrier)
if(!CanContractDisease(D))
@@ -136,22 +162,25 @@
return TRUE
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
if(species.virus_immune && !D.bypasses_immunity)
return FALSE
for(var/organ in D.required_organs)
if(locate(organ) in internal_organs)
continue
if(locate(organ) in organs)
continue
return FALSE
if(!((locate(organ) in organs) || (locate(organ) in internal_organs)))
return FALSE
if(species.virus_immune && !global_flag_check(D.virus_modifiers, BYPASSES_IMMUNITY))
D.virus_modifiers |= CARRIER
else
D.virus_modifiers &= ~CARRIER
return ..()
/mob/living/carbon/human/monkey/CanContractDisease(datum/disease/D)
. = ..()
if(. == -1)
if(D.viable_mobtypes.Find(/mob/living/carbon/human))
return 1
return
/mob/living/proc/CanSpreadAirborneDisease()
return !is_mouth_covered()
/mob/living/proc/handle_diseases()
return
@@ -160,10 +189,24 @@
LAZYINITLIST(viruses)
return viruses
/mob/proc/GetSpreadableViruses()
LAZYINITLIST(viruses)
var/list/viruses_to_return = list()
for(var/datum/disease/D in viruses)
if(D.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS))
continue
viruses_to_return += D
return viruses_to_return
/mob/proc/GetResistances()
LAZYINITLIST(resistances)
return resistances
/mob/proc/AddResistances(resistance)
LAZYINITLIST(resistances)
resistances |= resistance
return TRUE
/client/proc/ReleaseVirus()
set category = "Fun.Event Kit"
set name = "Release Virus"
@@ -173,17 +216,24 @@
return FALSE
var/disease = tgui_input_list(usr, "Choose virus", "Viruses", subtypesof(/datum/disease), subtypesof(/datum/disease))
if(isnull(disease))
return FALSE
var/mob/living/carbon/human/H = tgui_input_list(usr, "Choose infectee", "Characters", human_mob_list)
var/datum/disease/D = new disease
if(isnull(D) || isnull(H))
if(isnull(H))
return FALSE
var/datum/disease/D = new disease
if(!H.HasDisease(D))
H.ForceContractDisease(D)
message_admins("[key_name_admin(usr)] has triggered a virus outbreak of [D.name]! Affected mob: [key_name_admin(H)]")
log_admin("[key_name_admin(usr)] infected [key_name_admin(H)] with [D.name]")
if(!GLOB.archive_diseases[D.GetDiseaseID()])
GLOB.archive_diseases[D.GetDiseaseID()] = D
return TRUE
+52 -43
View File
@@ -4,7 +4,8 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
//Flags
var/visibility_flags = 0
var/disease_flags = CURABLE|CAN_CARRY|CAN_RESIST
var/spread_flags = AIRBORNE
var/spread_flags = DISEASE_SPREAD_AIRBORNE
var/virus_modifiers = NEEDS_ALL_CURES
//Fluff
/// Used for identification of viruses in the Medical Records Virus Database
@@ -20,34 +21,26 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
var/stage = 1
var/max_stages = 0
var/stage_prob = 4
/// The fraction of stages the virus must at least be at to show up on medical HUDs. Rounded up.
var/discovery_threshold = 0.5
/// If TRUE, this virus will show up on medical HUDs. Automatically set when it reaches mid-stage.
var/discovered = FALSE
// Other
var/list/viable_mobtypes = list()
var/mob/living/carbon/affected_mob
var/list/cures = list()
var/infectivity = 65
var/infectivity = 10
var/cure_chance = 8
var/carrier = FALSE
var/bypasses_immunity = FALSE
var/virus_heal_resistant = FALSE
var/spreading_modifier = 1
var/permeability_mod = 1
var/severity = NONTHREAT
var/danger = DISEASE_MINOR
var/list/required_organs = list()
var/needs_all_cures = TRUE
var/list/strain_data = list()
var/allow_dead = FALSE
var/infect_synthetics = FALSE
var/processing = FALSE
var/has_timer = FALSE
/datum/disease/Destroy()
affected_mob = null
GLOB.active_diseases.Remove(src)
if(processing)
if(global_flag_check(virus_modifiers, PROCESSING))
End()
return ..()
@@ -56,11 +49,11 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
return FALSE
var/cure = has_cure()
if(carrier && !cure)
if(global_flag_check(virus_modifiers, CARRIER) && !cure)
return FALSE
if(!processing)
processing = TRUE
if(!global_flag_check(virus_modifiers, PROCESSING))
virus_modifiers |= PROCESSING
Start()
stage = min(stage, max_stages)
@@ -72,8 +65,8 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
/datum/disease/proc/handle_stage_advance(has_cure = FALSE)
if(!has_cure && prob(stage_prob))
stage = min(stage + 1, max_stages)
if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1))
discovered = TRUE
if(!global_flag_check(virus_modifiers, DISCOVERED) && stage >= CEILING(max_stages * discovery_threshold, 1))
virus_modifiers |= DISCOVERED
/datum/disease/proc/handle_cure_testing(has_cure = FALSE)
if(has_cure && prob(cure_chance))
@@ -102,29 +95,32 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
if(affected_mob.bloodstr.has_reagent(C_id) || affected_mob.ingested.has_reagent(C_id))
cures_found++
if(needs_all_cures && cures_found < length(cures))
if(global_flag_check(virus_modifiers, NEEDS_ALL_CURES) && cures_found < length(cures))
return FALSE
return cures_found
/datum/disease/proc/spread(force_spread = 0)
/datum/disease/proc/spread(var/force_spread = 0)
if(!affected_mob)
return
if(affected_mob.is_incorporeal())
return
if((spread_flags & SPECIAL || spread_flags & NON_CONTAGIOUS || spread_flags & BLOOD) && !force_spread)
if(!(spread_flags & DISEASE_SPREAD_AIRBORNE) && !force_spread)
return
if(affected_mob.bloodstr.has_reagent(REAGENT_ID_SPACEACILLIN) || (affected_mob.nutrition > 300 && prob(affected_mob.nutrition/50)))
if(affected_mob.stat == DEAD && !global_flag_check(virus_modifiers, SPREAD_DEAD) && !force_spread)
return
var/spread_range = 1
if(affected_mob.reagents.has_reagent(REAGENT_ID_SPACEACILLIN) || (affected_mob.nutrition > 300 && prob(affected_mob.nutrition/50)))
return
var/spread_range = 2
if(force_spread)
spread_range = force_spread
if(spread_flags & AIRBORNE)
if(spread_flags & DISEASE_SPREAD_AIRBORNE)
spread_range++
var/turf/target = affected_mob.loc
@@ -133,38 +129,41 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
if(C.is_incorporeal())
continue
var/turf/current = get_turf(C)
if(current)
while(TRUE)
if(current == target)
C.ContractDisease(src)
break
var/direction = get_dir(current, target)
var/turf/next = get_step(current, direction)
if(!current.CanZASPass(next))
break
current = next
if(disease_air_spread_walk(target, current))
C.AirborneContractDisease(src, force_spread)
/proc/disease_air_spread_walk(turf/start, turf/end)
if(!start || !end)
return FALSE
while(TRUE)
if(end == start)
return TRUE
var/turf/Temp = get_step_towards(end, start)
if(!end.CanZASPass(Temp))
return FALSE
end = Temp
/datum/disease/proc/cure()
if(affected_mob)
if(disease_flags & CAN_RESIST)
if(!(type in affected_mob.GetResistances()))
affected_mob.resistances += type
affected_mob.AddResistances(type)
remove_virus()
qdel(src)
/datum/disease/proc/start_cure_timer()
if(has_timer)
if(global_flag_check(virus_modifiers, HAS_TIMER))
return
if(!(disease_flags & CURABLE))
return
has_timer = TRUE
virus_modifiers |= HAS_TIMER
addtimer(CALLBACK(src, PROC_REF(check_natural_immunity)), (1 HOUR) + rand( -20 MINUTES, 30 MINUTES), TIMER_DELETE_ME)
/datum/disease/proc/check_natural_immunity()
if(!(disease_flags & CURABLE))
return
if(prob(rand(10, 15)))
has_timer = FALSE
virus_modifiers &= ~HAS_TIMER
cure()
return
addtimer(CALLBACK(src, PROC_REF(check_natural_immunity)), rand(5 MINUTES, 10 MINUTES), TIMER_DELETE_ME)
@@ -180,20 +179,30 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease))
return D
/datum/disease/proc/GetDiseaseID()
return type
return
/datum/disease/proc/IsSpreadByBlood()
if(spread_flags & DISEASE_SPREAD_BLOOD)
return TRUE
return FALSE
/datum/disease/proc/IsSpreadByFluids()
if(spread_flags & DISEASE_SPREAD_FLUIDS)
return TRUE
return FALSE
/datum/disease/proc/IsSpreadByTouch()
if(spread_flags & CONTACT_FEET || spread_flags & CONTACT_HANDS || spread_flags & CONTACT_GENERAL)
if(spread_flags & DISEASE_SPREAD_CONTACT)
return TRUE
return FALSE
/datum/disease/proc/IsSpreadByAir()
if(spread_flags & AIRBORNE)
if(spread_flags & DISEASE_SPREAD_AIRBORNE)
return TRUE
return FALSE
/datum/disease/proc/remove_virus()
affected_mob.viruses -= src
affected_mob.RemoveDisease(src)
// Called when a disease is added onto a mob
/datum/disease/proc/Start()
+116 -111
View File
@@ -26,22 +26,25 @@ GLOBAL_LIST_INIT(advance_cures, list(
spread_text = "Unknown"
viable_mobtypes = list(/mob/living/carbon/human)
var/s_processing = FALSE
var/last_modified_by = "no CKEY"
var/resistance
var/stealth
var/stage_rate
var/transmission
var/severity
var/speed
var/list/symptoms = list()
var/s_processing = FALSE
var/id = ""
/datum/disease/advance/New(process = 1, datum/disease/advance/D)
if(!istype(D))
/datum/disease/advance/New(process = TRUE, datum/disease/advance/D)
if(istype(D))
for(var/datum/symptom/S in D.symptoms)
symptoms += new S.type
else
D = null
if(!symptoms || !length(symptoms))
if(!D || !D.symptoms || !length(D.symptoms))
symptoms = GenerateSymptoms(0, 2)
else
for(var/datum/symptom/S in D.symptoms)
symptoms += new S.type
Refresh()
..(process, D)
return
@@ -80,7 +83,7 @@ GLOBAL_LIST_INIT(advance_cures, list(
return TRUE
/datum/disease/advance/cure(resistance=1)
/datum/disease/advance/cure(resistance = TRUE)
if(affected_mob)
var/id = "[GetDiseaseID()]"
if(resistance && !(id in affected_mob.GetResistances()))
@@ -150,8 +153,8 @@ GLOBAL_LIST_INIT(advance_cures, list(
return generated
/datum/disease/advance/proc/Refresh(new_name = FALSE, archive = FALSE)
var/list/properties = GenerateProperties()
AssignProperties(properties)
GenerateProperties()
AssignProperties()
id = null
if(!GLOB.archive_diseases[GetDiseaseID()])
@@ -160,82 +163,92 @@ GLOBAL_LIST_INIT(advance_cures, list(
GLOB.archive_diseases[GetDiseaseID()] = src // So we don't infinite loop
GLOB.archive_diseases[GetDiseaseID()] = new /datum/disease/advance(0, src, 1)
var/datum/disease/advance/A = GLOB.archive_diseases[GetDiseaseID()]
AssignName(A.name)
/datum/disease/advance/proc/GenerateProperties()
resistance = 0
stealth = 0
stage_rate = 0
transmission = 0
severity = 0
if(!symptoms || !length(symptoms))
CRASH("We did not have any symptoms before generating properties.")
var/c1sev
var/c2sev
var/c3sev
var/list/properties = list("resistance" = 1, "stealth" = 0, "stage rate" = 1, "transmittable" = 1, "severity" = 0)
for(var/datum/symptom/S as() in symptoms)
resistance = S.resistance
stealth += S.stealth
stage_rate += S.stage_speed
transmission += S.transmission
for(var/datum/symptom/S as() in symptoms)
S.severityset(src)
switch(S.severity)
if(-INFINITY to 0)
c1sev += S.severity
if(1 to 2)
c2sev = max(c2sev, min(3, (S.severity + c2sev)))
if(3 to 4)
c2sev = max(c2sev, min(4, (S.severity + c2sev)))
if(5 to INFINITY)
if(c3sev >= 5)
c3sev += (S.severity -3)
else
c3sev += S.severity
for(var/datum/symptom/S in symptoms)
severity += (max(c2sev, c3sev) + c1sev)
properties["resistance"] += S.resistance
properties["stealth"] += S.stealth
properties["stage rate"] += S.stage_speed
properties["transmittable"] += S.transmittable
properties["severity"] = max(properties["severity"], S.severity) // severity is based on the highest severity symptom
/datum/disease/advance/proc/AssignProperties()
return properties
/datum/disease/advance/proc/AssignProperties(list/properties = list())
if(properties && length(properties))
switch(properties["stealth"])
if(2)
visibility_flags = HIDDEN_SCANNER
if(3 to INFINITY)
visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
// The more symptoms we have, the less transmittable it is but some symptoms can make up for it.
SetSpread(clamp(2 ** (properties["transmittable"] - length(symptoms)), BLOOD, AIRBORNE))
permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1)
cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20
stage_prob = max(properties["stage rate"], 2)
SetSeverity(properties["severity"])
GenerateCure(properties)
if(stealth >= 2)
visibility_flags |= HIDDEN_SCANNER
else
CRASH("Our properties were empty or null!")
visibility_flags &= ~HIDDEN_SCANNER
/datum/disease/advance/proc/SetSpread(spread_id)
switch(spread_id)
if(NON_CONTAGIOUS, SPECIAL)
spread_text = "Non-contagious"
if(CONTACT_GENERAL, CONTACT_HANDS, CONTACT_FEET)
spread_text = "On contact"
if(AIRBORNE)
spread_text = "Airborne"
if(BLOOD)
SetSpread()
permeability_mod = max(CEILING(0.4 * transmission, 1), 1)
cure_chance = 15 - clamp(resistance, -5, 5) // can be between 10 and 20
stage_prob = max(stage_rate, 2)
SetSeverity(severity)
GenerateCure()
/datum/disease/advance/proc/SetSpread()
switch(transmission)
if(-INFINITY to 5)
spread_flags = DISEASE_SPREAD_BLOOD
spread_text = "Blood"
spread_flags = spread_id
if(6 to 10)
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS
spread_text = "Fluids"
if(11 to INFINITY)
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS | DISEASE_SPREAD_CONTACT
spread_text = "On Contact"
/datum/disease/advance/proc/SetSeverity(level_sev)
switch(level_sev)
if(-INFINITY to 0)
severity = NONTHREAT
if(-INFINITY to -2)
severity = DISEASE_BENEFICIAL
if(-1)
severity = DISEASE_POSITIVE
if(0)
severity = DISEASE_NONTHREAT
if(1)
severity = MINOR
severity = DISEASE_MINOR
if(2)
severity = MEDIUM
severity = DISEASE_MEDIUM
if(3)
severity = HARMFUL
severity = DISEASE_HARMFUL
if(4)
severity = DANGEROUS
severity = DISEASE_DANGEROUS
if(5 to INFINITY)
severity = BIOHAZARD
severity = DISEASE_BIOHAZARD
else
severity = "Unknown"
/datum/disease/advance/proc/GenerateCure(list/properties = list())
if(properties && length(properties))
var/res = clamp(properties["resistance"] - (length(symptoms) / 2), 1, length(GLOB.advance_cures))
cures = list(GLOB.advance_cures[res])
cure_text = cures[1]
/datum/disease/advance/proc/GenerateCure()
var/res = clamp(resistance - (length(symptoms) / 2), 1, length(GLOB.advance_cures))
cures = list(GLOB.advance_cures[res])
cure_text = cures[1]
return
// Randomly generate a symptom, has a chance to lose or gain a symptom.
@@ -243,14 +256,15 @@ GLOBAL_LIST_INIT(advance_cures, list(
var/s = safepick(GenerateSymptoms(min_level, max_level, 1))
if(s)
AddSymptom(s)
Refresh(1)
Refresh(TRUE)
return
// Randomly generates a symptom from a given list, has a chance to lose or gain a symptom.
/datum/disease/advance/proc/PickyEvolve(var/list/datum/symptom/D)
var/s = safepick(D)
if(s)
AddSymptom(new s)
Refresh(1)
Refresh(TRUE)
return
// Randomly remove a symptom.
@@ -259,12 +273,20 @@ GLOBAL_LIST_INIT(advance_cures, list(
var/s = safepick(symptoms)
if(s)
RemoveSymptom(s)
Refresh(1)
Refresh(TRUE)
return
// Randomly neuter a symptom.
/datum/disease/advance/proc/Neuter()
if(symptoms.len)
var/s = safepick(symptoms)
if(s)
NeuterSymptom(s)
Refresh(TRUE)
// Name the disease.
/datum/disease/advance/proc/AssignName(name = "Unknown")
src.name = name
/datum/disease/advance/proc/AssignName(new_name = "Unknown")
name = new_name
return
// Return a unique ID of the disease.
@@ -278,6 +300,10 @@ GLOBAL_LIST_INIT(advance_cures, list(
id = result
return id
/datum/disease/advance/proc/Finalize()
for(var/datum/symptom/S in symptoms)
S.OnAdd(src)
// Add a symptom, if it is over the limit (with a small chance to be able to go over)
// we take a random symptom away and add the new one.
/datum/disease/advance/proc/AddSymptom(datum/symptom/S)
@@ -297,6 +323,13 @@ GLOBAL_LIST_INIT(advance_cures, list(
symptoms -= S
return
// Neuters a symptom, allowing it only for stats.
/datum/disease/advance/proc/NeuterSymptom(datum/symptom/S)
if(!S.neutered)
S.neutered = TRUE
S.name += " (neutered)"
S.OnRemove(src)
// Mix a list of advance diseases and return the mixed result.
/proc/Advance_Mix(list/D_list)
@@ -324,7 +357,7 @@ GLOBAL_LIST_INIT(advance_cures, list(
// Should be only 1 entry left, but if not let's only return a single entry
var/datum/disease/advance/to_return = pick(diseases)
to_return.Refresh(1)
to_return.Refresh(new_name = TRUE)
return to_return
/proc/SetViruses(datum/reagent/R, list/data)
@@ -342,7 +375,7 @@ GLOBAL_LIST_INIT(advance_cures, list(
set name = "Create Advanced Virus"
set desc = "Create an advanced virus and release it."
if(!is_admin())
if(!is_admin(usr))
return FALSE
var/i = VIRUS_SYMPTOM_LIMIT
@@ -355,8 +388,8 @@ GLOBAL_LIST_INIT(advance_cures, list(
symptoms += "Done"
symptoms += GLOB.list_symptoms.Copy()
do
if(usr)
var/symptom = tgui_input_list(usr, "Choose a symptom to add ([i] remaining)", "Choose a Symptom", symptoms)
if(src)
var/symptom = tgui_input_list(src, "Choose a symptom to add ([i] remaining)", "Choose a Symptom", symptoms)
if(isnull(symptom))
return
else if(istext(symptom))
@@ -370,16 +403,16 @@ GLOBAL_LIST_INIT(advance_cures, list(
if(length(D.symptoms) > 0)
var/new_name = tgui_input_text(usr, "Name your new disease.", "New Name")
var/new_name = tgui_input_text(src, "Name your new disease.", "New Name")
if(!new_name)
return FALSE
D.AssignName(new_name)
D.Refresh()
D.Refresh(new_name)
D.Finalize()
for(var/datum/disease/advance/AD in GLOB.active_diseases)
AD.Refresh()
H = tgui_input_list(usr, "Choose infectee", "Infectees", human_mob_list)
H = tgui_input_list(src, "Choose infectee", "Infectees", human_mob_list)
if(isnull(H))
return FALSE
@@ -390,35 +423,7 @@ GLOBAL_LIST_INIT(advance_cures, list(
var/list/name_symptoms = list()
for(var/datum/symptom/S in D.symptoms)
name_symptoms += S.name
message_admins("[key_name_admin(usr)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]")
log_admin("[key_name_admin(usr)] infected [key_name_admin(H)] with [D.name]. It has these symptoms: [english_list(name_symptoms)]")
message_admins("[key_name_admin(src)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]")
log_admin("[key_name_admin(src)] infected [key_name_admin(H)] with [D.name]. It has these symptoms: [english_list(name_symptoms)]")
return TRUE
/datum/disease/advance/proc/totalStageSpeed()
var/total_stage_speed = 0
for(var/i in symptoms)
var/datum/symptom/S = i
total_stage_speed += S.stage_speed
return total_stage_speed
/datum/disease/advance/proc/totalStealth()
var/total_stealth = 0
for(var/i in symptoms)
var/datum/symptom/S = i
total_stealth += S.stealth
return total_stealth
/datum/disease/advance/proc/totalResistance()
var/total_resistance = 0
for(var/i in symptoms)
var/datum/symptom/S = i
total_resistance += S.resistance
return total_resistance
/datum/disease/advance/proc/totalTransmittable()
var/total_transmittable = 0
for(var/i in symptoms)
var/datum/symptom/S = i
total_transmittable += S.transmittable
return total_transmittable
@@ -1,11 +1,9 @@
/datum/disease/advance/random
name = "Experimental Disease"
var/randomname = TRUE
var/datum/symptom/setsymptom = null
var/max_symptoms_override
/datum/disease/advance/random/minor
name = "Minor Experimental Disease"
max_symptoms_override = 4
/datum/disease/advance/random/New(max_symptoms, max_level = 6, min_level = 1, list/guaranteed_symptoms = setsymptom)
@@ -35,9 +33,10 @@
symptoms += new chosen_symptom
for(var/guaranteed_symptom in guaranteed_symptoms)
symptoms += new guaranteed_symptom
Finalize()
Refresh()
/datum/disease/advance/random/macrophage
name = "Unknown Disease"
setsymptom = /datum/symptom/macrophage
/datum/disease/advance/random/blob
@@ -15,27 +15,42 @@ BONUS
*/
/datum/symptom/blobspores
name = "Blob Spores"
desc = "This symptom causes the host to produce blob spores, which will leave the host at the later stages, and if the host dies, all of the spores will erupt from the host at the same time, while also producing a blob tile."
stealth = 1
resistance = 5
resistance = 6
stage_speed = -2
transmittable = 1
level = -1
transmission = 1
level = 9
severity = 3
naturally_occuring = FALSE
symptom_delay_min = 20 SECONDS
symptom_delay_max = 40 SECONDS
threshold_descs = list(
"Resistance 8" = "Spawns a strong blob instead of a normal blob",
"Resistance 11" = "There is a chance to spawn a factory blob, instead of a normal blob.",
"Resistance 14" = "Has a chance to spawn a blob node instead of a normal blob"
)
var/ready_to_pop
var/factory_blob
var/strong_blob
var/node_blob
/datum/symptom/blobspores/severityset(datum/disease/advance/A)
. = ..()
if(A.resistance >= 14)
severity += 1
/datum/symptom/blobspores/Start(datum/disease/advance/A)
if(!..())
return
if(A.totalResistance() >= 8)
if(A.resistance >= 11)
factory_blob = TRUE
if(A.totalResistance() >= 5)
if(A.resistance >= 8)
strong_blob = TRUE
if(A.totalResistance() >= 10)
if(A.resistance >= 14)
node_blob = TRUE
/datum/symptom/blobspores/Activate(datum/disease/advance/A)
@@ -45,31 +60,35 @@ BONUS
switch(A.stage)
if(1)
if(prob(2))
to_chat(M, span_notice("You feel bloated."))
to_chat(M, span_notice("You feel bloated."))
if(prob(3) && !M.jitteriness)
if(!M.jitteriness)
to_chat(M, span_notice("You feel a bit jittery."))
M.jitteriness = 10
if(2)
if(prob(1) && ishuman(M))
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.vomit(TRUE, FALSE)
if(3, 4)
if(prob(10))
to_chat(M, span_notice("You feel blobby?"))
to_chat(M, span_notice("You feel blobby?"))
if(5)
ready_to_pop = TRUE
if(prob(5))
M.audible_emote("coughs up a small amount of blood!")
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/bleeding_rng = rand(1, 2)
H.drip(bleeding_rng)
M.audible_emote("coughs up a small amount of blood!")
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/bleeding_rng = rand(1, 2)
H.drip(bleeding_rng)
/datum/symptom/blobspores/OnStageChange(datum/disease/advance/A)
if(!..())
return
if(A.stage == 5)
ready_to_pop = TRUE
/datum/symptom/blobspores/OnDeath(datum/disease/advance/A)
if(neutered)
return
var/mob/living/M = A.affected_mob
M.visible_message(span_danger("[M] starts swelling grotesquely!"))
addtimer(CALLBACK(src, PROC_REF(pop), A, M), 10 SECONDS)
@@ -16,37 +16,62 @@ Bonus
*/
/datum/symptom/choking
name = "Choking"
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -4
level = 3
severity = 3
name = "Acute Respiratory Distress Syndrome"
desc = "The virus causes shrinking of the host's lungs, causing severe asphyxiation."
stealth = -2
resistance = 0
stage_speed = -1
transmission = -2
level = 9
severity = 5
naturally_occuring = FALSE
base_message_chance = 15
symptom_delay_min = 10 SECONDS
symptom_delay_max = 30 SECONDS
var/paralysis = FALSE
threshold_descs = list(
"Transmission 8" = "Doubles the damage caused by the symptom."
)
/datum/symptom/choking/severityset(datum/disease/advance/A)
. = ..()
if(A.transmission >= 8)
severity += 1
/datum/symptom/choking/Start(datum/disease/advance/A)
if(!..())
return
if(A.transmission >= 8)
power = 2
/datum/symptom/choking/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2)
to_chat(M, span_warning(pick("You're having difficulty breathing.", "Your breathing becomes heavy.")))
if(3, 4)
to_chat(M, span_boldwarning(pick("Your windpipe feels like a straw.", "Your breathing becomes tremendously difficult.")))
Choke_stage_3_4(M, A)
M.emote("gasp")
else
to_chat(M, span_userdanger(pick("You're choking!", "You can't breathe!")))
Choke(M, A)
M.emote("gasp")
if(!..())
return
var/mob/living/M = A.affected_mob
if(!M.needs_to_breathe() || M.stat == DEAD)
return
switch(A.stage)
if(3, 4)
to_chat(M, span_warning(pick("Your windpipe feels thin.", "Your lungs feel small-")))
Choke_stage_3_4(M, A)
M.emote("gasp")
if(5)
to_chat(M, span_userdanger(pick("Your lungs hurt!", "It hurts to breathe!")))
Choke(M, A)
M.emote("gasp")
return
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth())
var/get_damage = rand(5, 10) * power
M.adjustOxyLoss(get_damage)
return 1
return TRUE
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
var/get_damage = sqrtor0(21+A.totalStageSpeed()*0.5)+sqrtor0(16+A.totalStealth()*5)
var/get_damage = rand(2, 5) * power
M.adjustOxyLoss(get_damage)
return 1
return TRUE
@@ -0,0 +1,61 @@
/datum/symptom/cockroach
name = "SBG Syndrome"
desc = "Causes bluespace synchronicity with nearby air channels, making the roaches infesting the station's scrubber crawl from the host's face."
stealth = 1
resistance = 2
stage_speed = 3
transmission = 1
level = 0
severity = 0
symptom_delay_min = 15 SECONDS
symptom_delay_max = 40 SECONDS
var/death_roaches = FALSE
threshold_descs = list(
"Stage Speed 8" = "Increases roach speed",
"Transmission 8" = "When the host dies, more roaches spawn."
)
/datum/symptom/cockroach/Start(datum/disease/advance/A)
if(!..())
return
if(A.stage_rate >= 8)
symptom_delay_min = 5
symptom_delay_max = 15
if(A.transmission >= 8)
death_roaches = TRUE
/datum/symptom/cockroach/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
if(M.stat == DEAD)
return
switch(A.stage)
if(2)
if(prob(base_message_chance))
to_chat(M, span_notice("You feel a tingle under your skin."))
if(3)
if(prob(base_message_chance))
to_chat(M, span_notice("Your pores feel drafty."))
if(prob(5))
to_chat(M, span_notice("You feel attuned to the atmosphere."))
if(4)
if(prob(base_message_chance))
to_chat(M, span_notice("You feel in tune with the station."))
if(5)
if(prob(base_message_chance))
M.visible_message(span_danger("[M] squirms as a cockroach crawl from their pores!"), span_userdanger("A cockroach crawls out of your face!!"))
new /mob/living/simple_mob/animal/passive/cockroach(M.loc)
if(prob(base_message_chance))
to_chat(M, span_notice("You feel something crawling in your pipes!"))
/datum/symptom/cockroach/OnDeath(datum/disease/advance/A)
if(!..())
return
if(death_roaches)
var/mob/living/M = A.affected_mob
to_chat(M, span_warning("Your pores explode into a colony of roaches!"))
for(var/i in 1 to rand(1, 5))
new /mob/living/simple_mob/animal/passive/cockroach(M.loc)
@@ -17,22 +17,45 @@ Bonus
/datum/symptom/confusion
name = "Confusion"
desc = "The virus interferes with the proper function of the neural system, leading to bouts of confusion and erratic movement."
stealth = 1
resistance = -1
stage_speed = -3
transmittable = 0
level = 4
transmission = 0
level = 3
severity = 2
base_message_chance = 25
symptom_delay_min = 15 SECONDS
symptom_delay_max = 30 SECONDS
threshold_descs = list(
"Transmission 6" = "Increases confusion duration.",
"Stealth 4" = "The symptom remains hidden until active."
)
/datum/symptom/confusion/severityset(datum/disease/advance/A)
. = ..()
if(A.resistance >= 6)
severity += 1
/datum/symptom/confusion/Start(datum/disease/advance/A)
if(!..())
return
if(A.transmission >= 6)
power = 1.5
if(A.stealth >= 4)
supress_warning = TRUE
/datum/symptom/confusion/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
to_chat(M, span_warning(pick("Your head hurts.", "Your mind blanks for a moment.")))
else
to_chat(M, span_userdanger("You can't think straight!"))
M.AdjustConfused(rand(16, 200))
return
if(!..())
return
var/mob/living/L = A.affected_mob
if(L.stat == DEAD)
return
switch(A.stage)
if(1, 2, 3, 4)
if(prob(base_message_chance) && !supress_warning)
to_chat(L, span_warning(pick("Your head hurts", "Your mind blanks for a moment.")))
else
to_chat(L, span_userdanger("You can't think straight!"))
L.confused = min(50 * power, L.confused+8)
+60 -15
View File
@@ -17,25 +17,70 @@ BONUS
/datum/symptom/cough
name = "Cough"
desc = "The virus irritates the throat of the host, causing occasional coughing."
stealth = -1
resistance = 3
stage_speed = 1
transmittable = 2
transmission = 2
level = 1
severity = 1
severity = 0
base_message_chance = 15
symptom_delay_min = 15 SECONDS
symptom_delay_max = 45 SECONDS
var/infective = FALSE
threshold_descs = list(
"Resistance 3" = "Host will drop small items when coughing.",
"Resistance 10" = "Occasonally causes coughing fits that stun the host.",
"Stage Speed 6" = "Increases cough frequency",
"Stealth 4" = "The symptom remains hidden until active.",
"Transmission 11" = "The hosts coughing will occasonally spread the virus."
)
/datum/symptom/cough/severityset(datum/disease/advance/A)
. = ..()
if(A.resistance >= 3)
severity += 1
if(A.resistance >= 10)
severity += 1
/datum/symptom/cough/Start(datum/disease/advance/A)
if(!..())
return
if(A.stealth >= 4)
supress_warning = TRUE
if(A.resistance >= 3)
power = 1.5
if(A.resistance >= 10)
power = 2
if(A.stage_rate >= 6)
symptom_delay_max = 10
if(A.transmission >= 11)
infective = TRUE
/datum/symptom/cough/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
to_chat(M, span_warning(pick("You swallow excess mucus", "You lightly cough.")))
else
M.emote("cough")
if(!..())
return
var/mob/living/M = A.affected_mob
if(M.stat == DEAD)
return
switch(A.stage)
if(1, 2, 3)
if(prob(base_message_chance) && !supress_warning)
to_chat(M, span_warning(pick("Your throat itches.", "You lightly cough.")))
else
M.emote("cough")
if(power >= 1.5)
var/obj/item/I = M.get_active_hand()
if(I && I.w_class == ITEMSIZE_SMALL)
M.drop_item()
if(!M.wear_mask) // Small spread if not wearing a mask
A.spread(2)
return
if(I && I.w_class == ITEMSIZE_COST_TINY)
M.drop_item(get_turf(M))
if(power >= 2 && prob(10))
to_chat(M, span_userdanger(pick("You have a coughing fit!", "You can't stop coughing!")))
M.Stun(5)
M.emote("cough")
addtimer(CALLBACK(M, TYPE_PROC_REF(/mob, emote), "cough"), 1 SECONDS)
addtimer(CALLBACK(M, TYPE_PROC_REF(/mob, emote), "cough"), 3 SECONDS)
addtimer(CALLBACK(M, TYPE_PROC_REF(/mob, emote), "cough"), 6 SECONDS)
if(infective && prob(50))
addtimer(CALLBACK(A, TYPE_PROC_REF(/datum/disease, spread), 2), 20)
@@ -20,7 +20,7 @@ Bonus
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -2
transmission = -2
level = 4
severity = 0
@@ -17,22 +17,50 @@ Bonus
/datum/symptom/deafness
name = "Deafness"
stealth = 1
resistance = -2
desc = "The virus causes inflammation of the eardrums, causing intermittent deafness."
stealth = -1
resistance = -1
stage_speed = 1
transmittable = -3
level = 4
severity = 3
transmission = -3
level = 3
severity = 2
base_message_chance = 100
symptom_delay_min = 25 SECONDS
symptom_delay_max = 80 SECONDS
/datum/symptom/deafness/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
threshold_descs = list(
"Resistance 9" = "Causes permanent hearing loss.",
"Stealth 4" = "The symptom remains hidden until active."
)
switch(A.stage)
if(3, 4)
to_chat(M, span_warning("[pick("you hear a ringing in your ear.", "You ears pop.")]"))
if(5)
to_chat(M, span_userdanger("You ear pop and begin ringing loudly!"))
M.ear_deaf += 20
return
/datum/symptom/deafness/severityset(datum/disease/advance/A)
. = ..()
if(A.resistance >= 9)
severity += 1
/datum/symptom/deafness/Start(datum/disease/advance/A)
if(!..())
return
if(A.stealth >= 4)
supress_warning = TRUE
if(A.resistance >= 9)
power = 2
/datum/symptom/deafness/Activate(var/datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
if(M.stat == DEAD)
return
switch(A.stage)
if(3, 4)
if(prob(base_message_chance) && !supress_warning)
to_chat(M, span_warning(pick("You hear a ringing in your ears.", "Your ears pop.")))
if(5)
if(power >= 2)
M.adjustEarDamage(100, 10)
to_chat(M, span_userdanger("Your ears pop painfully and start bleeding!"))
M.emote("scream")
else
to_chat(M, span_userdanger("Your ears pop and begin ringing loudly!"))
M.adjustEarDamage(0, 10)
@@ -1,37 +0,0 @@
/*
//////////////////////////////////////
Dizziness
Hidden.
Lowers resistance considerably.
Decreases stage speed.
Reduced transmittability
Intense Level.
Bonus
Shakes the affected mob's screen for short periods.
//////////////////////////////////////
*/
/datum/symptom/dizzy
name = "Dizziness"
stealth = 2
resistance = -2
stage_speed = -3
transmittable = -1
level = 4
severity = 2
/datum/symptom/dizzy/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
to_chat(M, span_warning(pick("You feel dizzy.", "Your head spins.")))
else
to_chat(M, span_userdanger("A wave of dizziness washes over you!"))
M.make_dizzy(10)
return
+45 -15
View File
@@ -17,24 +17,54 @@ Bonus
/datum/symptom/fever
name = "Fever"
stealth = 0
desc = "The virus causes a febrile response from the host, raising it's body temperature."
stealth = -1
resistance = 3
stage_speed = 3
transmittable = 2
transmission = 2
level = 2
severity = 2
severity = 0
base_message_chance = 20
symptom_delay_min = 25 SECONDS
symptom_delay_max = 50 SECONDS
/datum/symptom/fever/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
var/unsafe = FALSE
threshold_descs = list(
"Resistance 5" = "Increases fever intensity, fever can overheat and harm the host.",
"Resistance 10" = "Further increases fever intensity."
)
/datum/symptom/fever/severityset(datum/disease/advance/A)
. = ..()
if(A.resistance >= 5)
severity += 1
if(A.resistance >= 10)
severity += 1
/datum/symptom/fever/Start(datum/disease/advance/A)
if(!..())
return
if(A.resistance >= 5)
power = 1.5
unsafe = TRUE
if(A.resistance >= 10)
power = 2.5
/datum/symptom/fever/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
if(M.stat == DEAD)
return
if(!unsafe || A.stage < 4)
to_chat(M, span_warning(pick("You feel hot.", "You feel like you're burning.")))
if(M.bodytemperature < BODYTEMP_HEAT_DAMAGE_LIMIT)
Heat(M, A)
else
to_chat(M, span_userdanger(pick("You feel too hot", "You feel like your blod is boiling.")))
set_body_temp(A.affected_mob, A)
return
/datum/symptom/fever/proc/Heat(var/mob/living/M, var/datum/disease/advance/A)
var/get_heat = (sqrtor0(21+A.totalTransmittable()*2))+(sqrtor0(20+A.totalStageSpeed()*3))
M.bodytemperature = min(M.bodytemperature + (get_heat * A.stage), BODYTEMP_HEAT_DAMAGE_LIMIT - 1)
return TRUE
/datum/symptom/fever/proc/set_body_temp(mob/living/M, datum/disease/advance/A)
if(!unsafe)
M.bodytemperature = min(M.bodytemperature + max((3 * power) * A.stage, (BODYTEMP_HEAT_DAMAGE_LIMIT - 1)))
else
M.bodytemperature = min(M.bodytemperature + max((3 * power) * A.stage, (BODYTEMP_HEAT_DAMAGE_LIMIT + 20)))
+56 -26
View File
@@ -17,40 +17,70 @@ Bonus
/datum/symptom/fire
name = "Spontaneous Combustion"
desc = "The virus turns fat into an extremely flammable compound, and raises the body's temperature, making the host burst into flames spontaneously."
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -4
level = 6
severity = 5
resistance = -1
stage_speed = -2
transmission = -1
level = 7
severity = 4
base_message_chance = 20
symptom_delay_min = 40 SECONDS
symptom_delay_max = 85 SECONDS
var/infective = FALSE
threshold_descs = list(
"Stage Speed 4" = "Increases the intensity of the flames.",
"Stage Speed 8" = "Further increases the intensity of the flames.",
"Transmission 8" = "Host will spread the virus through skin flake when bursting into flames.",
"Stealth 4" = "The symptom remains hidden until active."
)
/datum/symptom/fire/Start(datum/disease/advance/A)
if(!..())
return
if(A.stage_rate >= 4)
power = 1.5
if(A.stage_rate >= 8)
power = 2
if(A.stealth >= 4)
supress_warning = TRUE
if(A.transmission >= 8)
infective = TRUE
/datum/symptom/fire/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(3)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(3)
if(prob(base_message_chance) && !supress_warning && M.stat != DEAD)
to_chat(M, span_warning(pick("You feel hot.", "You hear a crackling noise.", "You smell smoke.")))
if(4)
Firestacks_stage_4(M, A)
M.IgniteMob()
to_chat(M, span_userdanger("Your skin bursts into flames!"))
M.emote("scream")
if(5)
Firestacks_stage_5(M, A)
M.IgniteMob()
if(4)
Firestacks_stage_4(M, A)
M.IgniteMob()
to_chat(M, span_userdanger("Your skin bursts into flames!"))
M.emote("scream")
if(5)
Firestacks_stage_5(M, A)
M.IgniteMob()
if(M.stat != DEAD)
to_chat(M, span_userdanger("Your skin erupts into an inferno!"))
M.emote("scream")
return
/datum/symptom/fire/proc/Firestacks_stage_4(mob/living/M, datum/disease/advance/A)
var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 2)) - (sqrtor0(16 + A.totalStealth())), 1)
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks * 0.5)
return 1
M.adjust_fire_stacks(1 * power)
M.take_overall_damage(burn = 2 * power)
if(infective)
M.visible_message(span_danger("[M] bursts into flames, spreading burning sparks about the area!"))
return TRUE
/datum/symptom/fire/proc/Firestacks_stage_5(mob/living/M, datum/disease/advance/A)
var/get_stacks = max((sqrtor0(20 + A.totalStageSpeed() * 3))-(sqrtor0(16 + A.totalStealth())), 1)
M.adjust_fire_stacks(get_stacks)
M.adjustFireLoss(get_stacks)
return 1
M.adjust_fire_stacks(3 * power)
M.take_overall_damage(burn = 5 * power)
if(infective)
M.visible_message(span_danger("[M] bursts into flames, spreading burning sparks about the area!"))
return TRUE
@@ -17,26 +17,57 @@ Bonus
/datum/symptom/flesh_eating
name = "Necrotizing Fasciitis"
desc = "The virus aggressively attacks the skin and blood, leading to extreme bleeding."
stealth = -3
resistance = -4
resistance = -2
stage_speed = 0
transmittable = -4
level = 6
severity = 5
transmission = -1
level = 7
severity = 4
base_message_chance = 50
symptom_delay_min = 20 SECONDS
symptom_delay_max = 60 SECONDS
var/bleed = FALSE
var/damage = FALSE
threshold_descs = list(
"Resistance 10" = "The host takes brute damage as their flesh is burst open.",
"Transmission 8" = "The host will bleed far more violently, loosing even more blood, and spraying infected blood everywhere."
)
/datum/symptom/flesh_eating/Start(datum/disease/advance/A)
if(!..())
return
if(A.resistance >= 10)
damage = TRUE
if(A.transmission >= 8)
power = 2
bleed = TRUE
/datum/symptom/flesh_eating/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(2,3)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(2, 3)
if(prob(base_message_chance) && M.stat != DEAD)
to_chat(M, span_warning(pick("You feel a sudden pain across your body.", "Drops of blood appear suddenly on your skin.")))
if(4,5)
to_chat(M, span_userdanger(pick("You cringe as a violent pain takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")))
Flesheat(M, A)
return
if(4, 5)
if(M.stat != DEAD)
to_chat(M, span_userdanger(pick("You cringe as a violent pan takes over your body.", "It feels like your body is eating itself inside out.", "IT HURTS.")))
Flesheat(M, A)
/datum/symptom/flesh_eating/proc/Flesheat(mob/living/M, datum/disease/advance/A)
var/get_damage = ((sqrtor0(16-A.totalStealth()))*5)
M.adjustBruteLoss(get_damage)
return 1
if(damage)
M.take_overall_damage(BRUTE = rand(15, 25))
if(ishuman(M))
return
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/O = pick(H.organs)
if(bleed)
O.createwound(PIERCE, 5 * power)
else
O.createwound(BRUISE, 7.5 * power)
return TRUE
+10 -8
View File
@@ -15,18 +15,20 @@ BONUS
//////////////////////////////////////
*/
/datum/symptom/spyndrome
/datum/symptom/flip
name = "Flippinov"
desc = "The virus hijacks the host's motor system, making them flip incontrollably."
stealth = 2
resistance = 0
stage_speed = 3
transmittable = 1
transmission = 1
symptom_delay_min = 15 SECONDS
symptom_delay_max = 40 SECONDS
level = 1
severity = 0
/datum/symptom/spyndrome/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/L = A.affected_mob
L.emote("flip")
/datum/symptom/flip/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
M.emote("flip")
@@ -0,0 +1,134 @@
/datum/symptom/genetic
name = "Basic Genetic Symptom (does nothing)"
stealth = 0
resistance = 0
stage_speed = 0
transmission = 0
level = -1
base_message_chance = 20
symptom_delay_min = 1
symptom_delay_max = 1
var/datum/gene/trait/mutation
var/passive_message
var/preset = FALSE
/datum/symptom/genetic/Start(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/human/H = A.affected_mob
if(mutation)
preset = H.dna.GetSEState(mutation.block)
/datum/symptom/genetic/OnAdd(datum/disease/advance/A)
. = ..()
if(mutation && !preset)
var/mob/living/carbon/human/H = A.affected_mob
H.dna.SetSEState(mutation.block, TRUE)
domutcheck(H, null, TRUE)
H.UpdateAppearance()
/datum/symptom/genetic/OnRemove(datum/disease/advance/A)
. = ..()
if(mutation && !preset)
var/mob/living/carbon/human/H = A.affected_mob
H.dna.SetSEState(mutation.block, FALSE)
domutcheck(H, null, TRUE)
H.UpdateAppearance()
/datum/symptom/genetic/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/human/H = A.affected_mob
switch(A.stage)
if(4, 5)
if(passive_message && prob(2))
to_chat(H, passive_message)
/*
//////////////////////////////////////
Telepathy
Hidden.
Decreases resistance.
Decreases stage speed significantly.
Decreases transmittablity tremendously.
Critical Level.
Bonus
The user gains telepathy.
//////////////////////////////////////
*/
/datum/symptom/genetic/telepathy
name = "Pineal Gland Decalcification"
stealth = 2
resistance = -2
stage_speed = -3
transmission = -4
level = 5
severity = 0
/datum/symptom/genetic/telepathy/New()
. = ..()
mutation = get_gene_from_trait(/datum/trait/positive/superpower_remotetalk)
/*
//////////////////////////////////////
Hematophagy
Little bit hidden.
Decreases resistance slightly.
Decreases stage speed tremendously.
Slightly increased transmittablity.
Intense level.
BONUS
The host must feed on BLOOD
//////////////////////////////////////
*/
/datum/symptom/genetic/hematophagy
name = "Hematophagy"
stealth = 1
resistance = -1
resistance = -4
transmission = 1
severity = 1
/datum/symptom/genetic/hematophagy/New()
. = ..()
mutation = get_gene_from_trait(/datum/trait/positive/superpower_remotetalk)
/*
//////////////////////////////////////
Pica
Not noticable or unnoticable.
Decreases resistance.
Increases stage speed.
Little transmittable.
Low Level.
BONUS
The host gains hunger for any kind of object.
//////////////////////////////////////
*/
/datum/symptom/genetic/pica
name = "Pica"
stealth = 0
resistance = -2
stage_speed = 3
transmission = 1
level = 1
severity = 0
/datum/symptom/genetic/pica/New()
. = ..()
mutation = get_gene_from_trait(/datum/trait/neutral/trashcan)
+12 -9
View File
@@ -6,7 +6,7 @@ Alopecia
Noticable.
Decreases resistance slightly.
Reduces stage speed slightly.
Transmittable.
transmission.
Intense Level.
BONUS
@@ -17,16 +17,19 @@ BONUS
/datum/symptom/shedding
name = "Alopecia"
stealth = -1
resistance = -1
stage_speed = -1
transmittable = 2
level = 4
severity = 1
desc = "The virus attacks hair follicles, making hair thin and brittle."
stealth = 0
resistance = 3
stage_speed = 2
transmission = 2
level = 5
severity = 0
base_message_chance = 50
symptom_delay_min = 45
symptom_delay_max = 90
/datum/symptom/shedding/Activate(datum/disease/advance/A)
..()
if(!prob(SYMPTOM_ACTIVATION_PROB))
if(!..())
return
if(ishuman(A.affected_mob))
return
@@ -17,24 +17,67 @@ Bonus
/datum/symptom/hallucigen
name = "Hallucigen"
stealth = -2
resistance = -3
stage_speed = -3
transmittable = -1
level = 5
severity = 3
desc = "The virus stimulates the brain, causing occasional hallucinations."
stealth = 1
resistance = -1
stage_speed = 1
transmission = 1
level = 3
severity = 1
base_message_chance = 25
symptom_delay_min = 10 SECONDS
symptom_delay_max = 70 SECONDS
var/fake_healthy = FALSE
threshold_descs = list(
"Stage Speed 7" = "Increases the amount of hallucinations.",
"Stealth 2" = "The virus mimics positive symptoms"
)
/datum/symptom/hallucigen/severityset(datum/disease/advance/A)
. = ..()
if(A.stage_rate >= 7)
severity += 1
/datum/symptom/hallucigen/Start(datum/disease/advance/A)
if(!..())
return
if(A.stealth >= 2)
fake_healthy = TRUE
base_message_chance = 50
if(A.stage_rate >= 7)
power = 2
/datum/symptom/hallucigen/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2)
to_chat(M, span_warning(pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whisper with no source.", "Your head aches.")))
if(3, 4)
to_chat(M, span_boldwarning(pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")))
else
to_chat(M, span_userdanger(pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")))
M.hallucination = rand(5, 10)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
if(M.stat == DEAD)
return
var/list/healthy_messages = list(
"Your lungs feel great.",
"You realize you haven't been breathing",
"You don't feel the need to breathe.",
"Your eyes feel great.",
"You are now blinking manually.",
"You don't feel the need to blnk."
)
return
switch(A.stage)
if(1, 2)
if(prob(base_message_chance))
if(!fake_healthy)
to_chat(M, span_notice(pick("Something appears in your peripheral vision, then winks out.", "You hear a faint whisper with no source.", "Your head aches.")))
else
to_chat(M, span_notice(pick(healthy_messages)))
if(3, 4)
if(prob(base_message_chance))
if(!fake_healthy)
to_chat(M, span_danger(pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")))
else
to_chat(M, span_notice(pick(healthy_messages)))
else
if(prob(base_message_chance))
to_chat(M, span_userdanger(pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something is in the shadows...")))
M.hallucination += (45 * power)
@@ -17,16 +17,55 @@ BONUS
/datum/symptom/headache
name = "Headache"
desc = "The virus causes inflammation inside the brain, causing constant headaches."
stealth = -1
resistance = 4
stage_speed = 2
transmittable = 0
transmission = 0
level = 1
severity = 1
severity = 0
base_message_chance = 100
symptom_delay_min = 20 SECONDS
symptom_delay_max = 40 SECONDS
/datum/symptom/headache/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
to_chat(M, span_warning(pick("Your head hurts.", "Your head starts pounding.")))
return
threshold_descs = list(
"Stage Speed 6" = "Headaches will cause severe pain, that weakens the host.",
"Stage Speed 9" = "Headaches become less frequent but far more intense, preventing any action from the host.",
"Stealth 4" = "Reduces headache frequency until later stages."
)
/datum/symptom/headache/severityset(datum/disease/advance/A)
. = ..()
if(A.stage_rate >= 6)
severity += 1
if(A.stage_rate >= 9)
severity += 1
/datum/symptom/headache/Start(datum/disease/advance/A)
if(!..())
return
if(A.stealth >= 4)
base_message_chance = 50
if(A.stage_rate >= 6)
power = 2
if(A.stage_rate >= 9)
symptom_delay_min = 30 SECONDS
symptom_delay_max = 60 SECONDS
power = 3
/datum/symptom/headache/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
if(M.stat == DEAD)
return
if(power < 2)
if(prob(base_message_chance) || A.stage >= 4)
to_chat(M, span_warning(pick("Your head hurts.", "Your head pounds.")))
if(power >= 2 && A.stage >= 4)
to_chat(M, span_danger(pick("Your head hurts a lot.", "Your head pounds incessantly.")))
M.Weaken(10)
if(power >= 3 && A.stage >= 5)
to_chat(M, span_userdanger(pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your brain!")))
M.Stun(15)
+203 -106
View File
@@ -1,125 +1,222 @@
/*
//////////////////////////////////////
Healing
Little bit hidden.
Lowers resistance tremendously.
Decreases stage speed tremendously.
Decreases transmittablity temrendously.
Fatal Level.
Bonus
Heals toxins in the affected mob's blood stream.
//////////////////////////////////////
*/
/datum/symptom/heal
name = "Toxic Filter"
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -4
level = 6
severity = 0
name = "Basic Healing (does nothing)"
stealth = 0
resistance = 0
stage_speed = 0
transmission = 0
level = -1
base_message_chance = 20
symptom_delay_min = 1
symptom_delay_max = 1
var/passive_message = ""
threshold_descs = list(
"Stealth 4" = "Healing will no longer be visible to onlookers."
)
/datum/symptom/heal/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 10))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
Heal(M, A)
return
/datum/symptom/heal/proc/Heal(mob/living/M, datum/disease/advance/A)
var/get_damage = max(0, (sqrtor0(20+A.totalStageSpeed())*(1+rand())))
M.adjustToxLoss(-get_damage)
/datum/symptom/heal/Start(datum/disease/advance/A)
if(!..())
return FALSE
return TRUE
/*
//////////////////////////////////////
/datum/symptom/heal/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
var/effectiveness = CanHeal(A)
if(!effectiveness)
if(passive_message && prob(2) && passive_message_condition(M))
to_chat(M, passive_message)
return
else
Heal(M, A, effectiveness)
return
Metabolism
/datum/symptom/heal/proc/CanHeal(datum/disease/advance/A)
return power
Little bit hidden.
Lowers resistance.
Decreases stage speed.
Decreases transmittablity temrendously.
High Level.
/datum/symptom/heal/proc/Heal(mob/living/M, /datum/disease/advance/A, actual_power = 1)
return TRUE
Bonus
Cures all diseases (except itself) and creates anti-bodies for them until the symptom dies.
/datum/symptom/heal/proc/passive_message_condition(mob/living/M)
return TRUE
//////////////////////////////////////
*/
/datum/symptom/heal/chem
name = "Toxolysis"
desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
stealth = 0
resistance = -2
stage_speed = 2
transmission = -2
level = 6
power = 2
var/food_conversion = FALSE
threshold_descs = list(
"Resistance 7" = "Increases chem removal speed.",
"Stage Speed 6" = "Consumed chemicals nourish the host."
)
/datum/symptom/heal/chem/Start(datum/disease/advance/A)
if(!..())
return
if(A.stage >= 6)
food_conversion = TRUE
if(A.resistance >= 7)
power = 4
/datum/symptom/heal/chem/Heal(mob/living/carbon/human/H, datum/disease/advance/A, actual_power)
for(var/datum/reagent/R in H.bloodstr.reagent_list)
H.reagents.remove_reagent(R.type, actual_power)
if(food_conversion)
H.adjust_nutrition(2)
if(prob(2) && H.stat != DEAD)
to_chat(H, span_notice("You feel a mild warmth as your blood purifies itself."))
/datum/symptom/growth
name = "Pituitary Disruption"
desc = "Causes uncontrolled growth in the subject."
stealth = -3
resistance = -2
stage_speed = 1
transmission = -2
level = 8
severity = 1
symptom_delay_min = 10 SECONDS
symptom_delay_max = 20 SECONDS
var/current_size = 1
var/tetsuo = FALSE
var/bruteheal = FALSE
var/datum/mind/ownermind
threshold_descs = list(
"Stage Speed 6" = "The disease heals brute damage at a fast rate, but causes expulsion of benign tumors.",
"Stage Speed 12" = "The disease heals brute damage incredibly fast, but deteriorates cell health and causes tumors to become more advanced. The disease will also regenerate lost limbs."
)
/datum/symptom/growth/Start(datum/disease/advance/A)
if(!..())
return
if(A.stage_rate >= 6)
bruteheal = TRUE
if(A.stage_rate >= 12)
tetsuo = TRUE
power = 3
var/mob/living/carbon/human/H = A.affected_mob
ownermind = H.mind
/datum/symptom/growth/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/human/H = A.affected_mob
switch(A.stage)
if(4, 5)
if(prob(5) && bruteheal)
if(H.stat != DEAD)
to_chat(H, span_userdanger("You retch, and a splatter of gore escapes your gullet!"))
H.vomit(lost_nutrition = 0, blood = TRUE, stun = FALSE)
// Spitting tumors go here! IF they get up-ported.
if(tetsuo)
var/list/missing = H.get_missing_limbs()
if(prob(35) && H.mind && ishuman(H) && H.stat != DEAD)
new /obj/effect/decal/cleanable/blood/gibs(H.loc)
if(missing.len)
for(var/Z in missing)
if(H.regenerate_limb(Z, TRUE))
playsound(H, 'sound/effects/blobattack.ogg', 50, 1)
H.visible_message(span_warning("[H]'s missing limbs reform, making a loud, grotesque sound!"), span_userdanger("You limbs regrow, making a loud, crunchy sound and giving you great pain!"))
H.emote("scream")
if(Z == BP_HEAD)
if(isliving(ownermind.current))
var/mob/living/owner = ownermind.current
if(owner.stat != DEAD)
ownermind = null
break
ownermind.transfer_to(H)
H.grab_ghost()
break
if(bruteheal)
H.heal_overall_damage(2 * power)
if(prob(33) && tetsuo)
H.adjustCloneLoss(1)
else
if(prob(base_message_chance) && H.stat != DEAD)
to_chat(H, span_notice(pick("You feel bloated.", "The station seems small.", "You are the strongest.")))
return
/datum/symptom/heal/metabolism
name = "Anti-Bodies Metabolism"
name = "Metabolic Boost"
desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast, but also causing increased hunger."
stealth = -1
resistance = -1
stage_speed = -1
transmittable = -4
level = 3
severity = 0
var/list/cured_diseases = list()
resistance = -2
stage_speed = 2
transmission = 1
level = 6
var/triple_metabolism = FALSE
var/reduced_hunger = FALSE
/datum/symptom/heal/metabolism/Heal(mob/living/M, datum/disease/advance/A)
var/cured = 0
for(var/thing in M.GetViruses())
var/datum/disease/D = thing
if(D.virus_heal_resistant)
continue
if(D != A)
cured = TRUE
cured_diseases += D.GetDiseaseID()
D.cure()
if(cured)
to_chat(M, span_notice("You feel much better."))
threshold_descs = list(
"Stealth 3" = "Reduces hunger rate.",
"Stage Speed 10" = "Chemical metabolization is tripled instead of doubled."
)
/datum/symptom/heal/metabolism/End(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
if(istype(M))
if(length(cured_diseases))
for(var/res in M.GetResistances())
M.resistances -= res
to_chat(M, span_warning("You feel weaker."))
/datum/symptom/heal/metabolism/Start(datum/disease/advance/A)
if(!..())
return
if(A.stage_rate >= 10)
triple_metabolism = TRUE
if(A.stealth >= 3)
reduced_hunger = TRUE
/*
//////////////////////////////////////
/datum/symptom/heal/metabolism/Heal(mob/living/carbon/human/H, datum/disease/advance/A, actual_power)
if(!istype(H))
return
if(H.ingested)
H.ingested.metabolize()
if(triple_metabolism)
H.ingested.metabolize()
var/lost_nutrition = 9 - (reduced_hunger * 5)
H.adjust_nutrition(-lost_nutrition * 0.1)
if(prob(2) && H.stat != DEAD)
to_chat(H, span_notice("You feel an odd gurgle in your stomach, as if it was working much faster than normal."))
return TRUE
Longevity
/datum/symptom/heal/oxygen
name = "Oxygenation"
desc = "The virus causes the host's body to produce oxygen, allowing self-respiration."
stealth = 1
resistance = -3
stage_speed = -3
transmission = -4
level = 8
base_message_chance = 5
symptom_delay_min = 5 SECONDS
symptom_delay_max = 20 SECONDS
var/regenerate_blood = FALSE
Medium hidden boost.
Large resistance boost.
Large stage speed boost.
Large transmittablity boost.
High Level.
threshold_descs = list(
"Resistance 8" = "Additionally regenerates lost blood."
)
Bonus
After a certain amount of time the symptom will cure itself.
/datum/symptom/heal/oxygen/Start(datum/disease/advance/A)
if(!..())
return
if(A.resistance >= 8)
regenerate_blood = TRUE
//////////////////////////////////////
*/
/datum/symptom/heal/oxygen/Heal(mob/living/carbon/human/H, datum/disease/advance/A, actual_power)
if(!istype(H))
return
if(H.getOxyLoss() > 0)
H.adjustOxyLoss(3 * power)
if(regenerate_blood && H.vessel.get_reagent_amount(REAGENT_ID_BLOOD) < H.species.blood_volume)
H.add_chemical_effect(CE_BLOODRESTORE, 1)
/datum/symptom/heal/longevity
name = "Longevity"
stealth = 3
resistance = 4
stage_speed = 4
transmittable = 4
level = 3
severity = 0
var/longevity = 30
/datum/symptom/heal/longevity/Heal(mob/living/M, datum/disease/advance/A)
longevity -= 1
if(!longevity)
A.cure()
/datum/symptom/heal/longevity/Start(datum/disease/advance/A)
longevity = rand(initial(longevity) - 5, initial(longevity) + 5)
/*
//////////////////////////////////////
@@ -136,19 +233,19 @@ Bonus
Heals clone damage, treats radiation.
//////////////////////////////////////
*/
/datum/symptom/heal/dna
name = "Deoxyribonucleic Acid Restoration"
stealth = -1
resistance = -1
stage_speed = 0
transmittable = -3
transmission = -3
level = 5
severity = 0
/datum/symptom/heal/dna/Heal(var/mob/living/carbon/M, var/datum/disease/advance/A)
var/amt_healed = max(0, (sqrtor0(20+A.totalStageSpeed()*(3+rand())))-(sqrtor0(16+A.totalStealth()*rand())))
var/amt_healed = max(0, (sqrtor0(20+A.stage_rate*(3+rand())))-(sqrtor0(16+A.stealth*rand())))
M.adjustBrainLoss(-amt_healed)
M.radiation = max(M.radiation - 3, 0)
return TRUE
*/
@@ -1,43 +0,0 @@
/*
//////////////////////////////////////
Hematophagy
Little bit hidden.
Decreases resistance slightly.
Decreases stage speed tremendously.
Slightly increased transmittablity.
Intense level.
BONUS
The host must feed on BLOOD
//////////////////////////////////////
*/
/datum/symptom/hematophagy
name = "Hematophagy"
stealth = 1
resistance = -1
resistance = -4
transmittable = 1
level = 4
severity = 1
/datum/symptom/hematophagy/Start(datum/disease/advance/A)
if(ishuman(A.affected_mob))
var/mob/living/carbon/human/H = A.affected_mob
H.species.organic_food_coeff = 0
H.species.bloodsucker = TRUE
add_verb(H, /mob/living/carbon/human/proc/bloodsuck)
/datum/symptom/hematophagy/End(datum/disease/advance/A)
if(ishuman(A.affected_mob))
var/mob/living/carbon/human/H = A.affected_mob
H.species.organic_food_coeff = initial(H.species.organic_food_coeff)
H.species.bloodsucker = initial(H.species.bloodsucker)
remove_verb(H, /mob/living/carbon/human/proc/bloodsuck)
@@ -17,16 +17,43 @@ BONUS
/datum/symptom/itching
name = "Itching"
desc = "The virus irritates the skin, causing itching."
stealth = 0
resistance = 3
stage_speed = 3
transmittable = 1
transmission = 1
level = 1
severity = 1
severity = 0
symptom_delay_min = 15 SECONDS
symptom_delay_max = 35 SECONDS
/datum/symptom/itching/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
to_chat(M, span_warning("Your [pick("back", "arm", "leg", "elbow", "head")] itches."))
return
var/scratch = FALSE
threshold_descs = list(
"Transmission 6" = "Increases frequency of itching.",
"Stage Speed 7" = "The host will scratch itself when itchin, causing superficial damage."
)
/datum/symptom/itching/Start(datum/disease/advance/A)
if(!..())
return
if(A.transmission >= 6)
symptom_delay_min = 5 SECONDS
symptom_delay_max = 10 SECONDS
if(A.stage >= 7)
scratch = TRUE
/datum/symptom/itching/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
if(M.stat >= DEAD)
return
var/picked_bodypart = pick(BP_HEAD, BP_TORSO, BP_R_ARM, BP_L_ARM, BP_R_LEG, BP_L_LEG)
var/obj/item/organ/bodypart = M.get_organ(picked_bodypart)
var/can_scratch = scratch && !M.incapacitated()
if(bodypart && !bodypart.robotic)
M.visible_message("[can_scratch ? span_warning("[M] scratches their [bodypart.name].") : ""]", span_notice("Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]"))
if(can_scratch)
bodypart.take_damage(0.5)
@@ -17,16 +17,36 @@ Bonus
/datum/symptom/language
name = "Lingual Disocation"
stealth = 3
desc = "The virus attack the broca area of the brain, messing with the host's speech."
stealth = 0
resistance = 2
stage_speed = -2
transmittable = -1
level = 3
stage_speed = 1
transmission = 1
level = 1
severity = 1
symptom_delay_min = 20 SECONDS
symptom_delay_max = 50 SECONDS
var/gibberish = FALSE
threshold_descs = list(
"Resistance 5" = "The host might end up speaking a completely made up language."
)
/datum/symptom/language/Start(datum/disease/advance/A)
if(!..())
return
if(A.resistance)
gibberish = TRUE
/datum/symptom/language/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/human/H = A.affected_mob
H.apply_default_language(pick(H.languages))
return
if(!..())
return
var/mob/living/L = A.affected_mob
if(L.stat == DEAD)
return
if(gibberish && prob(10))
L.apply_default_language(LANGUAGE_GIBBERISH)
else
L.apply_default_language(pick(L.languages))
@@ -0,0 +1,53 @@
/datum/symptom/light
name = "Photosensitive muscle condensation"
desc = "The virus will cause muscles to contract when exposed to light, resulting in lowered speed, but increased durability. Muscles will become more malleable in the darkness, resulting in the host moving faster, but being more easily bruised."
stealth = 0
resistance = 2
stage_speed = -3
transmission = 0
level = 8
severity = -2
var/currenthealthmodifier
threshold_descs = list(
"Stealth 3" = "The virus causes a wider disparity between light and dark."
)
/datum/symptom/light/severityset(datum/disease/advance/A)
. = ..()
if(A.stealth >= 3)
severity -= 1
/datum/symptom/light/Start(datum/disease/advance/A)
if(!..())
return
if(A.stealth >= 3)
power = 2
/datum/symptom/light/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/human/H = A.affected_mob
if(H.stat >= DEAD)
return
var/realpower = power
var/healthchange = min(1 * realpower, (10 * realpower) - currenthealthmodifier)
if(isturf(H.loc))
var/turf/T = H.loc
var/light_amount = min(1, T.get_lumcount()) - 0.5
if(light_amount < 0.5)
realpower = power * -1
healthchange = max(1 * realpower, (10 * realpower) - currenthealthmodifier)
if(prob(5))
to_chat(H, span_warning(pick("You feel vulnerable.", "Your limbs feel loose and limber.", "The dark makes you feel realxed.")))
else if(prob(5))
to_chat(H, span_warning(pick("Your muscles feel tight.", "You feel lethargic.", "Your muscles feel hard and tough.")))
if(A.stage >= 5)
currenthealthmodifier += healthchange
H.maxHealth += healthchange
H.health += healthchange
/datum/symptom/light/End(datum/disease/advance/A)
. = ..()
var/mob/living/carbon/human/H = A.affected_mob
H.maxHealth -= currenthealthmodifier
H.health -= currenthealthmodifier
@@ -17,57 +17,84 @@ BONUS
/datum/symptom/macrophage
name = "Macrophage"
desc = "The virus grows within the host, ceasing to be microscopic and causing severe bodily harm. These Phages will seek out, attack, and infect more viable hosts."
stealth = -4
resistance = -1
stage_speed = -2
transmittable = 2
level = 6
transmission = 2
level = 9
severity = 2
symptom_delay_min = 40
symptom_delay_max = 60
var/gigagerms = FALSE
var/netspeed = 0
var/phagecounter = 10
threshold_descs = list(
"Stage Speed" = "The higher the stage speed, the more frequently will burst from the host.",
"Resistance" = "The higher the resistance, the more health phages will have, and the more damage the will do.",
"Transmission 10" = "Phages can be larger, and more aggressive.",
"Transmission 12" = "Phages will carry all diseases within the host, instead of only containing their own."
)
/datum/symptom/macrophage/severityset(datum/disease/advance/A)
. = ..()
if(A.transmission >= 10)
severity += 2
/datum/symptom/macrophage/Start(datum/disease/advance/A)
netspeed = max(1, A.stage)
if(A.severity >= HARMFUL)
if(!..())
return
netspeed = max(1, A.stage_rate)
if(A.transmission >= 10)
gigagerms = TRUE
/datum/symptom/macrophage/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
if(prob(base_message_chance) && M.stat != DEAD)
to_chat(M, span_notice("Your skin crawls."))
if(4)
if(4)
if(prob(base_message_chance))
M.visible_message(span_danger("Lumps form on [M]'s skin!"), span_userdanger("You cringe in pain as lumps form and move around on your skin!"))
if(5)
phagecounter -= max(2, A.totalStageSpeed())
if(gigagerms && phagecounter <= 0)
Burst(A, M, TRUE)
phagecounter += 10
while(phagecounter <= 0)
phagecounter += 5
Burst(A, M)
if(5)
phagecounter -= max(2, A.stage_rate)
if(gigagerms && phagecounter <= 0)
Burst(A, M, TRUE)
phagecounter += 10
while(phagecounter <= 0)
phagecounter += 5
Burst(A, M)
/datum/symptom/macrophage/proc/Burst(datum/disease/advance/A, var/mob/living/M, var/gigagerms = FALSE)
var/mob/living/simple_mob/vore/aggressive/macrophage/phage
phage = new(M.loc)
M.apply_damage(rand(1, 7))
phage.viruses = A.Copy()
phage.health += A.totalResistance()
phage.maxHealth += A.totalResistance()
if(gigagerms)
phage = new /mob/living/simple_mob/vore/aggressive/macrophage/giant(get_turf((M.loc)))
phage.melee_damage_lower = rand(10, 15)
phage.melee_damage_upper = rand(15, 20)
M.apply_damage(rand(10, 20))
playsound(M, 'sound/effects/splat.ogg', 50, 1)
M.emote("scream")
else
phage = new(get_turf((M.loc)))
M.apply_damage(rand(1, 7))
phage.health += A.resistance
phage.maxHealth += A.resistance
phage.infections += A
phage.base_disease = A
if(A.spread_flags & CONTACT_GENERAL)
if(A.transmission >= 12)
for(var/datum/disease/D in M.GetViruses())
if((D.spread_flags & SPECIAL) || (D.spread_flags & NON_CONTAGIOUS))
if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_CONTACT))
continue
if(D == A)
continue
phage.viruses += D
M.visible_message(span_danger("A strange crearure bursts out of [M]!"), span_userdanger("A slimy creature bursts forth from your flesh!"))
addtimer(CALLBACK(phage, TYPE_PROC_REF(/mob/living/simple_mob/vore/aggressive/macrophage, deathcheck)), 3000)
phage.infections += D
M.visible_message(span_danger("A strange creature burst out of [M]!"), span_userdanger("A slimy creature bursts forth from your flesh!"))
addtimer(CALLBACK(phage, TYPE_PROC_REF(/mob/living/simple_mob/vore/aggressive/macrophage, deathcheck)), 3 MINUTES)
+39 -6
View File
@@ -17,16 +17,49 @@ BONUS
/datum/symptom/mlem
name = "Mlemington"
desc = "The host uncontrollably licks their nose. Mlem."
stealth = 0
resistance = 3
stage_speed = 3
transmittable = 1
transmission = 1
level = 1
severity = 1
var/infective = FALSE
threshold_descs = list(
"Resistance 5" = "The host may occasionally go on a mlemming spree.",
"Transmission 8" = "The host will spread the virus through saliva when mlemming."
)
/datum/symptom/mlem/severityset(datum/disease/advance/A)
. = ..()
if(A.transmission >= 8)
infective = TRUE
severity += 1
/datum/symptom/mlem/Start(datum/disease/advance/A)
if(!..())
return
if(A.resistance >= 5)
power = 1.5
/datum/symptom/itching/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
M.emote("mlem")
return
if(!..())
return
var/mob/living/M = A.affected_mob
if(M.stat == DEAD)
return
switch(A.stage)
if(1, 2, 3)
if(prob(base_message_chance))
to_chat(M, span_notice("You think about licking your nose..."))
else
M.emote("mlem")
if(power >= 1.5)
M.emote("mlem")
if(power >= 2)
M.emote("mlem")
addtimer(CALLBACK(M, TYPE_PROC_REF(/mob, emote), "mlem"), 2 SECONDS)
addtimer(CALLBACK(M, TYPE_PROC_REF(/mob, emote), "mlem"), 5 SECONDS)
addtimer(CALLBACK(M, TYPE_PROC_REF(/mob, emote), "mlem"), 8 SECONDS)
@@ -17,15 +17,16 @@ Bonus
/datum/symptom/necrotic_agent
name = "Necrotic Agent"
stealth = -2
resistance = -3
stage_speed = -3
transmittable = 0
desc = "Allows the virus to infect corpses, and work on the dead."
stealth = 2
resistance = -2
stage_speed = -1
transmission = 0
level = 6
severity = 3
/datum/symptom/necrotic_agent/Start(datum/disease/advance/A)
A.allow_dead = TRUE
/datum/symptom/necrotic_agent/OnAdd(datum/disease/advance/A)
A.virus_modifiers |= SPREAD_DEAD
/datum/symptom/necrotic_agent/End(datum/disease/advance/A)
A.allow_dead = FALSE
/datum/symptom/necrotic_agent/OnRemove(datum/disease/advance/A)
A.virus_modifiers &= ~SPREAD_DEAD
@@ -1,38 +0,0 @@
/*
//////////////////////////////////////
Self-Respiration
Slightly hidden.
Lowers resistance significantly.
Decreases stage speed significantly.
Decreases transmittablity tremendously.
Fatal Level.
Bonus
The body generates dexalin.
//////////////////////////////////////
*/
/datum/symptom/oxygen
name = "Self-Respiration"
stealth = 1
resistance = -3
stage_speed = -3
transmittable = -4
level = 6
severity = 0
/datum/symptom/oxygen/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
if(M.reagents.get_reagent_amount(REAGENT_ID_DEXALIN) < 10)
M.reagents.add_reagent(REAGENT_ID_DEXALIN, 10)
else
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
to_chat(M, span_notice(pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")))
return
@@ -20,7 +20,7 @@ Bonus
stealth = -2
resistance = 2
stage_speed = 1
transmittable = -4
transmission = -4
level = 6
severity = 5
@@ -1,46 +0,0 @@
/*
//////////////////////////////////////
Pica
Not noticable or unnoticable.
Decreases resistance.
Increases stage speed.
Little transmittable.
Low Level.
BONUS
The host gains hunger for any kind of object.
//////////////////////////////////////
*/
/datum/symptom/pica
name = "Pica"
stealth = 0
resistance = -2
stage_speed = 3
transmittable = 1
level = 1
severity = 0
/datum/symptom/pica/Start(datum/disease/advance/A)
add_verb(A.affected_mob, /mob/living/proc/eat_trash)
add_verb(A.affected_mob, /mob/living/proc/toggle_trash_catching)
/datum/symptom/pica/End(datum/disease/advance/A)
remove_verb(A.affected_mob, /mob/living/proc/eat_trash)
remove_verb(A.affected_mob, /mob/living/proc/toggle_trash_catching)
/datum/symptom/pica/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/list/nearby = oview(5, A.affected_mob)
to_chat(A.affected_mob, span_warning("You could go fo a bite of [pick(nearby)]..."))
else if (prob(SYMPTOM_ACTIVATION_PROB))
if(ishuman(A.affected_mob))
var/mob/living/carbon/human/H = A.affected_mob
var/list/item = H.get_equipped_items()
to_chat(H, span_warning("[pick(item)] looks oddly [pick("delicious", "tasty", "scrumptious", "inviting")]..."))
return
@@ -0,0 +1,108 @@
/datum/symptom/radiation
name = "Irradiant Cells"
desc = "Causes the cells in the host's body to give off harmful radiation."
stealth = -1
resistance = 2
stage_speed = 1
transmission = 2
level = 7
severity = 3
symptom_delay_min = 10 SECONDS
symptom_delay_max = 40 SECONDS
threshold_descs = list(
"Speed 8" = "Host takes radiation damage faster."
)
/datum/symptom/radiation/severityset(datum/disease/advance/A)
. = ..()
if(A.stage_rate >= 8)
severity += 1
/datum/symptom/radiation/Start(datum/disease/advance/A)
if(!..())
return
if(A.stage_rate >= 8)
power = 2
/datum/symptom/radiation/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/human/H = A.affected_mob
if(H.stat == DEAD)
return
switch(A.stage)
if(1)
if(prob(10))
to_chat(H, span_notice("You feel off..."))
if(2, 3)
if(prob(50))
to_chat(H, span_danger("You feel like the atoms inside you are beginning to split..."))
if(4, 5)
radiate(H)
/datum/symptom/radiation/proc/radiate(mob/living/carbon/human/H)
to_chat(H, span_danger("You feel a wave of pain throughout your body!"))
H.radiation += 50 * power
return TRUE
/datum/symptom/radconversion
name = "Aptopic Culling"
desc = "The virus causes infected cells to die off when exposed to radiation, causing open wounds to appear on the host's flesh. The end result of this process is the removal of radioactive contamination from the host."
stealth = 1
resistance = 1
stage_speed = 1
transmission = -2
level = 8
severity = 0
symptom_delay_min = 1
symptom_delay_max = 1
var/toxheal = FALSE
var/cellheal = FALSE
threshold_descs = list(
"Stage Speed 6" = "The disease also kills off contaminated cells, converting Toxin damage to Brute damage, at an efficient rate.",
"Resistance 12" = "The disease also kills off genetically damaged cells, coverting Genetic damage to Burn damage, an inefficient rate."
)
/datum/symptom/radconversion/severityset(datum/disease/advance/A)
. = ..()
if(A.stage_rate >= 6)
severity -= 1
if(A.resistance >= 12)
severity -= 1
/datum/symptom/radconversion/Start(datum/disease/advance/A)
if(!..())
return
if(A.stage_rate >= 6)
toxheal = TRUE
if(A.resistance >= 12)
cellheal = TRUE
/datum/symptom/radconversion/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/human/H = A.affected_mob
if(A.stage >= 4)
if(H.radiation)
H.radiation -= max(H.radiation * 0.05, min(10, H.radiation))
H.take_overall_damage(2)
if(prob(5))
if(H.stat != DEAD)
to_chat(H, span_userdanger("A tear opens in your flesh!"))
blood_splatter(H.loc, H)
if(H.getToxLoss() && toxheal)
H.adjustToxLoss(-2)
H.take_overall_damage(1)
if(prob(5))
if(H.stat != DEAD)
to_chat(H, span_userdanger("A tear opens in your flesh!"))
blood_splatter(H.loc, H)
if(H.getCloneLoss() && cellheal)
H.adjustCloneLoss(-1)
H.take_overall_damage(burn = 2)
if(prob(5) && H.stat != DEAD)
to_chat(H, span_userdanger("A nasty rash appears on your skin!"))
else if (prob(2) && ((H.getCloneLoss() && cellheal) || (H.getToxLoss() && toxheal) || H.radiation) && H.stat != DEAD)
to_chat(H, span_notice("You feel a tingling sensation."))
@@ -20,7 +20,7 @@ Bonus
stealth = -3
resistance = -4
stage_speed = -4
transmittable = -3
transmission = -3
level = 5
severity = 0
@@ -47,7 +47,7 @@ Bonus
stealth = -1
resistance = -3
stage_speed = -2
transmittable = -4
transmission = -4
level = 4
/datum/symptom/sensory_restoration/Activate(datum/disease/advance/A)
@@ -17,23 +17,53 @@ Bonus
/datum/symptom/shivering
name = "Shivering"
desc = "The virus inhibits the body's thermoregulation, cooling the body down."
stealth = 0
resistance = 2
stage_speed = 2
transmittable = 2
transmission = 2
level = 2
severity = 2
severity = 0
symptom_delay_min = 20 SECONDS
symptom_delay_max = 40 SECONDS
var/unsafe = FALSE
threshold_descs = list(
"Stage Speed 5" = "Increases cooling speed; The host can fall below safe temperature levels.",
"Stage Speed 10" = "Further increases cooling speed."
)
/datum/symptom/shivering/severityset(datum/disease/advance/A)
. = ..()
if(A.stage_rate >= 5)
severity += 1
if(A.stage_rate >= 10)
severity += 1
/datum/symptom/shivering/Start(datum/disease/advance/A)
if(!..())
return
if(A.stage_rate >= 5)
power = 1.5
unsafe = TRUE
if(A.stage_rate >= 10)
power = 2.5
/datum/symptom/shivering/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/L = A.affected_mob
to_chat(L, span_warning(pick("You feel cold.", "You start shivering.")))
if(L.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT)
Chill(L, A)
return
if(!..())
return
var/mob/living/carbon/M = A.affected_mob
if(M.stat == DEAD)
return
if(!unsafe || A.stage < 4)
to_chat(M, span_warning(pick("You feel cold.", "You shiver.")))
else
to_chat(M, span_userdanger(pick("You fel your blood run cold.", "You feel ice in your veins.", "You feel like you can't heat up.", "You shiver violently.")))
set_body_temp(M, A)
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2))
M.bodytemperature = max(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
return 1
/datum/symptom/shivering/proc/set_body_temp(var/mob/living/carbon/H, datum/disease/advance/A)
if(!unsafe)
H.bodytemperature = max(-((3 * power) * A.stage), (BODYTEMP_COLD_DAMAGE_LIMIT +1))
else
H.bodytemperature = max(-((3 * power) * A.stage), (BODYTEMP_COLD_DAMAGE_LIMIT - 20))
+20 -69
View File
@@ -17,82 +17,33 @@ BONUS
/datum/symptom/size
name = "Mass Revectoring"
stealth = -4
resistance = 1
desc = "The virus causes distortion of the host's body, causing it to change size."
stealth = 1
resistance = 0
stage_speed = 2
transmittable = -2
transmission = 2
level = 4
severity = 1
severity = 0
symptom_delay_min = 20 SECONDS
symptom_delay_max = 60 SECONDS
var/min_size = RESIZE_MINIMUM
var/max_size = RESIZE_MAXIMUM
/datum/symptom/size/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
M.emote("twitch")
Resize(M, rand(25, 200))
/datum/symptom/size/proc/Resize(mob/living/M, var/size)
M.resize(size+M.size_multiplier/100)
/*
//////////////////////////////////////
Enlargement Disorder
Very noticeable.
Increases resistance slightly.
Increases stage speed.
Decreases transmittablity
Intense level.
BONUS
Grows the host to bigger sizes
//////////////////////////////////////
*/
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
M.emote("twitch")
M.resize(pick(min_size, max_size))
/datum/symptom/size/grow
name = "Enlargement Disorder"
/datum/symptom/size/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
M.emote("twitch")
Resize(M, rand(100, 200))
/*
//////////////////////////////////////
Dwindling Malady
Very noticeable.
Increases resistance slightly.
Increases stage speed.
Decreases transmittablity
Intense level.
BONUS
Shrinks the host to small sizes
//////////////////////////////////////
*/
min_size = RESIZE_NORMAL
max_size = RESIZE_MAXIMUM
/datum/symptom/size/shrink
name = "Dwindling Malady"
/datum/symptom/size/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
M.emote("twitch")
Resize(M, rand(25, 100))
min_size = RESIZE_MINIMUM
max_size = RESIZE_NORMAL
+45 -35
View File
@@ -18,30 +18,43 @@ Bonus
/datum/symptom/sneeze
name = "Sneezing"
desc = "The virus causes irritation of the nasal cavity, making the host sneeze occasionally."
stealth = -2
resistance = 3
stage_speed = 0
transmittable = 4
transmission = 4
symptom_delay_min = 15 SECONDS
symptom_delay_max = 40 SECONDS
level = 1
severity = 1
severity = 0
var/infective = FALSE
threshold_descs = list(
"Stealth 4" = "The symptom remains hidden until active.",
"Trasmission 12" = "The host may spread the disease through sneezing."
)
/datum/symptom/sneeze/Start(datum/disease/advance/A)
if(!..())
return
if(A.stealth >= 4)
supress_warning = TRUE
if(A.transmission >= 12)
infective = TRUE
/datum/symptom/sneeze/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
if(!supress_warning)
M.emote("sniff")
else
M.emote("sneeze")
if(!M.wear_mask) // Spread only if they're not covering their face
A.spread(5)
if(prob(30) && !M.wear_mask) // Same for mucus
var/obj/effect/decal/cleanable/mucus/icky = new(get_turf(M))
icky.viruses |= A.Copy()
return
else
M.emote("sneeze")
if(infective)
addtimer(CALLBACK(A, TYPE_PROC_REF(/datum/disease, spread), 4), 20)
/*
//////////////////////////////////////
@@ -61,33 +74,30 @@ Bonus
//////////////////////////////////////
*/
/datum/symptom/sneeze/bluespace
/datum/symptom/bsneeze
name = "Bluespace Sneezing"
desc = "The virus condenses bluespace particles in the host's nasal cavity, teleporting the host on sneeze."
stealth = -2
resistance = 3
stage_speed = 0
transmittable = 1
transmission = 1
symptom_delay_min = 20 SECONDS
symptom_delay_max = 30 SECONDS
level = 4
severity = 3
/datum/symptom/sneeze/bluespace/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
/datum/symptom/bsneeze/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
if(!supress_warning)
M.emote("sniff")
else
SneezeTeleport(A, M)
if(!M.wear_mask)
A.spread(A.stage)
if(prob(30) && !M.wear_mask)
var/obj/effect/decal/cleanable/mucus/icky = new(get_turf(M))
icky.viruses |= A.Copy()
else
SneezeTeleport(A, A.affected_mob)
return
/datum/symptom/sneeze/bluespace/proc/SneezeTeleport(datum/disease/advance/A, var/mob/living/mob)
/datum/symptom/bsneeze/proc/SneezeTeleport(datum/disease/advance/A, var/mob/living/mob)
var/list/destination = list()
var/place
+25 -9
View File
@@ -20,17 +20,33 @@ BONUS
stealth = 2
resistance = 0
stage_speed = 3
transmittable = 1
transmission = 1
level = 1
symptom_delay_min = 15 SECONDS
symptom_delay_max = 35 SECONDS
severity = 0
threshold_descs = list(
"Resistance 6" = "The target will flip more violently."
)
/datum/symptom/spyndrome/Activate(var/datum/disease/advance/A)
..()
var/bigspin = FALSE
if(prob(SYMPTOM_ACTIVATION_PROB))
if(A.affected_mob.buckled())
to_chat(viewers(A.affected_mob), span_warning("[A.affected_mob.name] struggles violently against their restraints!"))
/datum/symptom/spyndrome/Start(datum/disease/advance/A)
if(!..())
return
if(A.resistance >= 6)
bigspin = TRUE
/datum/symptom/spyndrome/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
if(prob(base_message_chance))
to_chat(M, span_notice("You can't stand still."))
else
to_chat(viewers(A.affected_mob), span_warning("[A.affected_mob.name] spins around violently!"))
A.affected_mob.emote("spin")
return
if(bigspin)
M.emote("floorspin")
else
M.emote("spin")
@@ -16,28 +16,69 @@ Bonus
*/
/datum/symptom/stimulant
name = "Overactive Adrenal Gland"
stealth = 0
resistance = -1
name = "Hyperactivity"
desc = "The virus causes restlessness, nervousness and hyperactivity, increasing the rate at which the host needs to eat, but making them harder to tire out"
stealth = -4
resistance = 0
stage_speed = 2
transmittable = -3
level = 3
transmission = -3
level = 8
severity = 1
symptom_delay_min = 1
symptom_delay_max = 1
var/clearacc = FALSE
threshold_descs = list(
"Resistance 8" = "This virus causes an even greater rate of nutriment loss, able to cause starvation, but it's energy gain greatly increases.",
"Stage 8" = "The virus causes extreme nervousness and paranoia, resulting in occasional hallucinations, and extreme restlessness, but great overall energy."
)
/datum/symptom/stimulant/severityset(datum/disease/advance/A)
. = ..()
if(A.resistance >= 8)
severity -= 1
if(A.stage_rate >= 8)
severity -= 1
/datum/symptom/stimulant/Start(datum/disease/advance/A)
if(!..())
return
power = initial(power)
if(A.resistance >= 8)
power += 2
if(A.stage_rate >= 8)
power += 1
clearacc = TRUE
/datum/symptom/stimulant/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/L = A.affected_mob
to_chat(L, span_notice("You feel a rush of energy inside you!"))
switch(A.stage)
if(1, 2)
L.jitteriness += 5
if(3, 4)
L.jitteriness += 10
else
if(L.reagents.get_reagent_amount(REAGENT_ID_HYPERZINE) < 10)
L.reagents.add_reagent(REAGENT_ID_HYPERZINE, 5)
if(prob(30))
L.jitteriness += 15
return
if(!..())
return
var/mob/living/carbon/human/H = A.affected_mob
if(H.stat == DEAD)
return
switch(A.stage)
if(2 to 3)
if(prob(power) && H.stat)
H.jitteriness += (2 * power)
H.emote("twitch")
to_chat(H, span_notice("[pick("you feel energetic!", "You feel well-rested.", "You feel great!")]"))
if(4 to 5)
H.drowsyness = max(0, H.drowsyness - 10 * power)
H.AdjustSleeping(-10 * power)
H.AdjustStunned(-10 * power)
if(prob(power) && prob(50))
if(H.stat)
H.emote("twitch")
H.make_jittery(2 * power)
H.reagents.add_reagent(REAGENT_ID_HYPERZINE, 5)
to_chat(H, span_notice("[pick("You feel nevervous...", "You feel anxious.", "You feel like everything is moving in slow motion.")]"))
if(H.nutrition > 150 - (30 * power))
H.nutrition = max(150 - (30 * power), H.nutrition - (2 * power))
if(prob(25))
H.make_jittery(2 * power)
if(clearacc)
if(prob(power) && prob(50))
if(H.stat)
H.emote("scream")
H.hallucination = min(20, H.hallucination + (5 * power))
@@ -5,16 +5,29 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom))
/datum/symptom
// Buffs/Debuffs the symptom has to the overall engineered disease.
var/name = ""
var/desc = "ERR://355. PanDEMIC was not able to initialize description!" // Someone forgot the description
var/threshold_descs = list()
var/stealth = 0
var/resistance = 0
var/stage_speed = 0
var/transmittable = 0
var/transmission = 0
// The type level of the symptom. Higher is harder to generate.
var/level = 0
// The severity level of the symptom. Higher is more dangerous.
var/severity = 0
// The hash tag for our diseases, we will add it up with our other symptoms to get a unique id! ID MUST BE UNIQUE!!!
var/id = ""
var/supress_warning = FALSE
var/next_activaction = 0
var/symptom_delay_min = 1 SECONDS
var/symptom_delay_max = 1 SECONDS
var/naturally_occuring = TRUE // If this symptom can roll from random diseases
var/base_message_chance = 10
var/power = 1
// If the symptom is neutered or not. If it is, it will only affect stats
var/neutered = FALSE
var/stopped = FALSE // Used for Viral Suspended Animaton, stops a symptom but doesn't neuter it.
/datum/symptom/New()
var/list/S = GLOB.list_symptoms
@@ -24,18 +37,71 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom))
return
CRASH("We couldn't assign an ID!")
/datum/symptom/proc/Copy()
var/datum/symptom/new_symp = new type
new_symp.name = name
new_symp.id = id
new_symp.neutered = neutered
return new_symp
// Called when processing of the advance disease, which holds this symptom, starts.
/datum/symptom/proc/Start(datum/disease/advance/A)
return
if(neutered)
return FALSE
next_activaction = world.time + rand(symptom_delay_min, symptom_delay_max)
return TRUE
/datum/symptom/proc/severityset(datum/disease/advance/A)
severity = initial(severity)
// Called when the advance disease is going to be deleted or when the advance disease stops processing.
/datum/symptom/proc/End(datum/disease/advance/A)
return
if(neutered)
return FALSE
return TRUE
// Called when the disease activates. It's what makes your diseases work!
/datum/symptom/proc/Activate(datum/disease/advance/A)
return
if(!A)
return FALSE
if(isbelly(A.affected_mob.loc)) // So you can eat people to "isolate" them. Or get eaten by a macrophage.
return FALSE
if(neutered || stopped)
return FALSE
if(world.time < next_activaction)
return FALSE
else
next_activaction = world.time + rand(symptom_delay_min, symptom_delay_max)
return TRUE
// Called when the host dies
/datum/symptom/proc/OnDeath(datum/disease/advance/A)
return !neutered
// Called when the stage changes
/datum/symptom/proc/OnStageChange(datum/disease/advance/A)
if(neutered || stopped)
return FALSE
return TRUE
/datum/symptom/proc/OnAdd(datum/disease/advance/A)
return
/datum/symptom/proc/OnRemove(datum/disease/advance/A)
return
/datum/symptom/proc/generate_threshold_desc()
return
/datum/symptom/proc/get_symptom_data()
var/list/data = list()
data["name"] = name
data["desc"] = desc
data["stealth"] = stealth
data["resistance"] = resistance
data["stage_speed"] = stage_speed
data["transmission"] = transmission
data["neutered"] = neutered
data["level"] = level
data["threshold_desc"] = threshold_descs
return data
@@ -20,7 +20,7 @@ Bonus
stealth = 1
resistance = 2
stage_speed = 0
transmittable = 1
transmission = 1
level = 5
severity = 3
@@ -1,45 +0,0 @@
/*
//////////////////////////////////////
Telepathy
Hidden.
Decreases resistance.
Decreases stage speed significantly.
Decreases transmittablity tremendously.
Critical Level.
Bonus
The user gains telepathy.
//////////////////////////////////////
*/
/datum/symptom/telepathy
name = "Pineal Gland Decalcification"
stealth = 2
resistance = -2
stage_speed = -3
transmittable = -4
level = 5
severity = 0
/datum/symptom/telepathy/Start(datum/disease/advance/A)
if(iscarbon(A))
var/mob/living/carbon/human/H = A.affected_mob
// Traitgenes Locate the gene from trait
var/datum/gene/trait/G = get_gene_from_trait(/datum/trait/positive/superpower_remotetalk)
H.dna.SetSEState(G.block, 1)
domutcheck(H, null, TRUE)
H.UpdateAppearance()
to_chat(H, span_notice("Your mind expands..."))
/datum/symptom/telepathy/End(datum/disease/advance/A)
if(iscarbon(A))
var/mob/living/carbon/human/H = A.affected_mob
// Traitgenes Locate the gene from trait
var/datum/gene/trait/G = get_gene_from_trait(/datum/trait/positive/superpower_remotetalk)
H.dna.SetSEState(G.block, 0)
domutcheck(H, null, TRUE)
H.UpdateAppearance()
to_chat(H, span_notice("Everything feels... Normal."))
+131 -26
View File
@@ -14,29 +14,20 @@ BONUS
//////////////////////////////////////
*/
/datum/symptom/viraladaptation
name = "Viral self-adaptation"
name = "Viral Self-Adaptation"
desc = "The virus mimics the function of normal body cells, becoming harder to spot and to eradicate, but reducing it's speed."
stealth = 3
resistance = 5
stage_speed = -3
transmittable = 0
level = 3
transmission = 0
level = 4
severity = 0
/datum/symptom/viraladaptation/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
to_chat(M, span_notice("You feel off, but no different from before."))
if(5)
to_chat(M, span_notice("You feel better, but nothing interesting happens."))
/*
//////////////////////////////////////
Viral evolution
Moderate stealth reductopn.
Moderate stealth reduction.
Major decreases to resistance.
increases stage speed.
increase to transmission
@@ -48,20 +39,134 @@ BONUS
//////////////////////////////////////
*/
/datum/symptom/viralevolution
name = "Viral evolutionary acceleration"
name = "Viral Evolutionary Acceleration"
desc = "The virus quickly adapts to spread as fast as possible both outside and inside a host. This, however, makes the virus easier to spot, and les able to fight off a cure."
stealth = -2
resistance = -3
stage_speed = 5
transmittable = 3
level = 3
severity = 0
transmission = 3
level = 4
/datum/symptom/viralevolution/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
/datum/symptom/viralpower
name = "Viral Power Multiplier"
desc = "The vrus has more powerful symptoms. May have unpredictable effects."
stealth = 2
resistance = 2
stage_speed = 2
transmission = 2
level = -1
var/maxpower
var/powerbudget
var/scramble = FALSE
var/used = FALSE
threshold_descs = list(
"Transmission 8" = "Constantly scrambles the power of all symptoms.",
"Stage Speed 8" = "Doubles the power boost."
)
/datum/symptom/viralpower/Start(datum/disease/advance/A)
if(!..())
return
if(A.speed >= 8)
power = 2
if(A.transmission >= 8)
scramble = TRUE
/datum/symptom/viralpower/Activate(datum/disease/advance/A)
if(!..())
return
if(!used)
for(var/datum/symptom/S as() in A.symptoms)
if(S == src)
return
S.power += power
maxpower += S.power
if(scramble)
powerbudget += power
maxpower += power
power = 0
used = TRUE
if(scramble)
var/datum/symptom/S = pick(A.symptoms)
if(S == src)
return
if(powerbudget && (prob(50) || powerbudget == maxpower))
S.power += 1
powerbudget -= 1
else if(S.power >= 2)
S.power -= 1
powerbudget += 1
/datum/symptom/viralreverse
name = "Viral Aggressive Metabolism"
desc = "The virus sacrifices its long term survivability to nearly instantly fully spread inside a host. \
The virus will start at the last stage, but will eventually decay and die off by itself."
stealth = 1
resistance = 1
stage_speed = 3
transmission = -4
level = 4
symptom_delay_min = 1
symptom_delay_max = 1
threshold_descs = list(
"Stage Speed" = "Highest between these determines the amount before self-curing.",
"Stealth 4" = "Doubles the time before the virus self-cures."
)
var/time_to_cure
/datum/symptom/viralreverse/Activate(datum/disease/advance/A)
if(!..())
return
if(time_to_cure > 0)
time_to_cure--
else
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
to_chat(M, span_notice("You feel better, but no different from before."))
if(5)
to_chat(M,span_notice("You feel off, but nothing interesting happens."))
Heal(M, A)
/datum/symptom/viralreverse/proc/Heal(mob/living/M, datum/disease/advance/A)
A.stage -= 1
if(A.stage < 2)
to_chat(M, span_notice("You suddenly feel healthy."))
A.cure(FALSE)
/datum/symptom/viralreverse/Start(datum/disease/advance/A)
if(!..())
return
A.stage = 5
if(A.stealth >= 4)
power = 2
time_to_cure = max(A.resistance, A.stage_rate) * 10 * power
/datum/symptom/viralincubate
name = "Viral Suspended Animation"
desc = "The virus has very little effect until it reaches its final stage"
stealth = 4
resistance = -2
stage_speed = -2
transmission = 1
level = 4
symptom_delay_min = 1
symptom_delay_max = 1
var/list/captives = list()
var/used = FALSE
/datum/symptom/viralincubate/Activate(datum/disease/advance/A)
if(!..())
return
if(A.stage >= 5)
for(var/datum/symptom/S as() in captives)
S.stopped = FALSE
captives -= S
if(!LAZYLEN(captives))
stopped = TRUE
else if(!used)
for(var/datum/symptom/S as() in A.symptoms)
if(S.neutered)
continue
if(S == src)
continue
S.stopped = TRUE
captives += S
used = TRUE
+59 -25
View File
@@ -17,35 +17,69 @@ Bonus
/datum/symptom/visionloss
name = "Hyphema"
desc = "The virus causes inflammation of the retina, leading to eye damage and eventually blindness."
stealth = -1
resistance = -4
resistance = -3
stage_speed = -4
transmittable = -3
level = 5
severity = 4
transmission = -2
level = 3
severity = 2
base_message_chance = 50
symptom_delay_min = 30 SECONDS
symptom_delay_max = 80 SECONDS
var/remove_eyes = FALSE
threshold_descs = list(
"Resistance 12" = "Weakens extraocular muscles, eventually leading to complete detachment of the eyes.",
"Stealth 4" = "The symptom remains hidden until active."
)
/datum/symptom/visionloss/severityset(datum/disease/advance/A)
. = ..()
if(A.resistance >= 12)
severity += 1
/datum/symptom/visionloss/Start(datum/disease/advance/A)
if(!..())
return
if(A.stealth >= 4)
supress_warning = TRUE
if(A.resistance >= 12)
remove_eyes = TRUE
/datum/symptom/visionloss/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
if(iscarbon(A))
var/mob/living/carbon/M = A.affected_mob
var/obj/item/organ/internal/eyes/eyes = M.internal_organs_by_name[O_EYES]
if(!eyes)
return
switch(A.stage)
if(1, 2)
if(!..())
return
if(iscarbon(A.affected_mob))
var/mob/living/carbon/M = A.affected_mob
var/obj/item/organ/internal/eyes/eyes = M.internal_organs_by_name[O_EYES]
if(!eyes)
return
switch(A.stage)
if(1, 2)
if(prob(base_message_chance) && !supress_warning && M.stat != DEAD)
to_chat(M, span_warning("Your eyes itch."))
if(3, 4)
if(3, 4)
if(M.stat != DEAD)
to_chat(M, span_boldwarning("Your eyes burn!"))
M.eye_blurry = 20
eyes.take_damage(1)
else
to_chat(M, span_userdanger("Your eyes burn horrificly!"))
M.eye_blurry = 40
eyes.take_damage(5)
if(eyes.damage >= 10)
M.disabilities |= NEARSIGHTED
if(prob(eyes.damage - 10 + 1))
if(!M.eye_blind)
M.eye_blurry = 20
eyes.take_damage(1)
else
M.eye_blurry += 20
eyes.take_damage(5)
if(eyes.damage >= 10)
M.disabilities |= NEARSIGHTED
if(prob(eyes.damage - 10 + 1))
if(!remove_eyes)
if(!M.is_blind())
if(M.stat != DEAD)
to_chat(M, span_userdanger("You go blind!"))
M.Blind(20)
eyes.take_damage(eyes.max_damage)
else
M.visible_message(span_warning("[M]'s eyes fall out of their sockets!"), span_userdanger("Your eyes out of their sockets!"))
eyes.forceMove(get_turf(M))
else
if(M.stat != DEAD)
to_chat(M, span_userdanger("Your eyes burn horrifically!"))
+35 -5
View File
@@ -17,18 +17,48 @@ Bonus
/datum/symptom/vomit
name = "Vomiting"
desc = "The virus causes nausea and irritates the stomach, causing occasional vomit."
stealth = -2
resistance = 0
stage_speed = 1
transmittable = 2
transmission = 2
level = 3
severity = 1
base_message_chance = 100
symptom_delay_min = 20 SECONDS
symptom_delay_max = 60 SECONDS
var/vomit_blood = FALSE
var/proj_vomit = 1
threshold_descs = list(
"Stage Speed 5" = "Host will vomit blood.",
"Transmission 6" = "Host will projectile vomit, increasing vomit range.",
"Stealth 4" = "The symptom remans hidden until active."
)
/datum/symptom/vomit/Start(datum/disease/advance/A)
if(!..())
return
if(A.stealth >= 4)
supress_warning = FALSE
if(A.stage_rate >= 5)
vomit_blood = TRUE
if(A.transmission >= 6)
proj_vomit = 5
/datum/symptom/vomit/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
if(prob(2))
to_chat(M, span_warning(pick("you feel nauseated.", "You feel like you're going to throw up!")))
if(prob(SYMPTOM_ACTIVATION_PROB))
M.vomit()
if(M.stat == DEAD)
return
switch(A.stage)
if(1, 2, 3, 4)
if(prob(base_message_chance) && !supress_warning)
to_chat(M, span_warning(pick("You feel nauseated.", "You feel like you're going to throw up!")))
else
vomit(M)
/datum/symptom/vomit/proc/vomit(mob/living/carbon/M)
M.vomit(20, vomit_blood, stun = 2, distance = proj_vomit)
@@ -20,7 +20,9 @@ Bonus
stealth = -1
resistance = -1
stage_speed = -2
transmittable = -2
transmission = -2
symptom_delay_min = 20 SECONDS
symptom_delay_max = 60 SECONDS
level = 3
severity = 3
@@ -1,37 +0,0 @@
/*
//////////////////////////////////////
Weight Loss
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced Transmittable.
High level.
Bonus
Decreases the weight of the mob,
forcing it to be skinny.
//////////////////////////////////////
*/
/datum/symptom/weight_loss
name = "Weight Loss"
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -2
level = 3
severity = 1
/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
to_chat(M, span_warning(pick("You feel hungry.", "You crave for food.")))
else
to_chat(M, span_warning(pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")))
M.adjust_nutrition(-20)
@@ -0,0 +1,65 @@
/*
//////////////////////////////////////
Weight Loss
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced Transmittable.
High level.
Bonus
Decreases the weight of the mob,
forcing it to be skinny.
//////////////////////////////////////
*/
/datum/symptom/weight_loss
name = "Weight Loss"
desc = "The virus mutates the host's metabolism, making it almost unable to gain nutrition from food."
stealth = 0
resistance = 2
stage_speed = -2
transmission = -1
level = 3
severity = 2
base_message_chance = 100
symptom_delay_min = 15 SECONDS
symptom_delay_max = 45 SECONDS
var/starving = TRUE
threshold_descs = list(
"Stealth 2" = "The symptom is less noticeable, and does not cause starvation."
)
/datum/symptom/weight_loss/severityset(datum/disease/advance/A)
. = ..()
if(A.stealth >= 2)
severity -= 3
/datum/symptom/weight_loss/Start(datum/disease/advance/A)
if(!..())
return
if(A.stealth >= 2)
base_message_chance = 25
starving = FALSE
/datum/symptom/weight_loss/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
if(M.stat == DEAD)
return
switch(A.stage)
if(1, 2, 3, 4)
if(prob(base_message_chance))
to_chat(M, span_warning(pick("You feel hungry.", "You crave for food.")))
else
if(prob(base_message_chance))
to_chat(M, span_warning(pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")))
M.adjust_nutrition(rand(10, 50))
if(starving)
M.adjust_nutrition(-100)
@@ -0,0 +1,42 @@
/datum/symptom/youth
name = "Eternal Youth"
desc = "The virus becomes symbiotically connected to the cells in the host's body, preventing and reversing aging. \
The virus, in turn, becomes more resistant, spreads faster, and is harder to spot, although it doesn't thrive as well without a host."
stealth = 3
resistance = 4
stage_speed = 4
transmission = -4
level = 5
base_message_chance = 100
symptom_delay_min = 25 SECONDS
symptom_delay_max = 50 SECONDS
/datum/symptom/youth/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/M = A.affected_mob
if(M.stat == DEAD)
return
if(ishuman(M))
var/mob/living/carbon/human/H = M
switch(A.stage)
if(1)
if(H.age > 41)
//H.age = 41
to_chat(H, span_notice("You haven't had this much energy in years!"))
if(2)
if(H.age > 36)
//H.age = 36
to_chat(H, span_notice("You're suddenly in a good mood."))
if(3)
if(H.age > 31)
//H.age = 31
to_chat(H, span_notice("You begin to feel more lithe."))
if(4)
if(H.age > 26)
//H.age = 26
to_chat(H, span_notice("You feel reinvigorated."))
if(5)
if(H.age > 21)
//H.age = 21
to_chat(H, span_notice("You feel like you can take on the world!"))
+3 -4
View File
@@ -3,17 +3,16 @@
form = "Infection"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS | DISEASE_SPREAD_CONTACT
cure_text = REAGENT_ETHANOL
cures = list(REAGENT_ID_ETHANOL)
agent = "Excess Lepdopticides"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "If left untreated subject will regurgitate butterflies."
severity = MINOR
danger = DISEASE_MINOR
/datum/disease/anxiety/stage_act()
if(!..())
return FALSE
..()
switch(stage)
if(2)
if(prob(15))
+6 -8
View File
@@ -2,22 +2,20 @@
form = "Condition"
name = "Appendicitis"
max_stages = 3
spread_text = "Non-contagius"
spread_flags = NON_CONTAGIOUS
spread_text = "Non-contagious"
disease_flags = CAN_CARRY|CAN_RESIST|CAN_NOT_POPULATE
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
virus_modifiers = NEEDS_ALL_CURES | BYPASSES_IMMUNITY
cure_text = "Surgery"
agent = "Shitty Appendix"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated the subject will become very weak, and may vomit often."
severity = MINOR
disease_flags = CAN_CARRY|CAN_RESIST|CAN_NOT_POPULATE
danger = DISEASE_MINOR
visibility_flags = HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/internal/appendix)
bypasses_immunity = TRUE
virus_heal_resistant = TRUE
/datum/disease/appendicitis/stage_act()
if(!..())
return
..()
switch(stage)
if(1)
if(prob(5))
+3 -4
View File
@@ -3,17 +3,16 @@
form = "Infection"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS | DISEASE_SPREAD_CONTACT
cure_text = REAGENT_SUGAR
cures = list(REAGENT_ID_SUGAR)
agent = "Apidae Infection"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "If left untreated, subject will regurgitate bees."
severity = BIOHAZARD
danger = DISEASE_MEDIUM
/datum/disease/beesease/stage_act()
if(!..())
return FALSE
..()
switch(stage)
if(2)
if(prob(2))
+3 -4
View File
@@ -2,7 +2,7 @@
name = "Brainrot"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS | DISEASE_SPREAD_CONTACT
cure_text = REAGENT_ALKYSINE
cures = list(REAGENT_ID_ALKYSINE)
agent = "Cryptococcus Cosmosis"
@@ -10,11 +10,10 @@
cure_chance = 15
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
required_organs = list(/obj/item/organ/internal/brain)
severity = HARMFUL
danger = DISEASE_HARMFUL
/datum/disease/brainrot/stage_act()
if(!..())
return FALSE
..()
switch(stage)
if(2)
if(prob(2))
+4 -6
View File
@@ -2,6 +2,7 @@
name = "Choreomania"
max_stages = 3
spread_text = "Airborne"
spread_flags = DISEASE_SPREAD_AIRBORNE | DISEASE_SPREAD_CONTACT | DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS
cure_text = REAGENT_ADRANOL
cures = list(REAGENT_ID_ADRANOL)
cure_chance = 10
@@ -9,13 +10,12 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject... Won't stop dancing!"
severity = MINOR
danger = DISEASE_MINOR
var/list/dance = list(2,4,8,2,4,8,2,4,8,2,4,8,1,4,1,4,1,4,2,4,8,2)
/datum/disease/choreomania/stage_act()
if(!..())
return FALSE
..()
switch(stage)
if(2)
if(prob(1))
@@ -31,8 +31,6 @@
for(var/D in dance)
affected_mob.dir = D
animate(affected_mob, pixel_x = 5, time = 5)
sleep(3)
animate(affected_mob, pixel_x = -5, time = 5)
animate(pixel_x = affected_mob.default_pixel_x, pixel_y = affected_mob.default_pixel_x, time = 2)
sleep(3)
animate(affected_mob, pixel_x = affected_mob.default_pixel_x, pixel_y = affected_mob.default_pixel_x, time = 2)
return
+5 -6
View File
@@ -2,19 +2,18 @@
name = "The Cold"
max_stages = 3
spread_text = "Airborne"
spread_flags = AIRBORNE
spread_flags = DISEASE_SPREAD_AIRBORNE
cure_text = "Rest & " + REAGENT_SPACEACILLIN
cures = list(REAGENT_ID_SPACEACILLIN, REAGENT_ID_CHICKENSOUP)
needs_all_cures = FALSE
virus_modifiers = NONE //Does NOT have needs_all_cures
agent = "XY-rhinovirus"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
permeability_mod = 0.5
desc = "If left untreated the subject will contract the flu."
severity = MINOR
danger = DISEASE_MINOR
/datum/disease/cold/stage_act()
if(!..())
return FALSE
..()
switch(stage)
if(2)
if(affected_mob.stat == UNCONSCIOUS && prob(40))
@@ -59,7 +58,7 @@
if(prob(1))
to_chat(affected_mob, span_notice("Mucous runs down the back of your throat."))
if(prob(1) && prob(50))
if(!affected_mob.resistances.Find(/datum/disease/flu))
if(affected_mob.HasResistance(/datum/disease/flu))
var/datum/disease/Flu = new /datum/disease/flu(0)
affected_mob.ContractDisease(Flu)
cure()
+33 -18
View File
@@ -3,28 +3,43 @@
medical_name = "ICE9 Cold"
max_stages = 3
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = DISEASE_SPREAD_CONTACT | DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS
cure_text = REAGENT_SPACEACILLIN
cures = list(REAGENT_ID_SPACEACILLIN)
agent = "ICE9-rhinovirus"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated the subject will slow, as if partly frozen."
severity = HARMFUL
danger = DISEASE_HARMFUL
/datum/disease/cold9/stage_act()
if(!..())
return FALSE
if(stage < 2)
return
var/stage_factor = stage - 1
affected_mob.bodytemperature -= 7.5 * stage_factor
if(prob(2 * stage_factor))
affected_mob.say("*sneeze")
if(prob(2 * stage_factor))
affected_mob.say("*cough")
if(prob(3 * stage_factor))
to_chat(affected_mob, span_danger("Your throat feels sore."))
if(prob(5 * stage_factor))
to_chat(affected_mob, span_danger("You feel stiff."))
affected_mob.adjustFireLoss(1)
..()
switch(stage)
if(1)
if(prob(1))
affected_mob.emote("sniff")
if(2)
if(prob(10))
affected_mob.bodytemperature -= 2
if(prob(1) && prob(10))
to_chat(affected_mob, span_notice("You feel better."))
cure()
return
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
to_chat(affected_mob, span_danger("Your throat feels sore."))
if(prob(5))
to_chat(affected_mob, span_danger("You feel stiff."))
if(3)
if(prob(10))
affected_mob.bodytemperature -= 5
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
to_chat(affected_mob, span_danger("Your throat feels sore."))
if(prob(10))
to_chat(affected_mob, span_danger("You feel stiff."))
+1 -1
View File
@@ -7,4 +7,4 @@
agent = "Bluespace Exposure"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated, subject will lose grip on reality."
severity = HARMFUL
danger = HARMFUL
+2 -2
View File
@@ -2,13 +2,13 @@
name = "GBS"
max_stages = 5
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = DISEASE_SPREAD_CONTACT | DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS
cure_text = REAGENT_ADRANOL + " & " + REAGENT_SULFUR
cures = list(REAGENT_ID_ADRANOL, REAGENT_ID_SULFUR)
agent = "Gravitokinetic Bipotential SADS-"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "if left untreated death will occur."
severity = BIOHAZARD // Mimics real GBS
danger = DISEASE_BIOHAZARD // Mimics real GBS
/datum/disease/fake_gbs/stage_act()
if(!..())
+3 -4
View File
@@ -4,17 +4,16 @@
spread_text = "Airborne"
cure_text = REAGENT_SPACEACILLIN
cures = list(REAGENT_ID_SPACEACILLIN, REAGENT_ID_CHICKENSOUP)
needs_all_cures = FALSE
virus_modifiers = NONE //Does NOT have needs_all_cures
cure_chance = 10
agent = "H13N1 flu virion"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
permeability_mod = 0.75
desc = "If left untreated the subject will feel quite unwell."
severity = MINOR
danger = DISEASE_MINOR
/datum/disease/flu/stage_act()
if(!..())
return FALSE
..()
switch(stage)
if(2)
if(affected_mob.lying && prob(20))
+3 -5
View File
@@ -3,16 +3,14 @@
max_stages = 3
stage_prob = 5
spread_text = "Non-Contagious"
spread_flags = NON_CONTAGIOUS
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
cure_text = "Sleep"
agent = REAGENT_SALMONELLA
cures = list(REAGENT_ID_CHICKENSOUP)
cure_chance = 10
viable_mobtypes = list(/mob/living/carbon/human)
desc = "Nausea, sickness, and vomitting."
severity = MINOR
disease_flags = CURABLE|CAN_NOT_POPULATE
virus_heal_resistant = TRUE
desc = "Nausea, sickness, and vomiting."
danger = DISEASE_MINOR
/datum/disease/food_poisoning/stage_act()
if(!..())
+3 -3
View File
@@ -2,13 +2,13 @@
name = "GBS"
max_stages = 5
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = DISEASE_SPREAD_CONTACT | DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS
cure_text = REAGENT_ADRANOL + " & " + REAGENT_SULFUR
cures = list(REAGENT_ID_ADRANOL, REAGENT_ID_SULFUR)
cure_chance = 15
agent = "Gravitokinetic Bipotential SADS+"
viable_mobtypes = list(/mob/living/carbon/human)
severity = BIOHAZARD
danger = DISEASE_PANDEMIC
disease_flags = CAN_NOT_POPULATE
/datum/disease/gbs/stage_act()
@@ -42,7 +42,7 @@
name = "Non-Contagious GBS"
stage_prob = 5
spread_text = "Non-contagious"
spread_flags = NON_CONTAGIOUS
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
cure_text = REAGENT_CRYOXADONE
cures = list(REAGENT_ID_CRYOXADONE)
cure_chance = 10
+2 -2
View File
@@ -3,13 +3,13 @@
form = "Infection"
max_stages = 4
spread_text = "On contact"
spread_flags = CONTACT_GENERAL
spread_flags = DISEASE_SPREAD_CONTACT | DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_FLUIDS
cure_text = REAGENT_ETHANOL
cures = list(REAGENT_ID_ETHANOL)
agent = "Excess Snuggles"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
desc = "If left untreated subject will regurgitate... puppies."
severity = HARMFUL
danger = DISEASE_HARMFUL
var/barklimit
var/list/puppy_types = list(/mob/living/simple_mob/animal/passive/dog/corgi/puppy)
var/list/plush_types = list(/obj/item/toy/plushie/orange_fox, /obj/item/toy/plushie/corgi, /obj/item/toy/plushie/robo_corgi, /obj/item/toy/plushie/pink_fox)
+1 -1
View File
@@ -8,7 +8,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field."
severity = MINOR
danger = DISEASE_MINOR
/datum/disease/magnitis/stage_act()
if(!..())
+2 -3
View File
@@ -10,10 +10,9 @@
cure_chance = 10
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated, subject will become a xenochimera upon perishing."
severity = BIOHAZARD
danger = DISEASE_BIOHAZARD
disease_flags = CURABLE
virus_heal_resistant = TRUE
allow_dead = TRUE
//allow_dead = TRUE //Unused
var/list/obj/item/organ/organ_list = list()
var/obj/item/organ/O
+1
View File
@@ -50,6 +50,7 @@
mask = /obj/item/clothing/mask/surgical
backpack = /obj/item/storage/backpack/virology
satchel_one = /obj/item/storage/backpack/satchel/vir
belt = /obj/item/extrapolator
/decl/hierarchy/outfit/job/medical/doctor/nurse
name = OUTFIT_JOB_NAME(JOB_ALT_NURSE)
+3 -3
View File
@@ -351,7 +351,7 @@
/datum/supply_pack/med/virus
name = "Virus culture crate"
desc = "Glass bottles with viral cultures. HANDLE WITH CARE. Requires Chief Medical Officer access."
contains = list(/obj/item/reagent_containers/glass/bottle/culture/cold = 1, /obj/item/reagent_containers/glass/bottle/culture/flu = 1)
contains = list(/obj/item/reagent_containers/glass/beaker/vial/culture/cold = 1, /obj/item/reagent_containers/glass/beaker/vial/culture/flu = 1)
cost = 25
containertype = /obj/structure/closet/crate/secure/zenghu
containername = "Virus culture crate"
@@ -425,7 +425,7 @@
name = "Experimental Disease crate"
desc = "An experimental disease. Contains a multitude of symptoms."
contains = list(
/obj/item/reagent_containers/glass/bottle/culture/random_virus = 1
/obj/item/reagent_containers/glass/beaker/vial/culture/random_virus = 1
)
cost = 60
containertype = /obj/structure/closet/crate/freezer
@@ -435,7 +435,7 @@
name = "Minor Experimental Disease crate"
desc = "An experimental disease. Contains a weakened, untested viral culture."
contains = list(
/obj/item/reagent_containers/glass/bottle/culture/random_virus/minor = 1
/obj/item/reagent_containers/glass/beaker/vial/culture/random_virus/minor = 1
)
cost = 40
containertype = /obj/structure/closet/crate/freezer