diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm index 9ab851e86bf..f340ff413aa 100644 --- a/code/game/dna/genes/vg_powers.dm +++ b/code/game/dna/genes/vg_powers.dm @@ -188,9 +188,19 @@ ..() block=REMOTETALKBLOCK +/datum/dna/gene/basic/grant_spell/remotetalk/activate(var/mob/user) + ..() + user.AddSpell(new /obj/effect/proc_holder/spell/targeted/mindscan(null)) + +/datum/dna/gene/basic/grant_spell/remotetalk/deactivate(var/mob/user) + ..() + for(var/obj/effect/proc_holder/spell/S in user.mob_spell_list) + if(istype(S, /obj/effect/proc_holder/spell/targeted/mindscan)) + user.RemoveSpell(S) + /obj/effect/proc_holder/spell/targeted/remotetalk name = "Project Mind" - desc = "Make people understand your thoughts at any range!" + desc = "Make people understand your thoughts!" charge_max = 0 clothes_req = 0 @@ -242,6 +252,83 @@ 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]") +/obj/effect/proc_holder/spell/targeted/mindscan + name = "Scan Mind" + desc = "Offer people a chance to share their thoughts!" + charge_max = 0 + clothes_req = 0 + stat_allowed = 0 + invocation_type = "none" + range = -2 + selection_type = "range" + action_icon_state = "genetic_mindscan" + 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 + + if(!validtargets.len) + 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 + + if(!targets.len || !targets[1]) //doesn't waste the spell + revert_cast(user) + return + + perform(targets, user = user) + +/obj/effect/proc_holder/spell/targeted/mindscan/cast(list/targets, mob/user = usr) + if(!ishuman(user)) return + for(var/mob/living/target in targets) + 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].") + target.show_message("[message]") + available_targets += target + addtimer(CALLBACK(src, .proc/removeAvailability, target), 100) + +/obj/effect/proc_holder/spell/targeted/mindscan/proc/removeAvailability(var/mob/living/target) + if(target in available_targets) + available_targets -= target + return + +/obj/effect/proc_holder/spell/targeted/mindscan/Topic(href, href_list) + var/mob/living/user + if(href_list["user"]) + user = locate(href_list["user"]) + if(href_list["target"]) + if(!user) + return + var/mob/living/target = locate(href_list["target"]) + if(!(target in available_targets)) + return + available_targets -= target + var/say = input("What do you wish to say") as text|null + if(!say) + return + say = strip_html(say) + say = pencode_to_html(say, target, format = 0, fields = 0) + + log_say("(TPATH to [key_name(target)]) [say]", user) + if(REMOTE_TALK in target.mutations) + target.show_message("You project your mind into [user.name]: [say]") + else + target.show_message("You fill the space in your thoughts: [say]") + user.show_message("You hear [target.name]'s voice: [say]") + for(var/mob/dead/observer/G in GLOB.player_list) + G.show_message("Telepathic response from [target] ([ghost_follow_link(target, ghost=G)]) to [user] ([ghost_follow_link(user, ghost=G)]): [say]") + /datum/dna/gene/basic/grant_spell/remoteview name="Remote Viewing" activation_messages=list("Your mind can see things from afar.") diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index 7bc556c628c..44fd328e6a2 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