Files
Aurora.3/code/modules/virus2/disease2.dm
Karolis 8b785b3815 New record consoles and removal of old datacore, adds SSrecords (#4878)
This PR is depending on #4868 for it's ui framework. This PR mostly makes new SSrecords subsystem responsible for storing records. This should replace old datacore.

Make new SSrecords.
Make things use SSrecords and whole code compile
Made VueUi button <vui-button> to push parameters as JSON, preserving client side data stricture.

    Add new records console and admin record management.

I am mostly looking for feedback regarding SSrecords and it's data storage mechanism criticism (It's using lists for storage)
2019-07-27 12:24:16 +03:00

272 lines
7.8 KiB
Plaintext

/datum/disease2/disease
var/infectionchance = 70
var/speed = 1
var/spreadtype = "Contact" // Can also be "Airborne"
var/stage = 1
var/stageprob = 10
var/dead = 0
var/clicks = 0
var/uniqueID = 0
var/list/datum/disease2/effectholder/effects = list()
var/antigen = list() // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here
var/max_stage = 4
var/list/affected_species = list("Human","Unathi","Skrell","Tajara")
/datum/disease2/disease/New()
uniqueID = rand(0,10000)
..()
/datum/disease2/disease/proc/makerandom(var/severity=1)
var/list/excludetypes = list()
for(var/i=1 ; i <= max_stage ; i++ )
var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder
holder.stage = i
holder.getrandomeffect(severity, excludetypes)
excludetypes += holder.effect.type
effects += holder
uniqueID = rand(0,10000)
switch(severity)
if(1)
infectionchance = 1
if(2)
infectionchance = rand(10,20)
else
infectionchance = rand(60,90)
antigen = list(pick(ALL_ANTIGENS))
antigen |= pick(ALL_ANTIGENS)
spreadtype = prob(70) ? "Airborne" : "Contact"
if(all_species.len)
affected_species = get_infectable_species()
/proc/get_infectable_species()
var/list/meat = list()
var/list/res = list()
for (var/specie in all_species)
var/datum/species/S = all_species[specie]
if(!S.virus_immune)
meat += S
if(meat.len)
var/num = rand(1,meat.len)
for(var/i=0,i<num,i++)
var/datum/species/picked = pick_n_take(meat)
res |= picked.name
if(picked.greater_form)
res |= picked.greater_form
if(picked.primitive_form)
res |= picked.primitive_form
return res
/datum/disease2/disease/proc/activate(var/mob/living/carbon/mob)
if(dead)
cure(mob)
return
if(mob.stat == 2)
return
if(stage <= 1 && clicks == 0) // with a certain chance, the mob may become immune to the disease before it starts properly
if(prob(5))
mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily
// Some species are flat out immune to organic viruses.
var/mob/living/carbon/human/H = mob
if(istype(H) && H.species.virus_immune)
cure(mob)
return
if(mob.total_radiation > 50)
if(prob(1))
majormutate()
//Space antivirals stop disease completely
if(mob.reagents.has_reagent("deltamivir"))
if(stage == 1 && prob(20))
src.cure(mob)
return
//Virus food speeds up disease progress
if(mob.reagents.has_reagent("virusfood"))
mob.reagents.remove_reagent("virusfood",0.1)
clicks += 10
if(prob(1) && prob(stage)) // Increasing chance of curing as the virus progresses
src.cure(mob)
mob.antibodies |= src.antigen
//Moving to the next stage
if(clicks > max(stage*100, 200) && prob(10))
if((stage <= max_stage) && prob(20)) // ~60% of viruses will be cured by the end of S4 with this
src.cure(mob)
mob.antibodies |= src.antigen
stage++
clicks = 0
//Do nasty effects
for(var/datum/disease2/effectholder/e in effects)
if(prob(33))
e.runeffect(mob,stage)
//Short airborne spread
if(src.spreadtype == "Airborne")
for(var/mob/living/carbon/M in oview(1,mob))
if(airborne_can_reach(get_turf(mob), get_turf(M)))
infect_virus2(M,src)
//fever
mob.bodytemperature = max(mob.bodytemperature, min(310+5*min(stage,max_stage) ,mob.bodytemperature+5*min(stage,max_stage)))
clicks+=speed
/datum/disease2/disease/proc/cure(var/mob/living/carbon/mob)
for(var/datum/disease2/effectholder/e in effects)
e.effect.deactivate(mob)
mob.virus2.Remove("[uniqueID]")
BITSET(mob.hud_updateflag, STATUS_HUD)
/datum/disease2/disease/proc/minormutate()
//uniqueID = rand(0,10000)
var/datum/disease2/effectholder/holder = pick(effects)
holder.minormutate()
//infectionchance = min(50,infectionchance + rand(0,10))
/datum/disease2/disease/proc/majormutate()
uniqueID = rand(0,10000)
var/datum/disease2/effectholder/holder = pick(effects)
var/list/exclude = list()
for(var/datum/disease2/effectholder/D in effects)
if(D != holder)
exclude += D.effect.type
holder.majormutate(exclude)
if (prob(5))
antigen = list(pick(ALL_ANTIGENS))
antigen |= pick(ALL_ANTIGENS)
if (prob(5) && all_species.len)
affected_species = get_infectable_species()
/datum/disease2/disease/proc/getcopy()
var/datum/disease2/disease/disease = new /datum/disease2/disease
disease.infectionchance = infectionchance
disease.spreadtype = spreadtype
disease.stageprob = stageprob
disease.antigen = antigen
disease.uniqueID = uniqueID
disease.affected_species = affected_species.Copy()
for(var/datum/disease2/effectholder/holder in effects)
var/datum/disease2/effectholder/newholder = new /datum/disease2/effectholder
newholder.effect = new holder.effect.type
newholder.effect.generate(holder.effect.data)
newholder.chance = holder.chance
newholder.cure = holder.cure
newholder.multiplier = holder.multiplier
newholder.happensonce = holder.happensonce
newholder.stage = holder.stage
disease.effects += newholder
return disease
/datum/disease2/disease/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
if (antigen != disease.antigen)
equal = 0
return equal
/proc/virus_copylist(var/list/datum/disease2/disease/viruses)
var/list/res = list()
for (var/ID in viruses)
var/datum/disease2/disease/V = viruses[ID]
res["[V.uniqueID]"] = V.getcopy()
return res
/datum/disease2/disease/proc/name()
.= "stamm #[add_zero("[uniqueID]", 4)]"
var/datum/record/virus/V = SSrecords.find_record("id", "[uniqueID]", RECORD_VIRUS)
if(istype(V))
.= V.name
/datum/disease2/disease/proc/get_basic_info()
var/t = ""
for(var/datum/disease2/effectholder/E in effects)
t += ", [E.effect.name]"
return "[name()] ([copytext(t,3)])"
/datum/disease2/disease/proc/get_info()
var/r = {"
<small>Analysis determined the existence of a GNAv2-based viral lifeform.</small><br>
<u>Designation:</u> [name()]<br>
<u>Antigen:</u> [antigens2string(antigen)]<br>
<u>Transmitted By:</u> [spreadtype]<br>
<u>Rate of Progression:</u> [stageprob * 10]<br>
<u>Species Affected:</u> [jointext(affected_species, ", ")]<br>
"}
r += "<u>Symptoms:</u><br>"
for(var/datum/disease2/effectholder/E in effects)
r += "([E.stage]) [E.effect.name] "
r += "<small><u>Strength:</u> [E.multiplier >= 3 ? "Severe" : E.multiplier > 1 ? "Above Average" : "Average"] "
r += "<u>Verosity:</u> [E.chance * 15]</small><br>"
return r
/datum/disease2/disease/proc/addToDB()
if (SSrecords.find_record("id", "[uniqueID]", RECORD_VIRUS))
return 0
var/datum/record/virus/v = new()
v.id = uniqueID
v.name = name()
v.description = get_info()
v.antigen = antigens2string(antigen)
v.spread_type = spreadtype
SSrecords.add_record(v)
return 1
proc/virus2_lesser_infection()
var/list/candidates = list() //list of candidate keys
for(var/mob/living/carbon/human/G in player_list)
if(G.client && G.stat != DEAD)
candidates += G
if(!candidates.len) return
candidates = shuffle(candidates)
infect_mob_random_lesser(candidates[1])
proc/virus2_greater_infection()
var/list/candidates = list() //list of candidate keys
for(var/mob/living/carbon/human/G in player_list)
if(G.client && G.stat != DEAD)
candidates += G
if(!candidates.len) return
candidates = shuffle(candidates)
infect_mob_random_greater(candidates[1])
proc/virology_letterhead(var/report_name)
return {"
<center><h1><b>[report_name]</b></h1></center>
<center><small><i>[station_name()] Virology Lab</i></small></center>
<hr>
"}
/datum/disease2/disease/proc/can_add_symptom(type)
for(var/datum/disease2/effectholder/H in effects)
if(H.effect.type == type)
return 0
return 1