diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index be744b53c34..41fdf4a2ad0 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -105,11 +105,13 @@
/datum/mind/proc/wipe_memory()
memory = null
-/datum/mind/proc/show_memory(mob/recipient)
- var/output = "[current.real_name]'s Memory
"
+/datum/mind/proc/show_memory(mob/recipient, window=1)
+ if(!recipient)
+ recipient = current
+ var/output = "[current.real_name]'s Memories:
"
output += memory
- if(objectives.len>0)
+ if(objectives.len)
output += "
Objectives:"
var/obj_count = 1
@@ -117,7 +119,7 @@
output += "Objective #[obj_count]: [objective.explanation_text]"
obj_count++
- if(job_objectives.len>0)
+ if(job_objectives.len)
output += "
Job Objectives:"
var/obj_count = 1
@@ -125,8 +127,10 @@
output += "- Task #[obj_count]: [objective.get_description()]
"
obj_count++
output += "
"
-
- recipient << browse(output,"window=memory")
+ if(window)
+ recipient << browse(output,"window=memory")
+ else
+ to_chat(recipient, "[output]")
/datum/mind/proc/edit_memory()
if(!ticker || !ticker.mode)
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 57b69358f6b..06402a584b7 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -1,3 +1,5 @@
+#define LING_ABSORB_RECENT_SPEECH 8 //The amount of recent spoken lines to gain on absorbing a mob
+
/obj/effect/proc_holder/changeling/absorbDNA
name = "Absorb DNA"
desc = "Absorb the DNA of our victim."
@@ -26,8 +28,6 @@
var/mob/living/carbon/target = G.affecting
return changeling.can_absorb_dna(user,target)
-
-
/obj/effect/proc_holder/changeling/absorbDNA/sting_action(var/mob/user)
var/datum/changeling/changeling = user.mind.changeling
var/obj/item/weapon/grab/G = user.get_active_hand()
@@ -63,7 +63,25 @@
if(target.mind)//if the victim has got a mind
- target.mind.show_memory(src, 0) //I can read your mind, kekeke. Output all their notes.
+ target.mind.show_memory(user, 0) //I can read your mind, kekeke. Output all their notes.
+
+ //Some of target's recent speech, so the changeling can attempt to imitate them better.
+ //Recent as opposed to all because rounds tend to have a LOT of text.
+ var/list/recent_speech = list()
+
+ if(target.say_log.len > LING_ABSORB_RECENT_SPEECH)
+ recent_speech = target.say_log.Copy(target.say_log.len-LING_ABSORB_RECENT_SPEECH+1,0) //0 so len-LING_ARS+1 to end of list
+ else
+ recent_speech = target.say_log.Copy()
+
+ if(recent_speech.len)
+ user.mind.store_memory("Some of [target]'s speech patterns, we should study these to better impersonate them!")
+ to_chat(user, "Some of [target]'s speech patterns, we should study these to better impersonate them!")
+ for(var/spoken_memory in recent_speech)
+ user.mind.store_memory("\"[spoken_memory]\"")
+ to_chat(user, "\"[spoken_memory]\"")
+ user.mind.store_memory("We have no more knowledge of [target]'s speech patterns.")
+ to_chat(user, "We have no more knowledge of [target]'s speech patterns.")
if(target.mind.changeling)//If the target was a changeling, suck out their extra juice and objective points!
changeling.chem_charges += min(target.mind.changeling.chem_charges, changeling.chem_storage)
@@ -72,7 +90,6 @@
target.mind.changeling.absorbed_dna.len = 1
target.mind.changeling.absorbedcount = 0
-
changeling.chem_charges=min(changeling.chem_charges+10, changeling.chem_storage)
changeling.isabsorbing = 0
@@ -82,8 +99,6 @@
target.Drain()
return 1
-
-
//Absorbs the target DNA.
/datum/changeling/proc/absorb_dna(mob/living/carbon/T, var/mob/user)
T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
@@ -104,3 +119,5 @@
return
absorbed_dna |= new_dna
trim_dna()
+
+#undef LING_ABSORB_RECENT_SPEECH
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 66aa234e2ca..e1488648731 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -52,5 +52,7 @@
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
var/gene_stability = DEFAULT_GENE_STABILITY
-
+
var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override
+
+ var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message"
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index b0f42e9a8cb..1e34b43e583 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -149,7 +149,7 @@ proc/get_radio_key_from_channel(var/channel)
if(speaking && (speaking.flags & HIVEMIND))
speaking.broadcast(src,trim(message))
return 1
-
+
if(message_mode == "cords")
if(iscarbon(src))
var/mob/living/carbon/C = src
@@ -282,6 +282,9 @@ proc/get_radio_key_from_channel(var/channel)
if(O) //It's possible that it could be deleted in the meantime.
O.hear_talk(src, message, verb, speaking)
+ //Log of what we've said, plain message, no spans or junk
+ say_log += message
+
log_say("[name]/[key] : [message]")
return 1