Merge branch 'DaforLynx/initial-hurt-sfx' into 'master'

Added npc hurt sfx

See merge request veloren/veloren!2467
This commit is contained in:
Imbris 2021-06-17 05:49:09 +00:00
commit f7e331d7af
27 changed files with 164 additions and 44 deletions

View File

@ -831,56 +831,126 @@
],
threshold: 0.2,
),
Utterance(Angry, Wendigo): (
files: [
"voxygen.audio.sfx.utterance.wendigo_angry",
],
threshold: 0.2,
),
Utterance(Angry, BipedLarge): (
files: [
"voxygen.audio.sfx.utterance.ogre_angry",
"voxygen.audio.sfx.utterance.ogre_angry1",
"voxygen.audio.sfx.utterance.ogre_angry2",
],
threshold: 0.2,
),
Utterance(Angry, Reptile): (
files: [
"voxygen.audio.sfx.utterance.saurok_angry",
],
threshold: 0.2,
threshold: 1.0,
),
Utterance(Angry, Bird): (
files: [
"voxygen.audio.sfx.utterance.bird_angry",
"voxygen.audio.sfx.utterance.bird_angry1",
],
threshold: 0.2,
threshold: 1.0,
),
Utterance(Calm, Pig): (
files: [
"voxygen.audio.sfx.utterance.pig_calm",
"voxygen.audio.sfx.utterance.pig_calm1",
],
threshold: 0.2,
threshold: 1.0,
),
Utterance(Angry, Adlet): (
files: [
"voxygen.audio.sfx.utterance.adlet_angry1",
"voxygen.audio.sfx.utterance.adlet_angry2",
],
threshold: 1.0,
),
Utterance(Angry, Alligator): (
files: [
"voxygen.audio.sfx.utterance.alligator_angry1",
"voxygen.audio.sfx.utterance.alligator_angry2",
],
threshold: 1.0,
),
Utterance(Angry, Antelope): (
files: [
"voxygen.audio.sfx.utterance.antelope_angry1",
],
threshold: 1.0,
),
Utterance(Angry, Reptile): (
files: [
"voxygen.audio.sfx.utterance.alligator_angry1",
"voxygen.audio.sfx.utterance.alligator_angry2",
],
threshold: 1.0,
),
Utterance(Angry, Saurok): (
files: [
"voxygen.audio.sfx.utterance.saurok_angry1",
],
threshold: 1.0,
),
Utterance(Angry, Wendigo): (
files: [
"voxygen.audio.sfx.utterance.wendigo_angry1",
],
threshold: 1.0,
),
Utterance(Calm, Cow): (
files: [
"voxygen.audio.sfx.utterance.cow_calm",
"voxygen.audio.sfx.utterance.cow_calm1",
"voxygen.audio.sfx.utterance.cow_calm2",
"voxygen.audio.sfx.utterance.cow_calm3",
],
threshold: 0.2,
threshold: 1.0,
),
Utterance(Calm, Sheep): (
files: [
"voxygen.audio.sfx.utterance.sheep_calm",
"voxygen.audio.sfx.utterance.sheep_calm1",
],
threshold: 0.2,
threshold: 1.0,
),
Utterance(Greeting, HumanMale): (
files: [
"voxygen.audio.sfx.utterance.humanmale_greeting",
"voxygen.audio.sfx.utterance.humanmale_greeting1",
],
threshold: 0.2,
threshold: 1.0,
),
Utterance(Hurt, Adlet): (
files: [
"voxygen.audio.sfx.utterance.adlet_hurt1",
"voxygen.audio.sfx.utterance.adlet_hurt2",
],
threshold: 1.0,
),
Utterance(Hurt, Antelope): (
files: [
"voxygen.audio.sfx.utterance.antelope",
],
threshold: 1.0,
),
Utterance(Hurt, HumanMale): (
files: [
"voxygen.audio.sfx.utterance.humanmale_hurt1",
],
threshold: 1.0,
),
Utterance(Hurt, Lion): (
files: [
"voxygen.audio.sfx.utterance.lion_hurt1",
],
threshold: 1.0,
),
Utterance(Hurt, Marlin): (
files: [
"voxygen.audio.sfx.utterance.marlin_hurt1",
],
threshold: 1.0,
),
Utterance(Hurt, Maneater): (
files: [
"voxygen.audio.sfx.utterance.maneater_hurt1",
],
threshold: 1.0,
),
Utterance(Hurt, Mindflayer): (
files: [
"voxygen.audio.sfx.utterance.mindflayer_hurt1",
],
threshold: 1.0,
),
}
)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -261,6 +261,7 @@ pub enum AgentEvent {
)>,
),
ServerSound(Sound),
Hurt,
}
#[derive(Copy, Clone, Debug)]

