diff --git a/baystation12.dme b/baystation12.dme
index 87626cca810..d7d20cfd0e5 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -37,6 +37,7 @@
#define FILE_DIR "code/game/gamemodes/blob"
#define FILE_DIR "code/game/gamemodes/changeling"
#define FILE_DIR "code/game/gamemodes/cult"
+#define FILE_DIR "code/game/gamemodes/epidemic"
#define FILE_DIR "code/game/gamemodes/extended"
#define FILE_DIR "code/game/gamemodes/malfunction"
#define FILE_DIR "code/game/gamemodes/meteor"
@@ -193,6 +194,7 @@
#define FILE_DIR "icons/vending_icons"
#define FILE_DIR "interface"
#define FILE_DIR "maps"
+#define FILE_DIR "maps/backup"
#define FILE_DIR "sound"
#define FILE_DIR "sound/ambience"
#define FILE_DIR "sound/announcer"
@@ -422,6 +424,7 @@
#include "code\game\gamemodes\changeling\traitor_chan.dm"
#include "code\game\gamemodes\cult\cult.dm"
#include "code\game\gamemodes\cult\cult_items.dm"
+#include "code\game\gamemodes\epidemic\epidemic.dm"
#include "code\game\gamemodes\extended\extended.dm"
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
#include "code\game\gamemodes\malfunction\malfunction.dm"
diff --git a/code/WorkInProgress/virus2/base.dm b/code/WorkInProgress/virus2/base.dm
index 5c84088756b..ce2aec42040 100644
--- a/code/WorkInProgress/virus2/base.dm
+++ b/code/WorkInProgress/virus2/base.dm
@@ -331,9 +331,9 @@ proc/airborne_can_reach(turf/source, turf/target)
/datum/disease2/effect/greater/radian
name = "Radian's syndrome"
stage = 4
- maxm = 3
+ maxm = 2
activate(var/mob/living/carbon/mob,var/multiplier)
- mob.radiation += (2*multiplier)
+ mob.radiation += (20*multiplier)
/datum/disease2/effect/greater/toxins
name = "Hyperacid Syndrome"
@@ -355,11 +355,28 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
shake_camera(mob,5*multiplier)
-/datum/disease2/effect/greater/deaf
- name = "Hard of hearing syndrome"
+/datum/disease2/effect/greater/fever
+ name = "Fever syndrome"
stage = 4
+ maxm = 2
activate(var/mob/living/carbon/mob,var/multiplier)
- mob.ear_deaf += 20
+ mob.adjustFireLoss(10 * multiplier)
+
+/datum/disease2/effect/greater/weak_bones
+ name = "Bone Density Syndrome"
+ stage = 4
+ maxm = 2
+ activate(var/mob/living/carbon/mob,var/multiplier)
+ var/name = pick(mob.organs)
+ var/datum/organ/external/organ = mob.organs[name]
+
+ if(!organ.broken)
+ mob.adjustBruteLoss(10)
+ mob.visible_message("\red You hear a loud cracking sound coming from [mob.name].","\red Something feels like it shattered in your [organ.display_name]!","You hear a sickening crack.")
+ mob.emote("scream")
+ organ.broken = 1
+ organ.wound = pick("broken","fracture","hairline fracture") //Randomise in future. Edit: Randomized. --SkyMarshal
+ organ.perma_injury = 10
/datum/disease2/effect/invisible
name = "Waiting Syndrome"
@@ -373,14 +390,6 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
mob.mutations |= 512
-/*/datum/disease2/effect/greater/noface
- name = "Identity Loss syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.face_dmg++
- deactivate(var/mob/living/carbon/mob)
- mob.face_dmg--*/
-
/datum/disease2/effect/greater/monkey
name = "Monkism syndrome"
stage = 4
@@ -439,18 +448,6 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
mob.setBrainLoss(50)
-/datum/disease2/effect/greater/suicide
- name = "Suicidal syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.suiciding = 1
- //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while
- viewers(mob) << "\red [mob.name] is holding \his breath. It looks like \he's trying to commit suicide."
- mob.adjustOxyLoss(175 - mob.getToxLoss() - mob.getFireLoss() - mob.getBruteLoss() - mob.getOxyLoss())
- mob.updatehealth()
- spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds
- mob.suiciding = 0
-
// lesser syndromes, partly just copypastes
/datum/disease2/effect/lesser/hallucinations
name = "Hallucinational Syndrome"
diff --git a/code/game/events/Events/VirusEpidemic.dm b/code/game/events/Events/VirusEpidemic.dm
index fa02c073cf8..8f2fa5becc4 100644
--- a/code/game/events/Events/VirusEpidemic.dm
+++ b/code/game/events/Events/VirusEpidemic.dm
@@ -9,7 +9,7 @@
for(var/mob/living/carbon/human/H in world)
if((H.virus2) || (H.stat == 2) || prob(30))
continue
- if(prob(90)) //may need changing, currently 10% chance for "deadly" disease
+ if(prob(100)) // no lethal diseases outside virus mode!
infect_mob_random_lesser(H)
if(prob(20))//don't want people to know that the virus alert = greater virus
command_alert("Probable outbreak of level [rand(1,6)] viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Virus Alert")
diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm
new file mode 100644
index 00000000000..25a66eaac20
--- /dev/null
+++ b/code/game/gamemodes/epidemic/epidemic.dm
@@ -0,0 +1,120 @@
+/datum/game_mode/epidemic
+ name = "epidemic"
+ config_tag = "epidemic"
+ required_players = 6
+
+ var/const/waittime_l = 300 //lower bound on time before intercept arrives (in tenths of seconds)
+ var/const/waittime_h = 600 //upper bound on time before intercept arrives (in tenths of seconds)
+ var/checkwin_counter =0
+ var/finished = 0
+
+///////////////////////////
+//Announces the game type//
+///////////////////////////
+/datum/game_mode/epidemic/announce()
+ world << "The current game mode is - Epidemic!"
+ world << "A deadly epidemic is spreading on the station. Find a cure as fast as possible, and keep your distance to anyone who speaks in a hoarse voice!"
+
+
+///////////////////////////////////////////////////////////////////////////////
+//Gets the round setup, cancelling if there's not enough players at the start//
+///////////////////////////////////////////////////////////////////////////////
+/datum/game_mode/epidemic/pre_setup()
+ var/doctors = 0
+ for(var/mob/new_player/player in world)
+ if(player.mind.assigned_role in list("Chief Medical Officer","Medical Doctor"))
+ doctors++
+ break
+
+ if(doctors < 1)
+ return 0
+
+ return 1
+
+
+/datum/game_mode/epidemic/post_setup()
+ var/list/crew = list()
+ for(var/mob/living/carbon/human/H in world) if(H.client)
+ crew += H
+
+ if(crew.len < 2)
+ world << "\red There aren't enough players for this mode!"
+ return
+
+ var/datum/disease2/disease/lethal = new
+ lethal.makerandom(1)
+ lethal.infectionchance = 5
+
+ var/datum/disease2/disease/nonlethal = new
+ nonlethal.makerandom(0)
+ nonlethal.infectionchance = 0
+
+ for(var/i = 0, i < crew.len / 3, i++)
+ var/mob/living/carbon/human/H = pick(crew)
+ if(H.virus2)
+ i--
+ continue
+ H.virus2 = lethal.getcopy()
+
+ for(var/i = 0, i < crew.len / 3, i++)
+ var/mob/living/carbon/human/H = pick(crew)
+ if(H.virus2)
+ continue
+ H.virus2 = nonlethal.getcopy()
+
+ spawn (rand(waittime_l, waittime_h))
+ send_intercept()
+
+ spawn(10 * 60 * 30)
+ command_alert("Unknown pathogen detected in routine biological scans.", "Biohazard Alert")
+ spawn(300)
+ command_alert("Pathogen identified as level 7 biohazard. All crew, take precaution immediately. Avoid contact with other biological personnel when necessary. Initiate quarantine immediately.", "Biohazard Alert")
+
+ ..()
+
+
+/datum/game_mode/epidemic/process()
+ checkwin_counter++
+ if(checkwin_counter >= 20)
+ if(!finished)
+ ticker.mode.check_win()
+ checkwin_counter = 0
+ return 0
+
+//////////////////////////////////////
+//Checks if the revs have won or not//
+//////////////////////////////////////
+/datum/game_mode/epidemic/check_win()
+ var/alive = 0
+ var/sick = 0
+ for(var/mob/living/carbon/human/H in world)
+ if(H.key && H.stat != 2) alive++
+ if(H.virus2 && H.stat != 2) sick++
+
+ if(alive == 0)
+ finished = 2
+ if(sick == 0)
+ finished = 1
+ return
+
+///////////////////////////////
+//Checks if the round is over//
+///////////////////////////////
+/datum/game_mode/epidemic/check_finished()
+ if(finished != 0)
+ return 1
+ else
+ return 0
+
+//////////////////////////////////////////////////////////////////////
+//Announces the end of the game with all relavent information stated//
+//////////////////////////////////////////////////////////////////////
+/datum/game_mode/epidemic/declare_completion()
+ if(finished == 1)
+ feedback_set_details("round_end_result","win - epidemic cured")
+ world << "\red The virus outbreak was contained! The crew wins!"
+ else if(finished == 2)
+ feedback_set_details("round_end_result","loss - rev heads killed")
+ world << "\red The crew succumbed to the epidemic!"
+ ..()
+ return 1
\ No newline at end of file
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index be03d425d76..718915bd87b 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -399,7 +399,7 @@
//New version pretends to call the shuttle but cause the shuttle to return after a random duration.
emergency_shuttle.fake_recall = rand(300,500)
- if(ticker.mode.name == "blob")
+ if(ticker.mode.name == "blob" || ticker.mode.name == "epidemic")
user << "Under directive 7-10, [station_name()] is quarantined until further notice."
return
diff --git a/config/config.txt b/config/config.txt
index 98f3e940fd6..912e5e5c527 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -55,6 +55,7 @@ PROBABILITY CULT 1
PROBABILITY MONKEY 0
PROBABILITY TRAITORCHAN 0
PROBABILITY EXTEND-A-TRAITORMONGOUS 3
+PROBABILITY EPIDEMIC 1
## if amount of traitors scales or not
TRAITOR_SCALING
diff --git a/data/mode.txt b/data/mode.txt
index e8ce87d6d4c..1edc7433207 100644
--- a/data/mode.txt
+++ b/data/mode.txt
@@ -1 +1 @@
-Extend-A-Traitormongous
+secret