diff --git a/aurorastation.dme b/aurorastation.dme index 87636b536af..4a3e67b3f77 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -2386,6 +2386,7 @@ #include "code\modules\virus2\diseasesplicer.dm" #include "code\modules\virus2\dishincubator.dm" #include "code\modules\virus2\effect.dm" +#include "code\modules\virus2\generated_diseases.dm" #include "code\modules\virus2\helpers.dm" #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" diff --git a/code/controllers/subsystems/event.dm b/code/controllers/subsystems/event.dm index 78b1153e2b4..8453ffab921 100644 --- a/code/controllers/subsystems/event.dm +++ b/code/controllers/subsystems/event.dm @@ -65,7 +65,7 @@ var/datum/controller/subsystem/events/SSevents var/list/datum/event_container/EC = event_containers[pos] EC.process() pos++ - + if (MC_TICK_CHECK) return diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm index 59961b91462..0621f7f5f7d 100644 --- a/code/modules/events/viral_infection.dm +++ b/code/modules/events/viral_infection.dm @@ -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 += "[D.name()]" - 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] diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index 04a11f049fd..36a6d0796e2 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -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 << "You feel like you are about to sneeze!" addtimer(CALLBACK(src, .proc/do_sneeze, mob, multiplier), 5) - proc/do_sneeze(mob/living/carbon/mob, multiplier) if (QDELETED(mob)) return diff --git a/code/modules/virus2/generated_diseases.dm b/code/modules/virus2/generated_diseases.dm new file mode 100644 index 00000000000..14ccd19c6a4 --- /dev/null +++ b/code/modules/virus2/generated_diseases.dm @@ -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