diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 9c41d21706..c0feab272c 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -71,14 +71,14 @@
for(var/spoken_memory in target.say_log)
if(recent_speech.len >= LING_ABSORB_RECENT_SPEECH)
break
- recent_speech += spoken_memory
+ recent_speech[spoken_memory] = target.say_log[spoken_memory]
if(recent_speech.len)
user.mind.store_memory("Some of [target]'s speech patterns, we should study these to better impersonate them!")
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]\"")
- user << "\"[spoken_memory]\""
+ user.mind.store_memory("\"[recent_speech[spoken_memory]]\"")
+ user << "\"[recent_speech[spoken_memory]]\""
user.mind.store_memory("We have no more knowledge of [target]'s speech patterns.")
user << "We have no more knowledge of [target]'s speech patterns."
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 1e31f0342a..bb7b35c48f 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -55,7 +55,7 @@
var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob.
- var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message"
+ var/list/say_log = list() //a log of what we've said, with a timestamp as the key for each message
var/bubble_icon = "default" //what icon the mob uses for speechbubbles
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index b108c7c47b..f580977738 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -98,8 +98,8 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
spans += get_spans()
- //Log of what we've said, plain message, no spans or junk
- say_log += message
+ //Log what we've said with an associated timestamp, using the list's len for safety/to prevent overwriting messages
+ say_log["[LAZYLEN(say_log) + 1]\[[time_stamp()]\]"] = message
var/message_range = 7
var/radio_return = radio(message, message_mode, spans)