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