diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm
index 9092448e398..e08d35b681d 100644
--- a/code/game/dna/genes/vg_powers.dm
+++ b/code/game/dna/genes/vg_powers.dm
@@ -214,25 +214,21 @@
/obj/effect/proc_holder/spell/targeted/remotetalk/choose_targets(mob/user = usr)
var/list/targets = new /list()
- var/list/validtargets = new /list()
- var/turf/T = get_turf(user)
- for(var/mob/living/M in range(14, T))
- if(M && M.mind)
- if(M == user)
- continue
- validtargets += M
+ var/list/validtargets = user.get_telepathic_targets()
- if(!validtargets.len)
+ if(!length(validtargets))
to_chat(user, "There are no valid targets!")
start_recharge()
return
- targets += input("Choose the target to talk to.", "Targeting") as null|mob in validtargets
+ var/target_name = input("Choose the target to talk to.", "Targeting") as null|anything in validtargets
- if(!targets.len || !targets[1]) //doesn't waste the spell
+ var/mob/living/target
+ if(!target_name || !(target = validtargets[target_name]))
revert_cast(user)
return
+ targets += target
perform(targets, user = user)
/obj/effect/proc_holder/spell/targeted/remotetalk/cast(list/targets, mob/user = usr)
@@ -249,7 +245,7 @@
target.show_message("You hear [user.real_name]'s voice: [say]")
else
target.show_message("You hear a voice that seems to echo around the room: [say]")
- user.show_message("You project your mind into [target.name]: [say]")
+ user.show_message("You project your mind into [(target in user.get_visible_mobs()) ? target.name : "the unknown entity"]: [say]")
for(var/mob/dead/observer/G in GLOB.player_list)
G.show_message("Telepathic message from [user] ([ghost_follow_link(user, ghost=G)]) to [target] ([ghost_follow_link(target, ghost=G)]): [say]")
@@ -266,26 +262,22 @@
var/list/available_targets = list()
/obj/effect/proc_holder/spell/targeted/mindscan/choose_targets(mob/user = usr)
- var/list/targets = new /list()
- var/list/validtargets = new /list()
- var/turf/T = get_turf(user)
- for(var/mob/living/M in range(14, T))
- if(M && M.mind)
- if(M == user)
- continue
- validtargets += M
+ var/list/targets = list()
+ var/list/validtargets = user.get_telepathic_targets()
- if(!validtargets.len)
+ if(!length(validtargets))
to_chat(user, "There are no valid targets!")
start_recharge()
return
- targets += input("Choose the target to listen to.", "Targeting") as null|mob in validtargets
+ var/target_name = input("Choose the target to listen to.", "Targeting") as null|anything in validtargets
- if(!targets.len || !targets[1]) //doesn't waste the spell
+ var/mob/living/target
+ if(!target_name || !(target = validtargets[target_name]))
revert_cast(user)
return
+ targets += target
perform(targets, user = user)
/obj/effect/proc_holder/spell/targeted/mindscan/cast(list/targets, mob/user = usr)
@@ -295,7 +287,7 @@
var/message = "You feel your mind expand briefly... (Click to send a message.)"
if(REMOTE_TALK in target.mutations)
message = "You feel [user.real_name] request a response from you... (Click here to project mind.)"
- user.show_message("You offer your mind to [target.name].")
+ user.show_message("You offer your mind to [(target in user.get_visible_mobs()) ? target.name : "the unknown entity"].")
target.show_message("[message]")
available_targets += target
addtimer(CALLBACK(src, .proc/removeAvailability, target), 100)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 848606be3ec..4e4bd99e54d 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -478,6 +478,41 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
return 0 //Unsupported slot
//END HUMAN
+/mob/proc/get_visible_mobs()
+ var/list/seen_mobs = list()
+ for(var/mob/M in view(src))
+ seen_mobs += M
+
+ return seen_mobs
+
+/**
+ * Returns an assoc list which contains the mobs in range and their "visible" name.
+ * Mobs out of view but in range will be listed as unknown. Else they will have their visible name
+*/
+/mob/proc/get_telepathic_targets()
+ var/list/validtargets = new /list()
+ var/turf/T = get_turf(src)
+ var/list/mobs_in_view = get_visible_mobs()
+
+ for(var/mob/living/M in range(14, T))
+ if(M && M.mind)
+ if(M == src)
+ continue
+ var/mob_name
+ if(M in mobs_in_view)
+ mob_name = M.name
+ else
+ mob_name = "Unknown entity"
+ var/i = 0
+ var/result_name
+ do
+ result_name = mob_name
+ if(i++)
+ result_name += " ([i])" // Avoid dupes
+ while(validtargets[result_name])
+ validtargets[result_name] = M
+ return validtargets
+
// If you're looking for `reset_perspective`, that's a synonym for this proc.
/mob/proc/reset_perspective(atom/A)
if(client)