diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm
index 1f17abbae1c..3959f6cb32c 100644
--- a/code/datums/emotes.dm
+++ b/code/datums/emotes.dm
@@ -64,6 +64,7 @@ var/global/list/emote_list = list()
else
user.visible_message(msg)
log_emote("[key_name(user)] : [msg]")
+ user.emote_log += "\[[time_stamp()]\] [msg]"
/datum/emote/proc/select_message_type(mob/user)
. = message
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 24ee7c1ae33..fb926931192 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -82,7 +82,8 @@ var/global/BSACooldown = 0
body += "
"
body += "Traitor panel | "
body += "Narrate to | "
- body += "Subtle message"
+ body += "Subtle message | "
+ body += "Individual Round Logs"
if (M.client)
if(!isnewplayer(M))
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 389ed32aff9..7c4270b4eba 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1820,6 +1820,17 @@
var/mob/M = locate(href_list["subtlemessage"])
usr.client.cmd_admin_subtle_message(M)
+ else if(href_list["individuallog"])
+ if(!check_rights(R_ADMIN))
+ return
+
+ var/mob/M = locate(href_list["individuallog"]) in mob_list
+ if(!ismob(M))
+ usr << "This can only be used on instances of type /mob."
+ return
+
+ show_individual_logging_panel(M, href_list["log_type"])
+
else if(href_list["traitor"])
if(!check_rights(R_ADMIN))
return
diff --git a/code/modules/admin/verbs/indidivual_loggings.dm b/code/modules/admin/verbs/indidivual_loggings.dm
new file mode 100644
index 00000000000..3bdfd54e66d
--- /dev/null
+++ b/code/modules/admin/verbs/indidivual_loggings.dm
@@ -0,0 +1,30 @@
+/proc/show_individual_logging_panel(mob/M, type = "attack")
+ if(!M || !ismob(M))
+ return
+ var/dat = "
Attack log | "
+ dat += "Say log | "
+ dat += "Emote log | "
+ dat += "OOC log | "
+ dat += "Refresh"
+
+ dat += "
"
+
+ switch(type)
+ if("attack")
+ dat += "Attack logs of [key_name(M)]
"
+ for(var/entry in M.attack_log)
+ dat += "[entry]
"
+ if("say")
+ dat += "Say logs of [key_name(M)]
"
+ for(var/entry in M.say_log)
+ dat += "[entry] [M.say_log[entry]]
"
+ if("emote")
+ dat += "Emote logs of [key_name(M)]
"
+ for(var/entry in M.emote_log)
+ dat += "[entry]
"
+ if("ooc")
+ dat += "OOC logs of [key_name(M)]
"
+ for(var/entry in M.ooc_log)
+ dat += "[entry]
"
+
+ usr << browse(dat, "window=invidual_logging;size=600x480")
\ No newline at end of file
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index bbbf67e9fe2..adaff6db0fb 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -52,6 +52,7 @@
return
log_ooc("[mob.name]/[key] : [raw_msg]")
+ mob.ooc_log += "\[[time_stamp()]\] [raw_msg]"
var/keyname = key
if(prefs.unlock_content)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 3d95b2bb756..3caabec5ff9 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -54,8 +54,6 @@
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, with a timestamp as the key for each message
-
var/bubble_icon = "default" //what icon the mob uses for speechbubbles
var/last_bumped = 0
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index b00302473dd..94dddb381aa 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -26,7 +26,10 @@
var/computer_id = null
var/lastattacker = null
var/lastattacked = null
- var/attack_log = list( )
+ var/list/attack_log = list()
+ var/list/say_log = list() //a log of what we've said, with a timestamp as the key for each message
+ var/list/ooc_log = list()
+ var/list/emote_log = list()
var/obj/machinery/machine = null
var/other_mobs = null
var/disabilities = 0 //Carbon
diff --git a/tgstation.dme b/tgstation.dme
index 036930f50ce..e0e5dcba18a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -14,7 +14,7 @@
// BEGIN_INCLUDE
#include "_maps\__MAP_DEFINES.dm"
-#include "_maps\tgstation2.dm"
+#include "_maps\runtimestation.dm"
#include "code\_compile_options.dm"
#include "code\world.dm"
#include "code\__DATASTRUCTURES\heap.dm"
@@ -974,6 +974,7 @@
#include "code\modules\admin\verbs\diagnostics.dm"
#include "code\modules\admin\verbs\fps.dm"
#include "code\modules\admin\verbs\getlogs.dm"
+#include "code\modules\admin\verbs\indidivual_loggings.dm"
#include "code\modules\admin\verbs\machine_upgrade.dm"
#include "code\modules\admin\verbs\manipulate_organs.dm"
#include "code\modules\admin\verbs\map_template_loadverb.dm"