implement "include" token for chats
This commit is contained in:
parent
43f67877a2
commit
01453e46f8
56
src/chat.rs
56
src/chat.rs
|
@ -1,9 +1,10 @@
|
||||||
|
use crate::{actor, audio, hud, settings, world, effects};
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy::math::DVec3;
|
use bevy::math::DVec3;
|
||||||
use bevy_xpbd_3d::prelude::*;
|
use bevy_xpbd_3d::prelude::*;
|
||||||
use serde_yaml::Value;
|
use serde_yaml::Value;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use crate::{actor, audio, hud, settings, world, effects};
|
use std::collections::HashMap;
|
||||||
|
|
||||||
pub const CHATS: &[&str] = &[
|
pub const CHATS: &[&str] = &[
|
||||||
include_str!("chats/serenity.yaml"),
|
include_str!("chats/serenity.yaml"),
|
||||||
|
@ -22,6 +23,8 @@ pub const TOKEN_LABEL: &str = "label";
|
||||||
pub const TOKEN_SCRIPT: &str = "script";
|
pub const TOKEN_SCRIPT: &str = "script";
|
||||||
pub const TOKEN_SOUND: &str = "sound";
|
pub const TOKEN_SOUND: &str = "sound";
|
||||||
pub const TOKEN_NOWAIT: &str = "nowait";
|
pub const TOKEN_NOWAIT: &str = "nowait";
|
||||||
|
|
||||||
|
pub const TOKEN_INCLUDE: &str = "include";
|
||||||
pub const TOKEN_GOTO_EXIT: &str = "EXIT";
|
pub const TOKEN_GOTO_EXIT: &str = "EXIT";
|
||||||
|
|
||||||
pub const DEFAULT_SOUND: &str = "chat";
|
pub const DEFAULT_SOUND: &str = "chat";
|
||||||
|
@ -142,6 +145,56 @@ impl ChatDB {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn preprocess_includes(&mut self) {
|
||||||
|
let mut include_db: HashMap<String, Vec<Value>> = HashMap::new();
|
||||||
|
for sequence in &self.0 {
|
||||||
|
if let Some(vector) = sequence.as_sequence() {
|
||||||
|
if let Some(first_item) = vector.get(0) {
|
||||||
|
if let Some(map) = first_item.as_mapping() {
|
||||||
|
for (key, value) in map {
|
||||||
|
if let (Some(key), Some(value)) = (key.as_str(), value.as_str()) {
|
||||||
|
if key == TOKEN_CHAT {
|
||||||
|
include_db.insert(value.to_string(), vector.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for mut sequence in self.0.iter_mut() {
|
||||||
|
ChatDB::preprocess_includes_recursively(&mut sequence, &include_db);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn preprocess_includes_recursively(sequence: &mut Value, include_db: &HashMap<String, Vec<Value>>) {
|
||||||
|
let mut changes: Vec<(usize, String)> = Vec::new();
|
||||||
|
if let Some(vector) = sequence.as_sequence_mut() {
|
||||||
|
for (index, item) in vector.iter_mut().enumerate() {
|
||||||
|
match item {
|
||||||
|
Value::Mapping(map) => {
|
||||||
|
for (key, value) in map.iter_mut() {
|
||||||
|
if let (Some(key), Some(value)) = (key.as_str(), value.as_str()) {
|
||||||
|
if key == TOKEN_INCLUDE {
|
||||||
|
changes.push((index, value.to_string()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if value.is_sequence() {
|
||||||
|
ChatDB::preprocess_includes_recursively(value, include_db);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (index, label) in changes {
|
||||||
|
vector.remove(index);
|
||||||
|
vector.splice(index..index, include_db[&label].iter().cloned());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_chat_by_id(&self, id: &String) -> Result<usize, String> {
|
pub fn get_chat_by_id(&self, id: &String) -> Result<usize, String> {
|
||||||
let mut found: Option<usize> = None;
|
let mut found: Option<usize> = None;
|
||||||
for (index, object_yaml) in self.0.iter().enumerate() {
|
for (index, object_yaml) in self.0.iter().enumerate() {
|
||||||
|
@ -483,6 +536,7 @@ pub fn load_chats(mut chatdb: ResMut<ChatDB>) {
|
||||||
error!("Could not load chat definitions. Validate files in `src/chats/` path.");
|
error!("Could not load chat definitions. Validate files in `src/chats/` path.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
chatdb.preprocess_includes();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_new_conversations(
|
pub fn handle_new_conversations(
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
- "Ready for a trip? Available bus stops: Oscillation Station, Metis Prime Station"
|
- "Ready for a trip? Available bus stops: Oscillation Station, Metis Prime Station"
|
||||||
- set: busstop serenity
|
- set: busstop serenity
|
||||||
- label: startransbusstop
|
- label: startransbusstop
|
||||||
- goto: EXIT
|
- include: BusStops
|
||||||
- label: interesting
|
- label: interesting
|
||||||
- Serenity Station is famous for the best pizza across the Jovian Rings.
|
- Serenity Station is famous for the best pizza across the Jovian Rings.
|
||||||
- Look for the neon sign of the pizzeria nearby.
|
- Look for the neon sign of the pizzeria nearby.
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
- "Ready for a trip? Available bus stops: Oscillation Station, Serenity Station"
|
- "Ready for a trip? Available bus stops: Oscillation Station, Serenity Station"
|
||||||
- set: busstop metis
|
- set: busstop metis
|
||||||
- label: startransbusstop
|
- label: startransbusstop
|
||||||
- goto: EXIT
|
- include: BusStops
|
||||||
- label: interesting
|
- label: interesting
|
||||||
- This area is an industrial paradise for asteroid miners.
|
- This area is an industrial paradise for asteroid miners.
|
||||||
- Though it has been recently abandoned due to the excessive particle radiation.
|
- Though it has been recently abandoned due to the excessive particle radiation.
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
- "Ready for a trip? Available bus stops: Serenity Station, Metis Prime Station"
|
- "Ready for a trip? Available bus stops: Serenity Station, Metis Prime Station"
|
||||||
- set: busstop oscillation
|
- set: busstop oscillation
|
||||||
- label: startransbusstop
|
- label: startransbusstop
|
||||||
- goto: EXIT
|
- include: BusStops
|
||||||
- label: interesting
|
- label: interesting
|
||||||
- The main attraction around here is the gorgeous view onto Jupiter from far up ahead.
|
- The main attraction around here is the gorgeous view onto Jupiter from far up ahead.
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
- addon: startransbusstop
|
- chat: BusStops
|
||||||
- Bus stop?! How does this work?:
|
- Bus stop?! How does this work?:
|
||||||
- StarTrans Cargo Services is the most convenient way to travel the vast distances of space.
|
- StarTrans Cargo Services is the most convenient way to travel the vast distances of space.
|
||||||
- Just activate your suit's built-in cryostasis. A StarTrans carrier will pick you up and you will wake up at your destination in the blink of an eye.
|
- Just activate your suit's built-in cryostasis. A StarTrans carrier will pick you up and you will wake up at your destination in the blink of an eye.
|
||||||
|
@ -56,7 +56,7 @@
|
||||||
- goto: startransbusstop
|
- goto: startransbusstop
|
||||||
- Can I take a spacecraft with me?:
|
- Can I take a spacecraft with me?:
|
||||||
- Absolutely.
|
- Absolutely.
|
||||||
- goto startransbusstop
|
- goto: startransbusstop
|
||||||
- if: busstop != "oscillation"
|
- if: busstop != "oscillation"
|
||||||
Take me to Oscillation Station, please.:
|
Take me to Oscillation Station, please.:
|
||||||
- StarTrans wishes you a pleasant journey.
|
- StarTrans wishes you a pleasant journey.
|
||||||
|
@ -85,3 +85,4 @@
|
||||||
- goto: interesting
|
- goto: interesting
|
||||||
- No, thank you.:
|
- No, thank you.:
|
||||||
- Feel free to come back any time.
|
- Feel free to come back any time.
|
||||||
|
- goto: EXIT
|
||||||
|
|
Loading…
Reference in a new issue