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)