diff --git a/code/_global_vars/mobs.dm b/code/_global_vars/mobs.dm
index 10d829904a..7e60dc71ea 100644
--- a/code/_global_vars/mobs.dm
+++ b/code/_global_vars/mobs.dm
@@ -5,3 +5,4 @@ GLOBAL_LIST_EMPTY(stealthminID)
GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client
GLOBAL_LIST_EMPTY(clients)
GLOBAL_LIST_EMPTY(players_by_zlevel)
+GLOBAL_LIST_EMPTY(round_text_log)
diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm
index 6644cc2efe..49cfefe1ee 100644
--- a/code/_helpers/logging.dm
+++ b/code/_helpers/logging.dm
@@ -48,7 +48,7 @@
/proc/log_access_in(client/new_client)
if (config.log_access)
- var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]"
+ var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]"
diary << "\[[time_stamp()]]ACCESS IN: [message][log_end]"
/proc/log_access_out(mob/last_mob)
@@ -60,26 +60,46 @@
if (config.log_say)
diary << "\[[time_stamp()]]SAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]"
+ //Log the message to in-game dialogue logs, as well.
+ if(speaker.client)
+ speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]"
+ GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]"
+
/proc/log_ooc(text, client/user)
if (config.log_ooc)
diary << "\[[time_stamp()]]OOC: [user.simple_info_line()]: [html_decode(text)][log_end]"
+ GLOB.round_text_log += "([time_stamp()]) ([user]) OOC: - [text]"
+
/proc/log_aooc(text, client/user)
if (config.log_ooc)
diary << "\[[time_stamp()]]AOOC: [user.simple_info_line()]: [html_decode(text)][log_end]"
+ GLOB.round_text_log += "([time_stamp()]) ([user]) AOOC: - [text]"
+
/proc/log_looc(text, client/user)
if (config.log_ooc)
diary << "\[[time_stamp()]]LOOC: [user.simple_info_line()]: [html_decode(text)][log_end]"
+ GLOB.round_text_log += "([time_stamp()]) ([user]) LOOC: - [text]"
+
/proc/log_whisper(text, mob/speaker)
if (config.log_whisper)
diary << "\[[time_stamp()]]WHISPER: [speaker.simple_info_line()]: [html_decode(text)][log_end]"
+ if(speaker.client)
+ speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]"
+ GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]"
+
+
/proc/log_emote(text, mob/speaker)
if (config.log_emote)
diary << "\[[time_stamp()]]EMOTE: [speaker.simple_info_line()]: [html_decode(text)][log_end]"
+ if(speaker.client)
+ speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) EMOTE: - [text]"
+ GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) EMOTE: - [text]"
+
/proc/log_attack(attacker, defender, message)
if (config.log_attack)
diary << "\[[time_stamp()]]ATTACK: [attacker] against [defender]: [message][log_end]"
@@ -100,6 +120,10 @@
if (config.log_say)
diary << "\[[time_stamp()]]DEADCHAT: [speaker.simple_info_line()]: [html_decode(text)][log_end]"
+ speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) DEADSAY: - [text]"
+ GLOB.round_text_log += "([time_stamp()]) ([src]/[speaker.client]) DEADSAY: - [text]"
+
+
/proc/log_ghostemote(text, mob/speaker)
if (config.log_emote)
diary << "\[[time_stamp()]]DEADEMOTE: [speaker.simple_info_line()]: [html_decode(text)][log_end]"
@@ -112,6 +136,10 @@
if (config.log_pda)
diary << "\[[time_stamp()]]PDA: [speaker.simple_info_line()]: [html_decode(text)][log_end]"
+ speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) MSG: - [text]"
+ GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) MSG: - [text]"
+
+
/proc/log_to_dd(text)
world.log << text //this comes before the config check because it can't possibly runtime
if(config.log_world_output)
@@ -201,7 +229,7 @@
if(include_link && is_special_character(M) && highlight_special_characters)
name = "[name]" //Orange
-
+
. += "/([name])"
return .
diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm
index f04bdf3b61..c1f5c67464 100644
--- a/code/modules/admin/admin_attack_log.dm
+++ b/code/modules/admin/admin_attack_log.dm
@@ -1,6 +1,7 @@
/mob/var/lastattacker = null
/mob/var/lastattacked = null
/mob/var/attack_log = list( )
+/mob/var/dialogue_log = list( )
proc/log_and_message_admins(var/message as text, var/mob/user = usr)
log_admin(user ? "[key_name(user)] [message]" : "EVENT [message]")
diff --git a/code/modules/admin/admin_tools.dm b/code/modules/admin/admin_tools.dm
new file mode 100644
index 0000000000..376aa2da44
--- /dev/null
+++ b/code/modules/admin/admin_tools.dm
@@ -0,0 +1,62 @@
+/client/proc/cmd_admin_check_player_logs(mob/living/M as mob in mob_list)
+ set category = "Admin"
+ set name = "Check Player Attack Logs"
+ set desc = "Check a player's attack logs."
+
+//Views specific attack logs belonging to one player.
+ var/dat = "[M]'s Attack Log:
"
+ dat += "Viewing attack logs of [M] - (Played by ([key_name(M)]).
"
+ if(M.mind)
+ dat += "Current Antag?: [(M.mind.special_role)?"Yes":"No"]
"
+ dat += "
Note: This is arranged from earliest to latest.
"
+
+
+ if(!isemptylist(M.attack_log))
+ dat += "