View File

@ -1,7 +1,7 @@
use crate::{
client::Client,
comp::{
agent::{Sound, SoundKind},
agent::{Agent, AgentEvent, Sound, SoundKind},
biped_large, bird_large, quadruped_low, quadruped_medium, quadruped_small,
skills::SkillGroupKind,
theropod, PhysicsState,
@ -60,6 +60,13 @@ pub fn handle_damage(server: &Server, entity: EcsEntity, change: HealthChange) {
if let Some(mut health) = ecs.write_storage::<Health>().get_mut(entity) {
health.change_by(change);
}
// This if statement filters out anything under 5 damage, for DOT ticks
// TODO: Find a better way to separate direct damage from DOT here
if change.amount < -50 {
if let Some(agent) = ecs.write_storage::<Agent>().get_mut(entity) {
agent.inbox.push_front(AgentEvent::Hurt);
}
}
}
pub fn handle_knockback(server: &Server, entity: EcsEntity, impulse: Vec3<f32>) {

View File

@ -633,11 +633,27 @@ impl<'a> AgentData<'a> {
}
// Interact if incoming messages
if !agent.inbox.is_empty() {
if !matches!(agent.inbox.front(), Some(AgentEvent::ServerSound(_))) {
if matches!(
agent.inbox.front(),
Some(AgentEvent::ServerSound(_)) | Some(AgentEvent::Hurt)
) {
let sound = agent.inbox.pop_front();
match sound {
Some(AgentEvent::ServerSound(sound)) => {
agent.sounds_heard.push(sound);
agent.awareness += sound.vol;
},
Some(AgentEvent::Hurt) => {
// Hurt utterances at random upon receiving damage
if thread_rng().gen::<f32>() < 0.4 {
controller.push_event(ControlEvent::Utterance(UtteranceKind::Hurt));
}
},
//Note: this should be unreachable
Some(_) | None => return,
}
} else {
agent.action_state.timer = 0.1;
} else if let Some(AgentEvent::ServerSound(sound)) = agent.inbox.pop_front() {
agent.sounds_heard.push(sound);
agent.awareness += sound.vol;
}
}
if agent.action_state.timer > 0.0 {
@ -676,6 +692,13 @@ impl<'a> AgentData<'a> {
return;
}
if let Some(AgentEvent::Hurt) = agent.inbox.pop_front() {
// Hurt utterances at random upon receiving damage
if thread_rng().gen::<f32>() < 0.4 {
controller.push_event(ControlEvent::Utterance(UtteranceKind::Hurt));
}
}
if let Some(Target {
target,
selected_at,

View File

@ -316,7 +316,7 @@ impl MusicMgr {
// Adds a bit of randomness between plays
let silence_between_tracks_seconds: f32 =
if matches!(music_state, MusicState::Activity(MusicActivity::Explore)) {
rng.gen_range(60.0..120.0)
rng.gen_range(90.0..180.0)
} else {
0.0
};

View File

@ -91,12 +91,12 @@ use client::Client;
use common::{
assets::{self, AssetExt, AssetHandle},
comp::{
beam, biped_large, humanoid,
beam, biped_large, biped_small, humanoid,
item::{ItemKind, ToolKind},
object,
poise::PoiseState,
quadruped_medium, quadruped_small, Body, CharacterAbilityType, InventoryUpdateEvent,
UtteranceKind,
quadruped_low, quadruped_medium, quadruped_small, Body, CharacterAbilityType,
InventoryUpdateEvent, UtteranceKind,
},
outcome::Outcome,
terrain::{BlockKind, TerrainChunk},
@ -199,7 +199,14 @@ pub enum VoiceKind {
Pig,
Cow,
Canine,
BigCat,
Lion,
Mindflayer,
Marlin,
Maneater,
Adlet,
Antelope,
Alligator,
Saurok,
}
fn body_to_voice(body: &Body) -> Option<VoiceKind> {
@ -208,6 +215,11 @@ fn body_to_voice(body: &Body) -> Option<VoiceKind> {
humanoid::BodyType::Female => VoiceKind::HumanFemale,
humanoid::BodyType::Male => VoiceKind::HumanMale,
},
Body::QuadrupedLow(body) => match body.species {
quadruped_low::Species::Maneater => VoiceKind::Maneater,
quadruped_low::Species::Alligator => VoiceKind::Alligator,
_ => return None,
},
Body::QuadrupedSmall(body) => match body.species {
quadruped_small::Species::Sheep => VoiceKind::Sheep,
quadruped_small::Species::Pig | quadruped_small::Species::Boar => VoiceKind::Pig,
@ -218,7 +230,7 @@ fn body_to_voice(body: &Body) -> Option<VoiceKind> {
| quadruped_medium::Species::Tiger
| quadruped_medium::Species::Lion
| quadruped_medium::Species::Frostfang
| quadruped_medium::Species::Snowleopard => VoiceKind::BigCat,
| quadruped_medium::Species::Snowleopard => VoiceKind::Lion,
quadruped_medium::Species::Wolf
| quadruped_medium::Species::Roshwalr
| quadruped_medium::Species::Tarasque
@ -231,17 +243,24 @@ fn body_to_voice(body: &Body) -> Option<VoiceKind> {
| quadruped_medium::Species::Yak
| quadruped_medium::Species::Moose
| quadruped_medium::Species::Dreadhorn => VoiceKind::Cow,
quadruped_medium::Species::Antelope => VoiceKind::Antelope,
_ => return None,
},
Body::BirdMedium(_) | Body::BirdLarge(_) => VoiceKind::Bird,
Body::BipedSmall(body) => match body.species {
biped_small::Species::Adlet => VoiceKind::Adlet,
_ => return None,
},
Body::BipedLarge(body) => match body.species {
biped_large::Species::Wendigo => VoiceKind::Wendigo,
biped_large::Species::Occultsaurok
| biped_large::Species::Mightysaurok
| biped_large::Species::Slysaurok => VoiceKind::Reptile,
| biped_large::Species::Slysaurok => VoiceKind::Saurok,
biped_large::Species::Mindflayer => VoiceKind::Mindflayer,
_ => VoiceKind::BipedLarge,
},
Body::Theropod(_) | Body::Dragon(_) => VoiceKind::Reptile,
Body::FishSmall(_) | Body::FishMedium(_) => VoiceKind::Marlin,
_ => return None,
})
}
@ -480,15 +499,15 @@ impl SfxMgr {
},
Outcome::Damage { pos, .. } => {
let sfx_trigger_item = triggers.get_key_value(&SfxEvent::Damage);
audio.emit_sfx(sfx_trigger_item, *pos, None, false);
audio.emit_sfx(sfx_trigger_item, *pos, Some(1.5), false);
},
Outcome::Block { pos, parry, .. } => {
if *parry {
let sfx_trigger_item = triggers.get_key_value(&SfxEvent::Parry);
audio.emit_sfx(sfx_trigger_item, *pos, Some(2.0), false);
audio.emit_sfx(sfx_trigger_item, *pos, Some(1.5), false);
} else {
let sfx_trigger_item = triggers.get_key_value(&SfxEvent::Block);
audio.emit_sfx(sfx_trigger_item, *pos, Some(2.0), false);
audio.emit_sfx(sfx_trigger_item, *pos, Some(1.5), false);
}
},
Outcome::PoiseChange { pos, state, .. } => match state {
@ -496,22 +515,22 @@ impl SfxMgr {
PoiseState::Interrupted => {
let sfx_trigger_item =
triggers.get_key_value(&SfxEvent::PoiseChange(PoiseState::Interrupted));
audio.emit_sfx(sfx_trigger_item, *pos, None, false);
audio.emit_sfx(sfx_trigger_item, *pos, Some(1.5), false);
},
PoiseState::Stunned => {
let sfx_trigger_item =
triggers.get_key_value(&SfxEvent::PoiseChange(PoiseState::Stunned));
audio.emit_sfx(sfx_trigger_item, *pos, None, false);
audio.emit_sfx(sfx_trigger_item, *pos, Some(1.5), false);
},
PoiseState::Dazed => {
let sfx_trigger_item =
triggers.get_key_value(&SfxEvent::PoiseChange(PoiseState::Dazed));
audio.emit_sfx(sfx_trigger_item, *pos, None, false);
audio.emit_sfx(sfx_trigger_item, *pos, Some(1.5), false);
},
PoiseState::KnockedDown => {
let sfx_trigger_item =
triggers.get_key_value(&SfxEvent::PoiseChange(PoiseState::KnockedDown));
audio.emit_sfx(sfx_trigger_item, *pos, None, false);
audio.emit_sfx(sfx_trigger_item, *pos, Some(1.5), false);
},
},
Outcome::Utterance { pos, kind, body } => {
@ -519,7 +538,7 @@ impl SfxMgr {
let sfx_trigger_item =
triggers.get_key_value(&SfxEvent::Utterance(*kind, voice));
if let Some(sfx_trigger_item) = sfx_trigger_item {
audio.emit_sfx(Some(sfx_trigger_item), *pos, Some(2.5), false);
audio.emit_sfx(Some(sfx_trigger_item), *pos, Some(1.5), false);
} else {
debug!(
"No utterance sound effect exists for ({:?}, {:?})",