implement specifying custom chat sounds per message with "sound" token
This commit is contained in:
parent
4b4be21ade
commit
39a74582fc
68
src/chat.rs
68
src/chat.rs
|
@ -23,6 +23,7 @@ pub const TOKEN_SCRIPT: &str = "script";
|
||||||
pub const TOKEN_SOUND: &str = "sound";
|
pub const TOKEN_SOUND: &str = "sound";
|
||||||
pub const TOKEN_GOTO_EXIT: &str = "EXIT";
|
pub const TOKEN_GOTO_EXIT: &str = "EXIT";
|
||||||
|
|
||||||
|
pub const DEFAULT_SOUND: &str = "chat";
|
||||||
pub const MAX_BRANCH_DEPTH: usize = 64;
|
pub const MAX_BRANCH_DEPTH: usize = 64;
|
||||||
|
|
||||||
pub const CHOICE_TIMER: f64 = 40.0 * settings::DEFAULT_CHAT_SPEED as f64;
|
pub const CHOICE_TIMER: f64 = 40.0 * settings::DEFAULT_CHAT_SPEED as f64;
|
||||||
|
@ -100,7 +101,7 @@ pub struct ChatScriptEvent(String);
|
||||||
pub enum ChatEvent {
|
pub enum ChatEvent {
|
||||||
DespawnAllChoices,
|
DespawnAllChoices,
|
||||||
DespawnAllChats,
|
DespawnAllChats,
|
||||||
SpawnMessage(String, hud::LogLevel),
|
SpawnMessage(String, hud::LogLevel, String),
|
||||||
SpawnChoice(String, usize, ChatPos),
|
SpawnChoice(String, usize, ChatPos),
|
||||||
RunScript(String),
|
RunScript(String),
|
||||||
Sleep(f64),
|
Sleep(f64),
|
||||||
|
@ -297,31 +298,60 @@ impl ChatDB {
|
||||||
let mut add_choices = true;
|
let mut add_choices = true;
|
||||||
match current_item {
|
match current_item {
|
||||||
Some(Value::String(message)) => {
|
Some(Value::String(message)) => {
|
||||||
event.send(ChatEvent::SpawnMessage(message.to_string(), hud::LogLevel::Chat));
|
event.send(ChatEvent::SpawnMessage(message.to_string(),
|
||||||
|
hud::LogLevel::Chat, DEFAULT_SOUND.to_string()));
|
||||||
}
|
}
|
||||||
Some(Value::Mapping(map)) => {
|
Some(Value::Mapping(map)) => {
|
||||||
if let Some(_) = self.search_choice(Some(&Value::Mapping(map.clone()))) {
|
if let Some(_) = self.search_choice(Some(&Value::Mapping(map.clone()))) {
|
||||||
add_choices = false;
|
add_choices = false;
|
||||||
}
|
}
|
||||||
for (key, value) in map {
|
let mut sound = "chat".to_string();
|
||||||
|
|
||||||
|
// We're going through the list of keys/values multiple times
|
||||||
|
// to ensure that dependencies for certain commands are available
|
||||||
|
|
||||||
|
// First pass
|
||||||
|
for (key, value) in &map {
|
||||||
|
let key = key.as_str();
|
||||||
|
match (key, value) {
|
||||||
|
(Some(TOKEN_SET), _) => {}
|
||||||
|
(Some(TOKEN_IF), _) => {}
|
||||||
|
(Some(TOKEN_SOUND), Value::String(sound_name)) => {
|
||||||
|
sound = sound_name.clone();
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Second pass
|
||||||
|
for (key, value) in &map {
|
||||||
let key = key.as_str();
|
let key = key.as_str();
|
||||||
match (key, value) {
|
match (key, value) {
|
||||||
(Some(TOKEN_CHAT), _) => {}
|
|
||||||
(Some(TOKEN_LABEL), _) => {}
|
|
||||||
(Some(TOKEN_MSG), Value::String(message)) => {
|
(Some(TOKEN_MSG), Value::String(message)) => {
|
||||||
event.send(ChatEvent::SpawnMessage(
|
event.send(ChatEvent::SpawnMessage(
|
||||||
message.to_string(), hud::LogLevel::Chat));
|
message.to_string(), hud::LogLevel::Chat, sound.clone()));
|
||||||
}
|
}
|
||||||
(Some(TOKEN_SYSTEM), Value::String(message)) => {
|
(Some(TOKEN_SYSTEM), Value::String(message)) => {
|
||||||
event.send(ChatEvent::SpawnMessage(
|
event.send(ChatEvent::SpawnMessage(
|
||||||
message.to_string(), hud::LogLevel::Info));
|
message.to_string(), hud::LogLevel::Info, sound.clone()));
|
||||||
}
|
}
|
||||||
(Some(TOKEN_WARN), Value::String(message)) => {
|
(Some(TOKEN_WARN), Value::String(message)) => {
|
||||||
event.send(ChatEvent::SpawnMessage(
|
event.send(ChatEvent::SpawnMessage(
|
||||||
message.to_string(), hud::LogLevel::Warning));
|
message.to_string(), hud::LogLevel::Warning, sound.clone()));
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Third pass
|
||||||
|
for (key, value) in &map {
|
||||||
|
let key = key.as_str();
|
||||||
|
match (key, value) {
|
||||||
|
(Some(TOKEN_SLEEP), Value::Number(time)) => {
|
||||||
|
if let Some(time_f64) = time.as_f64() {
|
||||||
|
event.send(ChatEvent::Sleep(time_f64));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
(Some(TOKEN_SET), _) => {}
|
|
||||||
(Some(TOKEN_IF), _) => {}
|
|
||||||
(Some(TOKEN_GOTO), Value::String(label)) => {
|
(Some(TOKEN_GOTO), Value::String(label)) => {
|
||||||
match self.search_label(chat.id, &label) {
|
match self.search_label(chat.id, &label) {
|
||||||
Some(pos) => {
|
Some(pos) => {
|
||||||
|
@ -333,22 +363,16 @@ impl ChatDB {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Some(TOKEN_SCRIPT), Value::String(script)) => {
|
(Some(TOKEN_SCRIPT), Value::String(script)) => {
|
||||||
event.send(ChatEvent::RunScript(script));
|
event.send(ChatEvent::RunScript(script.clone()));
|
||||||
}
|
|
||||||
(Some(TOKEN_SLEEP), Value::Number(time)) => {
|
|
||||||
if let Some(time_f64) = time.as_f64() {
|
|
||||||
event.send(ChatEvent::Sleep(time_f64));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
}
|
}
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
if chat.position.len() == 0 {
|
if chat.position.len() == 0 {
|
||||||
event.send(ChatEvent::SpawnMessage(
|
event.send(ChatEvent::SpawnMessage("Disconnected.".to_string(),
|
||||||
"Disconnected.".to_string(), hud::LogLevel::Info));
|
hud::LogLevel::Info, DEFAULT_SOUND.to_string()));
|
||||||
event.send(ChatEvent::DespawnAllChats);
|
event.send(ChatEvent::DespawnAllChats);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -471,7 +495,7 @@ pub fn handle_chat_events(
|
||||||
ChatEvent::DespawnAllChats => {
|
ChatEvent::DespawnAllChats => {
|
||||||
commands.entity(chat_entity).despawn();
|
commands.entity(chat_entity).despawn();
|
||||||
}
|
}
|
||||||
ChatEvent::SpawnMessage(message, level) => {
|
ChatEvent::SpawnMessage(message, level, sound) => {
|
||||||
match level {
|
match level {
|
||||||
hud::LogLevel::Chat => {
|
hud::LogLevel::Chat => {
|
||||||
log.chat(message.into(), chat.talker.name.clone().unwrap_or("".to_string()));
|
log.chat(message.into(), chat.talker.name.clone().unwrap_or("".to_string()));
|
||||||
|
@ -485,7 +509,7 @@ pub fn handle_chat_events(
|
||||||
}
|
}
|
||||||
chat.timer = now + ((message.len() as f32).max(CHAT_SPEED_MIN_LEN) * TALKER_SPEED_FACTOR * chat.talker.talking_speed / settings.chat_speed) as f64;
|
chat.timer = now + ((message.len() as f32).max(CHAT_SPEED_MIN_LEN) * TALKER_SPEED_FACTOR * chat.talker.talking_speed / settings.chat_speed) as f64;
|
||||||
|
|
||||||
let sfx = audio::str2sfx("chat");
|
let sfx = audio::str2sfx(sound);
|
||||||
ew_sfx.send(audio::PlaySfxEvent(sfx));
|
ew_sfx.send(audio::PlaySfxEvent(sfx));
|
||||||
}
|
}
|
||||||
ChatEvent::SpawnChoice(replytext, key, goto) => {
|
ChatEvent::SpawnChoice(replytext, key, goto) => {
|
||||||
|
|
Loading…
Reference in a new issue