diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index cf335b5f7d6..f7c36929432 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -420,7 +420,7 @@ var/global/list/bad_blocks[0]
data["UE"] = unique_enzymes
data["SE"] = SE.Copy() // This is probably too lazy for my own good
data["UI"] = UI.Copy()
- data["species"] = species.type // This works because `species` is a string, not a datum
+ data["species"] = species.type
// Because old DNA coders were insane or something
data["b_type"] = b_type
data["real_name"] = real_name
diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm
index c79e4168490..38caf8eda74 100644
--- a/code/game/dna/genes/monkey.dm
+++ b/code/game/dna/genes/monkey.dm
@@ -7,8 +7,8 @@
/datum/dna/gene/monkey/can_activate(var/mob/M,var/flags)
return ishuman(M)
-/datum/dna/gene/monkey/activate(var/mob/living/carbon/human/H, var/connected, var/flags)
- if(!istype(H,/mob/living/carbon/human))
+/datum/dna/gene/monkey/activate(mob/living/carbon/human/H, connected, flags)
+ if(!istype(H))
return
if(issmall(H))
return
@@ -41,13 +41,14 @@
if(H.client)
H.hud_used = new /datum/hud/monkey(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha)
+ H.hud_used.show_hud(H.hud_used.hud_version)
to_chat(H, "You are now a [H.dna.species.name].")
return H
-/datum/dna/gene/monkey/deactivate(var/mob/living/carbon/human/H, var/connected, var/flags)
- if(!istype(H,/mob/living/carbon/human))
+/datum/dna/gene/monkey/deactivate(mob/living/carbon/human/H, connected, flags)
+ if(!istype(H))
return
for(var/obj/item/W in H)
if(W == H.w_uniform) // will be torn
@@ -81,6 +82,7 @@
if(H.client)
H.hud_used = new /datum/hud/human(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha)
+ H.hud_used.show_hud(H.hud_used.hud_version)
to_chat(H, "You are now a [H.dna.species.name].")
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index a7af2b94482..befdf899253 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -375,7 +375,7 @@ var/list/sting_paths
path.on_purchase(src)
var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste
- mind.changeling.absorbed_dna |= C.dna
+ mind.changeling.absorbed_dna |= C.dna.Clone()
mind.changeling.trim_dna()
return 1
diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm
index fb3012cd274..72b0e821e66 100644
--- a/code/game/gamemodes/changeling/powers/humanform.dm
+++ b/code/game/gamemodes/changeling/powers/humanform.dm
@@ -26,10 +26,10 @@
to_chat(user, "We transform our appearance.")
user.dna.SetSEState(MONKEYBLOCK,0,1)
genemutcheck(user,MONKEYBLOCK,null,MUTCHK_FORCED)
+ if(istype(user))
+ user.set_species(chosen_dna.species.type)
user.dna = chosen_dna.Clone()
user.real_name = chosen_dna.real_name
- if(istype(user))
- user.set_species(chosen_dna.species)
domutcheck(user,null,MUTCHK_FORCED)
user.flavor_text = ""
user.dna.UpdateSE()
diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm
index d6b4870c50a..2197163cbd5 100644
--- a/code/game/gamemodes/changeling/powers/lesserform.dm
+++ b/code/game/gamemodes/changeling/powers/lesserform.dm
@@ -21,13 +21,9 @@
to_chat(H, "We cannot perform this ability in this form!")
return
- user.dna = user.dna.Clone()
H.visible_message("[H] transforms!")
changeling.geneticdamage = 30
to_chat(H, "Our genes cry out!")
- var/list/implants = list() //Try to preserve implants.
- for(var/obj/item/implant/W in H)
- implants += W
H.monkeyize()
changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
feedback_add_details("changeling_powers","LF")
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index 082ec9bbe54..bb216ddad35 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -111,11 +111,11 @@
target.visible_message("[target] begins to violenty convulse!","You feel a tiny prick and a begin to uncontrollably convulse!")
spawn(10)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.set_species(NewDNA.species.type)
target.dna = NewDNA.Clone()
target.real_name = NewDNA.real_name
- var/mob/living/carbon/human/H = target
- if(istype(H))
- H.set_species(NewDNA.species)
target.UpdateAppearance()
domutcheck(target, null)
feedback_add_details("changeling_powers","TS")
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index b7c8abefd1d..bacdc8b0d8b 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -14,10 +14,10 @@
if(!chosen_dna)
return
+ if(ishuman(user))
+ user.set_species(chosen_dna.species.type)
user.dna = chosen_dna.Clone()
user.real_name = chosen_dna.real_name
- if(ishuman(user))
- user.set_species(chosen_dna.species)
domutcheck(user, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
user.flavor_text = ""
user.dna.UpdateSE()
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index 9b03311d88c..a8c6398fa95 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -217,8 +217,8 @@
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
var/datum/dna/owner_dna = H.dna
clone.rename_character(clone.name, owner_dna.real_name)
+ clone.set_species(H.dna.species.type)
clone.dna = owner_dna.Clone()
- clone.set_species(H.dna.species)
clone.body_accessory = H.body_accessory
domutcheck(clone)
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 91c36356fd9..801eb6cb33c 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -321,7 +321,7 @@ var/global/list/multiverse = list()
to_chat(M, "You are an alternate version of [user.real_name] from another universe! Help [user.p_them()] accomplish [user.p_their()] goals at all costs.")
M.faction = list("[user.real_name]")
if(duplicate_self)
- M.set_species(user.dna.species) //duplicate the sword user's species.
+ M.set_species(user.dna.species.type) //duplicate the sword user's species.
else
if(prob(50))
var/list/list_all_species = list(/datum/species/human, /datum/species/unathi, /datum/species/skrell, /datum/species/tajaran, /datum/species/kidan, /datum/species/golem, /datum/species/diona, /datum/species/machine, /datum/species/slime, /datum/species/grey, /datum/species/vulpkanin)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 881136dbd58..798a01f2bda 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -231,7 +231,7 @@
R.dna = new /datum/dna()
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
- H.set_species(R.dna.species)
+ H.set_species(R.dna.species.type)
occupant = H
if(!R.dna.real_name) //to prevent null names
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index e5dc8f7db00..5e99a954650 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -300,7 +300,7 @@
/obj/machinery/transformer/transmogrifier/do_transform(mob/living/carbon/human/H)
if(!istype(H))
return
- if(!istype(target_species))
+ if(!ispath(target_species))
to_chat(H, "'[target_species]' is not a valid species!")
return
H.set_species(target_species)
@@ -336,7 +336,7 @@
to_chat(H, "No genetic template configured!")
return
var/prev_ue = H.dna.unique_enzymes
- H.set_species(template.species)
+ H.set_species(template.species.type)
H.dna = template.Clone()
H.real_name = template.real_name
H.sync_organ_dna(assimilate = 0, old_ue = prev_ue)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 2105ae712d0..64b856628ab 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -1252,7 +1252,7 @@
icon_state = "monkeycube"
bitesize = 12
filling_color = "#ADAC7F"
- var/monkey_type = "Monkey"
+ var/datum/species/monkey_type = /datum/species/monkey
list_reagents = list("nutriment" = 2)
/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 07fc623952c..3f79b90628d 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -4,7 +4,7 @@
AC.ui_interact(user, state = state)
/mob/living/carbon/human/proc/change_species(datum/species/new_species)
- if(!new_species || dna.species.type == new_species || !(initial(new_species.name) in all_species))
+ if(!new_species || dna.species.type == new_species || !ispath(new_species, /datum/species))
return FALSE
set_species(new_species, null, TRUE)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index d5ef581f4cb..64ecd8d2699 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -16,7 +16,7 @@
dna = new /datum/dna(null)
// Species name is handled by set_species()
- set_species(new_species, 1, delay_icon_update = 1)
+ set_species(new_species, 1, delay_icon_update = 1, skip_same_check = TRUE)
..()
@@ -1274,7 +1274,10 @@
else
to_chat(usr, "[self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].")
-/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE)
+/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE)
+ if(!skip_same_check)
+ if(dna.species.name == initial(new_species.name))
+ return
var/datum/species/oldspecies = dna.species
if(oldspecies)
@@ -1934,7 +1937,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
dna.deserialize(data["dna"])
real_name = dna.real_name
name = real_name
- set_species(dna.species)
+ set_species(dna.species.type, skip_same_check = TRUE)
age = data["age"]
undershirt = data["ushirt"]
underwear = data["uwear"]
diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm
index e88def0ebad..30451bc9562 100644
--- a/code/modules/mob/living/carbon/human/interactive/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm
@@ -208,8 +208,8 @@
var/datum/dna/toDoppel = chosen.dna
T.real_name = toDoppel.real_name
+ T.set_species(chosen.dna.species.type)
T.dna = toDoppel.Clone()
- T.set_species(chosen.dna.species)
T.body_accessory = chosen.body_accessory
T.UpdateAppearance()
domutcheck(T)
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index dea188e1eb7..880553a63bc 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -31,7 +31,8 @@
if(href_list["race"])
if(can_change(APPEARANCE_RACE) && (href_list["race"] in valid_species))
- if(owner.change_species(href_list["race"]))
+ var/datum/species/S = all_species[href_list["race"]]
+ if(owner.change_species(S.type))
cut_and_generate_data()
// Species change creates new organs - runtimes ahoy if we forget this
head_organ = owner.get_organ("head")
diff --git a/code/modules/vr/vr_controller.dm b/code/modules/vr/vr_controller.dm
index c0fc61be587..564291b2999 100644
--- a/code/modules/vr/vr_controller.dm
+++ b/code/modules/vr/vr_controller.dm
@@ -36,8 +36,8 @@ proc/build_virtual_avatar(mob/living/carbon/human/H, location, datum/map_templat
vr_avatar.real_me = V.real_me
else
vr_avatar.real_me = H
+ vr_avatar.set_species(H.dna.species.type)
vr_avatar.dna = H.dna.Clone()
- vr_avatar.set_species(H.dna.species)
vr_avatar.name = H.name
vr_avatar.real_name = H.real_name
vr_avatar.undershirt = H.undershirt