diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 49991b32bea..48abda03c83 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -38,6 +38,7 @@ DD.holder = src if(DD.disease_flags & CAN_CARRY && prob(5)) DD.carrier = 1 + DD.strain_data = D.strain_data.Copy() DD.affected_mob.med_hud_set_status() diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index f7772c5ac2b..05ea21602c3 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -179,7 +179,9 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease /datum/disease/proc/Copy() - return new type() + var/datum/disease/D = new type() + D.strain_data = strain_data.Copy() + return D /datum/disease/proc/GetDiseaseID() diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index c24e13668e0..eb38e8689af 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -8,7 +8,7 @@ disease_flags = CAN_CARRY|CAN_RESIST agent = "S4E1 retrovirus" viable_mobtypes = list(/mob/living/carbon/human) - var/list/original_dna = list() + var/datum/dna/original_dna = null var/transformed = 0 desc = "This disease transplants the genetic code of the intial vector into new hosts." severity = MEDIUM @@ -16,6 +16,17 @@ /datum/disease/dnaspread/stage_act() ..() + if(!affected_mob.dna) + cure() + + if(!strain_data["dna"]) + //Absorbs the target DNA. + strain_data["dna"] = new affected_mob.dna.type + affected_mob.dna.copy_dna(strain_data["dna"]) + src.carrier = 1 + src.stage = 4 + return + switch(stage) if(2 || 3) //Pretend to be a cold and give time to spread. if(prob(8)) @@ -32,21 +43,18 @@ affected_mob.adjustToxLoss(2) affected_mob.updatehealth() if(4) - if(!src.transformed) - if ((!strain_data["name"]) || (!strain_data["UI"]) || (!strain_data["SE"])) - del(affected_mob.virus) - return - + if(!src.transformed && !src.carrier) //Save original dna for when the disease is cured. - src.original_dna["name"] = affected_mob.real_name - src.original_dna["UI"] = affected_mob.dna.uni_identity - src.original_dna["SE"] = affected_mob.dna.struc_enzymes + original_dna = new affected_mob.dna.type + affected_mob.dna.copy_dna(original_dna) affected_mob << "You don't feel like yourself.." - affected_mob.dna.uni_identity = strain_data["UI"] + var/datum/dna/transform_dna = strain_data["dna"] + + transform_dna.transfer_identity(affected_mob) + affected_mob.real_name = affected_mob.dna.real_name + updateappearance(affected_mob) - affected_mob.dna.struc_enzymes = strain_data["SE"] - affected_mob.real_name = strain_data["name"] domutcheck(affected_mob) src.transformed = 1 @@ -55,12 +63,12 @@ return /datum/disease/dnaspread/Del() - if ((original_dna["name"]) && (original_dna["UI"]) && (original_dna["SE"])) - if(affected_mob) - affected_mob.dna.uni_identity = original_dna["UI"] - updateappearance(affected_mob) - affected_mob.dna.struc_enzymes = original_dna["SE"] - affected_mob.real_name = original_dna["name"] + if (original_dna && transformed && affected_mob) + original_dna.transfer_identity(affected_mob) + affected_mob.real_name = affected_mob.dna.real_name - affected_mob << "You feel more like yourself." + updateappearance(affected_mob) + domutcheck(affected_mob) + + affected_mob << "You feel more like yourself." ..() \ No newline at end of file diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index de27718296c..4eac92f16b9 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -9,6 +9,7 @@ severity = HARMFUL stage_prob = 10 visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC + disease_flags = CURABLE var/list/stage1 = list("You feel unremarkable.") var/list/stage2 = list("You feel boring.") var/list/stage3 = list("You feel utterly plain.") @@ -202,7 +203,7 @@ var/mob/living/carbon/human/human = affected_mob if(human.dna && human.dna.species.id != "slime") human.dna.species = new /datum/species/slime() - human.update_icons() + human.regenerate_icons() /datum/disease/transformation/corgi name = "The Barkening" diff --git a/code/game/dna.dm b/code/game/dna.dm index 21f94b0ce29..43f11afb6e7 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -36,9 +36,20 @@ destination.dna.uni_identity = uni_identity destination.dna.blood_type = blood_type destination.dna.species = species + destination.dna.mutant_color = mutant_color destination.dna.real_name = real_name destination.dna.mutations = mutations +/datum/dna/proc/copy_dna(var/datum/dna/new_dna) + new_dna.unique_enzymes = unique_enzymes + new_dna.struc_enzymes = struc_enzymes + new_dna.uni_identity = uni_identity + new_dna.blood_type = blood_type + new_dna.species = new species.type + new_dna.mutant_color = mutant_color + new_dna.real_name = real_name + new_dna.mutations = mutations + /datum/dna/proc/add_mutation(mutation_name) var/datum/mutation/human/HM = mutations_list[mutation_name] HM.on_acquiring(holder) diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm index 48da639f97e..ac4e518258b 100644 --- a/code/modules/mob/living/carbon/human/blood.dm +++ b/code/modules/mob/living/carbon/human/blood.dm @@ -153,7 +153,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 */ for(var/datum/disease/D in src.viruses) - B.data["viruses"] += new D.type(0, D, 1) + B.data["viruses"] += D.Copy() B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0) if(src.resistances&&src.resistances.len)