diff --git a/code/modules/mob/living/carbon/human/powers/human_powers.dm b/code/modules/mob/living/carbon/human/powers/human_powers.dm
index fef87c2f3263..8daf9a7488d7 100644
--- a/code/modules/mob/living/carbon/human/powers/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/powers/human_powers.dm
@@ -186,7 +186,7 @@
var/whisper = strip_html(input("Message:", "Psychic Whisper") as text|null)
if(whisper)
log_say("PsychicWhisper: [key_name(src)]->[target_mob.key] : [whisper] (AREA: [get_area_name(loc)])")
- to_chat(target_mob, SPAN_XENOWARNING(" You hear a strange, alien voice in your head... [whisper]"))
+ to_chat(target_mob, SPAN_XENOWARNING(" You hear a strange, alien voice in your head... [SPAN_PSYTALK(whisper)]"))
to_chat(src, SPAN_XENOWARNING(" You said: \"[whisper]\" to [target_mob]"))
for (var/mob/dead/observer/ghost as anything in GLOB.observer_list)
if(!ghost.client || isnewplayer(ghost))
@@ -195,7 +195,7 @@
var/rendered_message
var/human_track = "(F)"
var/target_track = "(F)"
- rendered_message = SPAN_XENOLEADER("PsychicWhisper: [real_name][human_track] to [target_mob.real_name][target_track], '[whisper]'")
+ rendered_message = SPAN_XENOLEADER("PsychicWhisper: [real_name][human_track] to [target_mob.real_name][target_track], '[SPAN_PSYTALK(whisper)]'")
ghost.show_message(rendered_message, SHOW_MESSAGE_AUDIBLE)
return
diff --git a/code/modules/mob/living/carbon/xenomorph/Abilities.dm b/code/modules/mob/living/carbon/xenomorph/Abilities.dm
index 6c220f41ad45..35b532136f90 100644
--- a/code/modules/mob/living/carbon/xenomorph/Abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Abilities.dm
@@ -210,9 +210,9 @@
if(whisper)
log_say("PsychicWhisper: [key_name(xeno_player)]->[target_mob.key] : [whisper] (AREA: [get_area_name(target_mob)])")
if(!istype(target_mob, /mob/living/carbon/xenomorph))
- to_chat(target_mob, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[whisper]\""))
+ to_chat(target_mob, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[SPAN_PSYTALK(whisper)]\""))
else
- to_chat(target_mob, SPAN_XENOQUEEN("You hear the voice of [xeno_player] resonate in your head. \"[whisper]\""))
+ to_chat(target_mob, SPAN_XENOQUEEN("You hear the voice of [xeno_player] resonate in your head. \"[SPAN_PSYTALK(whisper)]\""))
to_chat(xeno_player, SPAN_XENONOTICE("You said: \"[whisper]\" to [target_mob]"))
for(var/mob/dead/observer/ghost as anything in GLOB.observer_list)
@@ -222,7 +222,7 @@
var/rendered_message
var/xeno_track = "(F)"
var/target_track = "(F)"
- rendered_message = SPAN_XENOLEADER("PsychicWhisper: [xeno_player.real_name][xeno_track] to [target_mob.real_name][target_track], '[whisper]'")
+ rendered_message = SPAN_XENOLEADER("PsychicWhisper: [xeno_player.real_name][xeno_track] to [target_mob.real_name][target_track], '[SPAN_PSYTALK(whisper)]'")
ghost.show_message(rendered_message, SHOW_MESSAGE_AUDIBLE)
return ..()
@@ -254,9 +254,9 @@
continue
target_list += possible_target
if(!istype(possible_target, /mob/living/carbon/xenomorph))
- to_chat(possible_target, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[whisper]\""))
+ to_chat(possible_target, SPAN_XENOQUEEN("You hear a strange, alien voice in your head. \"[SPAN_PSYTALK(whisper)]\""))
else
- to_chat(possible_target, SPAN_XENOQUEEN("You hear the voice of [xeno_player] resonate in your head. \"[whisper]\""))
+ to_chat(possible_target, SPAN_XENOQUEEN("You hear the voice of [xeno_player] resonate in your head. \"[SPAN_PSYTALK(whisper)]\""))
FOR_DVIEW_END
if(!length(target_list))
return
@@ -269,7 +269,7 @@
if(ghost.client.prefs.toggles_chat & CHAT_GHOSTHIVEMIND)
var/rendered_message
var/xeno_track = "(F)"
- rendered_message = SPAN_XENOLEADER("PsychicRadiance: [xeno_player.real_name][xeno_track] to [targetstring], '[whisper]'")
+ rendered_message = SPAN_XENOLEADER("PsychicRadiance: [xeno_player.real_name][xeno_track] to [targetstring], '[SPAN_PSYTALK(whisper)]'")
ghost.show_message(rendered_message, SHOW_MESSAGE_AUDIBLE)
return ..()
diff --git a/code/span_macros.dm b/code/span_macros.dm
index 218f333d7df9..f0d78bba617e 100644
--- a/code/span_macros.dm
+++ b/code/span_macros.dm
@@ -19,6 +19,8 @@
#define SPAN_XENOWARNING(X) "[X]"
#define SPAN_XENOMINORWARNING(X) "[X]"
+#define SPAN_PSYTALK(X) "[X]"
+
// Yautja related
#define SPAN_YAUTJABOLD(X) "[X]"
#define SPAN_YAUTJABOLDBIG(X) "[X]"
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index 145229e23424..8104be1f57e5 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -123,6 +123,8 @@ h1.alert, h2.alert {color: #000000;}
.xeno {color: #900090; font-style: italic;}
.xenoleader {color: #730d73; font-style: italic; font-size: 3;}
.xenoqueen {color: #730d73; font-style: italic; font-weight: bold; font-size: 3;}
+.psy_talk {color: #a70090; font-style: italic; font-weight: bold; font-size: 3;}
+
.newscaster {color: #800000;}
.role_header {color: #db0000 text-align: center; font-weight: bold; font-family: trebuchet-ms; font-size: 2;}
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
index 5ea797fe2230..a430d06b7a00 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss
@@ -1449,6 +1449,14 @@ em {
animation: glitch 0.5s infinite;
}
+.psy_talk {
+ color: #c400aa;
+ font-weight: bold;
+
+ /*Animation*/
+ animation: psy_glitch 0.5s infinite;
+}
+
/*Keyframes*/
@keyframes glitch {
@@ -1473,6 +1481,28 @@ em {
}
}
+@keyframes psy_glitch {
+ 25% {
+ color: #c400aa;
+ transform: translate(-2px, -1px);
+ }
+
+ 50% {
+ color: #91007d;
+ transform: translate(1px, -2px);
+ }
+
+ 75% {
+ color: #750066;
+ transform: translate(-1px, 2px);
+ }
+
+ 100% {
+ color: #7c016c;
+ transform: translate(1px, 1px);
+ }
+}
+
.examine_block {
background: #1b1c1e;
border: 1px solid #a4bad6;
diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
index 87beb202a5ae..23ea05b1c9c1 100644
--- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss
@@ -1471,6 +1471,14 @@ h2.alert {
animation: glitch 0.5s infinite;
}
+.psy_talk {
+ color: #a70090;
+ font-weight: bold;
+
+ /*Animation*/
+ animation: psy_glitch 0.5s infinite;
+}
+
/*Keyframes*/
@keyframes glitch {
@@ -1495,6 +1503,28 @@ h2.alert {
}
}
+@keyframes psy_glitch {
+ 25% {
+ color: #a70090;
+ transform: translate(-2px, -1px);
+ }
+
+ 50% {
+ color: #91007d;
+ transform: translate(1px, -2px);
+ }
+
+ 75% {
+ color: #750066;
+ transform: translate(-1px, 2px);
+ }
+
+ 100% {
+ color: #7c016c;
+ transform: translate(1px, 1px);
+ }
+}
+
.examine_block {
background: #f2f7fa;
border: 1px solid #111a27;