Made it possible for mob to be infected with several viruses at once.

This commit is contained in:
Chinsky
2013-06-09 13:31:16 +04:00
parent 5703b8089d
commit 7a8a822a92
16 changed files with 106 additions and 117 deletions
+15 -47
View File
@@ -9,39 +9,19 @@
var/uniqueID = 0
var/list/datum/disease2/effectholder/effects = list()
var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here
var/max_stage = 4
/datum/disease2/disease/proc/makerandom(var/greater=0)
var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder
holder.stage = 1
if(greater)
holder.getrandomeffect_greater()
else
holder.getrandomeffect_lesser()
effects += holder
holder = new /datum/disease2/effectholder
holder.stage = 2
if(greater)
holder.getrandomeffect_greater()
else
holder.getrandomeffect_lesser()
effects += holder
holder = new /datum/disease2/effectholder
holder.stage = 3
if(greater)
holder.getrandomeffect_greater()
else
holder.getrandomeffect_lesser()
effects += holder
holder = new /datum/disease2/effectholder
holder.stage = 4
if(greater)
holder.getrandomeffect_greater()
else
holder.getrandomeffect_lesser()
effects += holder
for(var/i=1 ; i <= max_stage ; i++ )
var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder
holder.stage = i
if(greater)
holder.getrandomeffect_greater()
else
holder.getrandomeffect_lesser()
effects += holder
uniqueID = rand(0,10000)
infectionchance = rand(1,10)
// pick 2 antigens
antigen |= text2num(pick(ANTIGENS))
antigen |= text2num(pick(ANTIGENS))
spreadtype = "Airborne"
@@ -49,12 +29,11 @@
/datum/disease2/disease/proc/activate(var/mob/living/carbon/mob)
if(dead)
cure(mob)
mob.virus2 = null
mob.virus2 -= src
return
if(mob.stat == 2)
return
// with a certain chance, the mob may become immune to the disease before it starts properly
if(stage <= 1 && clicks == 0)
if(stage <= 1 && clicks == 0) // with a certain chance, the mob may become immune to the disease before it starts properly
if(prob(20))
mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily
else
@@ -67,10 +46,10 @@
mob.reagents.remove_reagent("virusfood",0.1)
clicks += 10
if(clicks > stage*100 && prob(10))
if(stage == 4)
if(stage == max_stage)
src.cure(mob)
mob.antibodies |= src.antigen
mob.virus2 = null
mob.virus2 -= src
del src
stage++
clicks = 0
@@ -79,19 +58,8 @@
clicks+=speed
/datum/disease2/disease/proc/cure(var/mob/living/carbon/mob)
var/datum/disease2/effectholder/E
if(stage>1)
E = effects[1]
E.effect.deactivate(mob)
if(stage>2)
E = effects[2]
E.effect.deactivate(mob)
if(stage>3)
E = effects[3]
E.effect.deactivate(mob)
if(stage>4)
E = effects[4]
E.effect.deactivate(mob)
for(var/datum/disease2/effectholder/e in effects)
e.effect.deactivate(mob)
/datum/disease2/disease/proc/minormutate()
var/datum/disease2/effectholder/holder = pick(effects)
+5 -1
View File
@@ -37,6 +37,7 @@
chance = rand(0,effect.chance_maxm)
if(2)
multiplier = rand(1,effect.maxm)
/datum/disease2/effectholder/proc/majormutate()
getrandomeffect_greater()
@@ -76,7 +77,7 @@
maxm = 3
activate(var/mob/living/carbon/mob,var/multiplier)
mob.radiation += (2*multiplier)
u
/datum/disease2/effect/greater/toxins
name = "Hyperacid Syndrome"
stage = 3
@@ -134,6 +135,9 @@
stage = 1
activate(var/mob/living/carbon/mob,var/multiplier)
mob.say("*sneeze")
if (prob(50))
var/obj/effect/decal/cleanable/mucus/M = new(get_turf(mob))
M.virus2 = mob.virus2.Copy()
/datum/disease2/effect/greater/gunck
name = "Flemmingtons"
+18 -19
View File
@@ -29,7 +29,6 @@ proc/get_infection_chance(var/mob/living/carbon/M)
return 0
else if(score == 5 && prob(35))
return 0
return 1
//Checks if table-passing table can reach target (5 tile radius)
@@ -46,37 +45,37 @@ proc/airborne_can_reach(turf/source, turf/target)
//Attemptes to infect mob M with virus. Set forced to 1 to ignore protective clothnig
/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0)
if(M.virus2)
if(!istype(disease))
return
if(!disease)
if(!istype(M))
return
if (disease in M.virus2)
return
// if one of the antibodies in the mob's body matches one of the disease's antigens, don't infect
if(M.antibodies & disease.antigen != 0) return
if(M.antibodies & disease.antigen != 0)
return
if(prob(disease.infectionchance) || forced)
if(M.virus2)
// certain clothes can prevent an infection
if(!forced && !get_infection_chance(M))
return
else
// certain clothes can prevent an infection
if(!forced && !M.get_infection_chance())
return
M.virus2 = disease.getcopy()
M.virus2.minormutate()
var/datum/disease2/disease/D = disease.getcopy()
D.minormutate()
M.virus2 += D
//Infects mob M with random lesser disease, if he doesn't have one
/proc/infect_mob_random_lesser(var/mob/living/carbon/M)
if(!M.virus2)
M.virus2 = new /datum/disease2/disease
M.virus2.makerandom()
M.virus2.infectionchance = 1
var/datum/disease2/disease/D = new /datum/disease2/disease
D.makerandom()
D.infectionchance = 1
M.virus2 += D
//Infects mob M with random greated disease, if he doesn't have one
/proc/infect_mob_random_greater(var/mob/living/carbon/M)
if(!M.virus2)
M.virus2 = new /datum/disease2/disease
M.virus2.makerandom(1)
var/datum/disease2/disease/D = new /datum/disease2/disease
D.makerandom(1)
M.virus2 += D
//Fancy prob() function.
/proc/dprob(var/p)
+2 -2
View File
@@ -53,9 +53,9 @@
if(prob(50))
user << "The dish shatters"
if(virus2.infectionchance > 0)
for(var/mob/living/carbon/target in view(null, src)) if(!target.virus2)
for(var/mob/living/carbon/target in view(null, src))
if(airborne_can_reach(src.loc, target.loc))
if(target.get_infection_chance())
if(get_infection_chance(target))
infect_virus2(target,src.virus2)
del src