diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 1978df1ae4..8a3b7d075e 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -215,6 +215,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
var/list/absorbed_dna = list()
+ var/list/absorbed_species = list()
+ var/list/absorbed_languages = list()
var/absorbedcount = 0
var/chem_charges = 20
var/chem_recharge_rate = 0.5
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index fb01c76588..53b2c36ea8 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -1,5 +1,6 @@
//Restores our verbs. It will only restore verbs allowed during lesser (monkey) form if we are not human
/mob/proc/make_changeling()
+
if(!mind) return
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
verbs += /datum/changeling/proc/EvolutionMenu
@@ -23,6 +24,15 @@
src.verbs += P.verbpath
mind.changeling.absorbed_dna |= dna
+
+ var/mob/living/carbon/human/H = src
+ if(istype(H))
+ mind.changeling.absorbed_species += H.species.name
+
+ for(var/language in languages)
+ if(!(language in mind.changeling.absorbed_languages))
+ mind.changeling.absorbed_languages += language
+
return 1
//removes our changeling verbs
@@ -63,6 +73,54 @@
return changeling
+//Used to dump the languages from the changeling datum into the actual mob.
+/mob/proc/changeling_update_languages(var/updated_languages)
+
+ languages = list()
+ for(var/language in updated_languages)
+ languages += language
+
+ return
+
+//Used to switch species based on the changeling datum.
+/mob/proc/changeling_change_species()
+
+ set category = "Changeling"
+ set name = "Change Species (5)"
+
+ var/mob/living/carbon/human/H = src
+ if(!istype(H))
+ src << "We may only use this power while in humanoid form."
+ return
+
+ var/datum/changeling/changeling = changeling_power(5,1,0)
+ if(!changeling) return
+
+ if(changeling.absorbed_species.len < 2)
+ src << "We do not know of any other species genomes to use."
+ return
+
+ var/S = input("Select the target species: ", "Target Species", null) as null|anything in changeling.absorbed_species
+ if(!S) return
+
+ domutcheck(src, null)
+
+ changeling.chem_charges -= 5
+ changeling.geneticdamage = 30
+
+ src.visible_message("[src] transforms!")
+
+ src.verbs -= /mob/proc/changeling_change_species
+ spawn(10) src.verbs += /mob/proc/changeling_change_species
+
+ H.set_species(S)
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ feedback_add_details("changeling_powers","TR")
+
+ return 1
+
//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
//Doesn't cost anything as it's the most basic ability.
/mob/proc/changeling_absorb_dna()
@@ -82,6 +140,10 @@
src << "[T] is not compatible with our biology."
return
+ if(T.species.flags & NO_SCAN)
+ src << "We do not know how to parse this creature's DNA!"
+ return
+
if(NOCLONE in T.mutations)
src << "This creature's DNA is ruined beyond useability!"
return
@@ -127,6 +189,17 @@
changeling.chem_charges += 10
changeling.geneticpoints += 2
+ //Steal all of their languages!
+ for(var/language in T.languages)
+ if(!(language in changeling.absorbed_languages))
+ changeling.absorbed_languages += language
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ //Steal their species!
+ if(T.species && !(T.species.name in changeling.absorbed_species))
+ changeling.absorbed_species += T.species.name
+
if(T.mind && T.mind.changeling)
if(T.mind.changeling.absorbed_dna)
for(var/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
@@ -260,6 +333,8 @@
O.make_changeling(1)
O.verbs += /mob/proc/changeling_lesser_transform
+ O.changeling_update_languages(changeling.absorbed_languages)
+
feedback_add_details("changeling_powers","LF")
del(C)
return 1
@@ -344,6 +419,7 @@
C.mind.transfer_to(O)
O.make_changeling()
+ O.changeling_update_languages(changeling.absorbed_languages)
feedback_add_details("changeling_powers","LFT")
del(C)
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 9d1d94adf3..5048977789 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -26,6 +26,12 @@ var/list/datum/power/changeling/powerinstances = list()
genomecost = 0
verbpath = /mob/proc/changeling_transform
+/datum/power/changeling/change_species
+ name = "Change Species"
+ desc = "We take on the apperance of a species that we have absorbed."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_change_species
+
/datum/power/changeling/fakedeath
name = "Regenerative Stasis"
desc = "We become weakened to a death-like state, where we will rise again from death."