#define SUBTLE_DEFAULT_DISTANCE world.view
#define SUBTLE_ONE_TILE 1
#define SUBTLE_SAME_TILE_DISTANCE 0
#define SUBTLER_TELEKINESIS_DISTANCE 7
#define SUBTLE_ONE_TILE_TEXT "1-Tile Range"
#define SUBTLE_SAME_TILE_TEXT "Same Tile"
#define PORTAL_ONE_TILE_TEXT "Portal 1-Tile Range"
#define PORTAL_SAME_TILE_TEXT "Portal Tile"
/datum/emote/living/subtle
key = "subtle"
message = null
mob_type_blacklist_typecache = list(/mob/living/brain)
/datum/emote/living/subtle/run_emote(mob/user, params, type_override = null)
if(!can_run_emote(user))
to_chat(user, span_warning("You can't emote at this time."))
return FALSE
var/subtle_message
var/subtle_emote = params
if(SSdbcore.IsConnected() && is_banned_from(user, "emote"))
to_chat(user, "You cannot send subtle emotes (banned).")
return FALSE
else if(user.client?.prefs.muted & MUTE_IC)
to_chat(user, "You cannot send IC messages (muted).")
return FALSE
else if(!params)
subtle_emote = tgui_input_text(user, "Choose an emote to display.", "Subtle", null, MAX_MESSAGE_LEN, TRUE)
if(!subtle_emote)
return FALSE
subtle_message = subtle_emote
else
subtle_message = params
if(type_override)
emote_type = type_override
if(!can_run_emote(user))
to_chat(user, span_warning("You can't emote at this time."))
return FALSE
user.log_message(subtle_message, LOG_SUBTLE)
var/space = should_have_space_before_emote(html_decode(subtle_emote)[1]) ? " " : ""
subtle_message = span_subtle("[user][space][user.apply_message_emphasis(subtle_message)]")
var/list/viewers = get_hearers_in_view(SUBTLE_ONE_TILE, user)
var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user]
if(hologram)
viewers |= get_hearers_in_view(SUBTLE_ONE_TILE, hologram)
for(var/obj/effect/overlay/holo_pad_hologram/iterating_hologram in viewers)
if(iterating_hologram?.Impersonation?.client)
viewers |= iterating_hologram.Impersonation
for(var/mob/ghost as anything in GLOB.dead_mob_list)
if((ghost.client?.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(ghost in viewers))
to_chat(ghost, "[FOLLOW_LINK(ghost, user)] [subtle_message]")
for(var/mob/receiver in viewers)
receiver.show_message(subtle_message, alt_msg = subtle_message)
// Optional sound notification
if(!isobserver(receiver))
var/datum/preferences/prefs = receiver.client?.prefs
if(prefs && prefs.read_preference(/datum/preference/toggle/subtler_sound))
receiver.playsound_local(get_turf(receiver), 'sound/effects/achievement/glockenspiel_ping.ogg', 50)
return TRUE
/*
* SUBTLE 2: NO GHOST BOOGALOO
*/
/datum/emote/living/subtler
key = "subtler"
message = null
mob_type_blacklist_typecache = list(/mob/living/brain)
/datum/emote/living/subtler/run_emote(mob/user, params, type_override = null)
if(!can_run_emote(user))
to_chat(user, span_warning("You can't emote at this time."))
return FALSE
var/subtler_message
var/subtler_emote = params
var/target
var/subtler_range = SUBTLE_DEFAULT_DISTANCE
if(SSdbcore.IsConnected() && is_banned_from(user, "emote"))
to_chat(user, span_warning("You cannot send subtle emotes (banned)."))
return FALSE
else if(user.client?.prefs.muted & MUTE_IC)
to_chat(user, span_warning("You cannot send IC messages (muted)."))
return FALSE
else if(!subtler_emote)
subtler_emote = tgui_input_text(user, "Choose an emote to display.", "Subtler Anti-Ghost" , null, MAX_MESSAGE_LEN, TRUE)
if(!subtler_emote)
return FALSE
var/list/in_view = get_hearers_in_view(subtler_range, user)
var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user]
if(hologram)
in_view |= get_hearers_in_view(subtler_range, hologram)
in_view -= GLOB.dead_mob_list
in_view.Remove(user)
for(var/mob/mob in in_view) // Filters out the AI eye and clientless mobs.
if(istype(mob, /mob/eye/camera/ai))
continue
if(mob.client)
continue
in_view.Remove(mob)
var/list/targets = list(SUBTLE_ONE_TILE_TEXT, SUBTLE_SAME_TILE_TEXT) + in_view
var/obj/structure/lewd_portal/portal = user?.buckled
if(istype(portal, /obj/structure/lewd_portal))
targets.Insert(1, PORTAL_ONE_TILE_TEXT, PORTAL_SAME_TILE_TEXT)
target = tgui_input_list(user, "Pick a target", "Target Selection", targets)
if(!target)
return FALSE
switch(target)
if(SUBTLE_ONE_TILE_TEXT)
target = SUBTLE_ONE_TILE
if(SUBTLE_SAME_TILE_TEXT)
target = SUBTLE_SAME_TILE_DISTANCE
subtler_message = subtler_emote
else
target = SUBTLE_DEFAULT_DISTANCE
subtler_message = subtler_emote
if(type_override)
emote_type = type_override
if(!can_run_emote(user))
to_chat(user, span_warning("You can't emote at this time."))
return FALSE
user.log_message(subtler_message, LOG_SUBTLER)
var/space = should_have_space_before_emote(html_decode(subtler_emote)[1]) ? " " : ""
subtler_message = span_subtler("[user][space][user.apply_message_emphasis(subtler_message)]")
if(istype(target, /mob))
var/mob/target_mob = target
user.show_message(subtler_message, alt_msg = subtler_message)
var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user]
if((get_dist(user.loc, target_mob.loc) <= subtler_range) || (hologram && get_dist(hologram.loc, target_mob.loc) <= subtler_range))
target_mob.show_message(subtler_message, alt_msg = subtler_message)
subtler_sound(target_mob)
else
to_chat(user, span_warning("Your emote was unable to be sent to your target: Too far away."))
else if(istype(target, /obj/effect/overlay/holo_pad_hologram))
var/obj/effect/overlay/holo_pad_hologram/hologram = target
if(hologram.Impersonation?.client)
hologram.Impersonation.show_message(subtler_message, alt_msg = subtler_message)
subtler_sound(hologram.Impersonation)
else if(istype(target, /obj/lewd_portal_relay)) //Direct Message to a portal user
var/obj/lewd_portal_relay/portal_relay = target
user.show_message(subtler_message, alt_msg = subtler_message)
if(portal_relay.owner?.client)
subtler_message = span_subtler("Unknown[space][user.apply_message_emphasis(subtler_emote)]")
portal_relay.owner.show_message(subtler_message, alt_msg = subtler_message)
subtler_sound(portal_relay.owner)
else
var/ghostless
if(target == PORTAL_SAME_TILE_TEXT || target == PORTAL_ONE_TILE_TEXT)
switch(target)
if(PORTAL_ONE_TILE_TEXT)
target = SUBTLE_ONE_TILE
if(PORTAL_SAME_TILE_TEXT)
target = SUBTLE_SAME_TILE_DISTANCE
var/obj/structure/lewd_portal/portal_reference = user.buckled
var/obj/lewd_portal_relay/output_portal = portal_reference?.relayed_body
ghostless = get_hearers_in_view(target, output_portal) //Broadcast message through portal
user.show_message(subtler_message, alt_msg = subtler_message)
subtler_message = span_subtler("[output_portal][space][user.apply_message_emphasis(subtler_emote)]")
else
ghostless = get_hearers_in_view(target, user) - GLOB.dead_mob_list
var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user]
if(hologram)
ghostless |= get_hearers_in_view(target, hologram)
for(var/obj/effect/overlay/holo_pad_hologram/holo in ghostless)
if(holo?.Impersonation?.client)
ghostless |= holo.Impersonation
for(var/mob/receiver in ghostless)
receiver.show_message(subtler_message, alt_msg = subtler_message)
// Optional sound notification
subtler_sound(receiver)
for(var/obj/lewd_portal_relay/portal in ghostless) //Message portal owners caught in range
if(portal?.owner?.client && portal.owner != user)
subtler_message = span_subtler("Unknown[space][user.apply_message_emphasis(subtler_emote)]")
portal.owner.show_message(subtler_message, alt_msg = subtler_message)
subtler_sound(portal.owner)
return TRUE
// Optional sound notification for subtler
/datum/emote/living/subtler/proc/subtler_sound(mob/hearer)
var/datum/preferences/prefs = hearer.client?.prefs
if(prefs && prefs.read_preference(/datum/preference/toggle/subtler_sound))
hearer.playsound_local(get_turf(hearer), 'sound/effects/achievement/glockenspiel_ping.ogg', 50)
/*
* VERB CODE
*/
/mob/living/proc/subtle_keybind()
var/message = input(src, "", "subtle") as text|null
if(!length(message))
return
return subtle(message)
/mob/living/verb/subtle()
set name = "Subtle"
set category = "IC"
if(GLOB.say_disabled) // This is here to try to identify lag problems
to_chat(usr, span_danger("Speech is currently admin-disabled."))
return
usr.emote("subtle")
/*
* VERB CODE 2
*/
/mob/living/verb/subtler()
set name = "Subtler Anti-Ghost"
set category = "IC"
if(GLOB.say_disabled) // This is here to try to identify lag problems
to_chat(usr, span_danger("Speech is currently admin-disabled."))
return
usr.emote("subtler")
#undef SUBTLE_DEFAULT_DISTANCE
#undef SUBTLE_ONE_TILE
#undef SUBTLE_SAME_TILE_DISTANCE
#undef SUBTLER_TELEKINESIS_DISTANCE
#undef SUBTLE_ONE_TILE_TEXT
#undef SUBTLE_SAME_TILE_TEXT
#undef PORTAL_ONE_TILE_TEXT
#undef PORTAL_SAME_TILE_TEXT