mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-19 14:42:25 +00:00
332 lines
9.3 KiB
Plaintext
332 lines
9.3 KiB
Plaintext
//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 <b>[mob.name] is attempting to bite off \his tongue. It looks like \he's trying to commit suicide.</b>"
|
|
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)))
|