/singleton/psionic_power/commune
name = "Commune"
desc = "Psionically commune with the target. Use on an adjacent object to store a mental image for sending. Use in hand with a mental image to warp and add to its description, or clear a warped one."
icon_state = "tech_audibledeception"
point_cost = 0
ability_flags = PSI_FLAG_FOUNDATIONAL
spell_path = /obj/item/spell/commune
/obj/item/spell/commune
name = "commune"
desc = "Déjà-vu."
icon_state = "overload"
item_icons = null
cast_methods = CAST_RANGED|CAST_MELEE|CAST_USE
aspect = ASPECT_PSIONIC
cooldown = 10
psi_cost = 15
//For shared/remote-examine Communes, similar to Show-Held-Object
var/object
var/note //desc
var/image //chat icon
var/warpdesc //Custom text added right after normal note desc
/obj/item/spell/commune/Destroy()
object = null
return ..()
/obj/item/spell/commune/on_use_cast(mob/user)
. = ..()
if(warpdesc)
warpdesc = null
to_chat(user, SPAN_NOTICE("You rein back to your initial mental image of \the [object], clearing the warped additions."))
else if(warpdesc == null && (object))
warpdesc = tgui_input_text(user, "How would you warp the mental image of \the [object]? This will only add to its existing description, never override or delete.", "Warp Mental Image", "", MAX_MESSAGE_LEN, TRUE)
if(!warpdesc)
warpdesc = null
return
to_chat(user, SPAN_NOTICE("You rethink your mental image of \the [object], warping in additions to its details."))
else return
/obj/item/spell/commune/on_melee_cast(atom/hit_atom, mob/living/user, def_zone)
. = ..()
if(!.)
return
if(object)
to_chat(user, SPAN_NOTICE("You already have a mental image in mind of \the [object]."))
return
else if(isobj(hit_atom) && !object)
object = "[hit_atom.name]" //Save a snapshot of its info so they don't auto-update.
note = ("[hit_atom.desc]" + " [hit_atom.desc_feedback]")
image = icon2html(hit_atom, user)
to_chat(user, SPAN_NOTICE("You note and refine a mental image of \the [object] for sending."))
/obj/item/spell/commune/on_ranged_cast(atom/hit_atom, mob/user)
. = ..()
if(!.)
return
commune(hit_atom, user)
/obj/item/spell/commune/proc/commune(atom/hit_atom, mob/user)
if(!isliving(hit_atom))
return
var/mob/living/target = hit_atom
if(target.stat == DEAD)
to_chat(user, SPAN_WARNING("Not even a psion of your level can speak to the dead."))
return
var/psi_blocked = target.is_psi_blocked(user, FALSE)
if(psi_blocked)
to_chat(user, psi_blocked)
return
//Checks psi-sensitivity for remote item examines, because normal Commune gets blocked
if(object)
to_chat(user, SPAN_CULT("You psionically project to [target]: [image] [object]\n[note]" + " [warpdesc]"))
var/mob/living/carbon/human/T = target
var/target_sensitivity = T.check_psi_sensitivity()
if(target_sensitivity >= 1) //Small detail, psions can subtly tell apart warped descriptions easier with the new line.
to_chat(T, SPAN_NOTICE("[user] blinks, their eyes briefly developing an unnatural shine."))
to_chat(T, SPAN_CULT("What must be [user]'s mental image of \a [image] [object] appears in your mind.\n[note]\n[warpdesc]"))
else if(target_sensitivity >= 0) //Info span so it feels like an actual examine at a glance
to_chat(T, SPAN_INFO("A mental image of \a [image] [object] suddenly builds in your mind.\n[note]" + " [warpdesc]"))
else //60% chance low-targets don't even get the icon. 35% (per point) of the object's name is scrambled, but base desc can still clue the item
var/scrmbldobject = stars(object, (abs(target_sensitivity) * 35))
var/scrmbldnote = stars(note, (abs(target_sensitivity) * 25))
var/scrmbldwarp = stars(warpdesc, (abs(target_sensitivity) * 45)) //Warped descriptions are even more abnormal, so extra scrambled
to_chat(T, SPAN_ALIEN("A mental image of \a [prob(40)?"[image] ":""][scrmbldobject] attempts to form in your mind.\n[scrmbldnote]" + " [scrmbldwarp]"))
log_say("[key_name(user)] communed to [key_name(target)]: [image] [object]\n[note]" + " [warpdesc]")
for(var/mob/M as anything in GLOB.player_list)
if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS)
to_chat(M, "[user] psionically says to [target]: [image] [object]\n[note]" + " [warpdesc]")
return
var/text = tgui_input_text(user, "What would you like to say?", "Commune", "", MAX_MESSAGE_LEN, TRUE)
if(!text)
return
text = formalize_text(text)
if(target.stat == DEAD)
to_chat(user, SPAN_WARNING("Not even a psion of your level can speak to the dead."))
return
log_say("[key_name(user)] communed to [key_name(target)]: [text]")
to_chat(user, SPAN_CULT("You psionically say to [target]: [text]"))
for (var/mob/M in GLOB.player_list)
if (istype(M, /mob/abstract/new_player))
continue
else if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS)
to_chat(M, "[user] psionically says to [target]: [text]")
var/mob/living/carbon/human/H = target
var/target_sensitivity = H.check_psi_sensitivity()
if(target_sensitivity >= 1)
// Augmented case for anyone with enhancements to their psi-sensitivity.
to_chat(H, SPAN_NOTICE("[user] blinks, their eyes briefly developing an unnatural shine."))
to_chat(H, SPAN_CULT("You instinctively sense [user] passing a thought into your mind: [text]"))
else if (target_sensitivity >= 0)
// Standard case for most characters.
to_chat(H, SPAN_ALIEN("A thought from outside your consciousness slips into your mind: [text]"))
else
// Negative sensitivity case, message arrives scrambled.
// 25% of the message is scrambled per negative point of psi-sensitivity. Allowing fractional points.
var/scrambled_message = stars(text, (abs(target_sensitivity) * 25))
to_chat(H, SPAN_ALIEN("A half-formed thought passes through your mind: [scrambled_message]"))