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)