diff --git a/code/datums/ai/human.dm b/code/datums/ai/human.dm
index bced65059e1..24c9fd55af3 100644
--- a/code/datums/ai/human.dm
+++ b/code/datums/ai/human.dm
@@ -8,13 +8,13 @@
return
if(H.get_shock() && H.shock_stage < 40 && prob(3))
- H.emote(pick("moan","groan"))
+ H.emote(pick(/decl/emote/audible/moan, /decl/emote/audible/groan))
if(H.shock_stage > 10 && prob(3))
- H.emote(pick("cry","whimper"))
+ H.emote(pick(/decl/emote/audible/cry, /decl/emote/audible/whimper))
if(H.shock_stage >= 40 && prob(3))
- H.emote("scream")
+ H.emote(/decl/emote/audible/scream)
if(!H.restrained() && H.lying && H.shock_stage >= 60 && prob(3))
H.custom_emote("thrashes in agony")
diff --git a/code/game/machinery/doors/airlock_interactions.dm b/code/game/machinery/doors/airlock_interactions.dm
index 681f9258b0b..4a28ca7be39 100644
--- a/code/game/machinery/doors/airlock_interactions.dm
+++ b/code/game/machinery/doors/airlock_interactions.dm
@@ -82,7 +82,7 @@
/mob/living/carbon/airlock_crush(var/crush_damage)
. = ..()
if (can_feel_pain())
- emote("scream")
+ emote(/decl/emote/audible/scream)
/mob/living/silicon/robot/airlock_crush(var/crush_damage)
return ..(round(crush_damage / CYBORG_AIRLOCKCRUSH_RESISTANCE)) //TODO implement robot melee armour and remove this.
diff --git a/code/game/machinery/suit_cycler.dm b/code/game/machinery/suit_cycler.dm
index 1cf28054c97..7edd6cb3a2a 100644
--- a/code/game/machinery/suit_cycler.dm
+++ b/code/game/machinery/suit_cycler.dm
@@ -441,7 +441,7 @@
if(occupant)
if(prob(radiation_level*2) && occupant.can_feel_pain())
- occupant.emote("scream")
+ occupant.emote(/decl/emote/audible/scream)
if(radiation_level > 2)
occupant.take_organ_damage(0, radiation_level*2 + rand(1,3))
if(radiation_level > 1)
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index a9f59a6a7d5..610bfe26698 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -296,7 +296,7 @@ steam.start() -- spawns the effect
R.take_overall_damage(0, 0.75)
if (R.coughedtime != 1)
R.coughedtime = 1
- R.emote("gasp")
+ R.emote(/decl/emote/audible/gasp)
spawn (20)
R.coughedtime = 0
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 7aef0369e8a..46c030d3ba5 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -422,7 +422,7 @@
H.stun_effect_act(2, 120, target_zone)
var/burn_damage = H.electrocute_act(burn_damage_amt*2, src, def_zone = target_zone)
if(burn_damage > 15 && H.can_feel_pain())
- H.emote("scream")
+ H.emote(/decl/emote/audible/scream)
var/obj/item/organ/internal/heart/doki = locate() in affecting.internal_organs
if(istype(doki) && doki.pulse && !doki.open && prob(10))
to_chat(doki, SPAN_DANGER("Your [doki] has stopped!"))
@@ -440,7 +440,7 @@
M.failed_last_breath = 0 //So mobs that died of oxyloss don't revive and have perpetual out of breath.
M.reload_fullscreen()
- M.emote("gasp")
+ M.emote(/decl/emote/audible/gasp)
SET_STATUS_MAX(M, STAT_WEAK, rand(10,25))
apply_brain_damage(M, deadtime)
diff --git a/code/modules/emotes/definitions/_mob.dm b/code/modules/emotes/definitions/_mob.dm
index c6fd0855eeb..a0959c87edc 100644
--- a/code/modules/emotes/definitions/_mob.dm
+++ b/code/modules/emotes/definitions/_mob.dm
@@ -1,159 +1,8 @@
-/mob
- var/list/default_emotes = list()
- var/list/usable_emotes = list()
+/mob/proc/get_default_emotes()
+ return
-/mob/proc/update_emotes(var/skip_sort)
- usable_emotes.Cut()
- for(var/emote in default_emotes)
- var/decl/emote/emote_datum = GET_DECL(emote)
- if(emote_datum.check_user(src))
- usable_emotes[emote_datum.key] = emote_datum
- if(!skip_sort)
- usable_emotes = sortTim(usable_emotes, /proc/cmp_text_asc)
-
-/mob/Initialize()
+/mob/living/get_default_emotes()
. = ..()
- update_emotes()
-
-// Specific defines follow.
-/mob/living/carbon/alien
- default_emotes = list(
- /decl/emote/visible,
- /decl/emote/visible/scratch,
- /decl/emote/visible/drool,
- /decl/emote/visible/nod,
- /decl/emote/visible/sway,
- /decl/emote/visible/sulk,
- /decl/emote/visible/twitch,
- /decl/emote/visible/dance,
- /decl/emote/visible/roll,
- /decl/emote/visible/shake,
- /decl/emote/visible/jump,
- /decl/emote/visible/shiver,
- /decl/emote/visible/collapse,
- /decl/emote/visible/spin,
- /decl/emote/visible/sidestep,
- /decl/emote/audible/hiss,
- /decl/emote/audible,
- /decl/emote/audible/deathgasp_alien,
- /decl/emote/audible/whimper,
- /decl/emote/audible/gasp,
- /decl/emote/audible/scretch,
- /decl/emote/audible/choke,
- /decl/emote/audible/moan,
- /decl/emote/audible/gnarl
- )
-
-/mob/living/carbon/human
- default_emotes = list(
- /decl/emote/visible/blink,
- /decl/emote/audible/synth,
- /decl/emote/audible/synth/ping,
- /decl/emote/audible/synth/buzz,
- /decl/emote/audible/synth/confirm,
- /decl/emote/audible/synth/deny,
- /decl/emote/visible/nod,
- /decl/emote/visible/shake,
- /decl/emote/visible/shiver,
- /decl/emote/visible/collapse,
- /decl/emote/audible/gasp,
- /decl/emote/audible/sneeze,
- /decl/emote/audible/sniff,
- /decl/emote/audible/snore,
- /decl/emote/audible/whimper,
- /decl/emote/audible/yawn,
- /decl/emote/audible/clap,
- /decl/emote/audible/chuckle,
- /decl/emote/audible/cough,
- /decl/emote/audible/cry,
- /decl/emote/audible/sigh,
- /decl/emote/audible/laugh,
- /decl/emote/audible/mumble,
- /decl/emote/audible/grumble,
- /decl/emote/audible/groan,
- /decl/emote/audible/moan,
- /decl/emote/audible/grunt,
- /decl/emote/audible/slap,
- /decl/emote/human/deathgasp,
- /decl/emote/audible/giggle,
- /decl/emote/audible/scream,
- /decl/emote/visible/airguitar,
- /decl/emote/visible/blink_r,
- /decl/emote/visible/bow,
- /decl/emote/visible/salute,
- /decl/emote/visible/flap,
- /decl/emote/visible/aflap,
- /decl/emote/visible/drool,
- /decl/emote/visible/eyebrow,
- /decl/emote/visible/twitch,
- /decl/emote/visible/dance,
- /decl/emote/visible/twitch_v,
- /decl/emote/visible/faint,
- /decl/emote/visible/frown,
- /decl/emote/visible/blush,
- /decl/emote/visible/wave,
- /decl/emote/visible/glare,
- /decl/emote/visible/stare,
- /decl/emote/visible/look,
- /decl/emote/visible/point,
- /decl/emote/visible/raise,
- /decl/emote/visible/grin,
- /decl/emote/visible/shrug,
- /decl/emote/visible/smile,
- /decl/emote/visible/pale,
- /decl/emote/visible/tremble,
- /decl/emote/visible/wink,
- /decl/emote/visible/hug,
- /decl/emote/visible/dap,
- /decl/emote/visible/signal,
- /decl/emote/visible/handshake,
- /decl/emote/visible/afold,
- /decl/emote/visible/alook,
- /decl/emote/visible/eroll,
- /decl/emote/visible/hbow,
- /decl/emote/visible/hip,
- /decl/emote/visible/holdup,
- /decl/emote/visible/hshrug,
- /decl/emote/visible/crub,
- /decl/emote/visible/erub,
- /decl/emote/visible/fslap,
- /decl/emote/visible/ftap,
- /decl/emote/visible/hrub,
- /decl/emote/visible/hspread,
- /decl/emote/visible/pocket,
- /decl/emote/visible/rsalute,
- /decl/emote/visible/rshoulder,
- /decl/emote/visible/squint,
- /decl/emote/visible/tfist,
- /decl/emote/visible/tilt,
- /decl/emote/visible/spin,
- /decl/emote/visible/sidestep,
- /decl/emote/visible/vomit
- )
-
-/mob/living/silicon/robot
- default_emotes = list(
- /decl/emote/audible/clap,
- /decl/emote/visible/bow,
- /decl/emote/visible/salute,
- /decl/emote/visible/flap,
- /decl/emote/visible/aflap,
- /decl/emote/visible/twitch,
- /decl/emote/visible/twitch_v,
- /decl/emote/visible/dance,
- /decl/emote/visible/nod,
- /decl/emote/visible/shake,
- /decl/emote/visible/glare,
- /decl/emote/visible/look,
- /decl/emote/visible/stare,
- /decl/emote/visible/deathgasp_robot,
- /decl/emote/visible/spin,
- /decl/emote/visible/sidestep,
- /decl/emote/audible/synth,
- /decl/emote/audible/synth/ping,
- /decl/emote/audible/synth/buzz,
- /decl/emote/audible/synth/confirm,
- /decl/emote/audible/synth/deny,
- /decl/emote/audible/synth/security,
- /decl/emote/audible/synth/security/halt
- )
+ var/decl/species/my_species = get_species()
+ if(LAZYLEN(my_species?.default_emotes))
+ return . | my_species.default_emotes
diff --git a/code/modules/emotes/definitions/_species.dm b/code/modules/emotes/definitions/_species.dm
deleted file mode 100644
index 1c13347a4ec..00000000000
--- a/code/modules/emotes/definitions/_species.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/decl/species
- var/list/default_emotes = list()
-
-/mob/living/carbon/update_emotes()
- . = ..(skip_sort=1)
- if(species)
- for(var/emote in species.default_emotes)
- var/decl/emote/emote_datum = GET_DECL(emote)
- if(emote_datum.check_user(src))
- usable_emotes[emote_datum.key] = emote_datum
- usable_emotes = sortTim(usable_emotes, /proc/cmp_text_asc)
diff --git a/code/modules/emotes/definitions/audible.dm b/code/modules/emotes/definitions/audible.dm
index d4615f7e819..cd5925460ce 100644
--- a/code/modules/emotes/definitions/audible.dm
+++ b/code/modules/emotes/definitions/audible.dm
@@ -1,108 +1,107 @@
/decl/emote/audible
key = "burp"
- emote_message_3p = "USER burps."
+ emote_message_3p = "$USER$ burps."
message_type = AUDIBLE_MESSAGE
/decl/emote/audible/Initialize()
. = ..()
if(!emote_message_radio)
// Snips the 'USER' from 3p emote messages for radio.
- emote_message_radio = copytext(emote_message_3p, 6)
+ emote_message_radio = copytext(emote_message_3p, 8)
/decl/emote/audible/deathgasp_alien
- key = "deathgasp"
- emote_message_3p = "USER lets out a waning guttural screech, green blood bubbling from its maw."
+ key = "adeathgasp"
+ emote_message_3p = "$USER$ lets out a waning guttural screech, green blood bubbling from its maw."
/decl/emote/audible/whimper
key = "whimper"
- emote_message_3p = "USER whimpers."
+ emote_message_3p = "$USER$ whimpers."
/decl/emote/audible/gasp
key = "gasp"
- emote_message_3p = "USER gasps."
+ emote_message_3p = "$USER$ gasps."
conscious = 0
/decl/emote/audible/scretch
key = "scretch"
- emote_message_3p = "USER scretches."
+ emote_message_3p = "$USER$ scretches."
/decl/emote/audible/choke
- key ="choke"
- emote_message_3p = "USER chokes."
+ key = "choke"
+ emote_message_3p = "$USER$ chokes."
conscious = 0
/decl/emote/audible/gnarl
key = "gnarl"
- emote_message_3p = "USER gnarls and shows its teeth.."
+ emote_message_3p = "$USER$ gnarls and shows its teeth.."
/decl/emote/audible/multichirp
key = "mchirp"
- emote_message_3p = "USER chirps a chorus of notes!"
+ emote_message_3p = "$USER$ chirps a chorus of notes!"
emote_sound = 'sound/misc/multichirp.ogg'
/decl/emote/audible/alarm
key = "alarm"
emote_message_1p = "You sound an alarm."
- emote_message_3p = "USER sounds an alarm."
+ emote_message_3p = "$USER$ sounds an alarm."
/decl/emote/audible/alert
key = "alert"
emote_message_1p = "You let out a distressed noise."
- emote_message_3p = "USER lets out a distressed noise."
+ emote_message_3p = "$USER$ lets out a distressed noise."
/decl/emote/audible/notice
key = "notice"
emote_message_1p = "You play a loud tone."
- emote_message_3p = "USER plays a loud tone."
+ emote_message_3p = "$USER$ plays a loud tone."
/decl/emote/audible/whistle
key = "whistle"
emote_message_1p = "You whistle."
- emote_message_3p = "USER whistles."
+ emote_message_3p = "$USER$ whistles."
/decl/emote/audible/boop
key = "boop"
emote_message_1p = "You boop."
- emote_message_3p = "USER boops."
+ emote_message_3p = "$USER$ boops."
/decl/emote/audible/sneeze
key = "sneeze"
- emote_message_3p = "USER sneezes."
+ emote_message_3p = "$USER$ sneezes."
/decl/emote/audible/sniff
key = "sniff"
- emote_message_3p = "USER sniffs."
+ emote_message_3p = "$USER$ sniffs."
/decl/emote/audible/snore
key = "snore"
- emote_message_3p = "USER snores."
+ emote_message_3p = "$USER$ snores."
conscious = 0
/decl/emote/audible/whimper
key = "whimper"
- emote_message_3p = "USER whimpers."
+ emote_message_3p = "$USER$ whimpers."
/decl/emote/audible/yawn
key = "yawn"
- emote_message_3p = "USER yawns."
+ emote_message_3p = "$USER$ yawns."
/decl/emote/audible/clap
key = "clap"
- emote_message_3p = "USER claps."
+ emote_message_3p = "$USER$ claps."
/decl/emote/audible/chuckle
key = "chuckle"
- emote_message_3p = "USER chuckles."
+ emote_message_3p = "$USER$ chuckles."
/decl/emote/audible/cough
key = "cough"
-/decl/emote/audible/cough/check_user(var/mob/living/carbon/user)
+/decl/emote/audible/cough/mob_can_use(mob/living/user, assume_available = FALSE)
. = ..()
- if(!.)
- return .
- var/obj/item/organ/internal/lungs/lung = user.get_organ(BP_LUNGS)
- . = lung?.active_breathing && !user.isSynthetic()
+ if(.)
+ var/obj/item/organ/internal/lungs/lung = user.get_organ(BP_LUNGS)
+ . = lung?.active_breathing && !user.isSynthetic()
/decl/emote/audible/cough/do_emote(var/mob/living/carbon/user, var/extra_params)
if(!istype(user))
@@ -112,90 +111,98 @@
/decl/emote/audible/cry
key = "cry"
- emote_message_3p = "USER cries."
+ emote_message_3p = "$USER$ cries."
/decl/emote/audible/sigh
key = "sigh"
- emote_message_3p = "USER sighs."
+ emote_message_3p = "$USER$ sighs."
/decl/emote/audible/laugh
key = "laugh"
- emote_message_3p_target = "USER laughs at TARGET."
- emote_message_3p = "USER laughs."
+ emote_message_3p_target = "$USER$ laughs at $TARGET$."
+ emote_message_3p = "$USER$ laughs."
/decl/emote/audible/mumble
key = "mumble"
- emote_message_3p = "USER mumbles!"
+ emote_message_3p = "$USER$ mumbles!"
/decl/emote/audible/grumble
key = "grumble"
- emote_message_3p = "USER grumbles!"
+ emote_message_3p = "$USER$ grumbles!"
/decl/emote/audible/groan
key = "groan"
- emote_message_3p = "USER groans!"
+ emote_message_3p = "$USER$ groans!"
conscious = 0
/decl/emote/audible/moan
key = "moan"
- emote_message_3p = "USER moans!"
+ emote_message_3p = "$USER$ moans!"
conscious = 0
/decl/emote/audible/giggle
key = "giggle"
- emote_message_3p = "USER giggles."
+ emote_message_3p = "$USER$ giggles."
/decl/emote/audible/scream
key = "scream"
- emote_message_3p = "USER screams!"
+ emote_message_3p = "$USER$ screams!"
/decl/emote/audible/grunt
key = "grunt"
- emote_message_3p = "USER grunts."
+ emote_message_3p = "$USER$ grunts."
/decl/emote/audible/slap
key = "slap"
- emote_message_1p_target = "You slap TARGET across the face!"
+ emote_message_1p_target = "You slap $TARGET$ across the face!"
emote_message_1p = "You slap yourself across the face!"
- emote_message_3p_target = "USER slaps TARGET across the face!"
- emote_message_3p = "USER slaps USER_SELF across the face!"
+ emote_message_3p_target = "$USER$ slaps $TARGET$ across the face!"
+ emote_message_3p = "$USER$ slaps $USER_SELF$ across the face!"
emote_sound = 'sound/effects/snap.ogg'
check_restraints = TRUE
check_range = 1
/decl/emote/audible/bug_hiss
- key ="hiss"
- emote_message_3p_target = "USER hisses at TARGET."
- emote_message_3p = "USER hisses."
+ key = "bughiss"
+ emote_message_3p_target = "$USER$ hisses at $TARGET$."
+ emote_message_3p = "$USER$ hisses."
emote_sound = 'sound/voice/BugHiss.ogg'
/decl/emote/audible/bug_buzz
- key ="buzz"
- emote_message_3p = "USER buzzes its wings."
+ key = "bugbuzz"
+ emote_message_3p = "$USER$ buzzes its wings."
emote_sound = 'sound/voice/BugBuzz.ogg'
/decl/emote/audible/bug_chitter
- key ="chitter"
- emote_message_3p = "USER chitters."
+ key = "bugchitter"
+ emote_message_3p = "$USER$ chitters."
emote_sound = 'sound/voice/Bug.ogg'
/decl/emote/audible/roar
key = "roar"
- emote_message_3p = "USER roars!"
+ emote_message_3p = "$USER$ roars!"
/decl/emote/audible/bellow
key = "bellow"
- emote_message_3p = "USER bellows!"
+ emote_message_3p = "$USER$ bellows!"
/decl/emote/audible/howl
key = "howl"
- emote_message_3p = "USER howls!"
+ emote_message_3p = "$USER$ howls!"
/decl/emote/audible/wheeze
key = "wheeze"
- emote_message_3p = "USER wheezes."
+ emote_message_3p = "$USER$ wheezes."
/decl/emote/audible/hiss
- key ="hiss_"
- emote_message_3p_target = "USER hisses softly at TARGET."
- emote_message_3p = "USER hisses softly."
\ No newline at end of file
+ key = "hiss_"
+ emote_message_3p_target = "$USER$ hisses softly at $TARGET$."
+ emote_message_3p = "$USER$ hisses softly."
+
+/decl/emote/audible/deathgasp
+ key = "deathgasp"
+
+/decl/emote/audible/deathgasp/get_emote_message_3p(mob/living/user)
+ var/decl/species/my_species = user.get_species()
+ if(my_species)
+ return "$USER$ [my_species.get_species_death_message()]"
diff --git a/code/modules/emotes/definitions/exertion.dm b/code/modules/emotes/definitions/exertion.dm
index a750125a6cc..a0aeb5a52e9 100644
--- a/code/modules/emotes/definitions/exertion.dm
+++ b/code/modules/emotes/definitions/exertion.dm
@@ -1,10 +1,13 @@
+/decl/emote/exertion
+ abstract_type = /decl/emote/exertion
+
/decl/emote/exertion/biological
key = "esweat"
emote_range = 4
emote_message_1p = "You are sweating heavily."
- emote_message_3p = "USER is sweating heavily."
+ emote_message_3p = "$USER$ sweats heavily."
-/decl/emote/exertion/biological/check_user(mob/living/user)
+/decl/emote/exertion/biological/mob_can_use(mob/living/user, assume_available = FALSE)
if(istype(user) && !user.isSynthetic())
return ..()
return FALSE
@@ -12,24 +15,24 @@
/decl/emote/exertion/biological/breath
key = "ebreath"
emote_message_1p = "You feel out of breath."
- emote_message_3p = "USER looks out of breath."
+ emote_message_3p = "$USER$ looks out of breath."
/decl/emote/exertion/biological/pant
key = "epant"
emote_range = 3
message_type = AUDIBLE_MESSAGE
emote_message_1p = "You pant to catch your breath."
- emote_message_3p = "USER pants for air."
- emote_message_impaired = "You can see USER breathing heavily."
+ emote_message_3p = "$USER$ pants for air."
+ emote_message_impaired = "You can see $USER$ breathing heavily."
/decl/emote/exertion/synthetic
key = "ewhine"
emote_range = 3
message_type = AUDIBLE_MESSAGE
emote_message_1p = "You overstress your actuators."
- emote_message_3p = "USER's actuators whine with strain."
+ emote_message_3p = "$USER$'s actuators whine with strain."
-/decl/emote/exertion/synthetic/check_user(mob/living/user)
+/decl/emote/exertion/synthetic/mob_can_use(mob/living/user, assume_available = FALSE)
if(istype(user) && user.isSynthetic())
return ..()
return FALSE
@@ -37,4 +40,4 @@
/decl/emote/exertion/synthetic/creak
key = "ecreak"
emote_message_1p = "Your chassis stress indicators spike."
- emote_message_3p = "USER's joints creak with stress."
+ emote_message_3p = "$USER$'s joints creak with stress."
diff --git a/code/modules/emotes/definitions/human.dm b/code/modules/emotes/definitions/human.dm
deleted file mode 100644
index f3c2f091a98..00000000000
--- a/code/modules/emotes/definitions/human.dm
+++ /dev/null
@@ -1,50 +0,0 @@
-/decl/emote/human/check_user(var/mob/living/carbon/human/user)
- return istype(user)
-
-/decl/emote/human/deathgasp
- key = "deathgasp"
-
-/decl/emote/human/deathgasp/get_emote_message_3p(var/mob/living/carbon/human/user)
- return "USER [user.species.get_species_death_message()]"
-
-/decl/emote/human/swish
- key = "swish"
-
-/decl/emote/human/swish/do_emote(var/mob/living/carbon/human/user)
- user.animate_tail_once()
-
-/decl/emote/human/wag
- key = "wag"
-
-/decl/emote/human/wag/do_emote(var/mob/living/carbon/human/user)
- user.animate_tail_start()
-
-/decl/emote/human/sway
- key = "sway"
-
-/decl/emote/human/sway/do_emote(var/mob/living/carbon/human/user)
- user.animate_tail_start()
-
-/decl/emote/human/qwag
- key = "qwag"
-
-/decl/emote/human/qwag/do_emote(var/mob/living/carbon/human/user)
- user.animate_tail_fast()
-
-/decl/emote/human/fastsway
- key = "fastsway"
-
-/decl/emote/human/fastsway/do_emote(var/mob/living/carbon/human/user)
- user.animate_tail_fast()
-
-/decl/emote/human/swag
- key = "swag"
-
-/decl/emote/human/swag/do_emote(var/mob/living/carbon/human/user)
- user.animate_tail_stop()
-
-/decl/emote/human/stopsway
- key = "stopsway"
-
-/decl/emote/human/stopsway/do_emote(var/mob/living/carbon/human/user)
- user.animate_tail_stop()
diff --git a/code/modules/emotes/definitions/synthetics.dm b/code/modules/emotes/definitions/synthetics.dm
index 0126be0c110..019a70d2905 100644
--- a/code/modules/emotes/definitions/synthetics.dm
+++ b/code/modules/emotes/definitions/synthetics.dm
@@ -1,43 +1,44 @@
/decl/emote/audible/synth
key = "beep"
- emote_message_3p = "USER beeps."
+ emote_message_3p = "$USER$ beeps."
emote_sound = 'sound/machines/twobeep.ogg'
-/decl/emote/audible/synth/check_user(var/mob/living/user)
- if(istype(user) && user.isSynthetic())
- return ..()
- return FALSE
+/decl/emote/audible/synth/mob_can_use(mob/living/user, assume_available = FALSE)
+ return ..() && user.isSynthetic()
/decl/emote/audible/synth/ping
key = "ping"
- emote_message_3p = "USER pings."
+ emote_message_3p = "$USER$ pings."
emote_sound = 'sound/machines/ping.ogg'
/decl/emote/audible/synth/buzz
key = "buzz"
- emote_message_3p = "USER buzzes."
+ emote_message_3p = "$USER$ buzzes."
emote_sound = 'sound/machines/buzz-sigh.ogg'
/decl/emote/audible/synth/confirm
key = "confirm"
- emote_message_3p = "USER emits an affirmative blip."
+ emote_message_3p = "$USER$ emits an affirmative blip."
emote_sound = 'sound/machines/synth_yes.ogg'
/decl/emote/audible/synth/deny
key = "deny"
- emote_message_3p = "USER emits a negative blip."
+ emote_message_3p = "$USER$ emits a negative blip."
emote_sound = 'sound/machines/synth_no.ogg'
/decl/emote/audible/synth/security
key = "law"
- emote_message_3p = "USER shows USER_HIS legal authorization barcode."
- emote_message_3p_target = "USER shows TARGET USER_THEIR legal authorization barcode."
+ emote_message_3p = "$USER$ shows $USER_THEIR$ legal authorization barcode."
+ emote_message_3p_target = "$USER$ shows $TARGET$ $USER_THEIR$ legal authorization barcode."
emote_sound = 'sound/voice/biamthelaw.ogg'
-/decl/emote/audible/synth/security/check_user(var/mob/living/silicon/robot/user)
- return (istype(user) && istype(user.module,/obj/item/robot_module/security))
+/decl/emote/audible/synth/security/mob_can_use(mob/living/user, assume_available = FALSE)
+ var/mob/living/silicon/robot/robot_user = user
+ if(!istype(robot_user))
+ return FALSE
+ return istype(robot_user.module, /obj/item/robot_module/security) && ..()
/decl/emote/audible/synth/security/halt
key = "halt"
- emote_message_3p = "USER's speakers skreech, \"Halt! Security!\"."
+ emote_message_3p = "$USER$'s speakers skreech, \"Halt! Security!\"."
emote_sound = 'sound/voice/halt.ogg'
diff --git a/code/modules/emotes/definitions/tail.dm b/code/modules/emotes/definitions/tail.dm
new file mode 100644
index 00000000000..de38cf69141
--- /dev/null
+++ b/code/modules/emotes/definitions/tail.dm
@@ -0,0 +1,62 @@
+
+/decl/emote/visible/tail
+ abstract_type = /decl/emote/visible/tail
+
+/decl/emote/visible/tail/mob_can_use(mob/living/user, assume_available = FALSE)
+ return ishuman(user) && ..()
+
+/decl/emote/visible/tail/swish
+ key = "swish"
+
+/decl/emote/visible/tail/swish/do_emote(mob/living/user)
+ var/mob/living/carbon/human/human_user = user
+ if(istype(human_user))
+ human_user.animate_tail_once()
+
+/decl/emote/visible/tail/wag
+ key = "wag"
+
+/decl/emote/visible/tail/wag/do_emote(mob/living/user)
+ var/mob/living/carbon/human/human_user = user
+ if(istype(human_user))
+ human_user.animate_tail_start()
+
+/decl/emote/visible/tail/sway
+ key = "sway"
+
+/decl/emote/visible/tail/sway/do_emote(mob/living/user)
+ var/mob/living/carbon/human/human_user = user
+ if(istype(human_user))
+ human_user.animate_tail_start()
+
+/decl/emote/visible/tail/qwag
+ key = "qwag"
+
+/decl/emote/visible/tail/qwag/do_emote(mob/living/user)
+ var/mob/living/carbon/human/human_user = user
+ if(istype(human_user))
+ human_user.animate_tail_fast()
+
+/decl/emote/visible/tail/fastsway
+ key = "fastsway"
+
+/decl/emote/visible/tail/fastsway/do_emote(mob/living/user)
+ var/mob/living/carbon/human/human_user = user
+ if(istype(human_user))
+ human_user.animate_tail_fast()
+
+/decl/emote/visible/tail/swag
+ key = "swag"
+
+/decl/emote/visible/tail/swag/do_emote(mob/living/user)
+ var/mob/living/carbon/human/human_user = user
+ if(istype(human_user))
+ human_user.animate_tail_stop()
+
+/decl/emote/visible/tail/stopsway
+ key = "stopsway"
+
+/decl/emote/visible/tail/stopsway/do_emote(mob/living/user)
+ var/mob/living/carbon/human/human_user = user
+ if(istype(human_user))
+ human_user.animate_tail_stop()
diff --git a/code/modules/emotes/definitions/visible.dm b/code/modules/emotes/definitions/visible.dm
index 4f7327a7382..81c7433ae1f 100644
--- a/code/modules/emotes/definitions/visible.dm
+++ b/code/modules/emotes/definitions/visible.dm
@@ -1,57 +1,57 @@
/decl/emote/visible
- key ="tail"
- emote_message_3p = "USER waves USER_THEIR tail."
+ key = "tail"
+ emote_message_3p = "$USER$ waves $USER_THEIR$ tail."
message_type = VISIBLE_MESSAGE
/decl/emote/visible/scratch
key = "scratch"
check_restraints = TRUE
- emote_message_3p = "USER scratches."
+ emote_message_3p = "$USER$ scratches."
/decl/emote/visible/drool
- key ="drool"
- emote_message_3p = "USER drools."
+ key = "drool"
+ emote_message_3p = "$USER$ drools."
conscious = 0
/decl/emote/visible/nod
- key ="nod"
- emote_message_3p_target = "USER nods USER_THEIR head at TARGET."
- emote_message_3p = "USER nods USER_THEIR head."
+ key = "nod"
+ emote_message_3p_target = "$USER$ nods $USER_THEIR$ head at $TARGET$."
+ emote_message_3p = "$USER$ nods $USER_THEIR$ head."
/decl/emote/visible/sway
- key ="sway"
- emote_message_3p = "USER sways around dizzily."
+ key = "sways"
+ emote_message_3p = "$USER$ sways around dizzily."
/decl/emote/visible/sulk
- key ="sulk"
- emote_message_3p = "USER sulks down sadly."
+ key = "sulk"
+ emote_message_3p = "$USER$ sulks down sadly."
/decl/emote/visible/dance
- key ="dance"
+ key = "dance"
check_restraints = TRUE
- emote_message_3p = "USER dances around happily."
+ emote_message_3p = "$USER$ dances around happily."
/decl/emote/visible/roll
- key ="roll"
+ key = "roll"
check_restraints = TRUE
- emote_message_3p = "USER rolls."
+ emote_message_3p = "$USER$ rolls."
/decl/emote/visible/shake
- key ="shake"
- emote_message_3p = "USER shakes USER_THEIR head."
+ key = "shake"
+ emote_message_3p = "$USER$ shakes $USER_THEIR$ head."
/decl/emote/visible/jump
- key ="jump"
- emote_message_3p = "USER jumps!"
+ key = "jump"
+ emote_message_3p = "$USER$ jumps!"
/decl/emote/visible/shiver
- key ="shiver"
- emote_message_3p = "USER shivers."
+ key = "shiver"
+ emote_message_3p = "$USER$ shivers."
conscious = 0
/decl/emote/visible/collapse
- key ="collapse"
- emote_message_3p = "USER collapses!"
+ key = "collapse"
+ emote_message_3p = "$USER$ collapses!"
/decl/emote/visible/collapse/do_extra(var/mob/user)
if(istype(user))
@@ -59,59 +59,59 @@
/decl/emote/visible/flash
key = "flash"
- emote_message_3p = "The lights on USER flash quickly."
+ emote_message_3p = "The lights on $USER$ flash quickly."
/decl/emote/visible/blink
key = "blink"
- emote_message_3p = "USER blinks."
+ emote_message_3p = "$USER$ blinks."
/decl/emote/visible/airguitar
key = "airguitar"
check_restraints = TRUE
- emote_message_3p = "USER is strumming the air and headbanging like a safari chimp."
+ emote_message_3p = "$USER$ is strumming the air and headbanging like a safari chimp."
/decl/emote/visible/blink_r
key = "blink_r"
- emote_message_3p = "USER blinks rapidly."
+ emote_message_3p = "$USER$ blinks rapidly."
/decl/emote/visible/bow
key = "bow"
- emote_message_3p_target = "USER bows to TARGET."
- emote_message_3p = "USER bows."
+ emote_message_3p_target = "$USER$ bows to $TARGET$."
+ emote_message_3p = "$USER$ bows."
/decl/emote/visible/salute
key = "salute"
- emote_message_3p_target = "USER salutes TARGET."
- emote_message_3p = "USER salutes."
+ emote_message_3p_target = "$USER$ salutes $TARGET$."
+ emote_message_3p = "$USER$ salutes."
check_restraints = TRUE
/decl/emote/visible/flap
key = "flap"
check_restraints = TRUE
- emote_message_3p = "USER flaps USER_THEIR wings."
+ emote_message_3p = "$USER$ flaps $USER_THEIR$ wings."
/decl/emote/visible/aflap
key = "aflap"
check_restraints = TRUE
- emote_message_3p = "USER flaps USER_THEIR wings ANGRILY!"
+ emote_message_3p = "$USER$ flaps $USER_THEIR$ wings ANGRILY!"
/decl/emote/visible/eyebrow
key = "eyebrow"
- emote_message_3p = "USER raises an eyebrow."
+ emote_message_3p = "$USER$ raises an eyebrow."
/decl/emote/visible/twitch
key = "twitch"
- emote_message_3p = "USER twitches."
+ emote_message_3p = "$USER$ twitches."
conscious = 0
/decl/emote/visible/twitch_v
key = "twitch_v"
- emote_message_3p = "USER twitches violently."
+ emote_message_3p = "$USER$ twitches violently."
conscious = 0
/decl/emote/visible/faint
key = "faint"
- emote_message_3p = "USER faints."
+ emote_message_3p = "$USER$ faints."
/decl/emote/visible/faint/do_extra(var/mob/user)
if(istype(user) && !HAS_STATUS(user, STAT_ASLEEP))
@@ -119,233 +119,232 @@
/decl/emote/visible/frown
key = "frown"
- emote_message_3p = "USER frowns."
+ emote_message_3p = "$USER$ frowns."
/decl/emote/visible/blush
key = "blush"
- emote_message_3p = "USER blushes."
+ emote_message_3p = "$USER$ blushes."
/decl/emote/visible/wave
key = "wave"
- emote_message_3p_target = "USER waves at TARGET."
- emote_message_3p = "USER waves."
+ emote_message_3p_target = "$USER$ waves at $TARGET$."
+ emote_message_3p = "$USER$ waves."
check_restraints = TRUE
/decl/emote/visible/glare
key = "glare"
- emote_message_3p_target = "USER glares at TARGET."
- emote_message_3p = "USER glares."
+ emote_message_3p_target = "$USER$ glares at $TARGET$."
+ emote_message_3p = "$USER$ glares."
/decl/emote/visible/stare
key = "stare"
- emote_message_3p_target = "USER stares at TARGET."
- emote_message_3p = "USER stares."
+ emote_message_3p_target = "$USER$ stares at $TARGET$."
+ emote_message_3p = "$USER$ stares."
/decl/emote/visible/look
key = "look"
- emote_message_3p_target = "USER looks at TARGET."
- emote_message_3p = "USER looks."
+ emote_message_3p_target = "$USER$ looks at $TARGET$."
+ emote_message_3p = "$USER$ looks."
/decl/emote/visible/point
key = "point"
check_restraints = TRUE
- emote_message_3p_target = "USER points to TARGET."
- emote_message_3p = "USER points."
+ emote_message_3p_target = "$USER$ points to $TARGET$."
+ emote_message_3p = "$USER$ points."
/decl/emote/visible/raise
key = "raise"
check_restraints = TRUE
- emote_message_3p = "USER raises a hand."
+ emote_message_3p = "$USER$ raises a hand."
/decl/emote/visible/grin
key = "grin"
- emote_message_3p_target = "USER grins at TARGET."
- emote_message_3p = "USER grins."
+ emote_message_3p_target = "$USER$ grins at $TARGET$."
+ emote_message_3p = "$USER$ grins."
/decl/emote/visible/shrug
key = "shrug"
- emote_message_3p = "USER shrugs."
+ emote_message_3p = "$USER$ shrugs."
/decl/emote/visible/smile
key = "smile"
- emote_message_3p_target = "USER smiles at TARGET."
- emote_message_3p = "USER smiles."
+ emote_message_3p_target = "$USER$ smiles at $TARGET$."
+ emote_message_3p = "$USER$ smiles."
/decl/emote/visible/pale
key = "pale"
- emote_message_3p = "USER goes pale for a second."
+ emote_message_3p = "$USER$ goes pale for a second."
/decl/emote/visible/tremble
key = "tremble"
- emote_message_3p = "USER trembles in fear!"
+ emote_message_3p = "$USER$ trembles in fear!"
/decl/emote/visible/wink
key = "wink"
- emote_message_3p_target = "USER winks at TARGET."
- emote_message_3p = "USER winks."
+ emote_message_3p_target = "$USER$ winks at $TARGET$."
+ emote_message_3p = "$USER$ winks."
/decl/emote/visible/hug
key = "hug"
check_restraints = TRUE
- emote_message_3p_target = "USER hugs TARGET."
- emote_message_3p = "USER hugs USER_SELF."
+ emote_message_3p_target = "$USER$ hugs $TARGET$."
+ emote_message_3p = "$USER$ hugs $USER_SELF$."
check_range = 1
/decl/emote/visible/dap
key = "dap"
check_restraints = TRUE
- emote_message_3p_target = "USER gives daps to TARGET."
- emote_message_3p = "USER sadly can't find anybody to give daps to, and daps USER_SELF."
+ emote_message_3p_target = "$USER$ gives daps to $TARGET$."
+ emote_message_3p = "$USER$ sadly can't find anybody to give daps to, and daps $USER_SELF$."
/decl/emote/visible/bounce
key = "bounce"
- emote_message_3p = "USER bounces in place."
+ emote_message_3p = "$USER$ bounces in place."
/decl/emote/visible/jiggle
key = "jiggle"
- emote_message_3p = "USER jiggles!"
+ emote_message_3p = "$USER$ jiggles!"
/decl/emote/visible/lightup
key = "light"
- emote_message_3p = "USER lights up for a bit, then stops."
+ emote_message_3p = "$USER$ lights up for a bit, then stops."
/decl/emote/visible/vibrate
key = "vibrate"
- emote_message_3p = "USER vibrates!"
+ emote_message_3p = "$USER$ vibrates!"
/decl/emote/visible/deathgasp_robot
- key = "deathgasp"
- emote_message_3p = "USER shudders violently for a moment, then becomes motionless, USER_THEIR eyes slowly darkening."
+ key = "rdeathgasp"
+ emote_message_3p = "$USER$ shudders violently for a moment, then becomes motionless, $USER_THEIR$ eyes slowly darkening."
/decl/emote/visible/handshake
key = "handshake"
check_restraints = TRUE
- emote_message_3p_target = "USER shakes hands with TARGET."
- emote_message_3p = "USER shakes hands with USER_SELF."
+ emote_message_3p_target = "$USER$ shakes hands with $TARGET$."
+ emote_message_3p = "$USER$ shakes hands with $USER_SELF$."
check_range = 1
/decl/emote/visible/handshake/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params)
if(target && !user.Adjacent(target))
- return "USER holds out USER_THEIR hand out to TARGET."
+ return "$USER$ holds out $USER_THEIR$ hand out to $TARGET$."
return ..()
/decl/emote/visible/signal
key = "signal"
- emote_message_3p_target = "USER signals at TARGET."
- emote_message_3p = "USER signals."
+ emote_message_3p_target = "$USER$ signals at $TARGET$."
+ emote_message_3p = "$USER$ signals."
check_restraints = TRUE
-/decl/emote/visible/signal/check_user(atom/user)
- return ismob(user)
-
/decl/emote/visible/signal/get_emote_message_3p(var/mob/living/user, var/atom/target, var/extra_params)
if(istype(user) && user.get_empty_hand_slot())
var/t1 = round(text2num(extra_params))
if(isnum(t1) && t1 <= 5)
- return "USER raises [t1] finger\s."
+ return "$USER$ raises [t1] finger\s."
return .. ()
/decl/emote/visible/afold
key = "afold"
check_restraints = TRUE
- emote_message_3p = "USER folds USER_THEIR arms."
+ emote_message_3p = "$USER$ folds $USER_THEIR$ arms."
/decl/emote/visible/alook
key = "alook"
- emote_message_3p = "USER looks away."
+ emote_message_3p = "$USER$ looks away."
/decl/emote/visible/hbow
key = "hbow"
- emote_message_3p = "USER bows USER_THEIR head."
+ emote_message_3p = "$USER$ bows $USER_THEIR$ head."
/decl/emote/visible/hip
key = "hip"
check_restraints = TRUE
- emote_message_3p = "USER puts USER_THEIR hands on USER_THEIR hips."
+ emote_message_3p = "$USER$ puts $USER_THEIR$ hands on $USER_THEIR$ hips."
/decl/emote/visible/holdup
key = "holdup"
check_restraints = TRUE
- emote_message_3p = "USER holds up USER_THEIR palms."
+ emote_message_3p = "$USER$ holds up $USER_THEIR$ palms."
/decl/emote/visible/hshrug
key = "hshrug"
- emote_message_3p = "USER gives a half shrug."
+ emote_message_3p = "$USER$ gives a half shrug."
/decl/emote/visible/crub
key = "crub"
check_restraints = TRUE
- emote_message_3p = "USER rubs USER_THEIR chin."
+ emote_message_3p = "$USER$ rubs $USER_THEIR$ chin."
/decl/emote/visible/eroll
key = "eroll"
- emote_message_3p = "USER rolls USER_THEIR eyes."
- emote_message_3p_target = "USER rolls USER_THEIR eyes at TARGET."
+ emote_message_3p = "$USER$ rolls $USER_THEIR$ eyes."
+ emote_message_3p_target = "$USER$ rolls $USER_THEIR$ eyes at $TARGET$."
/decl/emote/visible/erub
key = "erub"
check_restraints = TRUE
- emote_message_3p = "USER rubs USER_THEIR eyes."
+ emote_message_3p = "$USER$ rubs $USER_THEIR$ eyes."
/decl/emote/visible/fslap
key = "fslap"
check_restraints = TRUE
- emote_message_3p = "USER slaps USER_THEIR forehead."
+ emote_message_3p = "$USER$ slaps $USER_THEIR$ forehead."
/decl/emote/visible/ftap
key = "ftap"
- emote_message_3p = "USER taps USER_THEIR foot."
+ emote_message_3p = "$USER$ taps $USER_THEIR$ foot."
/decl/emote/visible/hrub
key = "hrub"
check_restraints = TRUE
- emote_message_3p = "USER rubs USER_THEIR hands together."
+ emote_message_3p = "$USER$ rubs $USER_THEIR$ hands together."
/decl/emote/visible/hspread
key = "hspread"
check_restraints = TRUE
- emote_message_3p = "USER spreads USER_THEIR hands."
+ emote_message_3p = "$USER$ spreads $USER_THEIR$ hands."
/decl/emote/visible/pocket
key = "pocket"
check_restraints = TRUE
- emote_message_3p = "USER shoves USER_THEIR hands in USER_THEIR pockets."
+ emote_message_3p = "$USER$ shoves $USER_THEIR$ hands in $USER_THEIR$ pockets."
/decl/emote/visible/rsalute
key = "rsalute"
check_restraints = TRUE
- emote_message_3p = "USER returns the salute."
+ emote_message_3p = "$USER$ returns the salute."
/decl/emote/visible/rshoulder
key = "rshoulder"
- emote_message_3p = "USER rolls USER_THEIR shoulders."
+ emote_message_3p = "$USER$ rolls $USER_THEIR$ shoulders."
/decl/emote/visible/squint
key = "squint"
- emote_message_3p = "USER squints."
- emote_message_3p_target = "USER squints at TARGET."
+ emote_message_3p = "$USER$ squints."
+ emote_message_3p_target = "$USER$ squints at $TARGET$."
/decl/emote/visible/tfist
key = "tfist"
- emote_message_3p = "USER tightens USER_THEIR hands into fists."
+ emote_message_3p = "$USER$ tightens $USER_THEIR$ hands into fists."
/decl/emote/visible/tilt
key = "tilt"
- emote_message_3p = "USER tilts USER_THEIR head."
+ emote_message_3p = "$USER$ tilts $USER_THEIR$ head."
/decl/emote/visible/spin
key = "spin"
check_restraints = TRUE
- emote_message_3p = "USER spins!"
+ emote_message_3p = "$USER$ spins!"
+ emote_delay = 2 SECONDS
/decl/emote/visible/spin/do_extra(mob/user)
if(istype(user))
- user.spin(20, 1)
+ user.spin(emote_delay, 1)
/decl/emote/visible/sidestep
key = "sidestep"
check_restraints = TRUE
- emote_message_3p = "USER steps rhythmically and moves side to side."
+ emote_message_3p = "$USER$ steps rhythmically and moves side to side."
+ emote_delay = 1.2 SECONDS
/decl/emote/visible/sidestep/do_extra(mob/user)
if(istype(user))
@@ -357,7 +356,7 @@
/decl/emote/visible/vomit
key = "vomit"
-/decl/emote/visible/vomit/check_user(var/mob/living/carbon/human/user)
+/decl/emote/visible/vomit/mob_can_use(mob/living/user, assume_available = FALSE)
. = ..() && user.check_has_mouth() && !user.isSynthetic()
/decl/emote/visible/vomit/do_emote(var/atom/user, var/extra_params)
diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm
index b806be2ce10..9bf4e8fad03 100644
--- a/code/modules/emotes/emote_define.dm
+++ b/code/modules/emotes/emote_define.dm
@@ -1,102 +1,196 @@
// 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
+// - $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.
+var/global/list/_emotes_by_key
+
+/proc/get_emote_by_key(var/key)
+ if(!global._emotes_by_key)
+ decls_repository.get_decls_of_type(/decl/emote) // _emotes_by_key will be updated in emote Initialize()
+ return global._emotes_by_key[key]
+
/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')
+ /// Command to use emote ie. '*[key]'
+ var/key
+ /// First person message ('You do a flip!')
+ var/emote_message_1p
+ /// Third person message ('Urist McShitter does a flip!')
+ var/emote_message_3p
+ /// First person message for robits.
+ var/emote_message_synthetic_1p
+ /// Third person message for robits.
+ var/emote_message_synthetic_3p
+
+ /// 'You do a flip at Urist McTarget!'
+ var/emote_message_1p_target
+ /// 'Urist McShitter does a flip at Urist McTarget!'
+ var/emote_message_3p_target
+ /// First person targeted message for robits.
+ var/emote_message_synthetic_1p_target
+ /// Third person targeted message for robits.
+ var/emote_message_synthetic_3p_target
- 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!'
+ /// A message to send over the radio if one picks up this emote.
+ var/emote_message_radio
+ /// As above, but for synthetics.
+ var/emote_message_radio_synthetic
- var/emote_message_radio // A message to send over the radio if one picks up this emote.
+ /// A message to show if the emote is audible and the user is muzzled.
+ var/emote_message_muffled
+ /// Deaf/blind message ('You hear someone flipping out.', 'You see someone opening and closing their mouth')
+ var/emote_message_impaired
- // Two-dimensional array
- // First is list of genders, associated to a list of the sound effects to use
+ /// Two-dimensional array: first is list of genders, associated to a list of the sound effects to use.
var/list/emote_sound = null
+ /// As above, but used when check_synthetic() is true.
+ var/list/emote_sound_synthetic
+ /// Volume of sound to play.
+ var/emote_volume = 50
+ /// As above, but used when check_synthetic() is true.
+ var/emote_volume_synthetic = 50
+
+ /// Audible/visual flag
+ var/message_type = VISIBLE_MESSAGE
+ /// Whether or not this emote -must- have a target.
+ var/mandatory_targetted_emote
+ /// Can this emote be used while restrained?
+ var/check_restraints
+ /// falsy, or a range outside which the emote will not work
+ var/check_range
+ /// Do we need to be awake to emote this?
+ var/conscious = TRUE
+ /// If >0, restricts emote visibility to viewers within range.
+ var/emote_range = 0
+ // Time in ds that this emote will block further emote use (spam prevention).
+ var/emote_delay = 1 SECOND
+
+/decl/emote/Initialize()
+ . = ..()
+ if(key)
+ LAZYSET(global._emotes_by_key, key, src)
+
+/decl/emote/validate()
+ . = ..()
+ var/list/all_emotes = decls_repository.get_decls_of_type(/decl/emote)
+ for(var/emote_type in all_emotes)
+ var/decl/emote/emote = all_emotes[emote_type]
+ if(emote == src)
+ continue
+ if(key == emote.key)
+ . += "non-unique key, overlaps with [emote.type]"
- 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/check_range // falsy, or a range outside which the emote will not work
- var/conscious = TRUE // Do we need to be awake to emote this?
- var/emote_range = 0 // If >0, restricts emote visibility to viewers within range.
+// validate() is never called outside of unit testing, but
+// this feels foul to have in non-unit test main code.
+#ifdef UNIT_TEST
+ var/static/obj/dummy_emote_target = new
+ dummy_emote_target.name = "\proper Barry's hat"
+ var/static/mob/dummy_emote_user = new
+ dummy_emote_user.name = "\proper Barry"
+ dummy_emote_user.set_gender(MALE)
+ // This should catch misspelled tokens, TARGET_HIM etc as well as leftover TARGET and USER.
+ var/static/list/tokens = list("$", "TARGET", "USER")
+ var/all_strings = list(
+ "emote_message_1p" = emote_message_1p,
+ "emote_message_3p" = emote_message_3p,
+ "emote_message_synthetic_1p" = emote_message_synthetic_1p,
+ "emote_message_synthetic_3p" = emote_message_synthetic_3p,
+ "emote_message_1p_target" = emote_message_1p_target,
+ "emote_message_3p_target" = emote_message_3p_target,
+ "emote_message_synthetic_1p_target" = emote_message_synthetic_1p_target,
+ "emote_message_synthetic_3p_target" = emote_message_synthetic_3p_target
+ )
+ for(var/string_key in all_strings)
+ var/emote_string = all_strings[string_key]
+ if(!length(emote_string))
+ continue
+ emote_string = replace_target_tokens(emote_string, dummy_emote_target)
+ emote_string = replace_user_tokens(emote_string, dummy_emote_user)
+ emote_string = uppertext(emote_string)
+ for(var/token in tokens)
+ if(findtext(emote_string, token))
+ . += "malformed emote token [token] in [string_key]"
+#endif
/decl/emote/proc/get_emote_message_1p(var/atom/user, var/atom/target, var/extra_params)
if(target)
+ if(emote_message_synthetic_1p_target && check_synthetic(user))
+ return emote_message_synthetic_1p_target
return emote_message_1p_target
+ if(emote_message_synthetic_1p && check_synthetic(user))
+ return emote_message_synthetic_1p
return emote_message_1p
/decl/emote/proc/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params)
if(target)
+ if(emote_message_synthetic_3p_target && check_synthetic(user))
+ return emote_message_synthetic_3p_target
return emote_message_3p_target
+ if(emote_message_synthetic_3p && check_synthetic(user))
+ return emote_message_synthetic_3p
return emote_message_3p
+/decl/emote/proc/get_emote_sound(var/atom/user)
+ if(check_synthetic(user) && emote_sound_synthetic)
+ return list(
+ "sound" = emote_sound_synthetic,
+ "vol" = emote_volume_synthetic
+ )
+ if(emote_sound)
+ return list(
+ "sound" = emote_sound,
+ "vol" = emote_volume
+ )
+
/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.")
+ to_chat(user, SPAN_WARNING("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))
+ var/target_dist
+ extra_params = trim(lowertext(extra_params))
+ for(var/atom/thing in view((isnull(check_range) ? world.view : check_range), user))
+
+ if(!isturf(thing.loc))
+ continue
+
+ var/new_target_dist = get_dist(thing, user)
+ if(!isnull(target_dist) && target_dist > new_target_dist)
+ continue
+
+ if(findtext(lowertext(thing.name), extra_params))
+ target_dist = new_target_dist
target = thing
- break
- if(targetted_emote && !target)
+ if(!target)
+ to_chat(user, SPAN_WARNING("You cannot see a '[extra_params]' within range."))
+
+ if(mandatory_targetted_emote && !target)
to_chat(user, SPAN_WARNING("You can't do that to thin air."))
return
- if(target && target != user && check_range)
- if (get_dist(user, target) > check_range)
- to_chat(user, SPAN_WARNING("\The [target] is too far away."))
- return
+ var/use_1p = get_emote_message_1p(user, target, extra_params)
+ if(use_1p)
+ if(target)
+ use_1p = replace_target_tokens(use_1p, target)
+ use_1p = "[capitalize(replace_user_tokens(use_1p, user))]"
- var/decl/pronouns/user_gender = user.get_pronouns()
- var/decl/pronouns/target_gender = target?.get_pronouns()
-
- var/use_3p
- var/use_1p
- var/use_radio_message
- 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_gender.him)
- use_1p = replacetext(use_1p, "TARGET_THEIR", target_gender.his)
- use_1p = replacetext(use_1p, "TARGET_SELF", target_gender.self)
- 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_gender.him)
- use_3p = replacetext(use_3p, "TARGET_THEIR", target_gender.his)
- use_3p = replacetext(use_3p, "TARGET_SELF", target_gender.self)
- 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_gender.him)
- use_3p = replacetext(use_3p, "USER_THEIR", user_gender.his)
- use_3p = replacetext(use_3p, "USER_SELF", user_gender.self)
- use_3p = replacetext(use_3p, "USER", "\the [user]")
- use_3p = capitalize(use_3p)
-
- if(emote_message_radio)
- use_radio_message = replacetext(emote_message_radio, "USER_THEM", user_gender.him)
- use_radio_message = replacetext(use_radio_message, "USER_THEIR", user_gender.his)
- use_radio_message = replacetext(use_radio_message, "USER_SELF", user_gender.self)
- use_radio_message = replacetext(use_radio_message, "USER", "\the [user]")
+ var/use_3p = get_emote_message_3p(user, target, extra_params)
+ if(use_3p)
+ if(target)
+ use_3p = replace_target_tokens(use_3p, target)
+ use_3p = "[replace_user_tokens(use_3p, user)]"
+
+ var/use_radio = get_radio_message(user)
+ if(use_radio)
+ if(target)
+ use_radio = replace_target_tokens(use_radio, target)
+ use_radio = replace_user_tokens(use_radio, user)
var/use_range = emote_range
if (!use_range)
@@ -111,29 +205,61 @@
M.visible_message(message = "[user] opens their mouth silently!", self_message = "You cannot say anything!", blind_message = emote_message_impaired, checkghosts = /datum/client_preference/ghost_sight)
return
else
- M.audible_message(message = use_3p, self_message = use_1p, deaf_message = emote_message_impaired, hearing_distance = use_range, checkghosts = /datum/client_preference/ghost_sight, radio_message = use_radio_message)
+ M.audible_message(message = use_3p, self_message = use_1p, deaf_message = emote_message_impaired, hearing_distance = use_range, checkghosts = /datum/client_preference/ghost_sight, radio_message = use_radio)
else
M.visible_message(message = use_3p, self_message = use_1p, blind_message = emote_message_impaired, range = use_range, checkghosts = /datum/client_preference/ghost_sight)
do_extra(user, target)
do_sound(user)
+/decl/emote/proc/replace_target_tokens(var/msg, var/atom/target)
+ . = msg
+ if(istype(target))
+ var/decl/pronouns/target_gender = target.get_pronouns()
+ . = replacetext(., "$TARGET_THEM$", target_gender.him)
+ . = replacetext(., "$TARGET_THEIR$", target_gender.his)
+ . = replacetext(., "$TARGET_SELF$", target_gender.self)
+ . = replacetext(., "$TARGET$", "\the [target]")
+
+/decl/emote/proc/replace_user_tokens(var/msg, var/atom/user)
+ . = msg
+ if(istype(user))
+ var/decl/pronouns/user_gender = user.get_pronouns()
+ . = replacetext(., "$USER_THEM$", user_gender.him)
+ . = replacetext(., "$USER_THEIR$", user_gender.his)
+ . = replacetext(., "$USER_SELF$", user_gender.self)
+ . = replacetext(., "$USER$", "\the [user]")
+
+/decl/emote/proc/get_radio_message(var/atom/user)
+ if(emote_message_radio_synthetic && check_synthetic(user))
+ return emote_message_radio_synthetic
+ return emote_message_radio
+
/decl/emote/proc/do_extra(var/atom/user, var/atom/target)
return
/decl/emote/proc/do_sound(var/atom/user)
- if(emote_sound)
- var/sound_to_play = emote_sound
- if(islist(emote_sound))
- sound_to_play = emote_sound[user.gender] || emote_sound
- sound_to_play = pick(sound_to_play)
- return playsound(user.loc, sound_to_play, 50, 0)
+ var/use_emote_sound = get_emote_sound(user)
+ if(!use_emote_sound)
+ return
+ var/sound_to_play = use_emote_sound
+ if(islist(use_emote_sound))
+ sound_to_play = use_emote_sound[user.gender] || use_emote_sound
+ sound_to_play = pick(sound_to_play)
+ return playsound(user.loc, sound_to_play, 50, 0)
-/decl/emote/proc/check_user(var/atom/user)
- return TRUE
+/decl/emote/proc/mob_can_use(mob/living/user, assume_available = FALSE)
+ return istype(user) && user.stat != DEAD && (assume_available || (type in user.get_default_emotes()))
/decl/emote/proc/can_target()
return (emote_message_1p_target || emote_message_3p_target)
/decl/emote/dd_SortValue()
return key
+
+/decl/emote/proc/check_synthetic(var/mob/living/user)
+ . = istype(user) && user.isSynthetic()
+ if(!. && message_type == AUDIBLE_MESSAGE && user.should_have_organ(BP_LUNGS))
+ var/obj/item/organ/internal/lungs/L = GET_INTERNAL_ORGAN(user, BP_LUNGS)
+ if(BP_IS_PROSTHETIC(L))
+ . = TRUE
diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm
index 7713886e073..5778a4ce922 100644
--- a/code/modules/emotes/emote_mob.dm
+++ b/code/modules/emotes/emote_mob.dm
@@ -1,7 +1,12 @@
-/mob/proc/can_emote(var/emote_type)
+/mob
+ var/next_emote
+ var/next_emote_refresh
+ var/last_emote_summary
+
+/mob/proc/can_emote(emote_type, show_message)
. = check_mob_can_emote(emote_type)
- if(!.)
- to_chat(src, SPAN_WARNING("You cannot currently [emote_type == AUDIBLE_MESSAGE ? "audibly" : "visually"] emote!"))
+ if(!. && show_message)
+ to_chat(show_message, SPAN_WARNING("You cannot currently [emote_type == AUDIBLE_MESSAGE ? "audibly" : "visually"] emote!"))
/mob/proc/check_mob_can_emote(var/emote_type)
SHOULD_CALL_PARENT(TRUE)
@@ -13,22 +18,38 @@
/mob/living/brain/check_mob_can_emote(var/emote_type)
return ..() && istype(get_container(), /obj/item/organ/internal/brain_interface)
+#define EMOTE_REFRESH_SPAM_COOLDOWN (5 SECONDS)
/mob/proc/emote(var/act, var/m_type, var/message)
set waitfor = FALSE
- // s-s-snowflake
- if(src.stat == DEAD && act != "deathgasp")
+
+ if(stat == DEAD && act != "deathgasp")
return
+ var/decl/emote/use_emote
+ if(ispath(act, /decl/emote))
+ use_emote = GET_DECL(act)
+ m_type = use_emote.message_type
+
+ var/show_message_to
if(usr == src) //client-called emote
- if (client && (client.prefs.muted & MUTE_IC))
- to_chat(src, "You cannot send IC messages (muted).")
+ if (client?.prefs?.muted & MUTE_IC)
+ to_chat(src, SPAN_WARNING("You cannot send IC messages (muted)."))
return
- if(act == "help")
- to_chat(src,"Usable emotes: [english_list(usable_emotes)]")
+ if(world.time < next_emote)
+ to_chat(src, SPAN_WARNING("You cannot use another emote yet."))
return
- if(!can_emote(m_type))
+ if(act == "help")
+ if(world.time >= next_emote_refresh)
+ var/list/usable_emotes = list()
+ next_emote_refresh = world.time + EMOTE_REFRESH_SPAM_COOLDOWN
+ for(var/emote in get_default_emotes())
+ var/decl/emote/emote_datum = GET_DECL(emote)
+ if(emote_datum.mob_can_use(src, assume_available = TRUE))
+ usable_emotes[emote_datum.key] = emote_datum
+ last_emote_summary = english_list(sortTim(usable_emotes, /proc/cmp_text_asc, associative = TRUE))
+ to_chat(src, "Usable emotes: [last_emote_summary].")
return
if(act == "me")
@@ -46,30 +67,44 @@
m_type = AUDIBLE_MESSAGE
return custom_emote(m_type, message)
+ show_message_to = usr
+
+ if(!can_emote(m_type, show_message_to))
+ return
+
var/splitpoint = findtext(act, " ")
if(splitpoint > 0)
var/tempstr = act
act = copytext(tempstr,1,splitpoint)
message = copytext(tempstr,splitpoint+1,0)
- var/decl/emote/use_emote = usable_emotes[act]
if(!use_emote)
- to_chat(src, "Unknown emote '[act]'. Type say *help for a list of usable emotes.")
+ use_emote = get_emote_by_key(act)
+
+ if(!istype(use_emote))
+ to_chat(show_message_to, SPAN_WARNING("Unknown emote '[act]'. Type say *help for a list of usable emotes."))
+ return
+
+ if(!use_emote.mob_can_use(src))
+ to_chat(show_message_to, SPAN_WARNING("You cannot use the emote '[act]'. Type say *help for a list of usable emotes."))
return
if(m_type != use_emote.message_type && use_emote.conscious && stat != CONSCIOUS)
return
if(use_emote.message_type == AUDIBLE_MESSAGE && get_item_blocking_speech())
- audible_message("\The [src] makes a muffled sound.")
+ audible_message("\The [src] [use_emote.emote_message_muffled || "makes a muffled sound."]")
return
- else
- use_emote.do_emote(src, message)
+
+ next_emote = world.time + use_emote.emote_delay
+ use_emote.do_emote(src, message)
for (var/obj/item/implant/I in src)
if (I.implanted)
I.trigger(act, src)
+#undef EMOTE_REFRESH_SPAM_COOLDOWN
+
/mob/proc/format_emote(var/emoter = null, var/message = null)
var/pretext
var/subtext
@@ -127,7 +162,7 @@
/mob/proc/custom_emote(var/m_type = VISIBLE_MESSAGE, var/message = null)
- if(!can_emote(m_type))
+ if(!can_emote(m_type, src))
return
var/input
@@ -156,8 +191,8 @@
var/obj/machinery/hologram/holopad/T = src.holo
if(T && T.masters[src]) //Is the AI using a holopad?
src.holopad_emote(message)
- else //Emote normally, then.
- ..()
+ return
+ return ..()
/mob/living/captive_brain/emote(var/message)
return
diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm
index dc3245f3b75..98d28529fea 100644
--- a/code/modules/materials/_materials.dm
+++ b/code/modules/materials/_materials.dm
@@ -740,7 +740,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay)
if(prob(10))
M.SelfMove(pick(global.cardinal))
if(prob(narcosis))
- M.emote(pick("twitch", "drool", "moan"))
+ M.emote(pick(/decl/emote/visible/twitch, /decl/emote/visible/drool, /decl/emote/audible/moan))
if(euphoriant)
SET_STATUS_MAX(M, STAT_DRUGGY, euphoriant)
diff --git a/code/modules/materials/definitions/gasses/material_gas_mundane.dm b/code/modules/materials/definitions/gasses/material_gas_mundane.dm
index e00322da326..a904f4fbf1f 100644
--- a/code/modules/materials/definitions/gasses/material_gas_mundane.dm
+++ b/code/modules/materials/definitions/gasses/material_gas_mundane.dm
@@ -143,7 +143,7 @@
SET_STATUS_MAX(M, STAT_DROWSY, 3)
SET_STATUS_MAX(M, STAT_SLUR, 3)
if(prob(20))
- M.emote(pick("giggle", "laugh"))
+ M.emote(pick(/decl/emote/audible/giggle, /decl/emote/audible/laugh))
M.add_chemical_effect(CE_PULSE, -1)
/decl/material/gas/nitrogen
diff --git a/code/modules/mob/hugs.dm b/code/modules/mob/hugs.dm
index a884e569db3..191d10734fe 100644
--- a/code/modules/mob/hugs.dm
+++ b/code/modules/mob/hugs.dm
@@ -20,8 +20,8 @@ var/global/list/_default_hug_messages = list(
hug_3p = "$USER$ rubs $TARGET$'s back soothingly."
hug_1p = "You rub $TARGET$'s back soothingly."
else
- hug_3p = "$USER$ hugs $TARGET$ to make $TARGET_HIM$ feel better."
- hug_1p = "You hug $TARGET$ to make $TARGET_HIM$ feel better."
+ hug_3p = "$USER$ hugs $TARGET$ to make $TARGET_THEM$ feel better."
+ hug_1p = "You hug $TARGET$ to make $TARGET_THEM$ feel better."
var/list/use_hug_messages = target.get_hug_zone_messages(get_target_zone())
if(length(use_hug_messages) >= 2)
@@ -33,16 +33,16 @@ var/global/list/_default_hug_messages = list(
var/decl/pronouns/target_pronouns = target.get_pronouns()
hug_3p = replacetext(hug_3p, "$USER$", "\the [src]")
- hug_3p = replacetext(hug_3p, "$USER_HIM$", my_pronouns.him)
- hug_3p = replacetext(hug_3p, "$USER_HIS$", my_pronouns.his)
+ hug_3p = replacetext(hug_3p, "$USER_THEM$", my_pronouns.him)
+ hug_3p = replacetext(hug_3p, "$USER_THEIR$", my_pronouns.his)
hug_3p = replacetext(hug_3p, "$TARGET$", "\the [target]")
- hug_3p = replacetext(hug_3p, "$TARGET_HIM$", target_pronouns.him)
- hug_3p = replacetext(hug_3p, "$TARGET_HIS$", target_pronouns.his)
+ hug_3p = replacetext(hug_3p, "$TARGET_THEM$", target_pronouns.him)
+ hug_3p = replacetext(hug_3p, "$TARGET_THEIR$", target_pronouns.his)
hug_1p = replacetext(hug_1p, "$TARGET$", "\the [target]")
- hug_1p = replacetext(hug_1p, "$TARGET_HIM$", target_pronouns.him)
- hug_1p = replacetext(hug_1p, "$TARGET_HIS$", target_pronouns.his)
+ hug_1p = replacetext(hug_1p, "$TARGET_THEM$", target_pronouns.him)
+ hug_1p = replacetext(hug_1p, "$TARGET_THEIR$", target_pronouns.his)
visible_message(
SPAN_NOTICE(capitalize(hug_3p)),
diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm
index 9c394e6491a..1d8a01ce9e9 100644
--- a/code/modules/mob/living/brain/brain.dm
+++ b/code/modules/mob/living/brain/brain.dm
@@ -2,16 +2,6 @@
name = "brain"
icon = 'icons/obj/surgery.dmi'
icon_state = "brain1"
- default_emotes = list(
- /decl/emote/audible/alarm,
- /decl/emote/audible/alert,
- /decl/emote/audible/notice,
- /decl/emote/audible/whistle,
- /decl/emote/audible/synth,
- /decl/emote/audible/boop,
- /decl/emote/visible/blink,
- /decl/emote/visible/flash
- )
// Used for EMP damage when inside an interface or robobrain.
var/emp_damage = 0
@@ -23,6 +13,19 @@
SPAN_DANGER("Major electrical distruption detected: System rebooting.")
)
+/mob/living/brain/get_default_emotes()
+ var/static/list/default_emotes = list(
+ /decl/emote/audible/alarm,
+ /decl/emote/audible/alert,
+ /decl/emote/audible/notice,
+ /decl/emote/audible/whistle,
+ /decl/emote/audible/synth,
+ /decl/emote/audible/boop,
+ /decl/emote/visible/blink,
+ /decl/emote/visible/flash
+ )
+ return default_emotes
+
/mob/living/brain/handle_regular_status_updates()
. = ..()
if(emp_damage || stat == DEAD || !is_in_interface())
@@ -56,7 +59,7 @@
var/container = get_container()
return istype(container, /obj/item/organ/internal/brain_interface) || istype(container, /obj/item/organ/internal/brain/robotic)
-/mob/living/brain/can_emote()
+/mob/living/brain/can_emote(emote_type, show_message)
return is_in_interface() && ..()
/mob/living/brain/can_use_rig()
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 95d001155a6..0f587e199d7 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -36,3 +36,32 @@
/mob/living/carbon/alien/get_admin_job_string()
return "Alien"
+
+/mob/living/carbon/alien/get_default_emotes()
+ var/static/list/default_emotes = list(
+ /decl/emote/visible,
+ /decl/emote/visible/scratch,
+ /decl/emote/visible/drool,
+ /decl/emote/visible/nod,
+ /decl/emote/visible/sway,
+ /decl/emote/visible/sulk,
+ /decl/emote/visible/twitch,
+ /decl/emote/visible/dance,
+ /decl/emote/visible/roll,
+ /decl/emote/visible/shake,
+ /decl/emote/visible/jump,
+ /decl/emote/visible/shiver,
+ /decl/emote/visible/collapse,
+ /decl/emote/visible/spin,
+ /decl/emote/visible/sidestep,
+ /decl/emote/audible/hiss,
+ /decl/emote/audible,
+ /decl/emote/audible/deathgasp_alien,
+ /decl/emote/audible/whimper,
+ /decl/emote/audible/gasp,
+ /decl/emote/audible/scretch,
+ /decl/emote/audible/choke,
+ /decl/emote/audible/moan,
+ /decl/emote/audible/gnarl
+ )
+ return default_emotes
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 368b7b5f493..a16b1a77e9a 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -540,7 +540,6 @@
set_move_intent(GET_DECL(move_intents[1]))
if(!istype(move_intent))
set_next_usable_move_intent()
- update_emotes()
apply_species_inventory_restrictions()
refresh_ai_handler()
@@ -1174,3 +1173,90 @@
return SScharacter_info.get_record(comments_record_id, TRUE)
return ..()
+/mob/living/carbon/human/get_default_emotes()
+ var/static/list/default_emotes = list(
+ /decl/emote/visible/blink,
+ /decl/emote/audible/synth,
+ /decl/emote/audible/synth/ping,
+ /decl/emote/audible/synth/buzz,
+ /decl/emote/audible/synth/confirm,
+ /decl/emote/audible/synth/deny,
+ /decl/emote/visible/nod,
+ /decl/emote/visible/shake,
+ /decl/emote/visible/shiver,
+ /decl/emote/visible/collapse,
+ /decl/emote/audible/gasp,
+ /decl/emote/audible/sneeze,
+ /decl/emote/audible/sniff,
+ /decl/emote/audible/snore,
+ /decl/emote/audible/whimper,
+ /decl/emote/audible/yawn,
+ /decl/emote/audible/clap,
+ /decl/emote/audible/chuckle,
+ /decl/emote/audible/cough,
+ /decl/emote/audible/cry,
+ /decl/emote/audible/sigh,
+ /decl/emote/audible/laugh,
+ /decl/emote/audible/mumble,
+ /decl/emote/audible/grumble,
+ /decl/emote/audible/groan,
+ /decl/emote/audible/moan,
+ /decl/emote/audible/grunt,
+ /decl/emote/audible/slap,
+ /decl/emote/audible/deathgasp,
+ /decl/emote/audible/giggle,
+ /decl/emote/audible/scream,
+ /decl/emote/visible/airguitar,
+ /decl/emote/visible/blink_r,
+ /decl/emote/visible/bow,
+ /decl/emote/visible/salute,
+ /decl/emote/visible/flap,
+ /decl/emote/visible/aflap,
+ /decl/emote/visible/drool,
+ /decl/emote/visible/eyebrow,
+ /decl/emote/visible/twitch,
+ /decl/emote/visible/dance,
+ /decl/emote/visible/twitch_v,
+ /decl/emote/visible/faint,
+ /decl/emote/visible/frown,
+ /decl/emote/visible/blush,
+ /decl/emote/visible/wave,
+ /decl/emote/visible/glare,
+ /decl/emote/visible/stare,
+ /decl/emote/visible/look,
+ /decl/emote/visible/point,
+ /decl/emote/visible/raise,
+ /decl/emote/visible/grin,
+ /decl/emote/visible/shrug,
+ /decl/emote/visible/smile,
+ /decl/emote/visible/pale,
+ /decl/emote/visible/tremble,
+ /decl/emote/visible/wink,
+ /decl/emote/visible/hug,
+ /decl/emote/visible/dap,
+ /decl/emote/visible/signal,
+ /decl/emote/visible/handshake,
+ /decl/emote/visible/afold,
+ /decl/emote/visible/alook,
+ /decl/emote/visible/eroll,
+ /decl/emote/visible/hbow,
+ /decl/emote/visible/hip,
+ /decl/emote/visible/holdup,
+ /decl/emote/visible/hshrug,
+ /decl/emote/visible/crub,
+ /decl/emote/visible/erub,
+ /decl/emote/visible/fslap,
+ /decl/emote/visible/ftap,
+ /decl/emote/visible/hrub,
+ /decl/emote/visible/hspread,
+ /decl/emote/visible/pocket,
+ /decl/emote/visible/rsalute,
+ /decl/emote/visible/rshoulder,
+ /decl/emote/visible/squint,
+ /decl/emote/visible/tfist,
+ /decl/emote/visible/tilt,
+ /decl/emote/visible/spin,
+ /decl/emote/visible/sidestep,
+ /decl/emote/visible/vomit
+ )
+ return default_emotes
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 00af3106c05..72903eb6c75 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -166,7 +166,7 @@
if(stance_damage >= 4 || (stance_damage >= 2 && prob(2)) || (stance_damage >= 3 && prob(8)))
if(!(lying || resting))
if(limb_pain)
- emote("scream")
+ emote(/decl/emote/audible/scream)
custom_emote(VISIBLE_MESSAGE, "collapses!")
SET_STATUS_MAX(src, STAT_WEAK, 3) //can't emote while weakened, apparently.
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 591dcf9df68..d17de99cb4d 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -123,7 +123,7 @@
to_chat(src, "You feel weak.")
SET_STATUS_MAX(src, STAT_WEAK, 3)
if(!lying)
- emote("collapse")
+ emote(/decl/emote/visible/collapse)
if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT))
lose_hair()
@@ -136,7 +136,7 @@
if(prob(1))
to_chat(src, "You feel strange!")
adjustCloneLoss(5 * RADIATION_SPEED_COEFFICIENT)
- emote("gasp")
+ emote(/decl/emote/audible/gasp)
if(radiation > 150)
damage = 8
radiation -= 4 * RADIATION_SPEED_COEFFICIENT
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 52e738ef6d4..9e322f87056 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -384,7 +384,7 @@
for(var/obj/item/organ/external/affecting in get_external_organs())
if(!screamed && affecting.can_feel_pain())
screamed = TRUE
- emote("scream")
+ emote(/decl/emote/audible/scream)
affecting.status |= ORGAN_DISFIGURED
take_organ_damage(0, severity, override_droplimb = DISMEMBER_METHOD_ACID)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 6bf47b4c9a9..7a73535f771 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -160,7 +160,7 @@
speaking = get_any_good_language(set_default=TRUE)
if (!speaking)
to_chat(src, SPAN_WARNING("You don't know a language and cannot speak."))
- emote("custom", AUDIBLE_MESSAGE, "[pick("grunts", "babbles", "gibbers", "jabbers", "burbles")] aimlessly.")
+ custom_emote(AUDIBLE_MESSAGE, "[pick("grunts", "babbles", "gibbers", "jabbers", "burbles")] aimlessly.")
return
if(handle_mob_specific_speech(message, message_mode, verb, speaking))
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index f55053ddeab..ae8f8e22f75 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1100,3 +1100,30 @@
/mob/living/silicon/robot/try_breathe()
return FALSE
+/mob/living/silicon/robot/get_default_emotes()
+ var/static/list/default_emotes = list(
+ /decl/emote/audible/clap,
+ /decl/emote/visible/bow,
+ /decl/emote/visible/salute,
+ /decl/emote/visible/flap,
+ /decl/emote/visible/aflap,
+ /decl/emote/visible/twitch,
+ /decl/emote/visible/twitch_v,
+ /decl/emote/visible/dance,
+ /decl/emote/visible/nod,
+ /decl/emote/visible/shake,
+ /decl/emote/visible/glare,
+ /decl/emote/visible/look,
+ /decl/emote/visible/stare,
+ /decl/emote/visible/deathgasp_robot,
+ /decl/emote/visible/spin,
+ /decl/emote/visible/sidestep,
+ /decl/emote/audible/synth,
+ /decl/emote/audible/synth/ping,
+ /decl/emote/audible/synth/buzz,
+ /decl/emote/audible/synth/confirm,
+ /decl/emote/audible/synth/deny,
+ /decl/emote/audible/synth/security,
+ /decl/emote/audible/synth/security/halt
+ )
+ return default_emotes
diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm
index c06159dffd2..9ec93228346 100644
--- a/code/modules/mob/living/simple_animal/hostile/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bat.dm
@@ -27,7 +27,7 @@
/mob/living/simple_animal/hostile/scarybat/FindTarget()
. = ..()
if(.)
- emote("flutters towards [.]")
+ custom_emote(VISIBLE_MESSAGE, "flutters towards [.]")
/mob/living/simple_animal/hostile/scarybat/Found(var/atom/A)//This is here as a potential override to pick a specific target if available
if(istype(A) && A == owner)
diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm
index 635c5fd9387..48dd4b828ce 100644
--- a/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/commanded/bear_companion.dm
@@ -16,12 +16,12 @@
/mob/living/simple_animal/hostile/commanded/bear/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone)
. = ..()
if(.)
- src.emote("roars in rage!")
+ custom_emote(AUDIBLE_MESSAGE, "roars in rage!")
/mob/living/simple_animal/hostile/commanded/bear/default_hurt_interaction(mob/user)
. = ..()
if(.)
- src.emote("roars in rage!")
+ custom_emote(AUDIBLE_MESSAGE, "roars in rage!")
/mob/living/simple_animal/hostile/commanded/bear/listen()
if(stance != COMMANDED_MISC) //cant listen if its booty shakin'
diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm
index 890e6d09e74..a344406a25b 100644
--- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm
+++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm
@@ -11,7 +11,7 @@
known_commands = list("stay", "stop", "attack", "follow", "heal", "emergency protocol")
gene_damage = -1
response_help_1p = "You wave your hand through $TARGET$."
- response_help_3p = "$USER$ waves $USER_HIS$ hand through $TARGET$."
+ response_help_3p = "$USER$ waves $USER_THEIR$ hand through $TARGET$."
response_harm = "agitates"
response_disarm = "fans at"
ai = /datum/ai/nanomachines
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 4d0dabbeb9b..113c566c040 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -5,7 +5,7 @@
speak_chance = 0
turns_per_move = 5
response_help_1p = "You wave your hand through $TARGET$."
- response_help_3p = "$USER$ waves $USER_HIS$ hand through $TARGET$."
+ response_help_3p = "$USER$ waves $USER_THEIR$ hand through $TARGET$."
speed = -1
max_health = 80
gene_damage = -1
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index e906a025065..d798265b2d7 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -8,7 +8,7 @@
speak_emote = list("hisses")
emote_hear = list("wails","screeches")
response_help_1p = "You wave your hand through $TARGET$."
- response_help_3p = "$USER$ waves $USER_HIS$ hand through $TARGET$."
+ response_help_3p = "$USER$ waves $USER_THEIR$ hand through $TARGET$."
response_disarm = "flails at"
response_harm = "punches"
natural_weapon = /obj/item/natural_weapon/shade
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index d8ce31b26fb..8c36b3d8892 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -24,7 +24,6 @@
if(BP_IS_PROSTHETIC(E))
robolimb_count++
full_prosthetic = robolimb_count > 0 && (robolimb_count == LAZYLEN(limbs)) //If no organs, no way to tell
- update_emotes()
return full_prosthetic
/mob/living/silicon/isSynthetic()
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 27b465a347a..ebf0af7fe1c 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -34,8 +34,8 @@ var/global/list/special_channel_keys = list(
SStyping.set_indicator_state(client, FALSE)
if(!filter_block_message(usr, message))
message = sanitize(message)
- if(can_emote(VISIBLE_MESSAGE))
- usr.emote("me", usr.emote_type, message)
+ if(can_emote(VISIBLE_MESSAGE, src))
+ usr.custom_emote(usr.emote_type, message)
else
usr.emote(message)
diff --git a/code/modules/organs/ailments/_ailment.dm b/code/modules/organs/ailments/_ailment.dm
index 101f4bb8dd8..812fc38c015 100644
--- a/code/modules/organs/ailments/_ailment.dm
+++ b/code/modules/organs/ailments/_ailment.dm
@@ -23,9 +23,9 @@
// Fluff strings
var/initial_ailment_message = "Your $ORGAN$ $ORGAN_DOES$n't feel quite right..." // Shown in New()
var/third_person_treatment_message = "$USER$ treats $TARGET$'s ailment with $ITEM$." // Shown when treating other with an item.
- var/self_treatment_message = "$USER$ treats $USER_HIS$ ailment with $ITEM$." // Shown when treating self with an item.
+ var/self_treatment_message = "$USER$ treats $USER_THEIR$ ailment with $ITEM$." // Shown when treating self with an item.
var/medication_treatment_message = "Your ailment abates." // Shown when treated by a metabolized reagent or CE_X effect.
- var/manual_diagnosis_string /* ex: "$USER_HIS$ $ORGAN$ has something wrong with it" */ // Shown when grab-diagnosed by a doctor. Leave null to be undiagnosable.
+ var/manual_diagnosis_string /* ex: "$USER_THEIR$ $ORGAN$ has something wrong with it" */ // Shown when grab-diagnosed by a doctor. Leave null to be undiagnosable.
var/scanner_diagnosis_string /* ex: "Significant swelling" */ // Shown on the handheld and body scanners. Leave null to be undiagnosable.
var/hidden_from_codex = FALSE
@@ -84,7 +84,7 @@
if(user)
var/decl/pronouns/G = user.get_pronouns()
. = replacetext(., "$USER$", "\the [user]")
- . = replacetext(., "$USER_HIS$", G.his)
+ . = replacetext(., "$USER_THEIR$", G.his)
if(target)
. = replacetext(., "$TARGET$", "\the [target]")
if(organ)
diff --git a/code/modules/organs/ailments/ailments_medical.dm b/code/modules/organs/ailments/ailments_medical.dm
index 69c53e08a54..09cf769982f 100644
--- a/code/modules/organs/ailments/ailments_medical.dm
+++ b/code/modules/organs/ailments/ailments_medical.dm
@@ -29,7 +29,7 @@
treated_by_reagent_type = /decl/material/liquid/nutriment/honey
treated_by_reagent_dosage = 1
medication_treatment_message = "You swallow, finding that your sore throat is rapidly recovering."
- manual_diagnosis_string = "$USER_HIS$ throat is red and inflamed."
+ manual_diagnosis_string = "$USER_THEIR$ throat is red and inflamed."
/datum/ailment/head/sore_throat/on_ailment_event()
to_chat(organ.owner, SPAN_DANGER("You swallow painfully past your sore throat."))
@@ -39,16 +39,16 @@
treated_by_reagent_type = /decl/material/liquid/antiseptic
treated_by_reagent_dosage = 1
medication_treatment_message = "The itching in your sinuses fades away."
- manual_diagnosis_string = "$USER_HIS$ sinuses are inflamed and running."
+ manual_diagnosis_string = "$USER_THEIR$ sinuses are inflamed and running."
/datum/ailment/head/sneezing/can_apply_to(obj/item/organ/_organ)
- . = ..()
- if(. && (!_organ.owner || !_organ.owner.usable_emotes["sneeze"]))
- return FALSE
+ . = ..() && _organ.owner
+ if(.)
+ var/decl/emote/emote = GET_DECL(/decl/emote/audible/sneeze)
+ return emote.mob_can_use(_organ.owner)
/datum/ailment/head/sneezing/on_ailment_event()
- if(organ.owner.usable_emotes["sneeze"])
- organ.owner.emote("sneeze")
+ organ.owner.emote(/decl/emote/audible/sneeze)
organ.owner.setClickCooldown(3)
/datum/ailment/sprain
@@ -56,8 +56,8 @@
applies_to_organ = list(BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)
treated_by_item_type = /obj/item/stack/medical/bruise_pack
third_person_treatment_message = "$USER$ wraps $TARGET$'s sprained $ORGAN$ in $ITEM$."
- self_treatment_message = "$USER$ wraps $USER_HIS$ sprained $ORGAN$ in $ITEM$."
- manual_diagnosis_string = "$USER_HIS$ $ORGAN$ is visibly swollen."
+ self_treatment_message = "$USER$ wraps $USER_THEIR$ sprained $ORGAN$ in $ITEM$."
+ manual_diagnosis_string = "$USER_THEIR$ $ORGAN$ is visibly swollen."
/datum/ailment/sprain/on_ailment_event()
to_chat(organ.owner, SPAN_DANGER("Your sprained [organ.name] aches distractingly."))
@@ -70,8 +70,8 @@
name = "rash"
treated_by_item_type = /obj/item/stack/medical/ointment
third_person_treatment_message = "$USER$ salves $TARGET$'s rash-stricken $ORGAN$ with $ITEM$."
- self_treatment_message = "$USER$ salves $USER_HIS$ rash-stricken $ORGAN$ with $ITEM$."
- manual_diagnosis_string = "$USER_HIS$ $ORGAN$ is covered in a bumpy red rash."
+ self_treatment_message = "$USER$ salves $USER_THEIR$ rash-stricken $ORGAN$ with $ITEM$."
+ manual_diagnosis_string = "$USER_THEIR$ $ORGAN$ is covered in a bumpy red rash."
/datum/ailment/rash/on_ailment_event()
to_chat(organ.owner, SPAN_DANGER("A bright red rash on your [organ.name] itches distractingly."))
@@ -83,12 +83,13 @@
applies_to_organ = list(BP_LUNGS)
treated_by_reagent_type = /decl/material/liquid/antiseptic
medication_treatment_message = "The tickling in your throat fades away."
- manual_diagnosis_string = "$USER_HIS$ throat is red and inflamed."
+ manual_diagnosis_string = "$USER_THEIR$ throat is red and inflamed."
/datum/ailment/coughing/can_apply_to(obj/item/organ/_organ)
- . = ..()
- if(. && (!_organ.owner || !_organ.owner.usable_emotes["cough"]))
- return FALSE
+ . = ..() && _organ.owner
+ if(.)
+ var/decl/emote/emote = GET_DECL(/decl/emote/audible/cough)
+ return emote.mob_can_use(_organ.owner)
/datum/ailment/coughing/on_ailment_event()
organ.owner.cough()
@@ -99,7 +100,7 @@
treated_by_chem_effect = CE_PAINKILLER
treated_by_chem_effect_strength = 25
medication_treatment_message = "The dull pulse of pain in your $ORGAN$ fades away."
- manual_diagnosis_string = "$USER_HIS$ $ORGAN$ is visibly swollen."
+ manual_diagnosis_string = "$USER_THEIR$ $ORGAN$ is visibly swollen."
/datum/ailment/sore_joint/on_ailment_event()
var/obj/item/organ/external/E = organ
diff --git a/code/modules/organs/ailments/faults/_fault.dm b/code/modules/organs/ailments/faults/_fault.dm
index 0eb2ec462f8..4a4d72c6fe5 100644
--- a/code/modules/organs/ailments/faults/_fault.dm
+++ b/code/modules/organs/ailments/faults/_fault.dm
@@ -7,5 +7,5 @@
)
treated_by_item_cost = 3
third_person_treatment_message = "$USER$ patches $TARGET$'s faulty $ORGAN$ with $ITEM$."
- self_treatment_message = "$USER$ patches $USER_HIS$ faulty $ORGAN$ with $ITEM$."
+ self_treatment_message = "$USER$ patches $USER_THEIR$ faulty $ORGAN$ with $ITEM$."
initial_ailment_message = "Damage to your $ORGAN$ has caused a fault..."
diff --git a/code/modules/organs/ailments/faults/fault_acid_discharge.dm b/code/modules/organs/ailments/faults/fault_acid_discharge.dm
index 505eeee331d..cc2281544a6 100644
--- a/code/modules/organs/ailments/faults/fault_acid_discharge.dm
+++ b/code/modules/organs/ailments/faults/fault_acid_discharge.dm
@@ -1,6 +1,6 @@
/datum/ailment/fault/acid
name = "acidic discharge"
- manual_diagnosis_string = "$USER_HIS$ $ORGAN$ is leaking some kind of chemical."
+ manual_diagnosis_string = "$USER_THEIR$ $ORGAN$ is leaking some kind of chemical."
/datum/ailment/fault/acid/on_ailment_event()
organ.owner.custom_pain("A burning sensation spreads through your [organ.name].", 5, affecting = organ.owner)
diff --git a/code/modules/organs/ailments/faults/fault_elec_discharge.dm b/code/modules/organs/ailments/faults/fault_elec_discharge.dm
index 09d5b3fdaf4..8e7ec518031 100644
--- a/code/modules/organs/ailments/faults/fault_elec_discharge.dm
+++ b/code/modules/organs/ailments/faults/fault_elec_discharge.dm
@@ -1,6 +1,6 @@
/datum/ailment/fault/elec_discharge
name = "electrical discharge"
- manual_diagnosis_string = "$USER_HIS$ $ORGAN$ gives you a static shock when you touch it!"
+ manual_diagnosis_string = "$USER_THEIR$ $ORGAN$ gives you a static shock when you touch it!"
/datum/ailment/fault/elec_discharge/on_ailment_event()
organ.owner.custom_pain("Shock jolts through your [organ.name], staggering you!", 50, affecting = organ.owner)
diff --git a/code/modules/organs/ailments/faults/fault_leaky.dm b/code/modules/organs/ailments/faults/fault_leaky.dm
index d3d44a66280..d8659a9fb51 100644
--- a/code/modules/organs/ailments/faults/fault_leaky.dm
+++ b/code/modules/organs/ailments/faults/fault_leaky.dm
@@ -1,6 +1,6 @@
/datum/ailment/fault/leaky
name = "leaky prosthetic"
- manual_diagnosis_string = "$USER_HIS$ $ORGAN$ is leaking some kind of chemical."
+ manual_diagnosis_string = "$USER_THEIR$ $ORGAN$ is leaking some kind of chemical."
var/static/list/chemicals = list(
/decl/material/liquid/enzyme,
/decl/material/liquid/frostoil,
diff --git a/code/modules/organs/ailments/faults/fault_locking_thumbs.dm b/code/modules/organs/ailments/faults/fault_locking_thumbs.dm
index a0df179ed84..faa71d72568 100644
--- a/code/modules/organs/ailments/faults/fault_locking_thumbs.dm
+++ b/code/modules/organs/ailments/faults/fault_locking_thumbs.dm
@@ -1,6 +1,6 @@
/datum/ailment/fault/locking_thumbs
name = "self-locking thumbs"
- manual_diagnosis_string = "$USER_HIS$ $ORGAN$ makes a grinding sound when you move the joints."
+ manual_diagnosis_string = "$USER_THEIR$ $ORGAN$ makes a grinding sound when you move the joints."
applies_to_organ = list(
BP_L_ARM,
BP_L_HAND,
diff --git a/code/modules/organs/ailments/faults/fault_noisemaker.dm b/code/modules/organs/ailments/faults/fault_noisemaker.dm
index 981cefb72ba..c99f9e2cc37 100644
--- a/code/modules/organs/ailments/faults/fault_noisemaker.dm
+++ b/code/modules/organs/ailments/faults/fault_noisemaker.dm
@@ -1,6 +1,6 @@
/datum/ailment/fault/noisemaker
name = "noisemaker"
- manual_diagnosis_string = "$USER_HIS$ $ORGAN$ is emitting a low capacitor whine."
+ manual_diagnosis_string = "$USER_THEIR$ $ORGAN$ is emitting a low capacitor whine."
/datum/ailment/fault/noisemaker/on_ailment_event()
organ.owner.audible_message(SPAN_DANGER("[organ.owner]'s [organ.name] emits a loud, piezoelectric screal."), hearing_distance = 7)
diff --git a/code/modules/organs/ailments/faults/fault_overstimulation.dm b/code/modules/organs/ailments/faults/fault_overstimulation.dm
index d334212b1e6..49244c9fe9d 100644
--- a/code/modules/organs/ailments/faults/fault_overstimulation.dm
+++ b/code/modules/organs/ailments/faults/fault_overstimulation.dm
@@ -2,5 +2,5 @@
name = "motor control overstimulation"
/datum/ailment/fault/overstimulation/on_ailment_event()
- organ.owner.emote("collapse")
+ organ.owner.emote(/decl/emote/visible/collapse)
SET_STATUS_MAX(organ.owner, STAT_STUN, rand(2, 4))
\ No newline at end of file
diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm
index a5800fb5563..a98d171a762 100644
--- a/code/modules/organs/external/_external.dm
+++ b/code/modules/organs/external/_external.dm
@@ -1241,7 +1241,7 @@ Note that amputating the affected organ does in fact remove the infection from t
"You hear a sickening crack.")
jostle_bone()
if(can_feel_pain())
- owner.emote("scream")
+ owner.emote(/decl/emote/audible/scream)
playsound(src.loc, "fracture", 100, 1, -2)
status |= ORGAN_BROKEN
diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm
index ca5c44974f9..b8f7c33f6f1 100644
--- a/code/modules/organs/external/_external_damage.dm
+++ b/code/modules/organs/external/_external_damage.dm
@@ -68,7 +68,7 @@
if((status & ORGAN_BROKEN) && brute)
jostle_bone(brute)
if(can_feel_pain() && prob(40))
- owner.emote("scream") //getting hit on broken hand hurts
+ owner.emote(/decl/emote/audible/scream) //getting hit on broken hand hurts
// If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking
var/datum/wound/created_wound
@@ -282,7 +282,7 @@
return
pain = max(0,min(max_damage,pain+amount))
if(owner && ((amount > 15 && prob(20)) || (amount > 30 && prob(60))))
- owner.emote("scream")
+ owner.emote(/decl/emote/audible/scream)
return pain-last_pain
/obj/item/organ/external/proc/stun_act(var/stun_amount, var/agony_amount)
diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm
index d84032440d0..f990df6ae80 100644
--- a/code/modules/organs/internal/brain.dm
+++ b/code/modules/organs/internal/brain.dm
@@ -188,7 +188,7 @@
SET_STATUS_MAX(owner, STAT_STUN, 10)
switch(rand(1, 3))
if(1)
- owner.emote("twitch")
+ owner.emote(/decl/emote/visible/twitch)
if(2 to 3)
owner.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]")
ADJ_STATUS(owner, STAT_JITTER, 100)
diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm
index a6013149427..4402f09783d 100644
--- a/code/modules/organs/internal/lungs.dm
+++ b/code/modules/organs/internal/lungs.dm
@@ -189,7 +189,7 @@
if(inhale_efficiency < 1)
if(prob(20) && active_breathing)
if(inhale_efficiency < 0.6)
- owner.emote("gasp")
+ owner.emote(/decl/emote/audible/gasp)
else if(prob(20))
to_chat(owner, SPAN_WARNING("It's hard to breathe..."))
breath_fail_ratio = clamp(0,(1 - inhale_efficiency + breath_fail_ratio)/2,1)
@@ -259,9 +259,9 @@
if(prob(15) && !owner.nervous_system_failure())
if(!owner.is_asystole())
if(active_breathing)
- owner.emote("gasp")
+ owner.emote(/decl/emote/audible/gasp)
else
- owner.emote(pick("shiver","twitch"))
+ owner.emote(pick(/decl/emote/visible/shiver,/decl/emote/visible/twitch))
if(damage || GET_CHEMICAL_EFFECT(owner, CE_BREATHLOSS) || world.time > last_successful_breath + 2 MINUTES)
owner.adjustOxyLoss(HUMAN_MAX_OXYLOSS*breath_fail_ratio)
diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm
index d9bff64a519..6ec0982199b 100644
--- a/code/modules/organs/pain.dm
+++ b/code/modules/organs/pain.dm
@@ -47,7 +47,7 @@
if(.)
var/force_emote = species.get_pain_emote(src, power)
if(force_emote && prob(power))
- var/decl/emote/use_emote = usable_emotes[force_emote]
+ var/decl/emote/use_emote = GET_DECL(force_emote)
if(!(use_emote.message_type == AUDIBLE_MESSAGE &&HAS_STATUS(src, STAT_SILENCE)))
emote(force_emote)
diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm
index fb4e91ed42d..bb2ff0beee5 100644
--- a/code/modules/reagents/chems/chems_compounds.dm
+++ b/code/modules/reagents/chems/chems_compounds.dm
@@ -74,7 +74,7 @@
/decl/material/liquid/frostoil/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder)
M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0)
if(prob(1))
- M.emote("shiver")
+ M.emote(/decl/emote/visible/shiver)
holder.remove_reagent(/decl/material/liquid/capsaicin, 5)
/decl/material/liquid/capsaicin
@@ -423,7 +423,7 @@
else if(E.organ_tag != BP_CHEST && E.organ_tag != BP_GROIN && prob(15))
to_chat(H, SPAN_DANGER("Your [E.name] is being lacerated from within!"))
if(E.can_feel_pain())
- H.emote("scream")
+ H.emote(/decl/emote/audible/scream)
if(prob(25))
for(var/i = 1 to rand(3,5))
new /obj/item/shard(get_turf(E), result_mat)
diff --git a/code/modules/reagents/chems/chems_drugs.dm b/code/modules/reagents/chems/chems_drugs.dm
index d03237b924d..f19a6179760 100644
--- a/code/modules/reagents/chems/chems_drugs.dm
+++ b/code/modules/reagents/chems/chems_drugs.dm
@@ -12,7 +12,7 @@
/decl/material/liquid/amphetamines/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder)
if(prob(5))
- M.emote(pick("twitch", "blink_r", "shiver"))
+ M.emote(pick(/decl/emote/visible/twitch, /decl/emote/visible/blink_r, /decl/emote/visible/shiver))
M.add_chemical_effect(CE_SPEEDBOOST, 1)
M.add_chemical_effect(CE_PULSE, 3)
@@ -33,7 +33,7 @@
if(prob(50))
SET_STATUS_MAX(M, STAT_DROWSY, 3)
if(prob(10))
- M.emote("drool")
+ M.emote(/decl/emote/visible/drool)
/decl/material/liquid/nicotine
name = "nicotine"
@@ -79,7 +79,7 @@
var/dose = LAZYACCESS(M.chem_doses, type)
if(dose < 0.5 * threshold)
if(dose == metabolism * 2 || prob(5))
- M.emote("yawn")
+ M.emote(/decl/emote/audible/yawn)
else if(dose < 1 * threshold)
SET_STATUS_MAX(M, STAT_BLURRY, 10)
else if(dose < 2 * threshold)
@@ -148,7 +148,7 @@
M.apply_effect(3, STUTTER)
ADJ_STATUS(M, STAT_DIZZY, 1)
if(prob(5))
- M.emote(pick("twitch", "giggle"))
+ M.emote(pick(/decl/emote/visible/twitch, /decl/emote/audible/giggle))
else if(dose < 2 * threshold)
M.apply_effect(3, STUTTER)
ADJ_STATUS(M, STAT_JITTER, 2)
@@ -156,7 +156,7 @@
SET_STATUS_MAX(M, STAT_DRUGGY, 35)
if(prob(10))
- M.emote(pick("twitch", "giggle"))
+ M.emote(pick(/decl/emote/visible/twitch, /decl/emote/audible/giggle))
else
M.add_chemical_effect(CE_MIND, -1)
M.apply_effect(3, STUTTER)
@@ -164,7 +164,7 @@
ADJ_STATUS(M, STAT_DIZZY, 5)
SET_STATUS_MAX(M, STAT_DRUGGY, 40)
if(prob(15))
- M.emote(pick("twitch", "giggle"))
+ M.emote(pick(/decl/emote/visible/twitch, /decl/emote/audible/giggle))
// Welcome back, Three Eye
/decl/material/liquid/glowsap/gleam
diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm
index ecf9764575e..b8a0f52247f 100644
--- a/code/modules/species/species.dm
+++ b/code/modules/species/species.dm
@@ -227,6 +227,9 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200
var/preview_icon_path
var/preview_outfit = /decl/hierarchy/outfit/job/generic/assistant
+ /// List of emote types that this species can use by default.
+ var/list/default_emotes
+
/decl/species/proc/build_codex_strings()
if(!codex_description)
@@ -475,9 +478,9 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200
/decl/species/proc/handle_sleeping(var/mob/living/carbon/human/H)
if(prob(2) && !H.failed_last_breath && !H.isSynthetic())
if(!HAS_STATUS(H, STAT_PARA))
- H.emote("snore")
+ H.emote(/decl/emote/audible/snore)
else
- H.emote("groan")
+ H.emote(/decl/emote/audible/groan)
/decl/species/proc/handle_environment_special(var/mob/living/carbon/human/H)
return
@@ -721,8 +724,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200
var/pain_level = pain_emotes_with_pain_level[pain_emotes]
if(pain_level >= pain_power)
// This assumes that if a pain-level has been defined it also has a list of emotes to go with it
- var/decl/emote/E = GET_DECL(pick(pain_emotes))
- return E.key
+ return pick(pain_emotes)
/decl/species/proc/handle_post_move(var/mob/living/carbon/human/H)
handle_exertion(H)
diff --git a/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm b/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm
index cc1c0166504..cd593387c8f 100644
--- a/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm
+++ b/mods/content/psionics/system/psionics/complexus/complexus_helpers.dm
@@ -78,7 +78,8 @@
stunned(value * 2)
set_cooldown(value * 100)
- if(prob(value*10)) owner.emote("scream")
+ if(prob(value*10))
+ owner.emote(/decl/emote/audible/scream)
// Your head asplode.
owner.adjustBrainLoss(value)
diff --git a/mods/content/psionics/system/psionics/faculties/coercion.dm b/mods/content/psionics/system/psionics/faculties/coercion.dm
index f619d38dd3f..cd856169ab9 100644
--- a/mods/content/psionics/system/psionics/faculties/coercion.dm
+++ b/mods/content/psionics/system/psionics/faculties/coercion.dm
@@ -45,7 +45,7 @@
if(prob(60) && iscarbon(M))
var/mob/living/carbon/C = M
if(C.can_feel_pain())
- M.emote("scream")
+ M.emote(/decl/emote/audible/scream)
to_chat(M, SPAN_DANGER("Your senses are blasted into oblivion by a psionic scream!"))
M.flash_eyes()
SET_STATUS_MAX(M, STAT_BLIND, 3)
@@ -132,7 +132,7 @@
to_chat(user, "You lash out, stabbing into \the [target] with a lance of psi-power.")
to_chat(target, "The muscles in your arms cramp horrendously!")
if(prob(75))
- target.emote("scream")
+ target.emote(/decl/emote/audible/scream)
for(var/hand_slot in target.get_held_item_slots())
var/obj/item/thing = target.get_equipped_item(hand_slot)
if(thing?.simulated && prob(75) && target.try_unequip(thing))
diff --git a/mods/content/xenobiology/emotes.dm b/mods/content/xenobiology/emotes.dm
index cb632012705..263221ad6fb 100644
--- a/mods/content/xenobiology/emotes.dm
+++ b/mods/content/xenobiology/emotes.dm
@@ -1,5 +1,5 @@
-/mob/living/slime
- default_emotes = list(
+/mob/living/slime/get_default_emotes()
+ var/static/list/default_emotes = list(
/decl/emote/audible/moan,
/decl/emote/visible/twitch,
/decl/emote/visible/sway,
@@ -14,8 +14,9 @@
/decl/emote/slime/angry,
/decl/emote/slime/frown,
/decl/emote/slime/smile
- )
-
+ )
+ return default_emotes
+
/decl/emote/slime
key = "nomood"
var/mood
@@ -26,25 +27,25 @@
slime_ai.mood = mood
user.update_icon()
-/decl/emote/slime/check_user(var/atom/user)
- return isslime(user)
+/decl/emote/slime/mob_can_use(mob/living/user, assume_available = FALSE)
+ return isslime(user) && ..()
/decl/emote/slime/pout
- key = "pout"
+ key = "slimepout"
mood = "pout"
/decl/emote/slime/sad
- key = "sad"
+ key = "slimesad"
mood = "sad"
/decl/emote/slime/angry
- key = "angry"
+ key = "slimeangry"
mood = "angry"
/decl/emote/slime/frown
- key = "frown"
+ key = "slimefrown"
mood = "mischevous"
/decl/emote/slime/smile
- key = "smile"
+ key = "slimesmile"
mood = ":3"
diff --git a/mods/content/xenobiology/slime/slime_AI.dm b/mods/content/xenobiology/slime/slime_AI.dm
index b79fcc0a3a1..9ab005ea9b0 100644
--- a/mods/content/xenobiology/slime/slime_AI.dm
+++ b/mods/content/xenobiology/slime/slime_AI.dm
@@ -193,7 +193,7 @@
if(prob(1))
if(prob(50))
- body.emote(pick("bounce","sway","light","vibrate","jiggle"))
+ body.emote(pick(/decl/emote/visible/bounce, /decl/emote/visible/sway, /decl/emote/visible/lightup, /decl/emote/visible/vibrate, /decl/emote/visible/jiggle))
else
var/list/possible_comments
var/list/all_slime_comments = decls_repository.get_decls_of_subtype(/decl/slime_comment)
diff --git a/mods/mobs/dionaea/datums/ai.dm b/mods/mobs/dionaea/datums/ai.dm
index 6af2cc080bb..750c1668076 100644
--- a/mods/mobs/dionaea/datums/ai.dm
+++ b/mods/mobs/dionaea/datums/ai.dm
@@ -10,4 +10,4 @@
if(prob(wander_prob) && !LAZYLEN(body.grabbed_by) && isturf(body.loc)) //won't move if being pulled
body.SelfMove(pick(global.cardinal))
if(prob(emote_prob))
- body.emote(pick("scratch","jump","chirp","tail"))
\ No newline at end of file
+ body.emote(pick(/decl/emote/visible/scratch, /decl/emote/visible/jump, /decl/emote/audible/chirp, /decl/emote/visible/tail))
diff --git a/mods/mobs/dionaea/mob/nymph_emotes.dm b/mods/mobs/dionaea/mob/nymph_emotes.dm
index d3a1eb2be9c..1c7c78bdbcc 100644
--- a/mods/mobs/dionaea/mob/nymph_emotes.dm
+++ b/mods/mobs/dionaea/mob/nymph_emotes.dm
@@ -1,5 +1,5 @@
-/mob/living/carbon/alien/diona
- default_emotes = list(
+/mob/living/carbon/alien/diona/get_default_emotes()
+ var/static/list/default_emotes = list(
/decl/emote/visible,
/decl/emote/visible/scratch,
/decl/emote/visible/drool,
@@ -24,8 +24,9 @@
/decl/emote/audible/bug_chitter,
/decl/emote/audible/chirp
)
+ return default_emotes
/decl/emote/audible/chirp
key = "chirp"
- emote_message_3p = "USER chirps!"
+ emote_message_3p = "$USER$ chirps!"
emote_sound = 'mods/mobs/dionaea/sounds/nymphchirp.ogg'
diff --git a/mods/species/ascent/datum/emotes.dm b/mods/species/ascent/datum/emotes.dm
index 1765b9e4517..7c34edae0b4 100644
--- a/mods/species/ascent/datum/emotes.dm
+++ b/mods/species/ascent/datum/emotes.dm
@@ -11,48 +11,49 @@
/decl/emote/visible/ascent_dazzle
)
-/mob/living/silicon/robot/flying/ascent
- default_emotes = list(
+/mob/living/silicon/robot/flying/ascent/get_default_emotes()
+ var/static/list/default_emotes = list(
/decl/emote/audible/ascent_purr,
/decl/emote/audible/ascent_hiss,
/decl/emote/audible/ascent_snarl
)
+ return default_emotes
/decl/emote/audible/ascent_purr
- key = "purr"
- emote_message_3p = "USER purrs."
+ key = "apurr"
+ emote_message_3p = "$USER$ purrs."
emote_sound = 'mods/species/ascent/sounds/ascent1.ogg'
/decl/emote/audible/ascent_hiss
- key ="hiss"
- emote_message_3p = "USER hisses."
+ key = "ahiss"
+ emote_message_3p = "$USER$ hisses."
emote_sound = 'mods/species/ascent/sounds/razorweb.ogg'
/decl/emote/audible/ascent_snarl
- key = "snarl"
- emote_message_3p = "USER snarls."
+ key = "asnarl"
+ emote_message_3p = "$USER$ snarls."
emote_sound = 'mods/species/ascent/sounds/razorweb_hiss.ogg'
/decl/emote/visible/ascent_flicker
- key = "flicker"
- emote_message_3p = "USER flickers prismatically."
+ key = "aflicker"
+ emote_message_3p = "$USER$ flickers prismatically."
/decl/emote/visible/ascent_glint
- key = "glint"
- emote_message_3p = "USER glints."
+ key = "aglint"
+ emote_message_3p = "$USER$ glints."
/decl/emote/visible/ascent_glimmer
- key = "glimmer"
- emote_message_3p = "USER glimmers."
+ key = "aglimmer"
+ emote_message_3p = "$USER$ glimmers."
/decl/emote/visible/ascent_pulse
- key = "pulse"
- emote_message_3p = "USER pulses with light."
+ key = "apulse"
+ emote_message_3p = "$USER$ pulses with light."
/decl/emote/visible/ascent_shine
- key = "shine"
- emote_message_3p = "USER shines brightly!"
+ key = "ashine"
+ emote_message_3p = "$USER$ shines brightly!"
/decl/emote/visible/ascent_dazzle
- key = "dazzle"
- emote_message_3p = "USER dazzles!"
+ key = "adazzle"
+ emote_message_3p = "$USER$ dazzles!"
diff --git a/mods/species/ascent/mobs/nymph/nymph_emotes.dm b/mods/species/ascent/mobs/nymph/nymph_emotes.dm
index fb601f6e91a..23b96c70bfa 100644
--- a/mods/species/ascent/mobs/nymph/nymph_emotes.dm
+++ b/mods/species/ascent/mobs/nymph/nymph_emotes.dm
@@ -1,5 +1,5 @@
-/mob/living/carbon/alien/ascent_nymph
- default_emotes = list(
+/mob/living/carbon/alien/ascent_nymph/get_default_emotes()
+ var/static/list/default_emotes = list(
/decl/emote/visible,
/decl/emote/visible/scratch,
/decl/emote/visible/drool,
@@ -19,4 +19,5 @@
/decl/emote/audible/gnarl,
/decl/emote/audible/bug_hiss,
/decl/emote/audible/bug_chitter
- )
\ No newline at end of file
+ )
+ return default_emotes
diff --git a/mods/species/bayliens/adherent/datum/emotes.dm b/mods/species/bayliens/adherent/datum/emotes.dm
index 7babbbd83c0..dd347dedd15 100644
--- a/mods/species/bayliens/adherent/datum/emotes.dm
+++ b/mods/species/bayliens/adherent/datum/emotes.dm
@@ -6,10 +6,10 @@
/decl/emote/audible/adherent_ding
key = "ding"
- emote_message_3p = "USER dings."
+ emote_message_3p = "$USER$ dings."
emote_sound = 'mods/species/bayliens/adherent/sound/ding.ogg'
/decl/emote/audible/adherent_chime
key = "chime"
- emote_message_3p = "USER chimes."
+ emote_message_3p = "$USER$ chimes."
emote_sound = 'mods/species/bayliens/adherent/sound/chime.ogg'
diff --git a/mods/species/bayliens/skrell/datum/emotes.dm b/mods/species/bayliens/skrell/datum/emotes.dm
index 6f773783d63..3bb122ec912 100644
--- a/mods/species/bayliens/skrell/datum/emotes.dm
+++ b/mods/species/bayliens/skrell/datum/emotes.dm
@@ -9,21 +9,21 @@
/decl/emote/audible/warble
key = "warble"
- emote_message_3p = "USER warbles."
+ emote_message_3p = "$USER$ warbles."
emote_sound = 'mods/species/bayliens/skrell/sound/warble.ogg'
/decl/emote/audible/croak
key = "croak"
- emote_message_3p = "USER croaks!"
+ emote_message_3p = "$USER$ croaks!"
/decl/emote/audible/trill
key = "trill"
- emote_message_3p = "USER trills melodically!"
+ emote_message_3p = "$USER$ trills melodically!"
/decl/emote/audible/hum
key = "hum"
- emote_message_3p = "USER hums a melodic, warbly chorus of notes!"
+ emote_message_3p = "$USER$ hums a melodic, warbly chorus of notes!"
/decl/emote/audible/coo
key = "coo"
- emote_message_3p = "USER lets out an audible, warbly coo."
\ No newline at end of file
+ emote_message_3p = "$USER$ lets out an audible, warbly coo."
\ No newline at end of file
diff --git a/mods/species/bayliens/tajaran/datum/emotes.dm b/mods/species/bayliens/tajaran/datum/emotes.dm
index f5e07f697b9..adeed0c5c8d 100644
--- a/mods/species/bayliens/tajaran/datum/emotes.dm
+++ b/mods/species/bayliens/tajaran/datum/emotes.dm
@@ -1,9 +1,9 @@
/decl/emote/audible/purr
key = "purr"
- emote_message_3p = "USER purrs."
+ emote_message_3p = "$USER$ purrs."
emote_sound = 'mods/species/bayliens/tajaran/sound/cat_purr.ogg'
/decl/emote/audible/purrlong
key = "purrl"
- emote_message_3p = "USER purrs."
+ emote_message_3p = "$USER$ purrs."
emote_sound = 'mods/species/bayliens/tajaran/sound/cat_purr_long.ogg'
diff --git a/mods/species/bayliens/tajaran/datum/species.dm b/mods/species/bayliens/tajaran/datum/species.dm
index 8db767a029f..b19f50f8877 100644
--- a/mods/species/bayliens/tajaran/datum/species.dm
+++ b/mods/species/bayliens/tajaran/datum/species.dm
@@ -62,13 +62,13 @@
)
default_emotes = list(
- /decl/emote/human/swish,
- /decl/emote/human/wag,
- /decl/emote/human/sway,
- /decl/emote/human/qwag,
- /decl/emote/human/fastsway,
- /decl/emote/human/swag,
- /decl/emote/human/stopsway,
+ /decl/emote/visible/tail/swish,
+ /decl/emote/visible/tail/wag,
+ /decl/emote/visible/tail/sway,
+ /decl/emote/visible/tail/qwag,
+ /decl/emote/visible/tail/fastsway,
+ /decl/emote/visible/tail/swag,
+ /decl/emote/visible/tail/stopsway,
/decl/emote/audible/purr,
/decl/emote/audible/purrlong
)
diff --git a/mods/species/bayliens/unathi/datum/species.dm b/mods/species/bayliens/unathi/datum/species.dm
index 29cd9e8d913..1cfd6fcf0bd 100644
--- a/mods/species/bayliens/unathi/datum/species.dm
+++ b/mods/species/bayliens/unathi/datum/species.dm
@@ -78,13 +78,13 @@
)
default_emotes = list(
- /decl/emote/human/swish,
- /decl/emote/human/wag,
- /decl/emote/human/sway,
- /decl/emote/human/qwag,
- /decl/emote/human/fastsway,
- /decl/emote/human/swag,
- /decl/emote/human/stopsway
+ /decl/emote/visible/tail/swish,
+ /decl/emote/visible/tail/wag,
+ /decl/emote/visible/tail/sway,
+ /decl/emote/visible/tail/qwag,
+ /decl/emote/visible/tail/fastsway,
+ /decl/emote/visible/tail/swag,
+ /decl/emote/visible/tail/stopsway
)
pain_emotes_with_pain_level = list(
diff --git a/mods/species/vox/datum/species.dm b/mods/species/vox/datum/species.dm
index e3d525a7917..8a361b59902 100644
--- a/mods/species/vox/datum/species.dm
+++ b/mods/species/vox/datum/species.dm
@@ -165,6 +165,6 @@
stack.do_backup()
/decl/emote/audible/vox_shriek
- key ="shriek"
- emote_message_3p = "USER SHRIEKS!"
+ key = "shriek"
+ emote_message_3p = "$USER$ SHRIEKS!"
emote_sound = 'mods/species/vox/sounds/shriek1.ogg'
diff --git a/nebula.dme b/nebula.dme
index 7f618f96e3e..b1dacc60123 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -2063,11 +2063,10 @@
#include "code\modules\emotes\emote_define.dm"
#include "code\modules\emotes\emote_mob.dm"
#include "code\modules\emotes\definitions\_mob.dm"
-#include "code\modules\emotes\definitions\_species.dm"
#include "code\modules\emotes\definitions\audible.dm"
#include "code\modules\emotes\definitions\exertion.dm"
-#include "code\modules\emotes\definitions\human.dm"
#include "code\modules\emotes\definitions\synthetics.dm"
+#include "code\modules\emotes\definitions\tail.dm"
#include "code\modules\emotes\definitions\visible.dm"
#include "code\modules\error_handler\error_handler.dm"
#include "code\modules\error_handler\error_reporting.dm"