mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-18 11:30:35 +01:00
Random Virus Event Overhaul (#5615)
This PR makes it so that random lethal viruses can only occur if there is a virologist to cure them. This PR also makes it so the viruses themselfs don't have completely random effects, but effects that make sense together by adding a new system.
This commit is contained in:
@@ -1,66 +1,58 @@
|
||||
/var/global/list/event_viruses = list() // so that event viruses are kept around for admin logs, rather than being GCed
|
||||
|
||||
datum/event/viral_infection
|
||||
var/list/viruses = list()
|
||||
ic_name = "a biohazard"
|
||||
no_fake = 1//Probability in announce complicates it
|
||||
var/datum/disease2/disease/generated/generated_disease
|
||||
ic_name = "a viral outbreak"
|
||||
|
||||
datum/event/viral_infection/setup()
|
||||
announceWhen = rand(0, 3000)
|
||||
announceWhen = rand(3 MINUTES, 5 MINUTES)
|
||||
endWhen = announceWhen + 1
|
||||
|
||||
//generate 1-3 viruses. This way there's an upper limit on how many individual diseases need to be cured if many people are initially infected
|
||||
var/num_diseases = rand(1,3)
|
||||
for (var/i=0, i < num_diseases, i++)
|
||||
var/datum/disease2/disease/D = new /datum/disease2/disease
|
||||
var/has_virologist = FALSE
|
||||
var/list/valid_diseases = list()
|
||||
|
||||
var/strength = 1 //whether the disease is of the greater or lesser variety
|
||||
if (severity >= EVENT_LEVEL_MAJOR && prob(75))
|
||||
strength = 2
|
||||
D.makerandom(strength)
|
||||
viruses += D
|
||||
for(var/mob/living/carbon/human/H in mob_list)
|
||||
if(H.mind && H.stat != DEAD && H.is_client_active(5) && H.get_assignment() == "Virologist")
|
||||
has_virologist = TRUE
|
||||
break
|
||||
|
||||
for(var/path in subtypesof(/datum/disease2/disease/generated/))
|
||||
var/datum/disease2/disease/generated/G = new path
|
||||
if(!has_virologist && G.dangerous)
|
||||
continue
|
||||
valid_diseases += G.type
|
||||
qdel(G)
|
||||
|
||||
var/result = pick(valid_diseases)
|
||||
generated_disease = new result
|
||||
|
||||
datum/event/viral_infection/announce()
|
||||
|
||||
if (severity == EVENT_LEVEL_MAJOR || prob(60))
|
||||
command_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg')
|
||||
var/disease_name = generated_disease ? generated_disease.generated_name : pick("Xenomorph Transformation", "Wizarditis", "GBS", "The Rhumba Beat")
|
||||
|
||||
var/announcement_body
|
||||
var/announcement_title
|
||||
|
||||
if(!generated_disease || generated_disease.dangerous)
|
||||
announcement_title = "High Risk Viral Outbreak"
|
||||
announcement_body = "Confirmed outbreak of level 7 viral infection classification \"[disease_name]\". Failure to contain outbreak and comply with official orders may result in contract termination and/or death."
|
||||
else
|
||||
announcement_title = "Viral Outbreak"
|
||||
announcement_body = "Confirmed outbreak of level 5 viral infection classification \"[disease_name]\". Please report to the medbay if you show any unusual symptoms."
|
||||
|
||||
command_announcement.Announce(announcement_body, announcement_title)
|
||||
|
||||
datum/event/viral_infection/start()
|
||||
if(!viruses.len) return
|
||||
|
||||
var/list/candidates = list() //list of candidate keys
|
||||
for(var/mob/living/carbon/human/G in player_list)
|
||||
if(G.mind && G.stat != DEAD && G.is_client_active(5) && !player_is_antag(G.mind))
|
||||
var/turf/T = get_turf(G)
|
||||
var/list/candidates = list()
|
||||
for(var/mob/living/carbon/human/H in player_list)
|
||||
if(H.mind && H.stat != DEAD && H.is_client_active(5) && !player_is_antag(H.mind))
|
||||
var/turf/T = get_turf(H)
|
||||
if(T.z in current_map.station_levels)
|
||||
candidates += G
|
||||
candidates += H
|
||||
if(!candidates.len) return
|
||||
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
|
||||
candidates = shuffle(candidates)
|
||||
|
||||
var/list/used_viruses = list()
|
||||
var/list/used_candidates = list()
|
||||
severity = max(EVENT_LEVEL_MUNDANE, severity - 1)
|
||||
var/actual_severity = severity * rand(1, 3)
|
||||
while(actual_severity > 0 && candidates.len)
|
||||
var/datum/disease2/disease/D = pick(viruses)
|
||||
infect_mob(candidates[1], D.getcopy())
|
||||
used_candidates += candidates[1]
|
||||
candidates.Remove(candidates[1])
|
||||
actual_severity--
|
||||
used_viruses |= D
|
||||
|
||||
event_viruses |= used_viruses
|
||||
var/list/used_viruses_links = list()
|
||||
var/list/used_viruses_text = list()
|
||||
for(var/datum/disease2/disease/D in used_viruses)
|
||||
used_viruses_links += "<a href='?src=\ref[D];info=1'>[D.name()]</a>"
|
||||
used_viruses_text += D.name()
|
||||
|
||||
var/list/used_candidates_links = list()
|
||||
var/list/used_candidates_text = list()
|
||||
for(var/mob/M in used_candidates)
|
||||
used_candidates_links += key_name_admin(M)
|
||||
used_candidates_text += key_name(M)
|
||||
|
||||
log_admin("Virus event affecting [english_list(used_candidates_text)] started; Viruses: [english_list(used_viruses_text)]")
|
||||
message_admins("Virus event affecting [english_list(used_candidates_links)] started; Viruses: [english_list(used_viruses_links)]")
|
||||
for(var/i=1,i<=severity,i++)
|
||||
if(candidates.len)
|
||||
infect_mob(candidates[1], generated_disease.getcopy())
|
||||
log_admin("Virus event affecting [candidates[1]] started; Virus: [generated_disease.generated_name] ")
|
||||
message_admins("Virus event affecting [candidates[1]] started; Virus: [generated_disease.generated_name] ")
|
||||
candidates -= candidates[1]
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob.apply_effect(2*multiplier, IRRADIATE, blocked = 0)
|
||||
|
||||
/datum/disease2/effect/deaf
|
||||
/datum/disease2/effect/deaf_major
|
||||
name = "Deafness"
|
||||
stage = 4
|
||||
badness = 2
|
||||
@@ -370,7 +370,6 @@
|
||||
mob << "<span class='warning'>You feel like you are about to sneeze!</span>"
|
||||
addtimer(CALLBACK(src, .proc/do_sneeze, mob, multiplier), 5)
|
||||
|
||||
|
||||
proc/do_sneeze(mob/living/carbon/mob, multiplier)
|
||||
if (QDELETED(mob))
|
||||
return
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
/datum/disease2/disease/generated
|
||||
var/generated_name = "Generated Disease"
|
||||
var/dangerous = FALSE
|
||||
uniqueID = 10000
|
||||
var/list/effect_datums = list()
|
||||
|
||||
/datum/disease2/disease/generated/New()
|
||||
|
||||
antigen = list(pick(ALL_ANTIGENS))
|
||||
antigen |= pick(ALL_ANTIGENS)
|
||||
affected_species = get_infectable_species()
|
||||
|
||||
for(var/i=1,i<effect_datums.len,i++)//It's a basic loop because I need the "i" for the stage number.
|
||||
var/datum/disease2/effect/E = effect_datums[i]
|
||||
var/datum/disease2/effectholder/H = new /datum/disease2/effectholder
|
||||
H.stage = i
|
||||
H.effect = new E
|
||||
H.effect.generate()
|
||||
H.chance = rand(0,H.effect.chance_maxm)
|
||||
H.multiplier = rand(1,H.effect.maxm)
|
||||
effects += H
|
||||
..()
|
||||
|
||||
/datum/disease2/disease/generated/cold
|
||||
generated_name = "Spacecold"
|
||||
spreadtype = "Airborne"
|
||||
uniqueID = 10001
|
||||
speed = 5
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/gunck,
|
||||
/datum/disease2/effect/sneeze,
|
||||
/datum/disease2/effect/fridge,
|
||||
/datum/disease2/effect/drowsness
|
||||
)
|
||||
|
||||
/datum/disease2/disease/generated/cough
|
||||
generated_name = "Moghes Cough"
|
||||
spreadtype = "Airborne"
|
||||
uniqueID = 10002
|
||||
speed = 5
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/headache,
|
||||
/datum/disease2/effect/cough,
|
||||
/datum/disease2/effect/groan,
|
||||
/datum/disease2/effect/drool
|
||||
)
|
||||
|
||||
/datum/disease2/disease/generated/zombie
|
||||
generated_name = "Cannibal Fever"
|
||||
dangerous = TRUE
|
||||
uniqueID = 10003
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/drool,
|
||||
/datum/disease2/effect/hungry,
|
||||
/datum/disease2/effect/groan,
|
||||
/datum/disease2/effect/mind
|
||||
)
|
||||
|
||||
/datum/disease2/disease/generated/madness
|
||||
generated_name = "Sensory Madness Syndrome"
|
||||
dangerous = TRUE
|
||||
uniqueID = 10004
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/headache,
|
||||
/datum/disease2/effect/blind,
|
||||
/datum/disease2/effect/hallucinations,
|
||||
/datum/disease2/effect/deaf_major
|
||||
)
|
||||
|
||||
/datum/disease2/disease/generated/clone
|
||||
generated_name = "Cloning Tube Disorder"
|
||||
dangerous = TRUE
|
||||
uniqueID = 10005
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/twitch,
|
||||
/datum/disease2/effect/hair,
|
||||
/datum/disease2/effect/mutation,
|
||||
/datum/disease2/effect/radian
|
||||
)
|
||||
|
||||
/datum/disease2/disease/generated/hyper
|
||||
generated_name = "Hormonal Infectious Disease"
|
||||
dangerous = TRUE
|
||||
uniqueID = 10006
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/twitch,
|
||||
/datum/disease2/effect/stimulant,
|
||||
/datum/disease2/effect/chem_synthesis,
|
||||
/datum/disease2/effect/killertoxins
|
||||
)
|
||||
|
||||
/datum/disease2/disease/generated/telepathy
|
||||
generated_name = "Skrell Syndrome"
|
||||
dangerous = TRUE
|
||||
uniqueID = 10007
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/headache,
|
||||
/datum/disease2/effect/hair,
|
||||
/datum/disease2/effect/telepathic,
|
||||
/datum/disease2/effect/bones
|
||||
)
|
||||
|
||||
/datum/disease2/disease/generated/laughter
|
||||
generated_name = "Ligma"
|
||||
spreadtype = "Airborne"
|
||||
speed = 10
|
||||
stageprob = 20
|
||||
uniqueID = 10011
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/giggle,
|
||||
/datum/disease2/effect/giggle,
|
||||
/datum/disease2/effect/giggle,
|
||||
/datum/disease2/effect/giggle
|
||||
)
|
||||
|
||||
/datum/disease2/disease/generated/dna
|
||||
generated_name = "DNA Disease"
|
||||
dangerous = TRUE
|
||||
uniqueID = 10012
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/twitch,
|
||||
/datum/disease2/effect/hair,
|
||||
/datum/disease2/effect/mutation,
|
||||
/datum/disease2/effect/dna
|
||||
)
|
||||
|
||||
/datum/disease2/disease/generated/fever
|
||||
generated_name = "Worker's Fever"
|
||||
uniqueID = 10013
|
||||
speed = 5
|
||||
stageprob = 15
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/headache,
|
||||
/datum/disease2/effect/drowsness,
|
||||
/datum/disease2/effect/confusion,
|
||||
/datum/disease2/effect/shakey
|
||||
)
|
||||
|
||||
/datum/disease2/disease/generated/spaceflu
|
||||
generated_name = "Space Flu"
|
||||
spreadtype = "Airborne"
|
||||
dangerous = TRUE
|
||||
uniqueID = 10014
|
||||
effect_datums = list(
|
||||
/datum/disease2/effect/gunck,
|
||||
/datum/disease2/effect/sneeze,
|
||||
/datum/disease2/effect/fridge,
|
||||
/datum/disease2/effect/toxins
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user