Added npc hurt sfx

This commit is contained in:
DaforLynx 2021-06-17 05:49:09 +00:00 committed by Imbris
parent 0a282c27c6
commit fd2094ca3d
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 ({:?}, {:?})",