// Note about emote messages:
// - USER / TARGET will be replaced with the relevant name, in bold.
// - USER_THEM / TARGET_THEM / USER_THEIR / TARGET_THEIR will be replaced with a
// gender-appropriate version of the same.
// - Impaired messages do not do any substitutions.
/decl/emote
var/key // Command to use emote ie. '*[key]'
var/emote_message_1p // First person message ('You do a flip!')
var/emote_message_3p // Third person message ('Urist McShitter does a flip!')
var/emote_message_impaired // Deaf/blind message ('You hear someone flipping out.', 'You see someone opening and closing their mouth')
var/emote_message_1p_target // 'You do a flip at Urist McTarget!'
var/emote_message_3p_target // 'Urist McShitter does a flip at Urist McTarget!'
var/message_type = VISIBLE_MESSAGE // Audible/visual flag
var/targetted_emote // Whether or not this emote needs a target.
var/check_restraints // Can this emote be used while restrained?
var/conscious = 1 // Do we need to be awake to emote this?
var/emote_range = 0 // If >0, restricts emote visibility to viewers within range.
/decl/emote/proc/get_emote_message_1p(var/atom/user, var/atom/target, var/extra_params)
if(target)
return emote_message_1p_target
return emote_message_1p
/decl/emote/proc/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params)
if(target)
return emote_message_3p_target
return emote_message_3p
/decl/emote/proc/do_emote(var/atom/user, var/extra_params)
if(ismob(user) && check_restraints)
var/mob/M = user
if(M.restrained())
to_chat(user, "You are restrained and cannot do that.")
return
var/atom/target
if(can_target() && extra_params)
extra_params = lowertext(extra_params)
for(var/atom/thing in view(user))
if(extra_params == lowertext(thing.name))
target = thing
break
var/use_3p
var/use_1p
if(emote_message_1p)
if(target && emote_message_1p_target)
use_1p = get_emote_message_1p(user, target, extra_params)
use_1p = replacetext(use_1p, "TARGET_THEM", target.get_pronoun("him"))
use_1p = replacetext(use_1p, "TARGET_THEIR", target.get_pronoun("his"))
use_1p = replacetext(use_1p, "TARGET_SELF", target.get_pronoun("himself"))
use_1p = replacetext(use_1p, "TARGET", "\the [target]")
else
use_1p = get_emote_message_1p(user, null, extra_params)
use_1p = capitalize(use_1p)
if(emote_message_3p)
if(target && emote_message_3p_target)
use_3p = get_emote_message_3p(user, target, extra_params)
use_3p = replacetext(use_3p, "TARGET_THEM", target.get_pronoun("him"))
use_3p = replacetext(use_3p, "TARGET_THEIR", target.get_pronoun("his"))
use_3p = replacetext(use_3p, "TARGET_SELF", target.get_pronoun("himself"))
use_3p = replacetext(use_3p, "TARGET", "\the [target]")
else
use_3p = get_emote_message_3p(user, null, extra_params)
use_3p = replacetext(use_3p, "USER_THEM", user.get_pronoun("him"))
use_3p = replacetext(use_3p, "USER_THEIR", user.get_pronoun("his"))
use_3p = replacetext(use_3p, "USER_SELF", user.get_pronoun("himself"))
use_3p = replacetext(use_3p, "USER", "\the [user]")
use_3p = capitalize(use_3p)
var/use_range = emote_range
if (!use_range)
use_range = world.view
if(!target_check(user, target))
return
if(ismob(user))
var/mob/M = user
if(message_type == AUDIBLE_MESSAGE)
M.audible_message(message = use_3p, self_message = use_1p, deaf_message = emote_message_impaired, hearing_distance = use_range)
else
M.visible_message(message = use_3p, self_message = use_1p, blind_message = emote_message_impaired, range = use_range)
do_extra(user, target)
/decl/emote/proc/do_extra(var/atom/user, var/atom/target)
return
/decl/emote/proc/check_user(var/atom/user)
return TRUE
/decl/emote/proc/target_check(var/atom/user, var/atom/target)
return TRUE
/decl/emote/proc/can_target()
return (emote_message_1p_target || emote_message_3p_target)
/decl/emote/dd_SortValue()
return key