From 66447b2b3908117008fc85781684217264ee0921 Mon Sep 17 00:00:00 2001 From: cib Date: Wed, 4 Apr 2012 19:00:36 -0700 Subject: [PATCH] Added virus epidemic mode. - Mode will only start with at least one doctor at round start(CMO or MD) - Lethal vira won't spawn anymore outside this mode --- baystation12.dme | 3 + code/WorkInProgress/virus2/base.dm | 47 ++++--- code/game/events/Events/VirusEpidemic.dm | 2 +- code/game/gamemodes/epidemic/epidemic.dm | 120 ++++++++++++++++++ .../game/machinery/computer/communications.dm | 2 +- config/config.txt | 1 + data/mode.txt | 2 +- 7 files changed, 149 insertions(+), 28 deletions(-) create mode 100644 code/game/gamemodes/epidemic/epidemic.dm 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