Ports emote decls from Bay + automatic pain emotes. (#9215)

This commit is contained in:
Matt Atlas
2020-07-03 20:14:23 +02:00
committed by GitHub
parent 431949383f
commit 107bbc58d8
30 changed files with 1369 additions and 908 deletions
+10 -1
View File
@@ -1493,6 +1493,16 @@
#include "code\modules\effects\sparks\procs.dm"
#include "code\modules\effects\sparks\spawner.dm"
#include "code\modules\effects\sparks\visuals.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\exertion.dm"
#include "code\modules\emotes\definitions\human.dm"
#include "code\modules\emotes\definitions\slime.dm"
#include "code\modules\emotes\definitions\synthetics.dm"
#include "code\modules\emotes\definitions\visible.dm"
#include "code\modules\events\apc_damage.dm"
#include "code\modules\events\blob.dm"
#include "code\modules\events\brand_intelligence.dm"
@@ -1841,7 +1851,6 @@
#include "code\modules\mob\living\carbon\alien\alien_attacks.dm"
#include "code\modules\mob\living\carbon\alien\alien_damage.dm"
#include "code\modules\mob\living\carbon\alien\death.dm"
#include "code\modules\mob\living\carbon\alien\emote.dm"
#include "code\modules\mob\living\carbon\alien\life.dm"
#include "code\modules\mob\living\carbon\alien\progression.dm"
#include "code\modules\mob\living\carbon\alien\update_icons.dm"
+4
View File
@@ -314,6 +314,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
//helper for inverting armor blocked values into a multiplier
#define BLOCKED_MULT(blocked) max(1 - (blocked/100), 0)
+207
View File
@@ -0,0 +1,207 @@
/mob
var/list/default_emotes = list()
var/list/usable_emotes = list()
/mob/proc/update_emotes(var/skip_sort)
usable_emotes.Cut()
for(var/emote in 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/Initialize()
. = ..()
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/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/alien/diona
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/audible/hiss,
/decl/emote/audible,
/decl/emote/audible/scretch,
/decl/emote/audible/choke,
/decl/emote/audible/gnarl,
/decl/emote/audible/chirp
)
/mob/living/carbon/brain/can_emote()
return (istype(container, /obj/item/device/mmi) && ..())
/mob/living/carbon/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/boop,
/decl/emote/visible/blink,
/decl/emote/visible/flash
)
/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/golfclap,
/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/snap,
/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/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
)
/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/nod,
/decl/emote/visible/shake,
/decl/emote/visible/glare,
/decl/emote/visible/look,
/decl/emote/visible/stare,
/decl/emote/visible/deathgasp_robot,
/decl/emote/audible/synth,
/decl/emote/audible/synth/ping,
/decl/emote/audible/synth/buzz,
/decl/emote/audible/synth/confirm,
/decl/emote/audible/synth/deny,
)
/mob/living/carbon/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
)
@@ -0,0 +1,79 @@
/datum/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 = decls_repository.get_decl(emote)
if(emote_datum.check_user(src))
usable_emotes[emote_datum.key] = emote_datum
usable_emotes = sortAssoc(usable_emotes)
// Specific defines follow.
/datum/species/slime
default_emotes = list(
/decl/emote/visible/bounce,
/decl/emote/visible/jiggle,
/decl/emote/visible/lightup,
/decl/emote/visible/vibrate
)
/datum/species/unathi
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/audible/lizard_bellow
)
pain_emotes_with_pain_level = list(
list(/decl/emote/audible/roar, /decl/emote/audible/whimper, /decl/emote/audible/moan) = 70,
list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/moan) = 40,
list(/decl/emote/audible/grunt, /decl/emote/audible/groan) = 10,
)
/datum/species/diona
default_emotes = list(
/decl/emote/audible/chirp,
/decl/emote/audible/multichirp,
/decl/emote/audible/nymphsqueal,
/decl/emote/audible/painrustle,
/decl/emote/audible/paincreak
)
pain_emotes_with_pain_level = list(
list(/decl/emote/audible/painrustle, /decl/emote/audible/paincreak, /decl/emote/audible/nymphsqueal) = 70,
list(/decl/emote/audible/painrustle, /decl/emote/audible/nymphsqueal) = 40,
list(/decl/emote/audible/paincreak) = 10,
)
/datum/species/bug
default_emotes = list(
/decl/emote/audible/hiss,
/decl/emote/audible/chitter,
/decl/emote/audible/shriek,
/decl/emote/audible/screech
)
pain_emotes_with_pain_level = list(
list(/decl/emote/audible/screech, /decl/emote/audible/shriek) = 70,
list(/decl/emote/audible/shriek, /decl/emote/audible/hiss) = 40,
list(/decl/emote/audible/hiss) = 10,
)
/datum/species/tajaran
default_emotes = list(
/decl/emote/audible/howl,
/decl/emote/audible/hiss
)
pain_emotes_with_pain_level = list(
list(/decl/emote/audible/scream, /decl/emote/audible/whimper, /decl/emote/audible/moan, /decl/emote/audible/cry, /decl/emote/audible/howl) = 70,
list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/moan, /decl/emote/audible/hiss) = 40,
list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/hiss) = 10,
)
/mob/living/carbon/human/set_species(var/new_species, var/default_colour = 1)
UNLINT(. = ..())
update_emotes()
+223
View File
@@ -0,0 +1,223 @@
/decl/emote/audible
key = "burp"
emote_message_3p = "USER burps."
message_type = AUDIBLE_MESSAGE
var/emote_sound
/decl/emote/audible/do_extra(var/atom/user)
var/sound_to_play
if(emote_sound)
if(islist(emote_sound))
sound_to_play = pick(emote_sound)
else
sound_to_play = emote_sound
playsound(user.loc, sound_to_play, 50, 0, vary = FALSE)
/decl/emote/audible/deathgasp_alien
key = "deathgasp"
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."
/decl/emote/audible/gasp
key ="gasp"
emote_message_3p = "USER gasps."
conscious = 0
/decl/emote/audible/scretch
key ="scretch"
emote_message_3p = "USER scretches."
/decl/emote/audible/choke
key ="choke"
emote_message_3p = "USER chokes."
conscious = 0
/decl/emote/audible/gnarl
key ="gnarl"
emote_message_3p = "USER gnarls and shows its teeth.."
/decl/emote/audible/chirp
key ="chirp"
emote_message_3p = "USER chirps!"
emote_sound = 'sound/misc/nymphchirp.ogg'
/decl/emote/audible/multichirp
key ="mchirp"
emote_message_3p = "USER chirps a chorus of notes!"
emote_sound = 'sound/misc/multichirp.ogg'
/decl/emote/audible/paincreak
key ="pcreak"
emote_message_3p = "USER creaks in pain!"
/decl/emote/audible/painrustle
key ="prustle"
emote_message_3p = "USER rustles in agony!"
/decl/emote/audible/nymphsqueal
key ="psqueal"
emote_message_3p = "USER's nymphs squeal in pain!"
/decl/emote/audible/chitter
key = "chitter"
emote_message_3p = "USER chitters."
emote_sound = list('sound/misc/zapsplat/chitter1.ogg', 'sound/misc/zapsplat/chitter2.ogg', 'sound/misc/zapsplat/chitter3.ogg')
/decl/emote/audible/shriek
key = "shriek"
emote_message_3p = "USER shrieks!"
/decl/emote/audible/screech
key = "screech"
emote_message_3p = "USER screeches!"
/decl/emote/audible/alarm
key = "alarm"
emote_message_1p = "You sound 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."
/decl/emote/audible/notice
key = "notice"
emote_message_1p = "You play 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."
/decl/emote/audible/boop
key = "boop"
emote_message_1p = "You boop."
emote_message_3p = "USER boops."
/decl/emote/audible/sneeze
key = "sneeze"
emote_message_3p = "USER sneezes."
/decl/emote/audible/sniff
key = "sniff"
emote_message_3p = "USER sniffs."
/decl/emote/audible/snore
key = "snore"
emote_message_3p = "USER snores."
conscious = 0
/decl/emote/audible/whimper
key = "whimper"
emote_message_3p = "USER whimpers."
/decl/emote/audible/yawn
key = "yawn"
emote_message_3p = "USER yawns."
/decl/emote/audible/clap
key = "clap"
emote_message_3p = "USER claps!"
emote_sound = 'sound/effects/clap.ogg'
/decl/emote/audible/golfclap
key = "golfclap"
emote_message_3p = "USER claps, clearly unimpressed."
emote_sound = 'sound/effects/golfclap.ogg'
/decl/emote/audible/chuckle
key = "chuckle"
emote_message_3p = "USER chuckles."
/decl/emote/audible/cough
key = "cough"
emote_message_3p = "USER coughs!"
conscious = 0
/decl/emote/audible/cry
key = "cry"
emote_message_3p = "USER cries."
/decl/emote/audible/sigh
key = "sigh"
emote_message_3p = "USER sighs."
/decl/emote/audible/laugh
key = "laugh"
emote_message_3p_target = "USER laughs at TARGET."
emote_message_3p = "USER laughs."
/decl/emote/audible/mumble
key = "mumble"
emote_message_3p = "USER mumbles!"
/decl/emote/audible/grumble
key = "grumble"
emote_message_3p = "USER grumbles!"
/decl/emote/audible/groan
key = "groan"
emote_message_3p = "USER groans!"
conscious = 0
/decl/emote/audible/moan
key = "moan"
emote_message_3p = "USER moans!"
conscious = 0
/decl/emote/audible/giggle
key = "giggle"
emote_message_3p = "USER giggles."
/decl/emote/audible/scream
key = "scream"
emote_message_3p = "USER screams!"
/decl/emote/audible/grunt
key = "grunt"
emote_message_3p = "USER grunts."
/decl/emote/audible/slap
key = "slap"
emote_message_1p_target = "<span class='warning'>You slap TARGET across the face!</span>"
emote_message_1p = "You slap yourself across the face!"
emote_message_3p_target = "<span class='warning'>USER slaps TARGET across the face!</span>"
emote_message_3p = "USER slaps USER_SELF across the face!"
emote_sound = 'sound/effects/snap.ogg'
/decl/emote/audible/snap
key = "snap"
emote_message_3p = "USER snaps USER_THEIR fingers."
emote_sound = 'sound/effects/fingersnap.ogg'
/decl/emote/audible/roar
key = "roar"
emote_message_3p = "USER roars!"
/decl/emote/audible/bellow
key = "bellow"
emote_message_3p = "USER bellows!"
/decl/emote/audible/howl
key = "howl"
emote_message_3p = "USER howls!"
/decl/emote/audible/wheeze
key = "wheeze"
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."
/decl/emote/audible/lizard_bellow
key = "bellow"
emote_message_3p_target = "USER bellows deeply at TARGET!"
emote_message_3p = "USER bellows!"
emote_sound = 'sound/voice/LizardBellow.ogg'
@@ -0,0 +1,41 @@
/decl/emote/exertion/biological
key = "esweat"
emote_range = 4
emote_message_1p = "You are sweating heavily."
emote_message_3p = "USER 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 = "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."
/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."
+56
View File
@@ -0,0 +1,56 @@
/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(deliberate = TRUE)
/decl/emote/human/deathgasp
key = "deathgasp"
/decl/emote/human/deathgasp/get_emote_message_3p(var/mob/living/carbon/human/user)
return "USER [user.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()
+30
View File
@@ -0,0 +1,30 @@
/decl/emote/slime
key = "nomood"
var/mood
/decl/emote/slime/do_extra(var/mob/living/carbon/slime/user)
user.mood = mood
user.regenerate_icons()
/decl/emote/slime/check_user(var/atom/user)
return istype(user, /mob/living/carbon/slime)
/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"
@@ -0,0 +1,29 @@
/decl/emote/audible/synth
key = "beep"
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/ping
key = "ping"
emote_message_3p = "USER pings."
emote_sound = 'sound/machines/ping.ogg'
/decl/emote/audible/synth/buzz
key = "buzz"
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_sound = 'sound/machines/synth_yes.ogg'
/decl/emote/audible/synth/deny
key = "deny"
emote_message_3p = "USER emits a negative blip."
emote_sound = 'sound/machines/synth_no.ogg'
+336
View File
@@ -0,0 +1,336 @@
/decl/emote/visible
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."
/decl/emote/visible/drool
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."
/decl/emote/visible/sway
key ="sway"
emote_message_3p = "USER sways around dizzily."
/decl/emote/visible/sulk
key ="sulk"
emote_message_3p = "USER sulks down sadly."
/decl/emote/visible/dance
key ="dance"
check_restraints = TRUE
emote_message_3p = "USER dances around happily."
/decl/emote/visible/roll
key ="roll"
check_restraints = TRUE
emote_message_3p = "USER rolls."
/decl/emote/visible/shake
key ="shake"
emote_message_3p = "USER shakes USER_THEIR head."
/decl/emote/visible/jump
key ="jump"
emote_message_3p = "USER jumps!"
/decl/emote/visible/shiver
key ="shiver"
emote_message_3p = "USER shivers."
conscious = 0
/decl/emote/visible/collapse
key ="collapse"
emote_message_3p = "USER 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 = "The lights on USER flash quickly."
/decl/emote/visible/blink
key = "blink"
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."
/decl/emote/visible/blink_r
key = "blink_r"
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."
/decl/emote/visible/salute
key = "salute"
emote_message_3p_target = "USER salutes TARGET."
emote_message_3p = "USER salutes."
/decl/emote/visible/flap
key = "flap"
check_restraints = TRUE
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!"
/decl/emote/visible/eyebrow
key = "eyebrow"
emote_message_3p = "USER raises an eyebrow."
/decl/emote/visible/twitch
key = "twitch"
emote_message_3p = "USER twitches."
conscious = 0
/decl/emote/visible/twitch_v
key = "twitch_v"
emote_message_3p = "USER twitches violently."
conscious = 0
/decl/emote/visible/faint
key = "faint"
emote_message_3p = "USER faints."
/decl/emote/visible/faint/do_extra(var/mob/user)
if(istype(user) && user.sleeping <= 0)
user.sleeping += 10
/decl/emote/visible/frown
key = "frown"
emote_message_3p = "USER frowns."
/decl/emote/visible/blush
key = "blush"
emote_message_3p = "USER blushes."
/decl/emote/visible/wave
key = "wave"
emote_message_3p_target = "USER waves at TARGET."
emote_message_3p = "USER waves."
/decl/emote/visible/glare
key = "glare"
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."
/decl/emote/visible/look
key = "look"
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."
/decl/emote/visible/raise
key = "raise"
check_restraints = TRUE
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."
/decl/emote/visible/shrug
key = "shrug"
emote_message_3p = "USER shrugs."
/decl/emote/visible/smile
key = "smile"
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."
/decl/emote/visible/tremble
key = "tremble"
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."
/decl/emote/visible/hug
key = "hug"
check_restraints = TRUE
emote_message_3p_target = "USER hugs TARGET."
emote_message_3p = "USER hugs USER_SELF."
/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."
/decl/emote/visible/signal
key = "signal"
check_restraints = TRUE
emote_message_3p = "USER signals."
/decl/emote/visible/signal/check_user(var/atom/user)
return ismob(user)
/decl/emote/visible/bounce
key = "bounce"
emote_message_3p = "USER bounces in place."
/decl/emote/visible/jiggle
key = "jiggle"
emote_message_3p = "USER jiggles!"
/decl/emote/visible/lightup
key = "light"
emote_message_3p = "USER lights up for a bit, then stops."
/decl/emote/visible/vibrate
key = "vibrate"
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."
/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."
message_type = VISIBLE_MESSAGE
/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 ..()
/decl/emote/visible/signal
key = "signal"
emote_message_3p_target = "USER signals at TARGET."
emote_message_3p = "USER signals."
message_type = VISIBLE_MESSAGE
/decl/emote/visible/signal/get_emote_message_3p(var/mob/user, var/atom/target, var/extra_params)
if(istype(user) && !(user.r_hand && user.l_hand))
var/t1 = round(text2num(extra_params))
if(isnum(t1) && t1 <= 5)
return "USER raises [t1] finger\s."
return .. ()
/decl/emote/visible/afold
key = "afold"
check_restraints = TRUE
emote_message_3p = "USER folds USER_THEIR arms."
/decl/emote/visible/alook
key = "alook"
emote_message_3p = "USER looks away."
/decl/emote/visible/hbow
key = "hbow"
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."
/decl/emote/visible/holdup
key = "holdup"
check_restraints = TRUE
emote_message_3p = "USER holds up USER_THEIR palms."
/decl/emote/visible/hshrug
key = "hshrug"
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."
/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."
/decl/emote/visible/erub
key = "erub"
check_restraints = TRUE
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."
/decl/emote/visible/ftap
key = "ftap"
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."
/decl/emote/visible/hspread
key = "hspread"
check_restraints = TRUE
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."
/decl/emote/visible/rsalute
key = "rsalute"
check_restraints = TRUE
emote_message_3p = "USER returns the salute."
/decl/emote/visible/rshoulder
key = "rshoulder"
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."
/decl/emote/visible/tfist
key = "tfist"
emote_message_3p = "USER tightens USER_THEIR hands into fists."
/decl/emote/visible/tilt
key = "tilt"
emote_message_3p = "USER tilts USER_THEIR head."
+105
View File
@@ -0,0 +1,105 @@
// Note about emote messages:
// - USER / TARGET will be replaced with the relevant name, in bold.
// - USER_THEM / TARGET_THEM / USER_THEIR / TARGET_THEIR will be replaced with a
// gender-appropriate version of the same.
// - Impaired messages do not do any substitutions.
/decl/emote
var/key // Command to use emote ie. '*[key]'
var/emote_message_1p // First person message ('You do a flip!')
var/emote_message_3p // Third person message ('Urist McShitter does a flip!')
var/emote_message_impaired // Deaf/blind message ('You hear someone flipping out.', 'You see someone opening and closing their mouth')
var/emote_message_1p_target // 'You do a flip at Urist McTarget!'
var/emote_message_3p_target // 'Urist McShitter does a flip at Urist McTarget!'
var/message_type = VISIBLE_MESSAGE // Audible/visual flag
var/targetted_emote // Whether or not this emote needs a target.
var/check_restraints // Can this emote be used while restrained?
var/conscious = 1 // Do we need to be awake to emote this?
var/emote_range = 0 // If >0, restricts emote visibility to viewers within range.
/decl/emote/proc/get_emote_message_1p(var/atom/user, var/atom/target, var/extra_params)
if(target)
return emote_message_1p_target
return emote_message_1p
/decl/emote/proc/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params)
if(target)
return emote_message_3p_target
return emote_message_3p
/decl/emote/proc/do_emote(var/atom/user, var/extra_params)
if(ismob(user) && check_restraints)
var/mob/M = user
if(M.restrained())
to_chat(user, "<span class='warning'>You are restrained and cannot do that.</span>")
return
var/atom/target
if(can_target() && extra_params)
extra_params = lowertext(extra_params)
for(var/atom/thing in view(user))
if(extra_params == lowertext(thing.name))
target = thing
break
var/datum/gender/user_gender = gender_datums[user.gender]
var/datum/gender/target_gender
if(target)
target_gender = gender_datums[target.gender]
var/use_3p
var/use_1p
if(emote_message_1p)
if(target && emote_message_1p_target)
use_1p = get_emote_message_1p(user, target, extra_params)
use_1p = replacetext(use_1p, "TARGET_THEM", target_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", "<b>\the [target]</b>")
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", "<b>\the [target]</b>")
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", "<b>\the [user]</b>")
use_3p = capitalize(use_3p)
var/use_range = emote_range
if (!use_range)
use_range = world.view
if(ismob(user))
var/mob/M = user
if(message_type == AUDIBLE_MESSAGE)
M.audible_message(message = use_3p, self_message = use_1p, deaf_message = emote_message_impaired, hearing_distance = use_range)
else
M.visible_message(message = use_3p, self_message = use_1p, blind_message = emote_message_impaired, range = use_range)
do_extra(user, target)
/decl/emote/proc/do_extra(var/atom/user, var/atom/target)
return
/decl/emote/proc/check_user(var/atom/user)
return TRUE
/decl/emote/proc/can_target()
return (emote_message_1p_target || emote_message_3p_target)
/decl/emote/dd_SortValue()
return key
+167
View File
@@ -0,0 +1,167 @@
/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)
// 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, "<span class='warning'>You cannot send IC messages (muted).</span>")
return
if(act == "help")
to_chat(src,"<b>Usable emotes:</b> [english_list(usable_emotes)]")
return
if(!can_emote(m_type))
to_chat(src, "<span class='warning'>You cannot currently [m_type == AUDIBLE_MESSAGE ? "audibly" : "visually"] emote!</span>")
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 class='warning'>Unknown emote '[act]'. Type <b>say *help</b> for a list of usable emotes.</span>")
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("<b>\The [src]</b> makes a muffled sound.")
return
else
use_emote.do_emote(src, message)
for (var/obj/item/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
var/anchor_char = "!"
if(!message || !emoter)
return
message = html_decode(message)
name_anchor = findtext(message, anchor_char)
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, anchor_char))
// abort abort!
to_chat(emoter, "<span class='warning'>You may use only one \"[anchor_char]\" symbol in your emote.</span>")
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 = "<B>[emoter]</B>"
return pretext + nametext + subtext
/mob/proc/custom_emote(var/m_type = VISIBLE_MESSAGE, var/message = null)
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 (message)
log_emote("[name]/[key] : [message]")
if(m_type == VISIBLE_MESSAGE)
visible_message(message)
else
audible_message(message)
// 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.
..()
/mob/living/captive_brain/emote(var/message)
return
/mob/abstract/observer/emote(var/act, var/type, var/message)
if(!message)
return
if(act != "me")
return
log_emote("Ghost/[src.key] : [message]",ckey=key_name(src))
if(src.client)
if(src.client.prefs.muted & (MUTE_DEADCHAT|MUTE_IC))
to_chat(src, "<span class='warning'>You cannot emote in deadchat (muted).</span>")
return
. = src.emote_dead(message)
-17
View File
@@ -12,20 +12,3 @@
return
. = src.say_dead(message)
/mob/abstract/observer/emote(var/act, var/type, var/message)
if(!message)
return
if(act != "me")
return
log_emote("Ghost/[src.key] : [message]",ckey=key_name(src))
if(src.client)
if(src.client.prefs.muted & (MUTE_DEADCHAT|MUTE_IC))
to_chat(src, "<span class='warning'>You cannot emote in deadchat (muted).</span>")
return
. = src.emote_dead(message)
-24
View File
@@ -1,30 +1,6 @@
// All mobs should have custom emote, really..
//m_type == 1 --> visual.
//m_type == 2 --> audible
/mob/proc/custom_emote(var/m_type=1,var/message = null, var/log_emote = 1)
if(usr && stat || !use_me && usr == src)
to_chat(src, "You are unable to emote.")
return
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
if(m_type == 2 && muzzled) return
var/input
if(!message)
input = sanitize(input(src,"Choose an emote to display.") as text|null)
else
input = message
if(input)
message = "<B>[src]</B> [input]"
else
return
if (message)
send_emote(message, m_type)
if (log_emote)
log_emote("[name]/[key] : [message]",ckey=key_name(key))
/mob/proc/emote_dead(var/message)
if(client.prefs.muted & MUTE_DEADCHAT)
+4
View File
@@ -18,6 +18,7 @@ var/list/datum/gender/gender_datums = list()
var/has = "have"
var/is = "are"
var/does = "do"
var/self = "themselves"
/datum/gender/male
key = "male"
@@ -30,6 +31,7 @@ var/list/datum/gender/gender_datums = list()
has = "has"
is = "is"
does = "does"
self = "himself"
/datum/gender/female
key = "female"
@@ -42,6 +44,7 @@ var/list/datum/gender/gender_datums = list()
has = "has"
is = "is"
does = "does"
self = "herself"
/datum/gender/neuter
key = "neuter"
@@ -54,3 +57,4 @@ var/list/datum/gender/gender_datums = list()
has = "has"
is = "is"
does = "does"
self = "itself"
@@ -1,121 +0,0 @@
/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)
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
switch(act)
if ("me")
if(silent)
return
if (src.client)
if (client.prefs.muted & MUTE_IC)
to_chat(src, "<span class='warning'>You cannot send IC messages (muted).</span>")
return
if (stat)
return
if(!(message))
return
return custom_emote(m_type, message)
if ("custom")
return custom_emote(m_type, message)
if("sign")
if (!src.restrained())
message = text("<B>The alien</B> signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))
m_type = 1
if ("burp")
if (!muzzled)
message = "<B>[src]</B> burps."
m_type = 2
if("deathgasp")
message = "<B>The [src.name]</B> lets out a waning guttural screech, green blood bubbling from its maw."
m_type = 2
if("scratch")
if (!src.restrained())
message = "<B>The [src.name]</B> scratches."
m_type = 1
if("whimper")
if (!muzzled)
message = "<B>The [src.name]</B> whimpers."
m_type = 2
if("tail")
message = "<B>The [src.name]</B> waves its tail."
m_type = 1
if("gasp")
message = "<B>The [src.name]</B> gasps."
m_type = 2
if("shiver")
message = "<B>The [src.name]</B> shivers."
m_type = 2
if("drool")
message = "<B>The [src.name]</B> drools."
m_type = 1
if("scretch")
if (!muzzled)
message = "<B>The [src.name]</B> scretches."
m_type = 2
if("choke")
message = "<B>The [src.name]</B> chokes."
m_type = 2
if("moan")
message = "<B>The [src.name]</B> moans!"
m_type = 2
if("nod")
message = "<B>The [src.name]</B> nods its head."
m_type = 1
// if("sit")
// message = "<B>The [src.name]</B> sits down." //Larvan can't sit down, /N
// m_type = 1
if("sway")
message = "<B>The [src.name]</B> sways around dizzily."
m_type = 1
if("sulk")
message = "<B>The [src.name]</B> sulks down sadly."
m_type = 1
if("twitch")
message = "<B>The [src.name]</B> twitches violently."
m_type = 1
if("dance")
if (!src.restrained())
message = "<B>The [src.name]</B> dances around happily."
m_type = 1
if("roll")
if (!src.restrained())
message = "<B>The [src.name]</B> rolls."
m_type = 1
if("shake")
message = "<B>The [src.name]</B> shakes its head."
m_type = 1
if("gnarl")
if (!muzzled)
message = "<B>The [src.name]</B> gnarls and shows its teeth.."
m_type = 2
if("jump")
message = "<B>The [src.name]</B> jumps!"
m_type = 1
if("hiss_")
message = "<B>The [src.name]</B> hisses softly."
m_type = 1
if("collapse")
Paralyse(2)
message = text("<B>[]</B> collapses!", src)
m_type = 2
if("chirp")
message = "<B>The [src.name]</B> chirps!"
playsound(src.loc, '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")
else
to_chat(src, text("Invalid Emote: []", act))
if ((message && src.stat == 0))
log_emote("[name]/[key] : [message]",ckey=key_name(key))
send_emote(message, m_type)
return
+1 -727
View File
@@ -1,735 +1,9 @@
/mob/living/carbon/human/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)
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
//var/m_type = 1
for (var/obj/item/implant/I in src)
if (I.implanted)
I.trigger(act, src)
if(stat == DEAD && (act != "deathgasp"))
return
switch(act)
if ("airguitar")
if (!src.restrained())
message = "is strumming the air and headbanging like a safari chimp."
m_type = 1
if ("blink")
message = "blinks."
m_type = 1
if ("blink_r")
message = "blinks rapidly."
m_type = 1
if ("bow")
if (!src.buckled)
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 = "bows to [param]."
else
message = "bows."
m_type = 1
if ("custom")
var/input = sanitize(input("Choose an emote to display.") as text|null)
if (!input)
return
var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable")
if (input2 == "Visible")
m_type = 1
else if (input2 == "Hearable")
if (src.miming)
return
m_type = 2
else
alert("Unable to use this emote, must be either hearable or visible.")
return
return custom_emote(m_type, message)
if ("me")
//if(silent && silent > 0 && findtext(message,"\"",1, null) > 0)
// return //This check does not work and I have no idea why, I'm leaving it in for reference.
if (src.client)
if (client.prefs.muted & MUTE_IC)
to_chat(src, "<span class='danger'>You cannot send IC messages (muted).</span>")
return
if (stat)
return
if(!(message))
return
return custom_emote(m_type, message)
if ("salute")
if (!src.buckled)
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 = "salutes to [param]."
else
message = "salutes."
m_type = 1
if ("choke")
if(miming)
message = "clutches [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] throat desperately!"
m_type = 1
else
if (!muzzled)
message = "chokes!"
m_type = 2
else
message = "makes a strong noise."
m_type = 2
if ("clap")
if (!src.restrained())
message = "claps."
playsound(loc, 'sound/effects/clap.ogg', 50, 1)
m_type = 2
if(miming)
m_type = 1
if ("golfclap")
if (!src.restrained())
message = "claps, clearly unimpressed."
playsound(loc, 'sound/effects/golfclap.ogg', 50, 1)
m_type = 2
if(miming)
m_type = 1
if ("flap")
if (!src.restrained())
message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings."
m_type = 2
if(miming)
m_type = 1
if ("aflap")
if (!src.restrained())
message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings ANGRILY!"
m_type = 2
if(miming)
m_type = 1
if ("drool")
message = "drools."
m_type = 1
if ("eyebrow")
message = "raises an eyebrow."
m_type = 1
if ("chuckle")
if(miming)
message = "appears to chuckle."
m_type = 1
else
if (!muzzled)
message = "chuckles."
m_type = 2
else
message = "makes a noise."
m_type = 2
if ("twitch")
message = "twitches violently."
m_type = 1
if ("twitch_s")
message = "twitches."
m_type = 1
if ("faint")
message = "faints."
if(src.sleeping)
return //Can't faint while asleep
src.sleeping += 10 //Short-short nap
m_type = 1
if ("cough")
if(miming)
message = "appears to cough!"
m_type = 1
else
if (!muzzled)
message = "coughs!"
m_type = 2
else
message = "makes a strong noise."
m_type = 2
if ("frown")
message = "frowns."
m_type = 1
if ("nod")
message = "nods."
m_type = 1
if ("blush")
message = "blushes."
m_type = 1
if ("wave")
message = "waves."
m_type = 1
if ("gasp")
if(miming)
message = "appears to be gasping!"
m_type = 1
else
if (!muzzled)
message = "gasps!"
m_type = 2
else
message = "makes a weak noise."
m_type = 2
if ("deathgasp")
message = "[species.death_message]"
m_type = 1
if ("giggle")
if(miming)
message = "giggles silently!"
m_type = 1
else
if (!muzzled)
message = "giggles."
m_type = 2
else
message = "makes a noise."
m_type = 2
if ("glare")
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 = "glares at [param]."
else
message = "glares."
if ("stare")
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 = "stares at [param]."
else
message = "stares."
if ("look")
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 = "looks at [param]."
else
message = "looks."
m_type = 1
if ("grin")
message = "grins."
m_type = 1
if ("cry")
if(miming)
message = "cries."
m_type = 1
else
if (!muzzled)
message = "cries."
m_type = 2
else
message = "makes a weak noise. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"] [get_visible_gender() == NEUTER ? "frown" : "frowns"]."
m_type = 2
if ("sigh")
if(miming)
message = "sighs."
m_type = 1
else
if (!muzzled)
message = "sighs."
m_type = 2
else
message = "makes a weak noise."
m_type = 2
if("slap", "slaps")
m_type = 1
if(!restrained())
var/M = null
if(param)
for(var/mob/A in view(1, null))
if(param == A.name)
M = A
break
if(M)
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
var/show_ssd
var/mob/living/carbon/human/H
if(ishuman(src))
H = src
show_ssd = H.species.show_ssd
if(H && show_ssd && !H.client && !H.teleop)
if(H.bg)
to_chat(H, span("danger", "You sense some disturbance to your physical body!"))
else if(!vr_mob)
message = "<span class='danger'>slaps [M] across the face, but they do not respond... Maybe they have S.S.D?</span>"
else if(H.client && H.willfully_sleeping)
message = "<span class='danger'>slaps [M] across the face, waking them up. Ouch!</span>"
H.sleeping = 0
H.willfully_sleeping = FALSE
else
message = "<span class='danger'>slaps [M] across the face. Ouch!</span>"
else
message = "<span class='danger'>slaps [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]!</span>"
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
SSfeedback.IncrementSimpleStat("selfslap")
if("snap", "snaps")
m_type = 2
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/L = H.get_organ(BP_L_HAND)
var/obj/item/organ/external/R = H.get_organ(BP_R_HAND)
var/left_hand_good = 0
var/right_hand_good = 0
if(L && (!(L.status & ORGAN_DESTROYED)) && (!(L.status & ORGAN_BROKEN)))
left_hand_good = 1
if(R && (!(R.status & ORGAN_DESTROYED)) && (!(R.status & ORGAN_BROKEN)))
right_hand_good = 1
if(!left_hand_good && !right_hand_good)
to_chat(usr, "You need at least one hand in good working order to snap your fingers.")
return
message = "snaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] fingers."
playsound(loc, 'sound/effects/fingersnap.ogg', 50, 1, -3)
if ("laugh")
if(miming)
message = "acts out a laugh."
m_type = 1
else
if (!muzzled)
message = "laughs."
m_type = 2
else
message = "makes a noise."
m_type = 2
if ("mumble")
message = "mumbles!"
m_type = 2
if(miming)
m_type = 1
if ("grumble")
if(miming)
message = "grumbles!"
m_type = 1
if (!muzzled)
message = "grumbles!"
m_type = 2
else
message = "makes a noise."
m_type = 2
if ("groan")
if(miming)
message = "appears to groan!"
m_type = 1
else
if (!muzzled)
message = "groans!"
m_type = 2
else
message = "makes a loud noise."
m_type = 2
if ("moan")
if(miming)
message = "appears to moan!"
m_type = 1
else
message = "moans!"
m_type = 2
if ("johnny")
var/M
if (param)
M = param
if (!M)
param = null
else
if(miming)
message = "takes a drag from a cigarette and blows \"[M]\" out in smoke."
m_type = 1
else
message = "says, \"[M], please. He had a family.\" [src.name] takes a drag from a cigarette and blows his name out in smoke."
m_type = 2
if ("point")
if (!src.restrained())
var/mob/M = null
if (param)
for (var/atom/A as mob|obj|turf|area in view(null, null))
if (param == A.name)
M = A
break
if (!M)
message = "points."
else
pointed(M)
if (M)
message = "points to [M]."
else
m_type = 1
if ("raise")
if (!src.restrained())
message = "raises a hand."
m_type = 1
if("shake")
message = "shakes [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] head."
m_type = 1
if ("shrug")
message = "shrugs."
m_type = 1
if ("signal")
if (!src.restrained())
var/t1 = round(text2num(param))
if (isnum(t1))
if (t1 <= 5 && (!src.r_hand || !src.l_hand))
message = "raises [t1] finger\s."
else if (t1 <= 10 && (!src.r_hand && !src.l_hand))
message = "raises [t1] finger\s."
m_type = 1
if ("smile")
message = "smiles."
m_type = 1
if ("shiver")
message = "shivers."
m_type = 2
if(miming)
m_type = 1
if ("pale")
message = "goes pale for a second."
m_type = 1
if ("tremble")
message = "trembles in fear!"
m_type = 1
if ("sneeze")
if (miming)
message = "sneezes."
m_type = 1
else
if (!muzzled)
message = "sneezes."
m_type = 2
else
message = "makes a strange noise."
m_type = 2
if ("sniff")
message = "sniffs."
m_type = 2
if(miming)
m_type = 1
if ("snore")
if (miming)
message = "sleeps soundly."
m_type = 1
else
if (!muzzled)
message = "snores."
m_type = 2
else
message = "makes a noise."
m_type = 2
if ("whimper")
if (miming)
message = "appears hurt."
m_type = 1
else
if (!muzzled)
message = "whimpers."
m_type = 2
else
message = "makes a weak noise."
m_type = 2
if ("wink")
message = "winks."
m_type = 1
if ("yawn")
if (!muzzled)
message = "yawns."
m_type = 2
if(miming)
m_type = 1
if ("collapse")
Paralyse(2)
message = "collapses!"
m_type = 2
if(miming)
m_type = 1
if("hug")
m_type = 1
if (!src.restrained())
var/M = null
if (param)
for (var/mob/A in view(1, null))
if (param == A.name)
M = A
break
if (M == src)
M = null
if (M)
message = "hugs [M]."
else
message = "hugs [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]."
if ("handshake")
m_type = 1
if (!src.restrained() && !src.r_hand)
var/mob/M = null
if (param)
for (var/mob/A in view(1, null))
if (param == A.name)
M = A
break
if (M == src)
M = null
if (M)
if (M.canmove && !M.r_hand && !M.restrained())
message = "shakes hands with [M]."
else
message = "holds out [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] hand to [M]."
if("dap")
m_type = 1
if (!src.restrained())
var/M = null
if (param)
for (var/mob/A in view(1, null))
if (param == A.name)
M = A
break
if (M)
message = "gives daps to [M]."
else
message = "sadly can't find anybody to give daps to, and daps [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]. Shameful."
if ("scream")
if(stat >= UNCONSCIOUS)
return
if (miming)
message = "acts out a scream!"
m_type = 1
else
if (!muzzled)
message = pick(species.scream_emote)
else
message = "makes a very loud noise."
m_type = 2
if("swish")
src.animate_tail_once()
if("idle")
src.animate_tail_reset()
if("wag", "sway")
src.animate_tail_start()
if("qwag", "fastsway")
src.animate_tail_fast()
if("swag", "stopsway")
src.animate_tail_stop()
if("beep")
if (!isipc(src))
to_chat(src, span("notice", "You're not a Machine!"))
else
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 = "beeps at [param]."
else
message = "beeps."
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
m_type = 1
if("ping")
if (!isipc(src))
to_chat(src, span("notice", "You're not a machine!"))
else
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 = "pings at [param]."
else
message = "pings."
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
m_type = 1
if("buzz")
if (!isipc(src))
to_chat(src, span("notice", "You're not a machine!"))
else
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 = "buzzes at [param]."
else
message = "buzzes."
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
m_type = 1
if("chirp")
if(!is_diona(src))
to_chat(src, "<span class='warning'>You are not a Diona!</span>")
return
message = "chirps!"
playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0)
m_type = 2
if("chirp_song")
if(!is_diona(src))
to_chat(src, "<span class='warning'>You are not a Diona!</span>")
return
message = "chirps a song!"
for(var/mob/living/carbon/alien/diona/D in src)
playsound(src.loc, 'sound/misc/nymphchirp.ogg', pick(list(5, 10, 20, 40)), 0)
sleep(pick(list(5, 10, 15, 20)))
m_type = 2
if("chitter")
if(!isvaurca(src))
to_chat(src, "<span class='warning'>You don't have the means to do this!</span>")
return
message = "chitters."
playsound(src.loc, pick('sound/misc/zapsplat/chitter1.ogg', 'sound/misc/zapsplat/chitter2.ogg', 'sound/misc/zapsplat/chitter3.ogg'), 50, 0)
m_type = 2
if("vomit")
if (!check_has_mouth(src))
to_chat(src, "<span class='warning'>You are unable to vomit.</span>")
return
delayed_vomit()
return
if ("help")
to_chat(src, "blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, golfclap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, frown, gasp, giggle, groan, grumble, handshake, hug-(none)/mob, glare-(none)/mob, grin, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, raise, salute, shake, shiver, shrug, sigh, signal-#1-10, smile, sneeze, sniff, snore, stare-(none)/mob, tremble, twitch, twitch_s, whimper, wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag, beep, ping, buzz, slap, snap, chitter, vomit")
else
to_chat(src, span("notice", "Unusable emote '[act]'. Say *help for a list."))
if (message)
log_emote("[name]/[key] : [message]",ckey=key_name(src))
custom_emote(m_type,message)
/mob/living/carbon/human/verb/pose()
set name = "Set Pose"
set desc = "Sets a description which will be shown when someone examines you."
set category = "IC"
pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"]...", "Pose", html_decode(pose)) as message)
pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"]...", "Pose", html_decode(pose)) as message)
/mob/living/carbon/human/verb/set_flavor()
set name = "Set Flavour Text"
@@ -105,8 +105,7 @@
if(!(lying || resting))
if(can_feel_pain())
emote("scream")
custom_emote(1, "collapses!")
Weaken(5) //can't emote while weakened, apparently.
emote("collapse")
/mob/living/carbon/human/proc/handle_grasp()
if(!l_hand && !r_hand)
@@ -97,7 +97,6 @@
var/death_sound
var/death_message = "falls limp and stops moving..."
var/death_message_range = 2
var/list/scream_emote = list("screams!")
var/knockout_message = "has been knocked unconscious!"
var/halloss_message = "slumps to the ground, too weak to continue fighting."
var/halloss_message_self = "You're in too much pain to keep going..."
@@ -150,6 +149,13 @@
"Your chilly flesh stands out in goosebumps."
)
// Order matters, higher pain level should be higher up
var/list/pain_emotes_with_pain_level = list(
list(/decl/emote/audible/scream, /decl/emote/audible/whimper, /decl/emote/audible/moan, /decl/emote/audible/cry) = 70,
list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/moan) = 40,
list(/decl/emote/audible/grunt, /decl/emote/audible/groan) = 10,
)
// HUD data vars.
var/datum/hud_data/hud
var/hud_type
@@ -615,3 +621,13 @@
/datum/species/proc/handle_despawn()
return
/datum/species/proc/get_pain_emote(var/mob/living/carbon/human/H, var/pain_power)
if(flags & NO_PAIN)
return
for(var/pain_emotes in pain_emotes_with_pain_level)
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 = decls_repository.get_decl(pick(pain_emotes))
return E.key
@@ -52,8 +52,6 @@
organ_med_burn_message = "<span class='danger'><font size=3>The nymph making up our %PARTNAME% burns terribly!</font></span>"
organ_high_burn_message = "<span class='danger'><font size=3>The nymph making up our %PARTNAME% screams in agony at the burning!</font></span>"
scream_emote = list("creaks in pain!", "rustles in agony!")
scream_emote = "screams!"
halloss_message = "creaks and crumbles to the floor."
halloss_message_self = "We can't take this much pain..."
pain_messages = list("We're in pain", "We hurt so much", "We can't stand the pain")
@@ -88,6 +88,12 @@
"Your scales bristle against the cold."
)
pain_emotes_with_pain_level = list(
list(/decl/emote/audible/wheeze, /decl/emote/audible/roar, /decl/emote/audible/bellow) = 80,
list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/wheeze, /decl/emote/audible/hiss) = 50,
list(/decl/emote/audible/grunt, /decl/emote/audible/groan, /decl/emote/audible/hiss) = 20,
)
pain_messages = list("It hurts so much", "You really need some painkillers", "Ancestors, it hurts")
move_trail = /obj/effect/decal/cleanable/blood/tracks/claw
+2 -2
View File
@@ -95,8 +95,8 @@ proc/get_radio_key_from_channel(var/channel)
/mob/living/proc/get_default_language()
return default_language
/mob/living/proc/is_muzzled()
return 0
/mob/proc/is_muzzled()
return istype(wear_mask, /obj/item/clothing/mask/muzzle)
/mob/living/proc/handle_speech_problems(var/message, var/verb, var/message_mode)
var/list/returns[4]
-5
View File
@@ -120,11 +120,6 @@
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
+7 -1
View File
@@ -43,6 +43,12 @@ mob/var/next_pain_time = 0
else
to_chat(src, "<span class='warning'>[message]</span>")
var/force_emote = species.get_pain_emote(src, power)
if(force_emote && prob(power))
var/decl/emote/use_emote = usable_emotes[force_emote]
if(!(use_emote.message_type == AUDIBLE_MESSAGE && silent))
emote(force_emote)
next_pain_time = world.time + (100-power)
/mob/living/carbon/human/proc/handle_pain()
@@ -81,7 +87,7 @@ mob/var/next_pain_time = 0
if(70 to 10000)
msg = "[burning ? species.organ_high_burn_message : species.organ_high_pain_message]"
msg = replacetext(msg, "%PARTNAME%", damaged_organ.name)
custom_pain(msg, maxdam, prob(10), damaged_organ, TRUE)
custom_pain(msg, maxdam, prob(30), damaged_organ, TRUE)
// Damage to internal organs hurts a lot.
for(var/obj/item/organ/internal/I in internal_organs)
@@ -261,10 +261,6 @@
if(isanimal(target))
target.visible_message("<b>[target]</b> twitches, foaming at the mouth.")
L.apply_damage(35, TOX) //temporary until simple_mob paralysis actually works.
/* var/mob/living/simple_animal/M = target
spawn(60)
target.visible_message("<b>[target]</b> collapses.")
M.Sleeping(1200)*/ //commented out until simple_mob paralysis actually works.
..()
/* Miscellaneous */
+1 -1
View File
@@ -525,7 +525,7 @@ CARGO_LOAD_ITEMS_FROM json
# Forces the maploader to load the specified map path. Valid options: aurora, runtime
FORCE_MAP aurora
FORCE_MAP runtime
# Reminds ticket handlers/all admin staff of not-closed tickets after this many SECONDS.
#TICKET_REMINDER_PERIOD 600
+43
View File
@@ -0,0 +1,43 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
# balance
# admin
# backend
# security
# refactor
#################################
# Your name.
author: MattAtlas
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Ported an overhauled emote backend."
- rscadd: "Added automatic pain messages for all species."
- rscadd: "Added a multichirp emote for dionae."
Binary file not shown.
Binary file not shown.
Binary file not shown.