//To simplify, all diseases have 4 stages, with effects starting at stage 2 //Stage 1 = Rest,Minor disease //Stage 2 = Minimal effect //Stage 3 = Medium effect //Stage 4 = Death/Really Really really bad effect /proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0) if(prob(disease.infectionchance)) if(M.virus2) return else var/score = 0 if(!forced) if(istype(M, /mob/living/carbon/human)) if(M:gloves) score += 5 if(istype(M:wear_suit, /obj/item/clothing/suit/space)) score += 10 if(istype(M:wear_suit, /obj/item/clothing/suit/bio_suit)) score += 10 if(istype(M:head, /obj/item/clothing/head/helmet/space)) score += 5 if(istype(M:head, /obj/item/clothing/head/bio_hood)) score += 5 if(M.wear_mask) score += 5 if((istype(M:wear_mask, /obj/item/clothing/mask) || istype(M:wear_mask, /obj/item/clothing/mask/surgical)) && !M.internal) score += 5 if(M.internal) score += 5 if(score > 15) return // else if(score == 20 && prob(95)) // return else if(score == 15 && prob(75)) return else if(score == 10 && prob(55)) return else if(score == 5 && prob(35)) return M.virus2 = disease.getcopy() M.virus2.minormutate() for(var/datum/disease2/resistance/res in M.resistances) if(res.resistsdisease(M.virus2)) M.virus2 = null /datum/disease2/resistance var/list/datum/disease2/effect/resistances = list() proc/resistsdisease(var/datum/disease2/disease/virus2) var/list/res2 = list() for(var/datum/disease2/effect/e in resistances) res2 += e.type for(var/datum/disease2/effectholder/holder in virus2) if(!(holder.effect.type in res2)) return 0 else res2 -= holder.effect.type if(res2.len > 0) return 0 else return 1 New(var/datum/disease2/disease/virus2) for(var/datum/disease2/effectholder/h in virus2.effects) resistances += h.effect.type /proc/infect_mob_random(var/mob/living/carbon/M) if(!M.virus2) M.virus2 = new /datum/disease2/disease M.virus2.makerandom() /datum/disease2/disease var/infectionchance = 10 var/spreadtype = "Blood" // Can also be "Airborne" var/stage = 1 var/stageprob = 2 var/dead = 0 var/clicks = 0 var/uniqueID = 0 var/list/datum/disease2/effectholder/effects = list() proc/makerandom() var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder holder.stage = 1 holder.getrandomeffect() effects += holder holder = new /datum/disease2/effectholder holder.stage = 2 holder.getrandomeffect() effects += holder holder = new /datum/disease2/effectholder holder.stage = 3 holder.getrandomeffect() effects += holder holder = new /datum/disease2/effectholder holder.stage = 4 holder.getrandomeffect() effects += holder uniqueID = rand(0,10000) infectionchance = rand(1,10) spreadtype = "Airborne" proc/minormutate() var/datum/disease2/effectholder/holder = pick(effects) holder.minormutate() infectionchance = min(10,infectionchance + rand(0,1)) proc/issame(var/datum/disease2/disease/disease) var/list/types = list() var/list/types2 = list() for(var/datum/disease2/effectholder/d in effects) types += d.effect.type var/equal = 1 for(var/datum/disease2/effectholder/d in disease.effects) types2 += d.effect.type for(var/type in types) if(!(type in types2)) equal = 0 return equal proc/activate(var/mob/living/carbon/mob) if(dead) mob.virus2 = null return if(mob.stat == 2) return if(mob.radiation > 50) if(prob(1)) majormutate() if(mob.reagents.has_reagent("spaceacillin")) return if(prob(stageprob) && prob(25 + (clicks/100)) && stage != 4) stage++ clicks = 0 for(var/datum/disease2/effectholder/e in effects) e.runeffect(mob,stage) proc/cure_added(var/datum/disease2/resistance/res) if(res.resistsdisease(src)) dead = 1 proc/majormutate() var/datum/disease2/effectholder/holder = pick(effects) holder.majormutate() proc/getcopy() // world << "getting copy" var/datum/disease2/disease/disease = new /datum/disease2/disease disease.infectionchance = infectionchance disease.spreadtype = spreadtype disease.stageprob = stageprob for(var/datum/disease2/effectholder/holder in effects) // world << "adding effects" var/datum/disease2/effectholder/newholder = new /datum/disease2/effectholder newholder.effect = new holder.effect.type newholder.chance = holder.chance newholder.cure = holder.cure newholder.multiplier = holder.multiplier newholder.happensonce = holder.happensonce newholder.stage = holder.stage disease.effects += newholder // world << "[newholder.effect.name]" // world << "[disease]" return disease /datum/disease2/effect var/name = "Blanking effect" var/stage = 4 var/maxm = 1 proc/activate(var/mob/living/carbon/mob,var/multiplier) /datum/disease2/effect/gibbingtons name = "Gibbingtons Syndrome" stage = 4 activate(var/mob/living/carbon/mob,var/multiplier) mob.gib() /datum/disease2/effect/radian name = "Radian's syndrome" stage = 4 maxm = 3 activate(var/mob/living/carbon/mob,var/multiplier) mob.radiation += (2*multiplier) /datum/disease2/effect/toxins name = "Hyperacid Syndrome" stage = 3 maxm = 3 activate(var/mob/living/carbon/mob,var/multiplier) mob.adjustToxLoss(2*multiplier) /datum/disease2/effect/scream name = "Random screaming syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*scream") /datum/disease2/effect/drowsness name = "Automated sleeping syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.drowsyness += 10 /datum/disease2/effect/shakey name = "World Shaking syndrome" stage = 3 maxm = 3 activate(var/mob/living/carbon/mob,var/multiplier) shake_camera(mob,5*multiplier) /datum/disease2/effect/deaf name = "Hard of hearing syndrome" stage = 4 activate(var/mob/living/carbon/mob,var/multiplier) mob.ear_deaf += 20 /datum/disease2/effect/invisible name = "Waiting Syndrome" stage = 1 activate(var/mob/living/carbon/mob,var/multiplier) return /* /datum/disease2/effect/telepathic name = "Telepathy Syndrome" stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) mob.mutations |= 512 */ /datum/disease2/effect/noface name = "Identity Loss syndrome" stage = 4 activate(var/mob/living/carbon/mob,var/multiplier) mob.real_name = "Unknown" /datum/disease2/effect/monkey name = "Monkism syndrome" stage = 4 activate(var/mob/living/carbon/mob,var/multiplier) if(istype(mob,/mob/living/carbon/human)) var/mob/living/carbon/human/h = mob h.monkeyize() /datum/disease2/effect/sneeze name = "Coldingtons Effect" stage = 1 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*sneeze") /datum/disease2/effect/gunck name = "Flemmingtons" stage = 1 activate(var/mob/living/carbon/mob,var/multiplier) mob << "\red Mucous runs down the back of your throat." /datum/disease2/effect/killertoxins name = "Toxification syndrome" stage = 4 activate(var/mob/living/carbon/mob,var/multiplier) mob.adjustToxLoss(15) /* /datum/disease2/effect/hallucinations name = "Hallucinational Syndrome" stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) mob.hallucination += 25 */ /datum/disease2/effect/sleepy name = "Resting syndrome" stage = 2 activate(var/mob/living/carbon/mob,var/multiplier) mob.say("*collapse") /datum/disease2/effect/mind name = "Lazy mind syndrome" stage = 3 activate(var/mob/living/carbon/mob,var/multiplier) mob.brainloss = 50 /datum/disease2/effect/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 attempting to bite off \his tongue. It looks like \he's trying to commit suicide." mob.oxyloss = max(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 /datum/disease2/effectholder var/name = "Holder" var/datum/disease2/effect/effect var/chance = 0 //Chance in percentage each tick var/cure = "" //Type of cure it requires var/happensonce = 0 var/multiplier = 1 //The chance the effects are WORSE var/stage = 0 proc/runeffect(var/mob/living/carbon/human/mob,var/stage) if(happensonce > -1 && effect.stage <= stage && prob(chance)) effect.activate(mob) if(happensonce == 1) happensonce = -1 proc/getrandomeffect() var/list/datum/disease2/effect/list = list() for(var/e in (typesof(/datum/disease2/effect) - /datum/disease2/effect)) // world << "Making [e]" var/datum/disease2/effect/f = new e if(f.stage == src.stage) list += f effect = pick(list) chance = rand(1,6) proc/minormutate() switch(pick(1,2,3,4,5)) if(1) chance = rand(0,100) if(2) multiplier = rand(1,effect.maxm) proc/majormutate() getrandomeffect() /proc/dprob(var/p) return(prob(sqrt(p)) && prob(sqrt(p)))