diff --git a/code/datums/Emote_system/emote.dm b/code/datums/Emote_system/emote.dm
index 09a111b009f..a8da598c573 100644
--- a/code/datums/Emote_system/emote.dm
+++ b/code/datums/Emote_system/emote.dm
@@ -7,6 +7,7 @@ VampyrBytes
*******************************************************************************************************/
#define EMOTE_COOLDOWN 20 //Time in deciseconds that the cooldown lasts
+#define HEARING_RANGE 7
/datum/emote
var/name = ""
@@ -33,7 +34,8 @@ VampyrBytes
var/targetText = "at" // what goes inbetween user and target
var/takesNumber = 0 // 1 if the emote uses a number parameter
- var/spanClass = "notice"
+ var/emoteSpanClass = "notice"
+ var/userSpanClass = "em"
var/baseLevel = 1
var/allowParent = 0 // 1 if you want the parent available as well as this one
@@ -48,10 +50,15 @@ VampyrBytes
if(count == 4)
baseLevel = 0
break
+
if(sound && !cooldown)
cooldown = EMOTE_COOLDOWN
-/datum/emote/proc/doEmote(var/mob/user)
+ if(targetText)
+ if(!findtextEx(targetText, " ", lentext(targetText)))
+ targetText += " "
+
+/datum/emote/proc/doEmote(var/mob/user, var/command = "")
if(!istype(user))
return
if(cooldown)
@@ -72,15 +79,18 @@ VampyrBytes
if(message)
message = addExtras(user, params, message)
- . = outputMessage(user, params, message)
+ . = processMessage(user, params, message)
-
- if(!doMime(user))
+ if(!doMime(user) && (!muzzleAffected || !isMuzzled(user)))
if(playSound(user, vol))
. = 2
doAction(user, params)
+ for (var/obj/item/weapon/implant/I in user)
+ if (I.implanted)
+ I.trigger(command, user)
+
return
// for things that the emote does that aren't text or sound based
@@ -99,7 +109,7 @@ VampyrBytes
// return "invalid" from either of these getters if you've tested the input and it's failed
/datum/emote/proc/getNumber(var/mob/user)
- var/number = input("How many") as null|num
+ var/number = input("How many?", "Enter number") as null|num
return number
/datum/emote/proc/getTarget(var/mob/user)
@@ -141,20 +151,30 @@ VampyrBytes
if(doMime(user))
message = mimeMessage(user, params)
+ if(message)
+ return message
- if(!message)
- if(muzzleAffected && user.is_muzzled())
- message = muzzleMessage(user)
- else if(checkForParams(params))
- message = paramMessage(user, params)
- else
- message = standardMessage(user)
+ if(muzzleAffected && isMuzzled(user))
+ message = muzzleMessage(user, params)
+ return message
- if(message && "target" in params)
- message = addTarget(user, params, message)
+ if(checkForParams(params))
+ message = paramMessage(user, params)
+ return message
+
+ message = standardMessage(user, params)
return message
+/datum/emote/proc/isMuzzled(var/mob/user)
+ if(user.sdisabilities & MUTE || user.is_muzzled())
+ return 1
+ if(!isliving(user))
+ return
+ var/mob/living/L = user
+ if (L.silent)
+ return 1
+
/datum/emote/proc/checkForParams(var/list/params)
for(var/p in params)
if(p == "target")
@@ -166,11 +186,13 @@ VampyrBytes
return
if(startText)
message = "[startText] [message]"
- message = "[message]"
+ message = "[message]"
return message
-/datum/emote/proc/standardMessage(var/mob/user)
- var/message = "\The [user] [text]"
+/datum/emote/proc/standardMessage(var/mob/user, var/list/params)
+ var/message = "\The [user] [text]"
+ if("target" in params)
+ message = addTarget(user, params, message)
return message
/datum/emote/proc/mimeMessage(var/mob/user, var/list/params)
@@ -178,13 +200,13 @@ VampyrBytes
return
if(checkForParams(params))
return paramMimeMessage(user, params)
- var/message = "\The [user] [mimeText]"
+ var/message = "\The [user] [mimeText]"
if(message && "target" in params)
message = addTarget(user, params, message)
return message
-/datum/emote/proc/muzzleMessage(var/mob/user)
- var/message = "\The [user] makes a "
+/datum/emote/proc/muzzleMessage(var/mob/user, var/list/params)
+ var/message = "\The [user] makes a "
if(muzzledNoise)
message += "[muzzledNoise] "
message += "noise"
@@ -204,11 +226,12 @@ VampyrBytes
if(!params["target"])
return message
if(params["target"] == user)
- message += " [targetText] [getHimself(user)]"
- else
- message += " [targetText] \the [params["target"]]"
+ message += " [targetText][getHimself(user)]"
+ return message
+ message += " [targetText]\the [params["target"]]"
return message
+
// What you should see when you perform the emote
/datum/emote/proc/createSelfMessage(var/mob/user, var/list/params, var/message = "")
if(!selfText)
@@ -220,23 +243,26 @@ VampyrBytes
if(mimeSelf)
message = replacetext(message, mimeText, mimeSelf)
- if(selfStart && startText)
- message = replacetext(message, "\The [user]", "you")
- else
- message = replacetext(message, "\The [user]", "You")
-
if(startText && !selfStart)
var/start = findtextEx(message, startText)
var/end = start + lentext(startText) + 1
message = copytext(message, 1, start) + copytext(message, end, lentext(message) + 1)
+ message = replaceMobWithYou(user, message)
+
return message
-/datum/emote/proc/outputMessage(var/mob/user, var/list/params, var/message = "")
+/datum/emote/proc/replaceMobWithYou(var/mob/M, var/message = "", var/mob/user) // user passed in in case an override needs to do something different if M != user (see johnny) VB
+
+ message = replacetext(message, "\The [M]", "You")
+ message = replacetext(message, "\the [M]", "you")
+
+ return message
+
+/datum/emote/proc/processMessage(var/mob/user, var/list/params, var/message = "")
var/visualOrAudible = audible + 1
if(doMime(user))
visualOrAudible = 1
- var/selfMessage = createSelfMessage(user, params, message)
log_emote("[user.name]/[user.key] : [message]")
sendToDead(message)
@@ -244,55 +270,83 @@ VampyrBytes
for(var/mob/M in getRecipients(user, visualOrAudible))
var/msg = ""
- if(selfMessage && M==user)
- msg = selfMessage
-
- else if(M.stat == UNCONSCIOUS || (M.sleeping > 0 && M.stat != 2))
- if (visualOrAudible == 2)
- msg = "... You can almost hear someone talking ..."
- else
+ if(M==user)
+ msg = createSelfMessage(user, params, message)
+ if(msg)
+ outputMessage(M, msg)
continue
- else if(M.sdisabilities & DEAF || M.ear_deaf)
+ if(M.stat == UNCONSCIOUS || (M.sleeping > 0 && M.stat != 2))
+ if (!visualOrAudible == 2)
+ continue
+ msg = "... You can almost hear someone talking ..."
+ outputMessage(M, msg)
+ continue
+
+ if(M.sdisabilities & DEAF || M.ear_deaf)
if(M.sdisabilities & BLIND || M.blinded || M.paralysis)
continue
- if((!(M in getRecipients(user, 1))) || M.see_invisible < user.invisibility)
+ if(!(M in getRecipients(user, 1)) || M.see_invisible < user.invisibility)
continue
- msg = createDeafMessage(user, params, message)
+ msg = createDeafMessage(user, params, message)
if(!msg && visualOrAudible == 2)
continue
+ if(msg)
+ outputMessage(M, msg)
+ continue
- else if(M.sdisabilities & BLIND || M.blinded || M.paralysis || (M.see_invisible < user.invisibility && visualOrAudible == 2))
+ if(M.sdisabilities & BLIND || M.blinded || M.paralysis || (M.see_invisible < user.invisibility && visualOrAudible == 2))
if(!(M in getRecipients(user, 2)))
continue
+
msg = createBlindMessage(user, params, message)
if(!msg && visualOrAudible == 1)
continue
+ if(msg)
+ outputMessage(M, msg)
+ continue
- else if(M.see_invisible < user.invisibility)
+ if(M.see_invisible < user.invisibility && visualOrAudible == 1)
continue
- if(!msg)
- msg = message
+ msg = message
+ outputMessage(M, msg)
+
+ if(visualOrAudible == 2)
+ handleListeningObjects(user, message)
- to_chat(M, msg)
return visualOrAudible
+/datum/emote/proc/outputMessage(var/mob/M, var/msg = "")
+ msg = replaceMobWithYou(M, msg, M)
+ to_chat(M, msg)
+
+/datum/emote/proc/handleListeningObjects(var/mob/user, var/message = "")
+ // based on say code
+ var/omsg = replacetext(message, "[user] ", "")
+ var/list/listening_obj = new
+ for(var/atom/movable/A in view(HEARING_RANGE, user))
+ if(istype(A, /mob))
+ var/mob/M = A
+ for(var/obj/O in M.contents)
+ listening_obj |= O
+ else if(istype(A, /obj))
+ var/obj/O = A
+ listening_obj |= O
+ for(var/obj/O in listening_obj)
+ O.hear_message(user, omsg)
+
/datum/emote/proc/getRecipients(var/mob/user, var/visualOrAudible)
- var/list/recipients[0]
- switch(visualOrAudible)
- if(1)
- recipients = viewers(user)
- if(2)
- recipients = get_mobs_in_view(7, user)
- return recipients
+ if(visualOrAudible == 1)
+ return viewers(user)
+ return get_mobs_in_view(HEARING_RANGE, user)
// set up different messages for blind people here. Empty will mean no message for
//non-audible emotes and the standard message for audible ones
/datum/emote/proc/createBlindMessage(var/mob/user, var/list/params, var/message)
if(audible && selfText)
- return "You hear someone [selfText]"
+ return "You hear someone [selfText]"
// set up different messages for deaf people here. Empty will mean no message for
// audible emotes and standard for non-audible ones
@@ -306,7 +360,7 @@ VampyrBytes
if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
M.show_message(message)
-/datum/emote/proc/playSound(var/mob/user)
+/datum/emote/proc/playSound(var/mob/user, var/list/params)
if(!sound)
return
playsound(user, sound, vol)
@@ -440,7 +494,7 @@ available, but if you do, make sure you return ..() so the check for use_me is s
/datum/emote/custom/ghost
name = "Ghost emote"
startText = "DEAD: "
- spanClass = "game deadsay"
+ emoteSpanClass = "game deadsay"
/datum/emote/custom/ghost/prevented(var/mob/user)
if(user.client.prefs.muted & MUTE_DEADCHAT)
@@ -451,7 +505,7 @@ available, but if you do, make sure you return ..() so the check for use_me is s
if(!config.dsay_allowed)
return "deadchat is globally muted"
-/datum/emote/custom/ghost/outputMessage(var/mob/user, var/message = "")
+/datum/emote/custom/ghost/processMessage(var/mob/user, var/message = "")
if(!message)
return
log_emote("Ghost/[user.key] : [message]")
diff --git a/code/datums/Emote_system/emote_handler.dm b/code/datums/Emote_system/emote_handler.dm
index ca8c14914f3..1417e83f9a8 100644
--- a/code/datums/Emote_system/emote_handler.dm
+++ b/code/datums/Emote_system/emote_handler.dm
@@ -49,7 +49,7 @@
if(prevented)
to_chat(owner, "You can't do that because [prevented]!")
return 0
- return emote.doEmote(owner)
+ return emote.doEmote(owner, command)
/datum/emoteHandler/proc/showCommands()
var/emoteList = "Available emotes are "