diff --git a/code/modules/mob/living/carbon/human/human_abilities.dm b/code/modules/mob/living/carbon/human/human_abilities.dm
index 2e24e0f3254b..ae5917664738 100644
--- a/code/modules/mob/living/carbon/human/human_abilities.dm
+++ b/code/modules/mob/living/carbon/human/human_abilities.dm
@@ -129,31 +129,56 @@
/datum/action/human_action/psychic_whisper
- name = "Psychic Whipser"
+ name = "Psychic Whisper"
action_icon_state = "cultist_channel_hivemind"
/datum/action/human_action/psychic_whisper/action_activate()
. = ..()
if(!ishuman(owner))
- return
+ return FALSE
var/mob/living/carbon/human/human_owner = owner
if(human_owner.client.prefs.muted & MUTE_IC)
to_chat(human_owner, SPAN_DANGER("You cannot whisper (muted)."))
- return
+ return FALSE
+
+ if(human_owner.stat == DEAD)
+ to_chat(human_owner, SPAN_WARNING("You cannot talk while dead."))
+ return FALSE
var/list/target_list = list()
for(var/mob/living/carbon/possible_target in view(7, human_owner))
- if(possible_target == human_owner || !possible_target.client)
+ if(possible_target == human_owner || !possible_target.client)
continue
target_list += possible_target
- var/mob/living/carbon/target_mob = tgui_input_list(human_owner, "Target", "Send a Psychic Whisper to whom?", target_list, theme = "hive_status")
- if(!target_mob)
- return
+ var/mob/living/carbon/target_mob = tgui_input_list(human_owner, "Target", "Send a Psychic Whisper to whom?", target_list, theme = "wizard")
+ if(!target_mob)
+ return FALSE
human_owner.psychic_whisper(target_mob)
+
+/datum/action/human_action/psychic_radiance
+ name = "Psychic Radiance"
+ action_icon_state = "cultist_channel_hivemind"
+
+/datum/action/xeno_action/onclick/psychic_radiance/use_ability(atom/A)
+ . = ..()
+ if(!ishuman(owner))
+ return FALSE
+ var/mob/living/carbon/human/human_owner = owner
+
+ if(human_owner.client.prefs.muted & MUTE_IC)
+ to_chat(human_owner, SPAN_DANGER("You cannot whisper (muted)."))
+ return FALSE
+
+ if(human_owner.stat == DEAD)
+ to_chat(human_owner, SPAN_WARNING("You cannot talk while dead."))
+ return FALSE
+
+ human_owner.psychic_radiance()
+
/*
CULT
*/
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 8daf9a7488d7..9ba7fc7c523b 100644
--- a/code/modules/mob/living/carbon/human/powers/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/powers/human_powers.dm
@@ -141,7 +141,7 @@
M.gib(create_cause_data("gutting", usr))
/mob/living/carbon/human/proc/commune()
- set category = "Abilities"
+ set category = "Abilities.Psychic"
set name = "Commune with creature"
set desc = "Send a telepathic message to an unlucky recipient."
@@ -181,15 +181,22 @@
/mob/living/carbon/human/proc/psychic_whisper(mob/target_mob as mob in oview())
set name = "Psychic Whisper"
set desc = "Whisper silently to someone over a distance."
- set category = "Abilities"
+ set category = "Abilities.Psychic"
+
+ if(stat == DEAD)
+ to_chat(src, SPAN_WARNING("You cannot talk while dead."))
+ return FALSE
- var/whisper = strip_html(input("Message:", "Psychic Whisper") as text|null)
+ var/whisper = tgui_input_text(src, "What do you wish to say?", "Psychic Whisper")
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... [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))
+ if(!istype(target_mob, /mob/living/carbon/xenomorph))
+ 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 [src] resonate in your head... \"[SPAN_PSYTALK(whisper)]\""))
+ to_chat(src, SPAN_XENOWARNING("You said: \"[whisper]\" to [target_mob]"))
+ FOR_DVIEW(var/mob/dead/observer/ghost, 12, src, SEE_INVISIBLE_OBSERVER)
+ if(!isobserver(ghost) || !ghost.client)
continue
if(ghost.client.prefs.toggles_chat & CHAT_GHOSTHIVEMIND)
var/rendered_message
@@ -197,7 +204,45 @@
var/target_track = "(F)"
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
+ return FALSE
+
+/mob/living/carbon/human/proc/psychic_radiance()
+ set name = "Psychic Radiance"
+ set desc = "Whisper silently to multiple people over a distance."
+ set category = "Abilities.Psychic"
+
+ if(stat == DEAD)
+ to_chat(src, SPAN_WARNING("You cannot talk while dead."))
+ return FALSE
+
+ var/whisper = tgui_input_text(src, "What do you wish to say?", "Psychic Radiance")
+ var/list/target_list = list()
+ if(!whisper)
+ return FALSE
+ FOR_DVIEW(var/mob/living/possible_target, 12, src, HIDE_INVISIBLE_OBSERVER)
+ if(possible_target == src || !possible_target.client)
+ 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... \"[SPAN_PSYTALK(whisper)]\""))
+ else
+ to_chat(possible_target, SPAN_XENOQUEEN("You hear the voice of [src] resonate in your head... \"[SPAN_PSYTALK(whisper)]\""))
+ FOR_DVIEW_END
+ if(!length(target_list))
+ to_chat(src, SPAN_XENOWARNING("There is no one around to hear you..."))
+ return FALSE
+ var/targetstring = english_list(target_list)
+ to_chat(src, SPAN_XENONOTICE("You said: \"[whisper]\" to [targetstring]"))
+ log_say("PsychicRadiance: [key_name(src)]->[targetstring] : [whisper] (AREA: [get_area_name(src)])")
+ FOR_DVIEW(var/mob/dead/observer/ghost, 12, src, SEE_INVISIBLE_OBSERVER)
+ if(!isobserver(ghost) || !ghost.client)
+ continue
+ if(ghost.client.prefs.toggles_chat & CHAT_GHOSTHIVEMIND)
+ var/rendered_message
+ var/human_track = "(F)"
+ rendered_message = SPAN_XENOLEADER("PsychicRadiance: [real_name][human_track] to [targetstring], '[SPAN_PSYTALK(whisper)]'")
+ ghost.show_message(rendered_message, SHOW_MESSAGE_AUDIBLE)
+ return TRUE
/mob/living/verb/lay_down()
set name = "Rest"
diff --git a/code/modules/mob/living/carbon/xenomorph/Abilities.dm b/code/modules/mob/living/carbon/xenomorph/Abilities.dm
index 35b532136f90..bb2a5ec65aeb 100644
--- a/code/modules/mob/living/carbon/xenomorph/Abilities.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Abilities.dm
@@ -206,7 +206,7 @@
if(!xeno_player.check_state(TRUE))
return
- var/whisper = strip_html(input("Message:", "Psychic Whisper") as text|null)
+ var/whisper = tgui_input_text(xeno_player, "What do you wish to say?", "Psychic Whisper")
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))
@@ -246,7 +246,7 @@
if(!xeno_player.check_state(TRUE))
return
var/list/target_list = list()
- var/whisper = strip_html(input("Message:", "Psychic Radiance") as text|null)
+ var/whisper = tgui_input_text(xeno_player, "What do you wish to say?", "Psychic Radiance")
if(!whisper || !xeno_player.check_state(TRUE))
return
FOR_DVIEW(var/mob/living/possible_target, 12, xeno_player, HIDE_INVISIBLE_OBSERVER)