diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 1e2b2e63f30..0c45ffab5b4 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -272,6 +272,10 @@
#define TASTE_DULL 0.5 //anything below 30%
#define TASTE_NUMB 0.1 //anything below 150%
+//Used by emotes
+#define VISIBLE_MESSAGE 1
+#define AUDIBLE_MESSAGE 2
+
// If they're in an FBP, what braintype.
#define FBP_NONE ""
#define FBP_CYBORG "Cyborg"
@@ -436,3 +440,8 @@
#define MAX_NUTRITION 5000 //VOREStation Edit
#define FAKE_INVIS_ALPHA_THRESHOLD 127 // If something's alpha var is at or below this number, certain things will pretend it is invisible.
+<<<<<<< HEAD
+=======
+
+#define DEATHGASP_NO_MESSAGE "no message"
+>>>>>>> d40a022... Merge pull request #7987 from MistakeNot4892/chirp
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index e4ad20f5d48..c333be31ef3 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -490,8 +490,9 @@
// Use for objects performing visible actions
// message is output to anyone who can see, e.g. "The [src] does something!"
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
-/atom/proc/visible_message(var/message, var/blind_message, var/list/exclude_mobs = null)
+/atom/proc/visible_message(var/message, var/blind_message, var/list/exclude_mobs, var/range = world.view)
+<<<<<<< HEAD
//VOREStation Edit
var/list/see
if(isbelly(loc))
@@ -500,6 +501,9 @@
else
see = get_mobs_and_objs_in_view_fast(get_turf(src),world.view,remote_ghosts = FALSE)
//VOREStation Edit End
+=======
+ var/list/see = get_mobs_and_objs_in_view_fast(get_turf(src), range, remote_ghosts = FALSE)
+>>>>>>> d40a022... Merge pull request #7987 from MistakeNot4892/chirp
var/list/seeing_mobs = see["mobs"]
var/list/seeing_objs = see["objs"]
@@ -508,20 +512,20 @@
for(var/obj in seeing_objs)
var/obj/O = obj
- O.show_message(message, 1, blind_message, 2)
+ O.show_message(message, VISIBLE_MESSAGE, blind_message, AUDIBLE_MESSAGE)
for(var/mob in seeing_mobs)
var/mob/M = mob
if(M.see_invisible >= invisibility && MOB_CAN_SEE_PLANE(M, plane))
- M.show_message(message, 1, blind_message, 2)
+ M.show_message(message, VISIBLE_MESSAGE, blind_message, AUDIBLE_MESSAGE)
else if(blind_message)
- M.show_message(blind_message, 2)
+ M.show_message(blind_message, AUDIBLE_MESSAGE)
// Show a message to all mobs and objects in earshot of this atom
// Use for objects performing audible actions
// message is the message output to anyone who can hear.
// deaf_message (optional) is what deaf people will see.
// hearing_distance (optional) is the range, how many tiles away the message can be heard.
-/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance)
+/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance, var/radio_message)
var/range = hearing_distance || world.view
var/list/hear = get_mobs_and_objs_in_view_fast(get_turf(src),range,remote_ghosts = FALSE)
@@ -529,14 +533,19 @@
var/list/hearing_mobs = hear["mobs"]
var/list/hearing_objs = hear["objs"]
- for(var/obj in hearing_objs)
- var/obj/O = obj
- O.show_message(message, 2, deaf_message, 1)
+ if(radio_message)
+ for(var/obj in hearing_objs)
+ var/obj/O = obj
+ O.hear_talk(src, list(new /datum/multilingual_say_piece(GLOB.all_languages["Noise"], radio_message)), null)
+ else
+ for(var/obj in hearing_objs)
+ var/obj/O = obj
+ O.show_message(message, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE)
for(var/mob in hearing_mobs)
var/mob/M = mob
var/msg = message
- M.show_message(msg, 2, deaf_message, 1)
+ M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE)
/atom/movable/proc/dropInto(var/atom/destination)
while(istype(destination))
@@ -647,4 +656,7 @@
/atom/Exited(atom/movable/AM, atom/new_loc)
. = ..()
- SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, new_loc)
\ No newline at end of file
+ SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, new_loc)
+
+/atom/proc/get_visible_gender()
+ return gender
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 5b4305844ef..f17c97a627b 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -507,7 +507,6 @@
log_and_message_admins("[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) entered cryostorage.")
announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE))
- //visible_message("\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.", 3)
visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2]", 3)
//VOREStation Edit begin: Dont delete mobs-in-mobs
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 21775d0403c..6e10f0e783d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -552,9 +552,7 @@ var/list/global/slot_flags_enumeration = list(
if(!hit_zone)
U.do_attack_animation(M)
playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- //visible_message("[U] attempts to stab [M] in the eyes, but misses!")
- for(var/mob/V in viewers(M))
- V.show_message("[U] attempts to stab [M] in the eyes, but misses!")
+ visible_message(SPAN_DANGER("\The [U] attempts to stab \the [M] in the eyes, but misses!"))
return
add_attack_logs(user,M,"Attack eyes with [name]")
diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm
index bfa8b616805..7dbb927f853 100644
--- a/code/game/objects/items/weapons/material/misc.dm
+++ b/code/game/objects/items/weapons/material/misc.dm
@@ -74,14 +74,12 @@
/obj/item/weapon/material/snow/snowball/attack_self(mob/user as mob)
if(user.a_intent == I_HURT)
- //visible_message("[user] has smashed the snowball in their hand!", "You smash the snowball in your hand.")
- to_chat(user, "You smash the snowball in your hand.")
+ to_chat(user, SPAN_NOTICE("You smash the snowball in your hand."))
var/atom/S = new /obj/item/stack/material/snow(user.loc)
qdel(src)
user.put_in_hands(S)
else
- //visible_message("[user] starts compacting the snowball.", "You start compacting the snowball.")
- to_chat(user, "You start compacting the snowball.")
+ to_chat(user, SPAN_NOTICE("You start compacting the snowball."))
if(do_after(user, 2 SECONDS))
var/atom/S = new /obj/item/weapon/material/snow/snowball/reinforced(user.loc)
qdel(src)
diff --git a/code/modules/emotes/definitions/_mob.dm b/code/modules/emotes/definitions/_mob.dm
new file mode 100644
index 00000000000..8c10b4cde2f
--- /dev/null
+++ b/code/modules/emotes/definitions/_mob.dm
@@ -0,0 +1,41 @@
+var/list/_default_mob_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/twitch_v,
+ /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,
+ /decl/emote/audible/hiss,
+ /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
+ var/list/usable_emotes
+
+/mob/proc/update_emotes(var/skip_sort)
+ usable_emotes = list()
+ for(var/emote in get_default_emotes())
+ var/decl/emote/emote_datum = decls_repository.get_decl(emote)
+ if(emote_datum.check_user(src))
+ usable_emotes[emote_datum.key] = emote_datum
+ if(!skip_sort)
+ usable_emotes = sortAssoc(usable_emotes)
+
+/mob/proc/get_default_emotes()
+ return global._default_mob_emotes
diff --git a/code/modules/emotes/definitions/_species.dm b/code/modules/emotes/definitions/_species.dm
new file mode 100644
index 00000000000..ff15df2fae5
--- /dev/null
+++ b/code/modules/emotes/definitions/_species.dm
@@ -0,0 +1,11 @@
+/datum/species
+ var/list/default_emotes = list()
+
+/mob/living/carbon/update_emotes(var/skip_sort)
+ . = ..(skip_sort = TRUE)
+ if(species)
+ for(var/emote in species.default_emotes)
+ var/decl/emote/emote_datum = decls_repository.get_decl(emote)
+ if(emote_datum.check_user(src))
+ usable_emotes[emote_datum.key] = emote_datum
+ usable_emotes = sortAssoc(usable_emotes)
diff --git a/code/modules/emotes/definitions/audible.dm b/code/modules/emotes/definitions/audible.dm
new file mode 100644
index 00000000000..6365f1171dd
--- /dev/null
+++ b/code/modules/emotes/definitions/audible.dm
@@ -0,0 +1,229 @@
+/decl/emote/audible
+ key = "burp"
+ emote_message_3p = "burps."
+ message_type = AUDIBLE_MESSAGE
+
+/decl/emote/audible/New()
+ . = ..()
+ // Snips the 'USER' from 3p emote messages for radio.
+ if(!emote_message_radio && emote_message_3p)
+ emote_message_radio = emote_message_3p
+ if(!emote_message_radio_synthetic && emote_message_synthetic_3p)
+ emote_message_radio_synthetic = emote_message_synthetic_3p
+
+/decl/emote/audible/deathgasp_alien
+ key = "deathgasp"
+ emote_message_3p = "lets out a waning guttural screech, green blood bubbling from its maw."
+
+/decl/emote/audible/whimper
+ key = "whimper"
+ emote_message_3p = "whimpers."
+
+/decl/emote/audible/gasp
+ key = "gasp"
+ emote_message_3p = "gasps."
+ conscious = FALSE
+
+/decl/emote/audible/scretch
+ key = "scretch"
+ emote_message_3p = "scretches."
+
+/decl/emote/audible/choke
+ key ="choke"
+ emote_message_3p = "chokes."
+ conscious = FALSE
+
+/decl/emote/audible/gnarl
+ key = "gnarl"
+ emote_message_3p = "gnarls and shows USER_HIS teeth."
+
+/decl/emote/audible/multichirp
+ key = "mchirp"
+ emote_message_3p = "chirps a chorus of notes!"
+ emote_sound = 'sound/voice/multichirp.ogg'
+
+/decl/emote/audible/alarm
+ key = "alarm"
+ emote_message_1p = "You sound an alarm."
+ emote_message_3p = "sounds an alarm."
+
+/decl/emote/audible/alert
+ key = "alert"
+ emote_message_1p = "You let out a distressed noise."
+ emote_message_3p = "lets out a distressed noise."
+
+/decl/emote/audible/notice
+ key = "notice"
+ emote_message_1p = "You play a loud tone."
+ emote_message_3p = "plays a loud tone."
+
+/decl/emote/audible/boop
+ key = "boop"
+ emote_message_1p = "You boop."
+ emote_message_3p = "boops."
+
+/decl/emote/audible/beep
+ key = "beep"
+ emote_message_3p = "You beep."
+ emote_message_3p = "beeps."
+ emote_sound = 'sound/machines/twobeep.ogg'
+
+/decl/emote/audible/sniff
+ key = "sniff"
+ emote_message_3p = "sniffs."
+
+/decl/emote/audible/snore
+ key = "snore"
+ emote_message_3p = "snores."
+ conscious = FALSE
+
+/decl/emote/audible/whimper
+ key = "whimper"
+ emote_message_3p = "whimpers."
+
+/decl/emote/audible/yawn
+ key = "yawn"
+ emote_message_3p = "yawns."
+
+/decl/emote/audible/clap
+ key = "clap"
+ emote_message_3p = "claps."
+
+/decl/emote/audible/chuckle
+ key = "chuckle"
+ emote_message_3p = "chuckles."
+
+/decl/emote/audible/cry
+ key = "cry"
+ emote_message_3p = "cries."
+
+/decl/emote/audible/sigh
+ key = "sigh"
+ emote_message_3p = "sighs."
+
+/decl/emote/audible/laugh
+ key = "laugh"
+ emote_message_3p_target = "laughs at TARGET."
+ emote_message_3p = "laughs."
+
+/decl/emote/audible/mumble
+ key = "mumble"
+ emote_message_3p = "mumbles!"
+
+/decl/emote/audible/grumble
+ key = "grumble"
+ emote_message_3p = "grumbles!"
+
+/decl/emote/audible/groan
+ key = "groan"
+ emote_message_3p = "groans!"
+ conscious = FALSE
+
+/decl/emote/audible/moan
+ key = "moan"
+ emote_message_3p = "moans!"
+ conscious = FALSE
+
+/decl/emote/audible/giggle
+ key = "giggle"
+ emote_message_3p = "giggles."
+
+/decl/emote/audible/grunt
+ key = "grunt"
+ emote_message_3p = "grunts."
+
+/decl/emote/audible/bug_hiss
+ key ="hiss"
+ emote_message_3p_target = "hisses at TARGET."
+ emote_message_3p = "hisses."
+ emote_sound = 'sound/voice/BugHiss.ogg'
+
+/decl/emote/audible/bug_buzz
+ key ="buzz"
+ emote_message_3p = "buzzes its wings."
+ emote_sound = 'sound/voice/BugBuzz.ogg'
+
+/decl/emote/audible/bug_chitter
+ key ="chitter"
+ emote_message_3p = "chitters."
+ emote_sound = 'sound/voice/Bug.ogg'
+
+/decl/emote/audible/roar
+ key = "roar"
+ emote_message_3p = "roars!"
+
+/decl/emote/audible/bellow
+ key = "bellow"
+ emote_message_3p = "bellows!"
+
+/decl/emote/audible/howl
+ key = "howl"
+ emote_message_3p = "howls!"
+
+/decl/emote/audible/wheeze
+ key = "wheeze"
+ emote_message_3p = "wheezes."
+
+/decl/emote/audible/hiss
+ key = "hiss"
+ emote_message_3p_target = "hisses softly at TARGET."
+ emote_message_3p = "hisses softly."
+
+/decl/emote/audible/chirp
+ key = "chirp"
+ emote_message_3p = "chirps!"
+ emote_sound = 'sound/misc/nymphchirp.ogg'
+
+/decl/emote/audible/crack
+ key = "crack"
+ emote_message_3p = "cracks USER_HIS knuckles."
+ emote_sound = 'sound/voice/knuckles.ogg'
+
+/decl/emote/audible/squish
+ key = "squish"
+ emote_sound = 'sound/effects/slime_squish.ogg' //Credit to DrMinky (freesound.org) for the sound.
+ emote_message_3p = "squishes."
+
+/decl/emote/audible/warble
+ key = "warble"
+ emote_sound = 'sound/effects/warble.ogg' // Copyright CC BY 3.0 alienistcog (freesound.org) for the sound.
+ emote_message_3p = "warbles."
+
+/decl/emote/audible/vox_shriek
+ key = "shriek"
+ emote_message_3p = "SHRIEKS!"
+ emote_sound = 'sound/voice/shriek1.ogg'
+
+/decl/emote/audible/purr
+ key = "purr"
+ emote_message_3p = "purrs."
+ emote_sound = 'sound/voice/cat_purr.ogg'
+
+/decl/emote/audible/purrlong
+ key = "purrl"
+ emote_message_3p = "purrs."
+ emote_sound = 'sound/voice/cat_purr_long.ogg'
+
+/decl/emote/audible/teshsqueak
+ key = "surprised"
+ emote_message_1p = "You chirp in surprise!"
+ emote_message_3p = "chirps in surprise!"
+ emote_message_1p_target = "You chirp in surprise at TARGET!"
+ emote_message_3p_target = "chirps in surprise at TARGET!"
+ emote_sound = 'sound/voice/teshsqueak.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio.
+
+/decl/emote/audible/teshchirp
+ key = "chirp"
+ emote_message_1p = "You chirp!"
+ emote_message_3p = "chirps!"
+ emote_message_1p_target = "You chirp at TARGET!"
+ emote_message_3p_target = "chirps at TARGET!"
+ emote_sound = 'sound/voice/teshchirp.ogg' // Copyright Sampling+ 1.0 Incarnidine (freesound.org) for the source audio.
+
+/decl/emote/audible/teshtrill
+ key = "trill"
+ emote_message_1p = "You trill."
+ emote_message_3p = "trills."
+ emote_message_1p_target = "You trill at TARGET."
+ emote_message_3p_target = "trills at TARGET."
+ emote_sound = 'sound/voice/teshtrill.ogg' // Copyright CC BY-NC 3.0 Arnaud Coutancier (freesound.org) for the source audio.
diff --git a/code/modules/emotes/definitions/audible_cough.dm b/code/modules/emotes/definitions/audible_cough.dm
new file mode 100644
index 00000000000..4e28d1db918
--- /dev/null
+++ b/code/modules/emotes/definitions/audible_cough.dm
@@ -0,0 +1,52 @@
+/decl/emote/audible/cough
+ key = "cough"
+ emote_message_1p = "You cough!"
+ emote_message_1p_target = "You cough on TARGET!"
+ emote_message_3p = "coughs!"
+ emote_message_3p_target = "coughs on TARGET!"
+ emote_message_synthetic_1p_target = "You emit a robotic cough towards TARGET."
+ emote_message_synthetic_1p = "You emit a robotic cough."
+ emote_message_synthetic_3p_target = "emits a robotic cough towards TARGET."
+ emote_message_synthetic_3p = "emits a robotic cough."
+ emote_volume = 120
+ emote_volume_synthetic = 50
+
+ conscious = FALSE
+ emote_sound_synthetic = list(
+ FEMALE = list(
+ 'sound/effects/mob_effects/f_machine_cougha.ogg',
+ 'sound/effects/mob_effects/f_machine_coughb.ogg'
+ ),
+ MALE = list(
+ 'sound/effects/mob_effects/m_machine_cougha.ogg',
+ 'sound/effects/mob_effects/m_machine_coughb.ogg',
+ 'sound/effects/mob_effects/m_machine_coughc.ogg'
+ ),
+ NEUTER = list(
+ 'sound/effects/mob_effects/m_machine_cougha.ogg',
+ 'sound/effects/mob_effects/m_machine_coughb.ogg',
+ 'sound/effects/mob_effects/m_machine_coughc.ogg'
+ ),
+ PLURAL = list(
+ 'sound/effects/mob_effects/m_machine_cougha.ogg',
+ 'sound/effects/mob_effects/m_machine_coughb.ogg',
+ 'sound/effects/mob_effects/m_machine_coughc.ogg'
+ )
+ )
+
+/decl/emote/audible/cough/get_emote_sound(var/atom/user)
+ if(ishuman(user) && !check_synthetic(user))
+ var/mob/living/carbon/human/H = user
+ if(H.get_gender() == FEMALE)
+ if(length(H.species.female_cough_sounds))
+ return list(
+ "sound" = H.species.female_cough_sounds,
+ "vol" = emote_volume
+ )
+ else
+ if(length(H.species.male_cough_sounds))
+ return list(
+ "sound" = H.species.male_cough_sounds,
+ "vol" = emote_volume
+ )
+ return ..()
diff --git a/code/modules/emotes/definitions/audible_scream.dm b/code/modules/emotes/definitions/audible_scream.dm
new file mode 100644
index 00000000000..00ed9c29fc3
--- /dev/null
+++ b/code/modules/emotes/definitions/audible_scream.dm
@@ -0,0 +1,16 @@
+/decl/emote/audible/scream
+ key = "scream"
+ emote_message_1p = "You scream!"
+ emote_message_3p = "screams!"
+
+/decl/emote/audible/scream/get_emote_message_1p(var/atom/user, var/atom/target, var/extra_params)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ return "You [H.species.scream_verb_1p]!"
+ . = ..()
+
+/decl/emote/audible/cough/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ return "[H.species.scream_verb_3p]!"
+ . = ..()
diff --git a/code/modules/emotes/definitions/audible_slap.dm b/code/modules/emotes/definitions/audible_slap.dm
new file mode 100644
index 00000000000..d0b5466c30c
--- /dev/null
+++ b/code/modules/emotes/definitions/audible_slap.dm
@@ -0,0 +1,24 @@
+/decl/emote/audible/slap
+ key = "slap"
+ emote_message_1p_target = "You slap TARGET across the face. Ouch!"
+ emote_message_1p = "You slap yourself across the face!"
+ emote_message_3p_target = "slaps TARGET across the face. Ouch!"
+ emote_message_3p = "slaps USER_SELF across the face!"
+ emote_sound = 'sound/effects/snap.ogg'
+ check_restraints = TRUE
+ check_range = 1
+
+/decl/emote/audible/slap/New()
+ ..()
+ emote_message_1p_target = SPAN_DANGER(emote_message_1p_target)
+ emote_message_1p = SPAN_DANGER(emote_message_1p)
+ emote_message_3p_target = SPAN_DANGER(emote_message_3p_target)
+ emote_message_3p = SPAN_DANGER(emote_message_3p)
+
+/decl/emote/audible/slap/do_extra(var/atom/user, var/atom/target)
+ . = ..()
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ var/obj/item/clothing/mask/smokable/mask = H.wear_mask
+ if(istype(mask) && H.unEquip(mask))
+ mask.forceMove(get_turf(H))
diff --git a/code/modules/emotes/definitions/audible_snap.dm b/code/modules/emotes/definitions/audible_snap.dm
new file mode 100644
index 00000000000..938273fe76c
--- /dev/null
+++ b/code/modules/emotes/definitions/audible_snap.dm
@@ -0,0 +1,22 @@
+/decl/emote/audible/snap
+ key = "snap"
+ emote_message_1p = "You snap your fingers."
+ emote_message_3p = "snaps USER_HIS fingers."
+ emote_message_1p_target = "You snap your fingers at TARGET."
+ emote_message_3p_target = "snaps USER_HIS fingers at TARGET."
+ emote_sound = 'sound/effects/fingersnap.ogg'
+
+/decl/emote/audible/snap/proc/can_snap(var/atom/user)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ for(var/limb in list(BP_L_HAND, BP_R_HAND))
+ var/obj/item/organ/external/L = H.get_organ(limb)
+ if(istype(L) && L.is_usable() && !L.splinted)
+ return TRUE
+ return FALSE
+
+/decl/emote/audible/snap/do_emote(var/atom/user, var/extra_params)
+ if(!can_snap(user))
+ to_chat(user, SPAN_WARNING("You need at least one working hand to snap your fingers."))
+ return FALSE
+ . = ..()
diff --git a/code/modules/emotes/definitions/audible_sneeze.dm b/code/modules/emotes/definitions/audible_sneeze.dm
new file mode 100644
index 00000000000..a15cbaf46db
--- /dev/null
+++ b/code/modules/emotes/definitions/audible_sneeze.dm
@@ -0,0 +1,29 @@
+/decl/emote/audible/sneeze
+ key = "sneeze"
+ emote_message_1p = "You sneeze."
+ emote_message_3p = "sneezes."
+ emote_sound_synthetic = list(
+ FEMALE = 'sound/effects/mob_effects/machine_sneeze.ogg',
+ MALE = 'sound/effects/mob_effects/f_machine_sneeze.ogg',
+ NEUTER = 'sound/effects/mob_effects/f_machine_sneeze.ogg',
+ PLURAL = 'sound/effects/mob_effects/f_machine_sneeze.ogg'
+ )
+ emote_message_synthetic_1p = "You emit a robotic sneeze."
+ emote_message_synthetic_1p_target = "You emit a robotic sneeze towards TARGET."
+ emote_message_synthetic_3p = "emits a robotic sneeze."
+ emote_message_synthetic_3p_target = "emits a robotic sneeze towards TARGET."
+
+/decl/emote/audible/sneeze/get_emote_sound(var/atom/user)
+ if(ishuman(user) && !check_synthetic(user))
+ var/mob/living/carbon/human/H = user
+ if(H.get_gender() == FEMALE)
+ return list(
+ "sound" = H.species.female_sneeze_sound,
+ "vol" = emote_volume
+ )
+ else
+ return list(
+ "sound" = H.species.male_sneeze_sound,
+ "vol" = emote_volume
+ )
+ return ..()
diff --git a/code/modules/emotes/definitions/audible_whistle.dm b/code/modules/emotes/definitions/audible_whistle.dm
new file mode 100644
index 00000000000..dabd64af59d
--- /dev/null
+++ b/code/modules/emotes/definitions/audible_whistle.dm
@@ -0,0 +1,36 @@
+/decl/emote/audible/whistle
+ key = "whistle"
+ emote_message_1p = "You whistle a tune."
+ emote_message_3p = "whistles a tune."
+ emote_sound = 'sound/voice/longwhistle.ogg'
+ emote_message_muffled = "makes a light spitting noise, a poor attempt at a whistle."
+ emote_sound_synthetic = 'sound/voice/longwhistle_robot.ogg'
+ emote_message_synthetic_1p = "You whistle a robotic tune."
+ emote_message_synthetic_3p = "whistles a robotic tune."
+
+/decl/emote/audible/whistle/quiet
+ key = "qwhistle"
+ emote_message_1p = "You whistle quietly."
+ emote_message_3p = "whistles quietly."
+ emote_sound = 'sound/voice/shortwhistle.ogg'
+ emote_message_synthetic_1p = "You whistle robotically."
+ emote_message_synthetic_3p = "whistles robotically."
+ emote_sound_synthetic = 'sound/voice/shortwhistle_robot.ogg'
+
+/decl/emote/audible/whistle/wolf
+ key = "wwhistle"
+ emote_message_1p = "You whistle inappropriately."
+ emote_message_3p = "whistles inappropriately."
+ emote_sound = 'sound/voice/wolfwhistle.ogg'
+ emote_message_synthetic_1p = "You beep inappropriately."
+ emote_message_synthetic_3p = "beeps inappropriately."
+ emote_sound_synthetic = 'sound/voice/wolfwhistle_robot.ogg'
+
+/decl/emote/audible/whistle/summon
+ key = "swhistle"
+ emote_message_1p = "You whistle a tune."
+ emote_message_3p = "whistles a tune."
+ emote_sound = 'sound/voice/summon_whistle.ogg'
+ emote_message_synthetic_1p = "You whistle a robotic tune."
+ emote_message_synthetic_3p = "whistles a robotic tune."
+ emote_sound_synthetic = 'sound/voice/summon_whistle_robot.ogg'
diff --git a/code/modules/emotes/definitions/exertion.dm b/code/modules/emotes/definitions/exertion.dm
new file mode 100644
index 00000000000..ac0061cca32
--- /dev/null
+++ b/code/modules/emotes/definitions/exertion.dm
@@ -0,0 +1,40 @@
+/decl/emote/exertion/biological
+ key = "esweat"
+ emote_range = 4
+ emote_message_1p = "You are sweating heavily."
+ emote_message_3p = "is sweating heavily."
+
+/decl/emote/exertion/biological/check_user(mob/living/user)
+ if(istype(user) && !user.isSynthetic())
+ return ..()
+ return FALSE
+
+/decl/emote/exertion/biological/breath
+ key = "ebreath"
+ emote_message_1p = "You feel out of breath."
+ emote_message_3p = "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 = "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."
+
+/decl/emote/exertion/synthetic/check_user(mob/living/user)
+ if(istype(user) && user.isSynthetic())
+ return ..()
+ return FALSE
+
+/decl/emote/exertion/synthetic/creak
+ key = "ecreak"
+ emote_message_1p = "Your chassis stress indicators spike."
+ 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
new file mode 100644
index 00000000000..1da92206239
--- /dev/null
+++ b/code/modules/emotes/definitions/human.dm
@@ -0,0 +1,62 @@
+/decl/emote/human
+ key = "vomit"
+
+/decl/emote/human/check_user(var/mob/living/carbon/human/user)
+ return (istype(user) && user.check_has_mouth() && !user.isSynthetic())
+
+/decl/emote/human/do_emote(var/mob/living/carbon/human/user)
+ user.vomit()
+
+/decl/emote/human/deathgasp
+ key = "deathgasp"
+
+/decl/emote/human/deathgasp/do_emote(mob/living/carbon/human/user)
+ if(istype(user) && user.species.get_death_message(user) == DEATHGASP_NO_MESSAGE)
+ to_chat(user, SPAN_WARNING("Your species has no deathgasp."))
+ return
+ . = ..()
+
+/decl/emote/human/deathgasp/get_emote_message_3p(var/mob/living/carbon/human/user)
+ return "USER [user.species.get_death_message(user)]"
+
+/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/slimes.dm b/code/modules/emotes/definitions/slimes.dm
new file mode 100644
index 00000000000..877422825ba
--- /dev/null
+++ b/code/modules/emotes/definitions/slimes.dm
@@ -0,0 +1,32 @@
+/decl/emote/slime
+ key = "nomood"
+ var/mood
+
+/decl/emote/slime/do_extra(var/mob/living/simple_mob/slime/user)
+ . = ..()
+ if(istype(user))
+ user.mood = mood
+ user.update_icon()
+
+/decl/emote/slime/check_user(var/atom/user)
+ return isslime(user)
+
+/decl/emote/slime/pout
+ key = "pout"
+ mood = "pout"
+
+/decl/emote/slime/sad
+ key = "sad"
+ mood = "sad"
+
+/decl/emote/slime/angry
+ key = "angry"
+ mood = "angry"
+
+/decl/emote/slime/frown
+ key = "frown"
+ mood = "mischevous"
+
+/decl/emote/slime/smile
+ key = "smile"
+ mood = ":3"
diff --git a/code/modules/emotes/definitions/synthetics.dm b/code/modules/emotes/definitions/synthetics.dm
new file mode 100644
index 00000000000..2f586cc98f9
--- /dev/null
+++ b/code/modules/emotes/definitions/synthetics.dm
@@ -0,0 +1,51 @@
+/decl/emote/audible/synth
+ key = "beep"
+ emote_message_3p = "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/ping
+ key = "ping"
+ emote_message_3p = "pings."
+ emote_sound = 'sound/machines/ping.ogg'
+
+/decl/emote/audible/synth/buzz
+ key = "buzz"
+ emote_message_3p = "buzzes."
+ emote_sound = 'sound/machines/buzz-sigh.ogg'
+
+/decl/emote/audible/synth/confirm
+ key = "confirm"
+ emote_message_3p = "emits an affirmative blip."
+ emote_sound = 'sound/machines/synth_yes.ogg'
+
+/decl/emote/audible/synth/deny
+ key = "deny"
+ emote_message_3p = "emits a negative blip."
+ emote_sound = 'sound/machines/synth_no.ogg'
+
+/decl/emote/audible/synth/security
+ key = "law"
+ emote_message_3p = "shows USER_HIS legal authorization barcode."
+ emote_message_3p_target = "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/weapon/robot_module/robot/security))
+
+/decl/emote/audible/synth/security/halt
+ key = "halt"
+ emote_message_3p = "USER's speakers skreech, \"Halt! Security!\"."
+ emote_sound = 'sound/voice/halt.ogg'
+
+/decl/emote/audible/synth/dwoop
+ key = "dwoop"
+ emote_message_1p_target = "You chirp happily at TARGET!"
+ emote_message_1p = "You chirp happily."
+ emote_message_3p_target = "chirps happily at TARGET!"
+ emote_message_3p = "chirps happily."
+ emote_sound = 'sound/machines/dwoop.ogg'
diff --git a/code/modules/emotes/definitions/visible.dm b/code/modules/emotes/definitions/visible.dm
new file mode 100644
index 00000000000..b346dd3692f
--- /dev/null
+++ b/code/modules/emotes/definitions/visible.dm
@@ -0,0 +1,336 @@
+/decl/emote/visible
+ key ="tail"
+ emote_message_3p = "waves USER_THEIR tail."
+ message_type = VISIBLE_MESSAGE
+
+/decl/emote/visible/scratch
+ key = "scratch"
+ check_restraints = TRUE
+ emote_message_3p = "scratches."
+
+/decl/emote/visible/drool
+ key ="drool"
+ emote_message_3p = "drools."
+ conscious = FALSE
+
+/decl/emote/visible/nod
+ key ="nod"
+ emote_message_3p_target = "nods USER_THEIR head at TARGET."
+ emote_message_3p = "nods USER_THEIR head."
+
+/decl/emote/visible/sway
+ key ="sway"
+ emote_message_3p = "sways around dizzily."
+
+/decl/emote/visible/sulk
+ key ="sulk"
+ emote_message_3p = "sulks down sadly."
+
+/decl/emote/visible/dance
+ key ="dance"
+ check_restraints = TRUE
+ emote_message_3p = "dances around happily."
+
+/decl/emote/visible/roll
+ key ="roll"
+ check_restraints = TRUE
+ emote_message_3p = "rolls."
+
+/decl/emote/visible/shake
+ key ="shake"
+ emote_message_3p = "shakes USER_THEIR head."
+
+/decl/emote/visible/jump
+ key ="jump"
+ emote_message_3p = "jumps!"
+
+/decl/emote/visible/shiver
+ key ="shiver"
+ emote_message_3p = "shivers."
+ conscious = FALSE
+
+/decl/emote/visible/collapse
+ key ="collapse"
+ emote_message_3p = "collapses!"
+
+/decl/emote/visible/collapse/do_extra(var/mob/user)
+ ..()
+ if(istype(user))
+ user.Paralyse(2)
+
+/decl/emote/visible/flash
+ key = "flash"
+ emote_message_3p = "flash USER_HIS lights quickly."
+
+/decl/emote/visible/blink
+ key = "blink"
+ emote_message_3p = "blinks."
+
+/decl/emote/visible/airguitar
+ key = "airguitar"
+ check_restraints = TRUE
+ emote_message_3p = "is strumming the air and headbanging like a safari chimp."
+
+/decl/emote/visible/blink_r
+ key = "blink_r"
+ emote_message_3p = "blinks rapidly."
+
+/decl/emote/visible/bow
+ key = "bow"
+ emote_message_3p_target = "bows to TARGET."
+ emote_message_3p = "bows."
+
+/decl/emote/visible/salute
+ key = "salute"
+ emote_message_3p_target = "salutes TARGET."
+ emote_message_3p = "salutes."
+ check_restraints = TRUE
+
+/decl/emote/visible/flap
+ key = "flap"
+ check_restraints = TRUE
+ emote_message_3p = "flaps USER_THEIR wings."
+
+/decl/emote/visible/aflap
+ key = "aflap"
+ check_restraints = TRUE
+ emote_message_3p = "flaps USER_THEIR wings ANGRILY!"
+
+/decl/emote/visible/eyebrow
+ key = "eyebrow"
+ emote_message_3p = "raises an eyebrow."
+
+/decl/emote/visible/twitch
+ key = "twitch"
+ emote_message_3p = "twitches."
+ conscious = FALSE
+
+/decl/emote/visible/twitch_v
+ key = "twitch_v"
+ emote_message_3p = "twitches violently."
+ conscious = FALSE
+
+/decl/emote/visible/faint
+ key = "faint"
+ emote_message_3p = "faints."
+
+/decl/emote/visible/faint/do_extra(var/mob/user)
+ . = ..()
+ if(istype(user) && !user.sleeping)
+ user.Sleeping(10)
+
+/decl/emote/visible/frown
+ key = "frown"
+ emote_message_3p = "frowns."
+
+/decl/emote/visible/blush
+ key = "blush"
+ emote_message_3p = "blushes."
+
+/decl/emote/visible/wave
+ key = "wave"
+ emote_message_3p_target = "waves at TARGET."
+ emote_message_3p = "waves."
+ check_restraints = TRUE
+
+/decl/emote/visible/glare
+ key = "glare"
+ emote_message_3p_target = "glares at TARGET."
+ emote_message_3p = "glares."
+
+/decl/emote/visible/stare
+ key = "stare"
+ emote_message_3p_target = "stares at TARGET."
+ emote_message_3p = "stares."
+
+/decl/emote/visible/look
+ key = "look"
+ emote_message_3p_target = "looks at TARGET."
+ emote_message_3p = "looks."
+
+/decl/emote/visible/point
+ key = "point"
+ check_restraints = TRUE
+ emote_message_3p_target = "points to TARGET."
+ emote_message_3p = "points."
+
+/decl/emote/visible/raise
+ key = "raise"
+ check_restraints = TRUE
+ emote_message_3p = "raises a hand."
+
+/decl/emote/visible/grin
+ key = "grin"
+ emote_message_3p_target = "grins at TARGET."
+ emote_message_3p = "grins."
+
+/decl/emote/visible/shrug
+ key = "shrug"
+ emote_message_3p = "shrugs."
+
+/decl/emote/visible/smile
+ key = "smile"
+ emote_message_3p_target = "smiles at TARGET."
+ emote_message_3p = "smiles."
+
+/decl/emote/visible/pale
+ key = "pale"
+ emote_message_3p = "goes pale for a second."
+
+/decl/emote/visible/tremble
+ key = "tremble"
+ emote_message_3p = "trembles in fear!"
+
+/decl/emote/visible/wink
+ key = "wink"
+ emote_message_3p_target = "winks at TARGET."
+ emote_message_3p = "winks."
+
+/decl/emote/visible/hug
+ key = "hug"
+ check_restraints = TRUE
+ emote_message_3p_target = "hugs TARGET."
+ emote_message_3p = "hugs USER_SELF."
+ check_range = 1
+
+/decl/emote/visible/dap
+ key = "dap"
+ check_restraints = TRUE
+ emote_message_3p_target = "gives daps to TARGET."
+ emote_message_3p = "sadly can't find anybody to give daps to, and daps USER_SELF."
+
+/decl/emote/visible/bounce
+ key = "bounce"
+ emote_message_3p = "bounces in place."
+
+/decl/emote/visible/jiggle
+ key = "jiggle"
+ emote_message_3p = "jiggles!"
+
+/decl/emote/visible/lightup
+ key = "light"
+ emote_message_3p = "lights up for a bit, then stops."
+
+/decl/emote/visible/vibrate
+ key = "vibrate"
+ emote_message_3p = "vibrates!"
+
+/decl/emote/visible/deathgasp_robot
+ key = "deathgasp"
+ emote_message_3p = "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 = "shakes hands with TARGET."
+ emote_message_3p = "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 "holds out USER_THEIR hand out to TARGET."
+ return ..()
+
+/decl/emote/visible/signal
+ key = "signal"
+ emote_message_3p_target = "signals at TARGET."
+ emote_message_3p = "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_active_hand() || !user.get_inactive_hand()))
+ var/t1 = round(text2num(extra_params))
+ if(isnum(t1) && t1 <= 5)
+ return "raises [t1] finger\s."
+ return .. ()
+
+/decl/emote/visible/afold
+ key = "afold"
+ check_restraints = TRUE
+ emote_message_3p = "folds USER_THEIR arms."
+
+/decl/emote/visible/alook
+ key = "alook"
+ emote_message_3p = "looks away."
+
+/decl/emote/visible/hbow
+ key = "hbow"
+ emote_message_3p = "bows USER_THEIR head."
+
+/decl/emote/visible/hip
+ key = "hip"
+ check_restraints = TRUE
+ emote_message_3p = "puts USER_THEIR hands on USER_THEIR hips."
+
+/decl/emote/visible/holdup
+ key = "holdup"
+ check_restraints = TRUE
+ emote_message_3p = "holds up USER_THEIR palms."
+
+/decl/emote/visible/hshrug
+ key = "hshrug"
+ emote_message_3p = "gives a half shrug."
+
+/decl/emote/visible/crub
+ key = "crub"
+ check_restraints = TRUE
+ emote_message_3p = "rubs USER_THEIR chin."
+
+/decl/emote/visible/eroll
+ key = "eroll"
+ emote_message_3p = "rolls USER_THEIR eyes."
+ emote_message_3p_target = "rolls USER_THEIR eyes at TARGET."
+
+/decl/emote/visible/erub
+ key = "erub"
+ check_restraints = TRUE
+ emote_message_3p = "rubs USER_THEIR eyes."
+
+/decl/emote/visible/fslap
+ key = "fslap"
+ check_restraints = TRUE
+ emote_message_3p = "slaps USER_THEIR forehead."
+
+/decl/emote/visible/ftap
+ key = "ftap"
+ emote_message_3p = "taps USER_THEIR foot."
+
+/decl/emote/visible/hrub
+ key = "hrub"
+ check_restraints = TRUE
+ emote_message_3p = "rubs USER_THEIR hands together."
+
+/decl/emote/visible/hspread
+ key = "hspread"
+ check_restraints = TRUE
+ emote_message_3p = "spreads USER_THEIR hands."
+
+/decl/emote/visible/pocket
+ key = "pocket"
+ check_restraints = TRUE
+ emote_message_3p = "shoves USER_THEIR hands in USER_THEIR pockets."
+
+/decl/emote/visible/rsalute
+ key = "rsalute"
+ check_restraints = TRUE
+ emote_message_3p = "returns the salute."
+
+/decl/emote/visible/rshoulder
+ key = "rshoulder"
+ emote_message_3p = "rolls USER_THEIR shoulders."
+
+/decl/emote/visible/squint
+ key = "squint"
+ emote_message_3p = "squints."
+ emote_message_3p_target = "squints at TARGET."
+
+/decl/emote/visible/tfist
+ key = "tfist"
+ emote_message_3p = "tightens USER_THEIR hands into fists."
+
+/decl/emote/visible/tilt
+ key = "tilt"
+ emote_message_3p = "tilts USER_THEIR head."
diff --git a/code/modules/emotes/definitions/visible_animated.dm b/code/modules/emotes/definitions/visible_animated.dm
new file mode 100644
index 00000000000..2e035d289c7
--- /dev/null
+++ b/code/modules/emotes/definitions/visible_animated.dm
@@ -0,0 +1,76 @@
+/decl/emote/visible/spin
+ key = "spin"
+ check_restraints = TRUE
+ emote_message_3p = "spins!"
+
+/decl/emote/visible/spin/do_extra(mob/user)
+ if(istype(user))
+ user.spin(20, 1)
+
+/decl/emote/visible/sidestep
+ key = "sidestep"
+ check_restraints = TRUE
+ emote_message_3p = "steps rhythmically and moves side to side."
+
+/decl/emote/visible/sidestep/do_extra(mob/user)
+ if(istype(user))
+ animate(user, pixel_x = 5, time = 5)
+ sleep(3)
+ animate(user, pixel_x = -5, time = 5)
+ animate(pixel_x = user.default_pixel_x, pixel_y = user.default_pixel_x, time = 2)
+
+/decl/emote/visible/flip
+ key = "flip"
+ emote_message_1p = "You do a flip!"
+ emote_message_3p = "does a flip!"
+ emote_sound = 'sound/effects/bodyfall4.ogg'
+
+/decl/emote/visible/flip/do_extra(mob/user)
+ . = ..()
+ if(istype(user))
+ user.SpinAnimation(7,1)
+
+/decl/emote/visible/floorspin
+ key = "floorspin"
+ emote_message_1p = "You spin around on the floor!"
+ emote_message_3p = "spins around on the floor!"
+ var/static/list/spin_dirs = list(
+ NORTH,
+ SOUTH,
+ EAST,
+ WEST,
+ EAST,
+ SOUTH,
+ NORTH,
+ SOUTH,
+ EAST,
+ WEST,
+ EAST,
+ SOUTH,
+ NORTH,
+ SOUTH,
+ EAST,
+ WEST,
+ EAST,
+ SOUTH
+ )
+
+/decl/emote/visible/floorspin/proc/spin_dir(var/mob/user)
+ set waitfor = FALSE
+ for(var/i in spin_dirs)
+ user.set_dir(i)
+ sleep(1)
+ if(QDELETED(user))
+ return
+
+/decl/emote/visible/floorspin/proc/spin_anim(var/mob/user)
+ set waitfor = FALSE
+ sleep(1)
+ if(!QDELETED(user))
+ user.SpinAnimation(10,1)
+
+/decl/emote/visible/floorspin/do_extra(mob/user)
+ . = ..()
+ if(istype(user))
+ spin_dir(user)
+ spin_anim(user)
diff --git a/code/modules/emotes/definitions/visible_vomit.dm b/code/modules/emotes/definitions/visible_vomit.dm
new file mode 100644
index 00000000000..1ec79dea6a9
--- /dev/null
+++ b/code/modules/emotes/definitions/visible_vomit.dm
@@ -0,0 +1,10 @@
+/decl/emote/visible/vomit
+ key = "vomit"
+
+/decl/emote/visible/vomit/do_emote(var/atom/user, var/extra_params)
+ if(isliving(user))
+ var/mob/living/M = user
+ if(!M.isSynthetic())
+ M.vomit()
+ return
+ to_chat(src, SPAN_WARNING("You are unable to vomit."))
diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm
new file mode 100644
index 00000000000..21d129c4a37
--- /dev/null
+++ b/code/modules/emotes/emote_define.dm
@@ -0,0 +1,181 @@
+// Note about emote messages:
+// - USER / TARGET will be replaced with the relevant name, in bold.
+// - USER_THEM / TARGET_THEM / USER_THEIR / TARGET_THEIR will be replaced with a
+// gender-appropriate version of the same.
+// - Impaired messages do not do any substitutions.
+
+/decl/emote
+ var/key // Command to use emote ie. '*[key]'
+ var/emote_message_1p // First person message ('You do a flip!')
+ var/emote_message_3p // Third person message ('Urist McBackflip does a flip!')
+ var/emote_message_synthetic_1p // First person message for robits.
+ var/emote_message_synthetic_3p // Third person message for robits.
+
+ var/emote_message_impaired // Deaf/blind message ('You hear someone flipping out.', 'You see someone opening and closing their mouth')
+
+ var/emote_message_1p_target // 'You do a flip at Urist McTarget!'
+ var/emote_message_3p_target // 'Urist McShitter does a flip at Urist McTarget!'
+ var/emote_message_synthetic_1p_target // First person targeted message for robits.
+ var/emote_message_synthetic_3p_target // Third person targeted message for robits.
+
+ var/emote_message_radio // A message to send over the radio if one picks up this emote.
+ var/emote_message_radio_synthetic // As above, but for synthetics.
+ var/emote_message_muffled // A message to show if the emote is audible and the user is muzzled.
+
+ var/list/emote_sound // A sound for the emote to play.
+ // Can either be a single sound, a list of sounds to pick from, or an
+ // associative array of gender to single sounds/a list of sounds.
+ var/list/emote_sound_synthetic // As above, but used when check_synthetic() is true.
+ var/emote_volume = 50 // Volume of sound to play.
+ var/emote_volume_synthetic = 50 // As above, but used when check_synthetic() is true.
+
+ var/message_type = VISIBLE_MESSAGE // Audible/visual flag
+ 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.
+
+/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, 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))
+ target = thing
+ break
+
+ 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/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 = "\The [user] [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)
+ use_range = world.view
+
+ if(ismob(user))
+ var/mob/M = user
+ if(message_type == AUDIBLE_MESSAGE)
+ if(isliving(user))
+ var/mob/living/L = user
+ if(L.silent)
+ M.visible_message(message = "[user] opens their mouth silently!", self_message = "You cannot say anything!", blind_message = emote_message_impaired)
+ return
+ else
+ M.audible_message(message = use_3p, self_message = use_1p, deaf_message = emote_message_impaired, hearing_distance = use_range, radio_message = use_radio)
+ else
+ M.visible_message(message = use_3p, self_message = use_1p, blind_message = emote_message_impaired, range = use_range)
+
+ do_extra(user, target)
+ do_sound(user)
+
+/decl/emote/proc/replace_target_tokens(var/msg, var/atom/target)
+ . = msg
+ if(istype(target))
+ var/datum/gender/target_gender = gender_datums[target.get_visible_gender()]
+ . = replacetext(., "TARGET_THEM", target_gender.him)
+ . = replacetext(., "TARGET_THEIR", target_gender.his)
+ . = replacetext(., "TARGET_SELF", target_gender.himself)
+ . = replacetext(., "TARGET", "\the [target]")
+
+/decl/emote/proc/replace_user_tokens(var/msg, var/atom/user)
+ . = msg
+ if(istype(user))
+ var/datum/gender/user_gender = gender_datums[user.get_visible_gender()]
+ . = replacetext(., "USER_THEM", user_gender.him)
+ . = replacetext(., "USER_THEIR", user_gender.his)
+ . = replacetext(., "USER_SELF", user_gender.himself)
+ . = 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)
+ var/list/use_sound = get_emote_sound(user)
+ if(!islist(use_sound) || length(use_sound) < 2)
+ return
+ var/sound_to_play = use_sound["sound"]
+ if(!sound_to_play)
+ return
+ if(islist(sound_to_play))
+ if(sound_to_play[user.gender])
+ sound_to_play = sound_to_play[user.gender]
+ if(islist(sound_to_play) && length(sound_to_play))
+ sound_to_play = pick(sound_to_play)
+ if(sound_to_play)
+ playsound(user.loc, sound_to_play, use_sound["vol"], 0)
+
+/decl/emote/proc/check_user(var/atom/user)
+ return TRUE
+
+/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(!. && ishuman(user) && message_type == AUDIBLE_MESSAGE)
+ var/mob/living/carbon/human/H = user
+ if(H.should_have_organ(O_LUNGS))
+ var/obj/item/organ/internal/lungs/L = H.internal_organs_by_name[O_LUNGS]
+ if(L && L.robotic == 2) //Hard-coded to 2, incase we add lifelike robotic lungs
+ . = TRUE
diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm
new file mode 100644
index 00000000000..bda07cbb119
--- /dev/null
+++ b/code/modules/emotes/emote_mob.dm
@@ -0,0 +1,175 @@
+/mob/proc/can_emote(var/emote_type)
+ return (stat == CONSCIOUS)
+
+/mob/living/can_emote(var/emote_type)
+ return (..() && !(silent && emote_type == AUDIBLE_MESSAGE))
+
+/mob/proc/emote(var/act, var/m_type, var/message)
+ set waitfor = FALSE
+ // s-s-snowflake
+ if(src.stat == DEAD && act != "deathgasp")
+ return
+
+ if(usr == src) //client-called emote
+ if (client && (client.prefs.muted & MUTE_IC))
+ to_chat(src, "You cannot send IC messages (muted).")
+ return
+
+ if(act == "help")
+ to_chat(src,"Usable emotes: [english_list(usable_emotes)].")
+ return
+
+ if(!can_emote(m_type))
+ to_chat(src, SPAN_WARNING("You cannot currently [m_type == AUDIBLE_MESSAGE ? "audibly" : "visually"] emote!"))
+ return
+
+ if(act == "me")
+ return custom_emote(m_type, message)
+
+ if(act == "custom")
+ if(!message)
+ message = sanitize(input("Enter an emote to display.") as text|null)
+ if(!message)
+ return
+ if (!m_type)
+ if(alert(src, "Is this an audible emote?", "Emote", "Yes", "No") == "No")
+ m_type = VISIBLE_MESSAGE
+ else
+ m_type = AUDIBLE_MESSAGE
+ return custom_emote(m_type, message)
+
+ 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, SPAN_WARNING("Unknown 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 && is_muzzled())
+ audible_message("\The [src] [use_emote.emote_message_muffled || "makes a muffled sound."]")
+ return
+ else
+ use_emote.do_emote(src, message)
+
+ for (var/obj/item/weapon/implant/I in src)
+ if (I.implanted)
+ I.trigger(act, src)
+
+/mob/proc/format_emote(var/emoter = null, var/message = null)
+ var/pretext
+ var/subtext
+ var/nametext
+ var/end_char
+ var/start_char
+ var/name_anchor
+
+ if(!message || !emoter)
+ return
+
+ message = html_decode(message)
+
+ name_anchor = findtext(message, "*")
+ if(name_anchor > 0) // User supplied emote with visible_emote token (default ^)
+ pretext = copytext(message, 1, name_anchor)
+ subtext = copytext(message, name_anchor + 1, length(message) + 1)
+ else
+ // No token. Just the emote as usual.
+ subtext = message
+
+ // Oh shit, we got this far! Let's see... did the user attempt to use more than one token?
+ if(findtext(subtext, "*"))
+ // abort abort!
+ to_chat(emoter, SPAN_WARNING("You may use only one \"["*"]\" symbol in your emote."))
+ return
+
+ if(pretext)
+ // Add a space at the end if we didn't already supply one.
+ end_char = copytext(pretext, length(pretext), length(pretext) + 1)
+ if(end_char != " ")
+ pretext += " "
+
+ // Grab the last character of the emote message.
+ end_char = copytext(subtext, length(subtext), length(subtext) + 1)
+ if(!(end_char in list(".", "?", "!", "\"", "-", "~"))) // gotta include ~ for all you fucking weebs
+ // No punctuation supplied. Tack a period on the end.
+ subtext += "."
+
+ // Add a space to the subtext, unless it begins with an apostrophe or comma.
+ if(subtext != ".")
+ // First, let's get rid of any existing space, to account for sloppy emoters ("X, ^ , Y")
+ subtext = trim_left(subtext)
+ start_char = copytext(subtext, 1, 2)
+ if(start_char != "," && start_char != "'")
+ subtext = " " + subtext
+
+ pretext = capitalize(html_encode(pretext))
+ nametext = html_encode(nametext)
+ subtext = html_encode(subtext)
+ // Store the player's name in a nice bold, naturalement
+ nametext = "[emoter]"
+ return pretext + nametext + subtext
+
+/mob/proc/custom_emote(var/m_type = VISIBLE_MESSAGE, var/message, var/range = world.view)
+
+ if((usr && stat) || (!use_me && usr == src))
+ to_chat(src, "You are unable to emote.")
+ return
+
+ var/input
+ if(!message)
+ input = sanitize(input(src,"Choose an emote to display.") as text|null)
+ else
+ input = message
+
+ if(input)
+ message = format_emote(src, message)
+ else
+ return
+
+ if(input)
+ log_emote(message,src) //Log before we add junk
+ message = "[src] [input]"
+ else
+ return
+
+ if(message)
+ message = encode_html_emphasis(message)
+
+ // Hearing gasp and such every five seconds is not good emotes were not global for a reason.
+ // Maybe some people are okay with that.
+ var/turf/T = get_turf(src)
+ if(!T) return
+ var/list/in_range = get_mobs_and_objs_in_view_fast(T,range,2,remote_ghosts = client ? TRUE : FALSE)
+ var/list/m_viewers = in_range["mobs"]
+ var/list/o_viewers = in_range["objs"]
+
+ for(var/mob in m_viewers)
+ var/mob/M = mob
+ spawn(0) // It's possible that it could be deleted in the meantime, or that it runtimes.
+ if(M)
+ if(isobserver(M))
+ message = "[src] ([ghost_follow_link(src, M)]) [input]"
+ M.show_message(message, m_type)
+
+ for(var/obj in o_viewers)
+ var/obj/O = obj
+ spawn(0)
+ if(O)
+ O.see_emote(src, message, m_type)
+
+
+
+// Specific mob type exceptions below.
+/mob/living/silicon/ai/emote(var/act, var/type, var/message)
+ 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.
+ ..()
diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm
index 9d6735ee8b6..1badc92926a 100644
--- a/code/modules/mob/death.dm
+++ b/code/modules/mob/death.dm
@@ -73,7 +73,7 @@
if(src.loc && istype(loc,/obj/belly) || istype(loc,/obj/item/device/dogborg/sleeper)) deathmessage = "no message" //VOREStation Add - Prevents death messages from inside mobs
facing_dir = null
- if(!gibbed && deathmessage != "no message") // This is gross, but reliable. Only brains use it.
+ if(!gibbed && deathmessage != DEATHGASP_NO_MESSAGE)
src.visible_message("\The [src.name] [deathmessage]")
set_stat(DEAD)
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 2a8af560804..74ce24a07d7 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
// All mobs should have custom emote, really..
//m_type == 1 --> visual.
//m_type == 2 --> audible
@@ -53,12 +54,14 @@
if(O)
O.see_emote(src, message, m_type)
+=======
+>>>>>>> d40a022... Merge pull request #7987 from MistakeNot4892/chirp
// Shortcuts for above proc
/mob/proc/visible_emote(var/act_desc)
- custom_emote(1, act_desc)
+ custom_emote(VISIBLE_MESSAGE, act_desc)
/mob/proc/audible_emote(var/act_desc)
- custom_emote(2, act_desc)
+ custom_emote(AUDIBLE_MESSAGE, act_desc)
/mob/proc/emote_dead(var/message)
diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm
index 01f1d2f57d2..739c3b09c6b 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona.dm
@@ -1,3 +1,29 @@
+var/list/_nymph_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/scretch,
+ /decl/emote/audible/choke,
+ /decl/emote/audible/gnarl,
+ /decl/emote/audible/bug_hiss,
+ /decl/emote/audible/bug_chitter,
+ /decl/emote/audible/chirp
+)
+
/mob/living/carbon/alien/diona
name = "diona nymph"
voice_name = "diona nymph"
@@ -20,6 +46,9 @@
holder_type = /obj/item/weapon/holder/diona
var/obj/item/hat
+/mob/living/carbon/alien/diona/get_default_emotes()
+ return global._nymph_default_emotes
+
/mob/living/carbon/alien/diona/Initialize()
. = ..()
species = GLOB.all_species[SPECIES_DIONA]
diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm
index 5cff048e10b..b0517e7a952 100644
--- a/code/modules/mob/living/carbon/alien/emote.dm
+++ b/code/modules/mob/living/carbon/alien/emote.dm
@@ -1,108 +1,31 @@
-/mob/living/carbon/alien/emote(var/act, var/m_type=1, var/message = null)
- var/param = null
- if(findtext(act, "-", 1, null))
- var/t1 = findtext(act, "-", 1, null)
- param = copytext(act, t1 + 1, length(act) + 1)
- act = copytext(act, 1, t1)
+var/list/_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/twitch_v,
+ /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,
+ /decl/emote/audible/chirp
+)
- var/muzzled = is_muzzled()
- act = lowertext(act)
-
- switch(act)
- if("sign")
- if(!restrained())
- var/num = null
- if(text2num(param))
- num = "the number [text2num(param)]"
- if(num)
- message = "[src] signs [num]."
- m_type = 1
- if("burp")
- if(!muzzled)
- message = "[src] burps."
- m_type = 2
- if("deathgasp")
- message = "[src] lets out a waning guttural screech, green blood bubbling from its maw."
- m_type = 2
- if("scratch")
- if(!restrained())
- message = "[src] scratches."
- m_type = 1
- if("whimper")
- if(!muzzled)
- message = "[src] whimpers."
- m_type = 2
- if("tail")
- message = "[src] waves its tail."
- m_type = 1
- if("gasp")
- message = "[src] gasps."
- m_type = 2
- if("shiver")
- message = "[src] shivers."
- m_type = 2
- if("drool")
- message = "[src] drools."
- m_type = 1
- if("scretch")
- if(!muzzled)
- message = "[src] scretches."
- m_type = 2
- if("choke")
- message = "[src] chokes."
- m_type = 2
- if("moan")
- message = "[src] moans!"
- m_type = 2
- if("nod")
- message = "[src] nods its head."
- m_type = 1
-// if("sit")
-// message = "[src] sits down." //Larvan can't sit down, /N
-// m_type = 1
- if("sway")
- message = "[src] sways around dizzily."
- m_type = 1
- if("sulk")
- message = "[src] sulks down sadly."
- m_type = 1
- if("twitch")
- message = "[src] twitches."
- m_type = 1
- if("twitch_v")
- message = "[src] twitches violently."
- m_type = 1
- if("dance")
- if(!restrained())
- message = "[src] dances around happily."
- m_type = 1
- if("roll")
- if(!restrained())
- message = "[src] rolls."
- m_type = 1
- if("shake")
- message = "[src] shakes its head."
- m_type = 1
- if("gnarl")
- if(!muzzled)
- message = "[src] gnarls and shows its teeth.."
- m_type = 2
- if("jump")
- message = "[src] jumps!"
- m_type = 1
- if("hiss_")
- message = "[src] hisses softly."
- m_type = 1
- if("collapse")
- Paralyse(2)
- message = "[src] collapses!"
- m_type = 2
- if("chirp")
- message = "[src] chirps!"
- playsound(src, 'sound/misc/nymphchirp.ogg', 50, 0)
- m_type = 2
- if("help")
- to_chat(src, "burp, chirp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper")
-
- if(!stat)
- ..(act, m_type, message)
+/mob/living/carbon/alien/get_default_emotes()
+ . = global._alien_default_emotes
diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm
index 8b6e7f71756..687372c6ee1 100644
--- a/code/modules/mob/living/carbon/brain/death.dm
+++ b/code/modules/mob/living/carbon/brain/death.dm
@@ -3,7 +3,7 @@
container.icon_state = "mmi_dead"
return ..(gibbed,"beeps shrilly as the MMI flatlines!")
else
- return ..(gibbed,"no message")
+ return ..(gibbed, DEATHGASP_NO_MESSAGE)
/mob/living/carbon/brain/gib()
if(istype(container, /obj/item/device/mmi))
diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm
index 05706fe299e..cb6ed6a1b7b 100644
--- a/code/modules/mob/living/carbon/brain/emote.dm
+++ b/code/modules/mob/living/carbon/brain/emote.dm
@@ -1,47 +1,17 @@
-/mob/living/carbon/brain/emote(var/act,var/m_type=1,var/message = null)
- if(!(container && istype(container, /obj/item/device/mmi)))//No MMI, no emotes
- return
+var/list/_brain_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/beep,
+ /decl/emote/audible/boop,
+ /decl/emote/visible/blink,
+ /decl/emote/visible/flash
+)
- if(findtext(act, "-", 1, null))
- var/t1 = findtext(act, "-", 1, null)
- act = copytext(act, 1, t1)
+/mob/living/carbon/brain/can_emote()
+ return (istype(container, /obj/item/device/mmi) && ..())
- if(stat == DEAD)
- return
- switch(act)
- if("alarm")
- to_chat(src, "You sound an alarm.")
- message = "[src] sounds an alarm."
- m_type = 2
- if("alert")
- to_chat(src, "You let out a distressed noise.")
- message = "[src] lets out a distressed noise."
- m_type = 2
- if("notice")
- to_chat(src, "You play a loud tone.")
- message = "[src] plays a loud tone."
- m_type = 2
- if("flash")
- message = "The lights on [src] flash quickly."
- m_type = 1
- if("blink")
- message = "[src] blinks."
- m_type = 1
- if("whistle")
- to_chat(src, "You whistle.")
- message = "[src] whistles."
- m_type = 2
- if("beep")
- to_chat(src, "You beep.")
- message = "[src] beeps."
- m_type = 2
- if("boop")
- to_chat(src, "You boop.")
- message = "[src] boops."
- m_type = 2
- if("help")
- to_chat(src, "alarm, alert, notice, flash, blink, whistle, beep, boop")
-
- if(!stat)
- ..(act, m_type, message)
-
\ No newline at end of file
+/mob/living/carbon/brain/get_default_emotes()
+ return global._brain_default_emotes
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 6afe10cdec7..6347ae9eab0 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null)
var/param = null
@@ -838,6 +839,106 @@
if(message)
custom_emote(m_type,message)
+=======
+var/list/_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/choke,
+ /decl/emote/audible/sneeze,
+ /decl/emote/audible/sniff,
+ /decl/emote/audible/snore,
+ /decl/emote/audible/whimper,
+ /decl/emote/audible/whistle,
+ /decl/emote/audible/whistle/quiet,
+ /decl/emote/audible/whistle/wolf,
+ /decl/emote/audible/whistle/summon,
+ /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/crack,
+ /decl/emote/human,
+ /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/audible/snap,
+ /decl/emote/visible/vomit,
+ /decl/emote/visible/floorspin,
+ /decl/emote/visible/flip
+)
+
+/mob/living/carbon/human/get_default_emotes()
+ return global._human_default_emotes
+>>>>>>> d40a022... Merge pull request #7987 from MistakeNot4892/chirp
/mob/living/carbon/human/verb/pose()
set name = "Set Pose"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b351c3d79be..823125109e4 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1162,6 +1162,9 @@
//A slew of bits that may be affected by our species change
regenerate_icons()
+ // Update our available emote list.
+ update_emotes()
+
if(species)
//if(mind) //VOREStation Removal
//apply_traits() //VOREStation Removal
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 34b93b25738..15ea6a45542 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -81,7 +81,6 @@
var/voice = "" //Instead of new say code calling GetVoice() over and over and over, we're just going to ask this variable, which gets updated in Life()
- var/miming = null //Toggle for the mime's abilities.
var/special_voice = "" // For changing our voice. Used by a symptom.
var/last_dam = -1 //Used for determining if we need to process all organs or just some or even none.
@@ -156,4 +155,3 @@
// Custom Species Name
var/custom_species
-
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 6795d670647..c0360d3297a 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -98,7 +98,8 @@
// This is the 'mechanical' check for synthetic-ness, not appearance
// Returns the company that made the synthetic
/mob/living/carbon/human/isSynthetic()
- if(synthetic) return synthetic //Your synthetic-ness is not going away
+ if(synthetic)
+ return synthetic //Your synthetic-ness is not going away
var/obj/item/organ/external/T = organs_by_name[BP_TORSO]
if(T && T.robotic >= ORGAN_ROBOT)
src.verbs += /mob/living/carbon/human/proc/self_diagnostics
@@ -106,9 +107,9 @@
src.verbs += /mob/living/carbon/human/proc/setmonitor_state
var/datum/robolimb/R = all_robolimbs[T.model]
synthetic = R
+ update_emotes()
return synthetic
-
- return 0
+ return FALSE
// Would an onlooker know this person is synthetic?
// Based on sort of logical reasoning, 'Look at head, look at torso'
diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
index b29bead4f9c..e8ff96175a7 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
@@ -25,7 +25,8 @@
speech_sounds = list('sound/voice/shriek1.ogg')
speech_chance = 20
- scream_verb = "shrieks"
+ scream_verb_1p = "shriek"
+ scream_verb_3p = "shrieks"
male_scream_sound = 'sound/voice/shriek1.ogg'
female_scream_sound = 'sound/voice/shriek1.ogg'
male_cough_sounds = list('sound/voice/shriekcough.ogg')
@@ -86,7 +87,11 @@
/datum/mob_descriptor/height = -1,
/datum/mob_descriptor/build = 1,
/datum/mob_descriptor/vox_markings = 0
- )
+ )
+
+ default_emotes = list(
+ /decl/emote/audible/vox_shriek
+ )
/datum/species/vox/get_random_name(var/gender)
var/datum/language/species_language = GLOB.all_languages[default_language]
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 80ad0763e27..3ae68b2c7d8 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -75,7 +75,8 @@
var/list/assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) //VOREStation Edit
//Soundy emotey things.
- var/scream_verb = "screams"
+ var/scream_verb_1p = "scream"
+ var/scream_verb_3p = "screams"
var/male_scream_sound //= 'sound/goonstation/voice/male_scream.ogg' Removed due to licensing, replace!
var/female_scream_sound //= 'sound/goonstation/voice/female_scream.ogg' Removed due to licensing, replace!
var/male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
diff --git a/code/modules/mob/living/carbon/human/species/species_getters.dm b/code/modules/mob/living/carbon/human/species/species_getters.dm
index 0eeea4f9d4c..7b635613ea1 100644
--- a/code/modules/mob/living/carbon/human/species/species_getters.dm
+++ b/code/modules/mob/living/carbon/human/species/species_getters.dm
@@ -44,7 +44,7 @@
if(config.show_human_death_message)
return ((H && H.isSynthetic()) ? "gives one shrill beep before falling lifeless." : death_message)
else
- return "no message"
+ return DEATHGASP_NO_MESSAGE
/datum/species/proc/get_ssd(var/mob/living/carbon/human/H)
if(H)
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
index bfb1b7d5e3d..8ec116221ed 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
@@ -119,6 +119,15 @@ var/datum/species/shapeshifter/promethean/prometheans
var/heal_rate = 0.5 // Temp. Regen per tick.
+ default_emotes = list(
+ /decl/emote/audible/squish,
+ /decl/emote/audible/chirp,
+ /decl/emote/visible/bounce,
+ /decl/emote/visible/jiggle,
+ /decl/emote/visible/lightup,
+ /decl/emote/visible/vibrate
+ )
+
/datum/species/shapeshifter/promethean/New()
..()
prometheans = src
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index f74505e770b..21e19f68d43 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -160,6 +160,16 @@
/datum/mob_descriptor/build = 2
)
+ 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
+ )
+
/datum/species/unathi/equip_survival_gear(var/mob/living/carbon/human/H)
..()
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
@@ -250,6 +260,16 @@
O_INTESTINE = /obj/item/organ/internal/intestine
)
+ 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
+ )
+
/datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H)
..()
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
@@ -533,6 +553,11 @@
genders = list(PLURAL)
+ default_emotes = list(
+ /decl/emote/audible/chirp,
+ /decl/emote/audible/multichirp
+ )
+
/datum/species/diona/can_understand(var/mob/other)
if(istype(other, /mob/living/carbon/alien/diona))
return TRUE
diff --git a/code/modules/mob/living/carbon/human/species/station/teshari.dm b/code/modules/mob/living/carbon/human/species/station/teshari.dm
index 3a282707c35..42afbbdbfcb 100644
--- a/code/modules/mob/living/carbon/human/species/station/teshari.dm
+++ b/code/modules/mob/living/carbon/human/species/station/teshari.dm
@@ -139,7 +139,7 @@
descriptors = list(
/datum/mob_descriptor/height = -3,
/datum/mob_descriptor/build = -3
- )
+ )
var/static/list/flight_bodyparts = list(
BP_L_ARM,
@@ -152,6 +152,12 @@
/obj/item/clothing/suit/straight_jacket
)
+ default_emotes = list(
+ /decl/emote/audible/teshsqueak,
+ /decl/emote/audible/teshchirp,
+ /decl/emote/audible/teshtrill
+ )
+
/datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H)
..()
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
@@ -159,7 +165,7 @@
/datum/species/teshari/handle_falling(mob/living/carbon/human/H, atom/hit_atom, damage_min, damage_max, silent, planetary)
// Tesh can glide to save themselves from some falls. Basejumping bird
- // without parachute, or falling bird without free wings goes splat.
+ // without parachute, or falling bird without free wings, goes splat.
// Are we landing from orbit, or handcuffed/unconscious/tied to something?
if(planetary || !istype(H) || H.incapacitated(INCAPACITATION_DEFAULT|INCAPACITATION_DISABLED))
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 877e8542767..ae1b09ae714 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -433,38 +433,5 @@ proc/get_radio_key_from_channel(var/channel)
/mob/proc/GetVoice()
return name
-/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't
- if(stat) //already snowflaked to shit can call the parent and handle emoting sanely
- return FALSE
-
- if(..(act, type, message))
- return TRUE
-
- if(act && type && message)
- log_emote(message, src)
-
- for(var/mob/M in dead_mob_list)
- if(!M.client)
- continue
-
- if(isnewplayer(M))
- continue
-
- if(isobserver(M) && M.is_preference_enabled(/datum/client_preference/ghost_sight))
- M.show_message(message)
-
- switch(type)
- if(1) // Visible
- visible_message(message)
- return TRUE
- if(2) // Audible
- audible_message(message)
- return TRUE
- else
- if(act == "help")
- return // Mobs handle this individually
- to_chat(src, "Unusable emote '[act]'. Say *help for a list.")
-
-
/mob/proc/speech_bubble_appearance()
return "normal"
diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm
index 00a5e429932..6aa6ae2150f 100644
--- a/code/modules/mob/living/silicon/emote.dm
+++ b/code/modules/mob/living/silicon/emote.dm
@@ -1,113 +1,13 @@
-/mob/living/silicon/emote(var/act, var/m_type = 1,var/message = null)
- var/param = null
- if(findtext(act, "-", 1, null))
- var/t1 = findtext(act, "-", 1, null)
- param = copytext(act, t1 + 1, length(act) + 1)
- act = copytext(act, 1, t1)
+var/list/_silicon_default_emotes = list(
+ /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/dwoop,
+ /decl/emote/audible/synth/security,
+ /decl/emote/audible/synth/security/halt
+)
- if(findtext(act, "s", -1) && !findtext(act, "_", -2))//Removes ending s's unless they are prefixed with a '_'
- act = copytext(act, 1, length(act))
-
- switch(act)
- if("beep")
- var/M = null
- if(param)
- for (var/mob/A in view(null, null))
- if (param == A.name)
- M = A
- break
- if(!M)
- param = null
-
- if (param)
- message = "[src] beeps at [param]."
- else
- message = "[src] beeps."
- playsound(src, 'sound/machines/twobeep.ogg', 50, 0)
- m_type = 1
-
- if("ping")
- var/M = null
- if(param)
- for (var/mob/A in view(null, null))
- if (param == A.name)
- M = A
- break
- if(!M)
- param = null
-
- if (param)
- message = "[src] pings at [param]."
- else
- message = "[src] pings."
- playsound(src, 'sound/machines/ping.ogg', 50, 0)
- m_type = 1
-
- if("buzz")
- var/M = null
- if(param)
- for (var/mob/A in view(null, null))
- if (param == A.name)
- M = A
- break
- if(!M)
- param = null
-
- if (param)
- message = "[src] buzzes at [param]."
- else
- message = "[src] buzzes."
- playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
- m_type = 1
-
- if("yes", "ye")
- var/M = null
- if(param)
- for (var/mob/A in view(null, null))
- if (param == A.name)
- M = A
- break
- if(!M)
- param = null
-
- if (param)
- message = "[src] emits an affirmative blip at [param]."
- else
- message = "[src] emits an affirmative blip."
- playsound(src, 'sound/machines/synth_yes.ogg', 50, 0)
- m_type = 1
-
- if("dwoop")
- var/M = null
- if(param)
- for (var/mob/A in view(null, null))
- M = A
- break
- if(!M)
- param = null
-
- if (param)
- message = "[src] chirps happily at [param]"
- else
- message = "[src] chirps happily."
- playsound(src, 'sound/machines/dwoop.ogg', 50, 0)
- m_type = 1
-
- if("no")
- var/M = null
- if(param)
- for (var/mob/A in view(null, null))
- if (param == A.name)
- M = A
- break
- if(!M)
- param = null
-
- if (param)
- message = "[src] emits a negative blip at [param]."
- else
- message = "[src] emits a negative blip."
- playsound(src, 'sound/machines/synth_no.ogg', 50, 0)
- m_type = 1
-
- ..(act, m_type, message)
\ No newline at end of file
+/mob/living/silicon/get_default_emotes()
+ return global._silicon_default_emotes
diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
index 9560c6b528e..3818912dd98 100644
--- a/code/modules/mob/living/silicon/robot/emote.dm
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
/mob/living/silicon/robot/emote(var/act,var/m_type=1,var/message = null)
var/param = null
if(findtext(act, "-", 1, null))
@@ -153,3 +154,34 @@
to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt, yes, dwoop, no")
..(act, m_type, message)
+=======
+var/list/_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/dwoop,
+ /decl/emote/audible/synth/security,
+ /decl/emote/audible/synth/security/halt
+)
+
+/mob/living/silicon/robot/get_default_emotes()
+ return global._robot_default_emotes
+>>>>>>> d40a022... Merge pull request #7987 from MistakeNot4892/chirp
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index ef870cb1f35..34f6096ede0 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -114,7 +114,7 @@
return 0
return 1
-/mob/living/silicon/ai/emote(var/act, var/type, var/message)
+/mob/living/silicon/ai/emote(var/act, var/m_type, var/message)
var/obj/machinery/hologram/holopad/T = holo
if(T && T.masters[src]) //Is the AI using a holopad?
. = holopad_emote(message)
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
index 9db6a6bffa0..c48f94bf277 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm
@@ -1,3 +1,32 @@
+var/list/_cat_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/twitch_v,
+ /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,
+ /decl/emote/audible/hiss,
+ /decl/emote/audible/whimper,
+ /decl/emote/audible/gasp,
+ /decl/emote/audible/scretch,
+ /decl/emote/audible/choke,
+ /decl/emote/audible/moan,
+ /decl/emote/audible/gnarl,
+ /decl/emote/audible/purr,
+ /decl/emote/audible/purrlong
+)
+
/mob/living/simple_mob/animal/passive/cat
name = "cat"
desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
@@ -28,6 +57,9 @@
update_icon()
return ..()
+/mob/living/simple_mob/animal/passive/cat/get_default_emotes()
+ return global._cat_default_emotes
+
/mob/living/simple_mob/animal/passive/cat/handle_special()
if(!stat && prob(2)) // spooky
var/mob/observer/dead/spook = locate() in range(src, 5)
diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm
index a5419bc5599..f8d47a4b2dc 100644
--- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm
@@ -1,5 +1,21 @@
-// The top-level slime defines. Xenobio slimes and feral slimes will inherit from this.
+var/list/_slime_default_emotes = list(
+ /decl/emote/audible/moan,
+ /decl/emote/visible/twitch,
+ /decl/emote/visible/sway,
+ /decl/emote/visible/shiver,
+ /decl/emote/visible/bounce,
+ /decl/emote/visible/jiggle,
+ /decl/emote/visible/lightup,
+ /decl/emote/visible/vibrate,
+ /decl/emote/slime,
+ /decl/emote/slime/pout,
+ /decl/emote/slime/sad,
+ /decl/emote/slime/angry,
+ /decl/emote/slime/frown,
+ /decl/emote/slime/smile
+)
+// The top-level slime defines. Xenobio slimes and feral slimes will inherit from this.
/mob/living/simple_mob/slime
name = "slime"
desc = "It's a slime."
@@ -64,6 +80,9 @@
can_enter_vent_with = list(/obj/item/clothing/head)
+/mob/living/simple_mob/slime/get_default_emotes()
+ return global._slime_default_emotes
+
/datum/say_list/slime
speak = list("Blorp...", "Blop...")
emote_see = list("bounces", "jiggles", "sways")
diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm
index 2d070d1a298..9caa58cb33d 100644
--- a/code/modules/mob/living/voice/voice.dm
+++ b/code/modules/mob/living/voice/voice.dm
@@ -137,6 +137,6 @@
return TRUE
return ..()
-/mob/living/voice/custom_emote(var/m_type=1,var/message = null,var/range=world.view)
+/mob/living/voice/custom_emote(var/m_type = VISIBLE_MESSAGE, var/message = null, var/range = world.view)
if(!comm) return
..(m_type,message,comm.video_range)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 3b4b478a7eb..c41691a8575 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -42,6 +42,7 @@
lastarea = get_area(src)
hook_vr("mob_new",list(src)) //VOREStation Code
update_transform() // Some mobs may start bigger or smaller than normal.
+ update_emotes()
return ..()
/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
@@ -49,19 +50,19 @@
if(!client && !teleop) return
if (type)
- if((type & 1) && (is_blind() || paralysis) )//Vision related
+ if((type & VISIBLE_MESSAGE) && (is_blind() || paralysis) )//Vision related
if (!( alt ))
return
else
msg = alt
type = alt_type
- if ((type & 2) && is_deaf())//Hearing related
+ if ((type & AUDIBLE_MESSAGE) && is_deaf())//Hearing related
if (!( alt ))
return
else
msg = alt
type = alt_type
- if ((type & 1) && (sdisabilities & BLIND))
+ if ((type & VISIBLE_MESSAGE) && (sdisabilities & BLIND))
return
// Added voice muffling for Issue 41.
if(stat == UNCONSCIOUS || sleeping > 0)
@@ -77,14 +78,17 @@
// message is the message output to anyone who can see e.g. "[src] does something!"
// self_message (optional) is what the src mob sees e.g. "You do something!"
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
-/mob/visible_message(var/message, var/self_message, var/blind_message, var/list/exclude_mobs = null)
+/mob/visible_message(var/message, var/self_message, var/blind_message, var/list/exclude_mobs = null, var/range = world.view)
if(self_message)
if(LAZYLEN(exclude_mobs))
exclude_mobs |= src
else
exclude_mobs = list(src)
src.show_message(self_message, 1, blind_message, 2)
- . = ..(message, blind_message, exclude_mobs)
+ // Transfer messages about what we are doing to upstairs
+ if(shadow)
+ shadow.visible_message(message, self_message, blind_message, exclude_mobs, range)
+ . = ..(message, blind_message, exclude_mobs, range) // Really not ideal that atom/visible_message has different arg numbering :(
// Returns an amount of power drawn from the object (-1 if it's not viable).
// If drain_check is set it will not actually drain power, just return a value.
@@ -99,7 +103,7 @@
// self_message (optional) is what the src mob hears.
// deaf_message (optional) is what deaf people will see.
// hearing_distance (optional) is the range, how many tiles away the message can be heard.
-/mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message)
+/mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message, var/radio_message)
var/range = hearing_distance || world.view
var/list/hear = get_mobs_and_objs_in_view_fast(get_turf(src),range,remote_ghosts = FALSE)
@@ -107,16 +111,21 @@
var/list/hearing_mobs = hear["mobs"]
var/list/hearing_objs = hear["objs"]
- for(var/obj in hearing_objs)
- var/obj/O = obj
- O.show_message(message, 2, deaf_message, 1)
+ if(radio_message)
+ for(var/obj in hearing_objs)
+ var/obj/O = obj
+ O.hear_talk(src, list(new /datum/multilingual_say_piece(GLOB.all_languages["Noise"], radio_message)), null)
+ else
+ for(var/obj in hearing_objs)
+ var/obj/O = obj
+ O.show_message(message, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE)
for(var/mob in hearing_mobs)
var/mob/M = mob
var/msg = message
if(self_message && M==src)
msg = self_message
- M.show_message(msg, 2, deaf_message, 1)
+ M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE)
/mob/proc/findname(msg)
for(var/mob/M in mob_list)
@@ -576,9 +585,6 @@
/mob/proc/get_gender()
return gender
-/mob/proc/get_visible_gender()
- return gender
-
/mob/proc/see(message)
if(!is_active())
return 0
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 52e843a9eeb..c30d256c596 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -105,11 +105,6 @@
verb = "asks"
return verb
-
-/mob/proc/emote(var/act, var/type, var/message)
- if(act == "me")
- return custom_emote(type, message)
-
/mob/proc/get_ear()
// returns an atom representing a location on the map from which this
// mob can hear things
diff --git a/code/modules/multiz/zshadow.dm b/code/modules/multiz/zshadow.dm
index fcc5ecad650..e43ab219395 100644
--- a/code/modules/multiz/zshadow.dm
+++ b/code/modules/multiz/zshadow.dm
@@ -113,12 +113,6 @@
if(shadow)
shadow.set_dir(new_dir)
-// Transfer messages about what we are doing to upstairs
-/mob/visible_message(var/message, var/self_message, var/blind_message, var/list/exclude_mobs = null)
- . = ..()
- if(shadow)
- shadow.visible_message(message, self_message, blind_message, exclude_mobs)
-
/mob/zshadow/set_typing_indicator(var/state)
if(!typing_indicator)
init_typing_indicator("typing")
diff --git a/sound/voice/Bug.ogg b/sound/voice/Bug.ogg
new file mode 100644
index 00000000000..83486e436f2
Binary files /dev/null and b/sound/voice/Bug.ogg differ
diff --git a/sound/voice/BugBuzz.ogg b/sound/voice/BugBuzz.ogg
new file mode 100644
index 00000000000..43fda8be425
Binary files /dev/null and b/sound/voice/BugBuzz.ogg differ
diff --git a/sound/voice/BugHiss.ogg b/sound/voice/BugHiss.ogg
new file mode 100644
index 00000000000..3ab342f5c9d
Binary files /dev/null and b/sound/voice/BugHiss.ogg differ
diff --git a/sound/voice/cat_purr.ogg b/sound/voice/cat_purr.ogg
new file mode 100644
index 00000000000..1125cb2bbd7
Binary files /dev/null and b/sound/voice/cat_purr.ogg differ
diff --git a/sound/voice/cat_purr_long.ogg b/sound/voice/cat_purr_long.ogg
new file mode 100644
index 00000000000..c74b845250d
Binary files /dev/null and b/sound/voice/cat_purr_long.ogg differ
diff --git a/sound/voice/multichirp.ogg b/sound/voice/multichirp.ogg
new file mode 100644
index 00000000000..2db358e942b
Binary files /dev/null and b/sound/voice/multichirp.ogg differ
diff --git a/sound/voice/teshchirp.ogg b/sound/voice/teshchirp.ogg
new file mode 100644
index 00000000000..f13c80dd335
Binary files /dev/null and b/sound/voice/teshchirp.ogg differ
diff --git a/sound/voice/teshsqueak.ogg b/sound/voice/teshsqueak.ogg
new file mode 100644
index 00000000000..41d205ab9fb
Binary files /dev/null and b/sound/voice/teshsqueak.ogg differ
diff --git a/sound/voice/teshtrill.ogg b/sound/voice/teshtrill.ogg
new file mode 100644
index 00000000000..db30e988e53
Binary files /dev/null and b/sound/voice/teshtrill.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index 30e1a8d9a55..4789a1086d6 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2071,6 +2071,24 @@
#include "code\modules\economy\vending_machines.dm"
#include "code\modules\entopics_vr\alternate_appearance.dm"
#include "code\modules\entopics_vr\entopics.dm"
+#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\audible_cough.dm"
+#include "code\modules\emotes\definitions\audible_scream.dm"
+#include "code\modules\emotes\definitions\audible_slap.dm"
+#include "code\modules\emotes\definitions\audible_snap.dm"
+#include "code\modules\emotes\definitions\audible_sneeze.dm"
+#include "code\modules\emotes\definitions\audible_whistle.dm"
+#include "code\modules\emotes\definitions\exertion.dm"
+#include "code\modules\emotes\definitions\human.dm"
+#include "code\modules\emotes\definitions\slimes.dm"
+#include "code\modules\emotes\definitions\synthetics.dm"
+#include "code\modules\emotes\definitions\visible.dm"
+#include "code\modules\emotes\definitions\visible_animated.dm"
+#include "code\modules\emotes\definitions\visible_vomit.dm"
#include "code\modules\error_handler\_defines.dm"
#include "code\modules\error_handler\error_handler.dm"
#include "code\modules\error_handler\error_viewer.dm"