Files
VOREStation/code/modules/events/disease_outbreak.dm
640cab345e 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>
2025-04-21 06:12:15 -04:00

99 lines
3.5 KiB
Plaintext

GLOBAL_LIST_EMPTY(current_pending_diseases)
/datum/event/disease_outbreak
var/datum/disease/chosen_disease
var/static/list/transmissable_symptoms = list()
var/static/list/diseases_minor = list()
var/static/list/diseases_moderate_major = list()
/datum/event/disease_outbreak/setup()
if(isemptylist(diseases_minor) && isemptylist(diseases_moderate_major))
populate_diseases()
if(isemptylist(transmissable_symptoms))
populate_symptoms()
var/datum/disease/virus
if(prob(50))
switch(severity)
if(EVENT_LEVEL_MODERATE)
virus = pick(diseases_minor)
if(EVENT_LEVEL_MAJOR)
virus = pick(diseases_moderate_major)
else
stack_trace("Disease Outbreak: Invalid Event Level [severity]. Expected: 1-2")
virus = /datum/disease/cold
chosen_disease = new virus
else
if(severity == EVENT_LEVEL_MAJOR)
chosen_disease = create_virus(severity * pick(2,3)) //50% chance for a major disease instead of a moderate one
else
chosen_disease = create_virus(severity * 2)
chosen_disease.virus_modifiers |= CARRIER
/datum/event/disease_outbreak/start()
GLOB.current_pending_diseases += chosen_disease
var/list/candidates = list()
for(var/mob/living/carbon/human/G in human_mob_list)
if(G.mind && G.stat != DEAD && G.is_client_active(5) && !player_is_antag(G.mind))
var/area/A = get_area(G)
if(!A)
continue
if(!(A.z in using_map.station_levels))
continue
if(A.flag_check(RAD_SHIELDED))
continue
if(isbelly(G.loc))
continue
if(G.species.virus_immune)
continue
candidates += G
var/chosen_infect = rand(3, 5)
while(chosen_infect)
if(!isemptylist(candidates))
var/mob/living/carbon/human/H = pick(candidates)
H.ForceContractDisease(chosen_disease)
candidates -= H
chosen_infect--
if(!GLOB.archive_diseases[chosen_disease.GetDiseaseID()])
GLOB.archive_diseases[chosen_disease.GetDiseaseID()] = chosen_disease
//Creates a virus with a harmful effect, guaranteed to be spreadable by contact or airborne
/datum/event/disease_outbreak/proc/create_virus(max_severity = 6)
var/datum/disease/advance/A = new /datum/disease/advance
A.symptoms = A.GenerateSymptomsBySeverity(max_severity - 1, max_severity, 2) //Choose "Payload" symptoms
A.AssignProperties(A.GenerateProperties())
var/list/symptoms_to_try = transmissable_symptoms.Copy()
while(length(symptoms_to_try))
if(A.spread_text != "Blood")
break
if(length(A.symptoms) < VIRUS_SYMPTOM_LIMIT) //Ensure the virus is spreadable by adding symptoms that boost transmission
var/datum/symptom/TS = pick_n_take(symptoms_to_try)
A.AddSymptom(new TS)
else
popleft(A.symptoms) //We have a full symptom list but are still not transmittable. Try removing one of the "payloads"
A.AssignProperties(A.GenerateProperties())
A.name = pick(GLOB.alphabet_upper) + num2text(rand(1,9)) + pick(GLOB.alphabet_upper) + num2text(rand(1,9)) + pick("v", "V", "-" + num2text(GLOB.game_year), "")
A.Refresh()
return A
/datum/event/disease_outbreak/proc/populate_diseases()
for(var/candidate in subtypesof(/datum/disease))
var/datum/disease/CD = new candidate
if(CD.disease_flags & CAN_NOT_POPULATE)
continue
switch(CD.danger)
if(DISEASE_NONTHREAT, DISEASE_MINOR)
diseases_minor += candidate
if(DISEASE_MEDIUM, DISEASE_HARMFUL, DISEASE_DANGEROUS, DISEASE_BIOHAZARD)
diseases_moderate_major += candidate
/datum/event/disease_outbreak/proc/populate_symptoms()
for(var/candidate in subtypesof(/datum/symptom))
var/datum/symptom/CS = candidate
if(initial(CS.transmission) > 1)
transmissable_symptoms += candidate