diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index eccdadc7f30..64f7548f8a2 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -110,6 +110,7 @@
if (!istype(H.dna, /datum/dna) || !H.dna.uni_identity || (length(H.dna.uni_identity) != 32))
if(!istype(H.dna, /datum/dna))
H.dna = new /datum/dna(null)
+ H.dna.real_name = H.real_name
H.check_dna()
//Now, deal with gloves.
if (H.gloves && H.gloves != src)
@@ -171,6 +172,7 @@
return 0
if (!istype(M.dna, /datum/dna))
M.dna = new /datum/dna(null)
+ M.dna.real_name = M.real_name
M.check_dna()
if (!( src.flags ) & FPRINT)
return 0
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 7b179393bfc..0ea61c118e2 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -5,6 +5,7 @@
var/uni_identity = null
var/b_type = "A+"
var/mutantrace = null //The type of mutant race the player is if applicable (i.e. potato-man)
+ var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
/datum/dna/proc/check_integrity(var/mob/living/carbon/human/character)
if(character)
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index d42e0e2fd18..89f9435483d 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -13,7 +13,7 @@
src.verbs += P.verbpath
if(!mind.changeling.absorbed_dna.len)
- mind.changeling.absorbed_dna[real_name] = dna
+ mind.changeling.absorbed_dna += dna
return 1
//removes our changeling verbs
@@ -109,7 +109,8 @@
usr.visible_message("[usr] sucks the fluids from [T]!")
T << "You have been absorbed by the changeling!"
- changeling.absorbed_dna[T.real_name] = T.dna
+ T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
+ changeling.absorbed_dna += T.dna
if(usr.nutrition < 400) usr.nutrition = min((usr.nutrition + T.nutrition), 400)
changeling.chem_charges += 10
changeling.geneticpoints += 2
@@ -119,7 +120,7 @@
changeling.absorbed_dna |= T.mind.changeling.absorbed_dna //steal all their loot
changeling.absorbedcount += T.mind.changeling.absorbedcount
- T.mind.changeling.absorbed_dna = list("T.real_name"=T.dna)
+ T.mind.changeling.absorbed_dna = list(T.dna)
if(T.mind.changeling.purchasedpowers)
for(var/datum/power/changeling/Tp in T.mind.changeling.purchasedpowers)
@@ -153,14 +154,27 @@
var/datum/changeling/changeling = changeling_power(5,1,0)
if(!changeling) return
- var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in changeling.absorbed_dna
+ var/list/names = list()
+ for(var/datum/dna/DNA in changeling.absorbed_dna)
+ names += "[DNA.real_name]"
+
+ var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
+ var/datum/dna/chosen_dna
+ for(var/datum/dna/DNA in changeling.absorbed_dna)
+ if(S == "[DNA.real_name]")
+ chosen_dna = DNA
+ break
+
+ if(!chosen_dna)
+ return
+
changeling.chem_charges -= 5
usr.visible_message("[usr] transforms!")
changeling.geneticdamage = 30
- usr.dna = changeling.absorbed_dna[S]
- usr.real_name = S
+ usr.dna = chosen_dna
+ usr.real_name = chosen_dna.real_name
updateappearance(usr, usr.dna.uni_identity)
domutcheck(usr, null)
@@ -243,15 +257,28 @@
var/datum/changeling/changeling = changeling_power(1,1,0)
if(!changeling) return
- var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in changeling.absorbed_dna
+ var/list/names = list()
+ for(var/datum/dna/DNA in changeling.absorbed_dna)
+ names += "[DNA.real_name]"
+
+ var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
+ var/datum/dna/chosen_dna
+ for(var/datum/dna/DNA in changeling.absorbed_dna)
+ if(S == "[DNA.real_name]")
+ chosen_dna = DNA
+ break
+
+ if(!chosen_dna)
+ return
+
var/mob/living/carbon/C = usr
changeling.chem_charges--
C.remove_changeling_powers()
C.visible_message("[C] transforms!")
- C.dna = changeling.absorbed_dna[S]
+ C.dna = chosen_dna
var/list/implants = list()
for (var/obj/item/weapon/implant/I in C) //Still preserving implants
@@ -286,7 +313,7 @@
O.gender = MALE
O.dna = C.dna
C.dna = null
- O.real_name = S
+ O.real_name = chosen_dna.real_name
for(var/obj/T in C)
del(T)
@@ -566,17 +593,33 @@
var/datum/changeling/changeling = changeling_power(40)
if(!changeling) return 0
- var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in changeling.absorbed_dna
+
+
+
+ var/list/names = list()
+ for(var/datum/dna/DNA in changeling.absorbed_dna)
+ names += "[DNA.real_name]"
+
+ var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
+ var/datum/dna/chosen_dna
+ for(var/datum/dna/DNA in changeling.absorbed_dna)
+ if(S == "[DNA.real_name]")
+ chosen_dna = DNA
+ break
+
+ if(!chosen_dna)
+ return
+
var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting)
if(!T) return 0
if((HUSK in T.mutations) || (!ishuman(T) && !ismonkey(T)))
usr << "Our sting appears ineffective against its DNA."
return 0
T.visible_message("[T] transforms!")
- T.dna = changeling.absorbed_dna[S]
- T.real_name = S
+ T.dna = chosen_dna
+ T.real_name = chosen_dna.real_name
updateappearance(T, T.dna.uni_identity)
domutcheck(T, null)
feedback_add_details("changeling_powers","TS")
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index a4888e66224..678783887d7 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -181,6 +181,7 @@
if(!H.dna)
H.dna = new /datum/dna()
+ H.dna.real_name = H.real_name
if(ui)
H.dna.uni_identity = ui
updateappearance(H, ui)
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index 716f33c0298..8c96cfbcdd2 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -910,6 +910,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(!podman.dna)
podman.dna = new /datum/dna()
+ podman.dna.real_name = podman.real_name
if(ui)
podman.dna.uni_identity = ui
updateappearance(podman, ui)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index aa8c05a990a..51a8749293c 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -28,6 +28,9 @@
..()
+ if(dna)
+ dna.real_name = real_name
+
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
if ((!( yes ) || now_pushing))
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 81e7a030835..50de0446040 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -2,10 +2,15 @@
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
+
+ if(name == "monkey")
+ name = text("monkey ([rand(1, 1000)])")
+ real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
dna = new /datum/dna( null )
+ dna.real_name = real_name
dna.uni_identity = "00600200A00E0110148FC01300B009"
dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
dna.unique_enzymes = md5(name)
@@ -18,10 +23,6 @@
dna.uni_identity += gendervar
dna.uni_identity += "12C"
dna.uni_identity += "4E2"
-
- if(name == "monkey")
- name = text("monkey ([rand(1, 1000)])")
- real_name = name
..()
return
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index d2451c67709..7d6c29dc14d 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -32,7 +32,10 @@
if(hud_used) del(hud_used) //remove the hud objects
hud_used = new/obj/hud( src )
- if(!dna) dna = new /datum/dna(null)
+ if(!dna)
+ dna = new /datum/dna(null)
+ if(dna)
+ dna.real_name = real_name
next_move = 1
sight |= SEE_SELF
diff --git a/code/modules/mob/new_player/preferences.dm b/code/modules/mob/new_player/preferences.dm
index 7641dc9ebed..64a140c86d6 100644
--- a/code/modules/mob/new_player/preferences.dm
+++ b/code/modules/mob/new_player/preferences.dm
@@ -671,6 +671,9 @@ datum/preferences
character.real_name = real_name
+ if(character.dna)
+ character.dna.real_name = character.real_name
+
character.gender = gender
character.age = age