implement "include" token for chats

This commit is contained in:
yuni 2024-04-14 03:21:48 +02:00
parent 43f67877a2
commit 01453e46f8
2 changed files with 61 additions and 6 deletions

View file

@ -1,9 +1,10 @@
use crate::{actor, audio, hud, settings, world, effects};
use bevy::prelude::*;
use bevy::math::DVec3;
use bevy_xpbd_3d::prelude::*;
use serde_yaml::Value;
use serde::Deserialize;
use crate::{actor, audio, hud, settings, world, effects};
use std::collections::HashMap;
pub const CHATS: &[&str] = &[
include_str!("chats/serenity.yaml"),
@ -22,6 +23,8 @@ pub const TOKEN_LABEL: &str = "label";
pub const TOKEN_SCRIPT: &str = "script";
pub const TOKEN_SOUND: &str = "sound";
pub const TOKEN_NOWAIT: &str = "nowait";
pub const TOKEN_INCLUDE: &str = "include";
pub const TOKEN_GOTO_EXIT: &str = "EXIT";
pub const DEFAULT_SOUND: &str = "chat";
@ -142,6 +145,56 @@ impl ChatDB {
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> {
let mut found: Option<usize> = None;
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.");
}
}
chatdb.preprocess_includes();
}
pub fn handle_new_conversations(

View file

@ -11,7 +11,7 @@
- "Ready for a trip? Available bus stops: Oscillation Station, Metis Prime Station"
- set: busstop serenity
- label: startransbusstop
- goto: EXIT
- include: BusStops
- label: interesting
- Serenity Station is famous for the best pizza across the Jovian Rings.
- Look for the neon sign of the pizzeria nearby.
@ -25,7 +25,7 @@
- "Ready for a trip? Available bus stops: Oscillation Station, Serenity Station"
- set: busstop metis
- label: startransbusstop
- goto: EXIT
- include: BusStops
- label: interesting
- This area is an industrial paradise for asteroid miners.
- 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"
- set: busstop oscillation
- label: startransbusstop
- goto: EXIT
- include: BusStops
- label: interesting
- 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?:
- 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.
@ -56,7 +56,7 @@
- goto: startransbusstop
- Can I take a spacecraft with me?:
- Absolutely.
- goto startransbusstop
- goto: startransbusstop
- if: busstop != "oscillation"
Take me to Oscillation Station, please.:
- StarTrans wishes you a pleasant journey.
@ -85,3 +85,4 @@
- goto: interesting
- No, thank you.:
- Feel free to come back any time.
- goto: EXIT