mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-23 08:31:57 +00:00
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)
272 lines
7.8 KiB
Plaintext
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
|