implement looking up chat id
This commit is contained in:
parent
253604e9aa
commit
a572959df3
74
src/chat.rs
74
src/chat.rs
|
@ -1,45 +1,101 @@
|
||||||
extern crate yaml_rust;
|
extern crate yaml_rust;
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
use yaml_rust::{Yaml, YamlLoader};
|
||||||
|
use crate::{audio};
|
||||||
|
|
||||||
pub const CHATS: &[&str] = &[
|
pub const CHATS: &[&str] = &[
|
||||||
include_str!("chats/serenity.yaml"),
|
include_str!("chats/serenity.yaml"),
|
||||||
include_str!("chats/startrans.yaml"),
|
include_str!("chats/startrans.yaml"),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
pub const TOKEN_CHAT: &str = "chat";
|
||||||
|
|
||||||
pub struct ChatPlugin;
|
pub struct ChatPlugin;
|
||||||
impl Plugin for ChatPlugin {
|
impl Plugin for ChatPlugin {
|
||||||
fn build(&self, app: &mut App) {
|
fn build(&self, app: &mut App) {
|
||||||
app.add_systems(Startup, load_chats);
|
app.add_systems(Startup, load_chats);
|
||||||
|
app.add_systems(Update, (
|
||||||
|
handle_new_conversations,
|
||||||
|
));
|
||||||
app.add_event::<StartConversationEvent>();
|
app.add_event::<StartConversationEvent>();
|
||||||
app.insert_resource(ChatDB(Vec::new()));
|
app.insert_resource(ChatDB(Vec::new()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Resource)]
|
||||||
|
pub struct ChatDB(Vec<Yaml>);
|
||||||
|
impl ChatDB {
|
||||||
|
pub fn get_chat_by_id(&self, id: &String) -> Result<u32, String> {
|
||||||
|
let mut found: Option<u32> = None;
|
||||||
|
for (index, object_yaml) in self.0.iter().enumerate() {
|
||||||
|
if let Some(object_vec) = object_yaml.as_vec() {
|
||||||
|
if object_vec.len() == 0 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let first_item = &object_vec[0];
|
||||||
|
if let Some(hash) = first_item.as_hash() {
|
||||||
|
if let Some(chat_id_yaml) = hash.get(&Yaml::String(TOKEN_CHAT.to_string())) {
|
||||||
|
if let Some(chat_id) = chat_id_yaml.as_str() {
|
||||||
|
if chat_id != id {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if found.is_some() {
|
||||||
|
return Err("Found multiple chats with the same id!".to_string());
|
||||||
|
}
|
||||||
|
found = Some(index as u32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
warn!("Non-list YAML object found while processing chat specs");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(result) = found {
|
||||||
|
return Ok(result);
|
||||||
|
}
|
||||||
|
return Err(format!("No chat with the conversation ID `{id}` was found."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Talker {
|
pub struct Talker {
|
||||||
pub pronoun: String,
|
|
||||||
pub conv_id: String,
|
pub conv_id: String,
|
||||||
|
pub name: Option<String>,
|
||||||
|
pub pronoun: Option<String>,
|
||||||
}
|
}
|
||||||
impl Default for Talker { fn default() -> Self { Self {
|
|
||||||
pronoun: "they/them".to_string(),
|
|
||||||
conv_id: "undefined".to_string(),
|
|
||||||
}}}
|
|
||||||
|
|
||||||
#[derive(Event)]
|
#[derive(Event)]
|
||||||
pub struct StartConversationEvent {
|
pub struct StartConversationEvent {
|
||||||
pub talker: Talker,
|
pub talker: Talker,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Resource)]
|
|
||||||
pub struct ChatDB(Vec<yaml_rust::Yaml>);
|
|
||||||
|
|
||||||
pub fn load_chats(mut chatdb: ResMut<ChatDB>) {
|
pub fn load_chats(mut chatdb: ResMut<ChatDB>) {
|
||||||
for chat_yaml in CHATS {
|
for chat_yaml in CHATS {
|
||||||
if let Ok(mut yaml_data) = yaml_rust::YamlLoader::load_from_str(chat_yaml) {
|
if let Ok(mut yaml_data) = YamlLoader::load_from_str(chat_yaml) {
|
||||||
chatdb.0.append(&mut yaml_data);
|
chatdb.0.append(&mut yaml_data);
|
||||||
} else {
|
} else {
|
||||||
error!("Could not load chat definitions. Validate files in `src/chats/` path.");
|
error!("Could not load chat definitions. Validate files in `src/chats/` path.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn handle_new_conversations(
|
||||||
|
//mut commands: Commands,
|
||||||
|
mut er_conv: EventReader<StartConversationEvent>,
|
||||||
|
mut ew_sfx: EventWriter<audio::PlaySfxEvent>,
|
||||||
|
chatdb: Res<ChatDB>,
|
||||||
|
//time: Res<Time>,
|
||||||
|
) {
|
||||||
|
for event in er_conv.read() {
|
||||||
|
match (*chatdb).get_chat_by_id(&event.talker.conv_id) {
|
||||||
|
Ok(chat_id) => {
|
||||||
|
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::Ping));
|
||||||
|
dbg!(chat_id);
|
||||||
|
}
|
||||||
|
Err(error) => {
|
||||||
|
error!("Error while looking for chat ID: {error}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -9,21 +9,13 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
- chat: ClippyPizza
|
- chat: SubduedClippy
|
||||||
- At your service!
|
- At your service!
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
- chat: Rudy
|
|
||||||
- system: "Error: No response"
|
|
||||||
- system: Lifeform in cryostasis detected
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
- chat: Icarus
|
- chat: Icarus
|
||||||
- if talkcount > 0:
|
- if talkcount > 0:
|
||||||
- "Oh, hi again! How are you?"
|
- "Oh, hi again! How are you?"
|
||||||
|
@ -130,7 +122,7 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
- chat: SpacePizza
|
- chat: SpacePizzaChef
|
||||||
- Welcome to Space Pizza™, best pizza around the rings!
|
- Welcome to Space Pizza™, best pizza around the rings!
|
||||||
- Great to see a customer, we don't get many lately
|
- Great to see a customer, we don't get many lately
|
||||||
- Would you like to order today's special?
|
- Would you like to order today's special?
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
- chat: NPCinCryoStasis
|
||||||
|
- system: "Error: No response"
|
||||||
|
- system: Lifeform in cryostasis detected
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
- chat: ClippyTransSerenity
|
- chat: ClippyTransSerenity
|
||||||
- Welcome at StarTrans Cargo Services! You have reached Serenity Station.
|
- Welcome at StarTrans Cargo Services! You have reached Serenity Station.
|
||||||
- "Ready for a trip? Available bus stops: Oscillation Station, Metis Prime Station"
|
- "Ready for a trip? Available bus stops: Oscillation Station, Metis Prime Station"
|
||||||
|
|
|
@ -693,7 +693,8 @@ fn spawn_entities(
|
||||||
if !state.chat.is_empty() {
|
if !state.chat.is_empty() {
|
||||||
actor.insert(chat::Talker {
|
actor.insert(chat::Talker {
|
||||||
conv_id: state.chat.clone(),
|
conv_id: state.chat.clone(),
|
||||||
..default()
|
name: state.name.clone(),
|
||||||
|
pronoun: Some(state.pronoun.clone()),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if state.is_vehicle {
|
if state.is_vehicle {
|
||||||
|
|
16
src/defs.txt
16
src/defs.txt
|
@ -179,12 +179,12 @@ actor -3300 10 0 pizzeria
|
||||||
thrust 15 6 3 400 0.5
|
thrust 15 6 3 400 0.5
|
||||||
rotationy -0.5
|
rotationy -0.5
|
||||||
scale 3
|
scale 3
|
||||||
chatid pizzaclippy
|
chatid SubduedClippy
|
||||||
|
|
||||||
actor -35 0 0 suit
|
actor -35 0 0 suit
|
||||||
relativeto pizzeria
|
relativeto pizzeria
|
||||||
name "Space Pizza™"
|
name "Space Pizza™"
|
||||||
chatid pizzeria
|
chatid SpacePizzaChef
|
||||||
armodel suit_ar_chefhat
|
armodel suit_ar_chefhat
|
||||||
alive yes
|
alive yes
|
||||||
scale 2
|
scale 2
|
||||||
|
@ -199,7 +199,7 @@ actor -3300 10 0 pizzeria
|
||||||
actor 60 -15 -40 suit
|
actor 60 -15 -40 suit
|
||||||
relativeto player
|
relativeto player
|
||||||
name Icarus
|
name Icarus
|
||||||
chatid hi_icarus
|
chatid Icarus
|
||||||
alive yes
|
alive yes
|
||||||
scale 2
|
scale 2
|
||||||
collider capsule 1 0.5
|
collider capsule 1 0.5
|
||||||
|
@ -215,7 +215,7 @@ actor -300 0 40 suit
|
||||||
relativeto player
|
relativeto player
|
||||||
id drifter
|
id drifter
|
||||||
name "Drifter"
|
name "Drifter"
|
||||||
chatid drifter
|
chatid Drifter
|
||||||
oxygen 0.08
|
oxygen 0.08
|
||||||
scale 2
|
scale 2
|
||||||
collider capsule 1 0.5
|
collider capsule 1 0.5
|
||||||
|
@ -238,7 +238,7 @@ actor 100 -18000 2000 "orb_busstop"
|
||||||
thrust 15 6 3 400 0.5
|
thrust 15 6 3 400 0.5
|
||||||
rotationy -0.5
|
rotationy -0.5
|
||||||
scale 3
|
scale 3
|
||||||
chatid "busstopclippy"
|
chatid ClippyTransSerenity
|
||||||
actor 40 10 40 "orb_busstop"
|
actor 40 10 40 "orb_busstop"
|
||||||
name "Light Orb"
|
name "Light Orb"
|
||||||
relativeto busstopclippy
|
relativeto busstopclippy
|
||||||
|
@ -263,7 +263,7 @@ actor 100 -18000 2000 "orb_busstop"
|
||||||
thrust 1.2 1 1 400 1.5
|
thrust 1.2 1 1 400 1.5
|
||||||
scale 2
|
scale 2
|
||||||
collider capsule 1 0.5
|
collider capsule 1 0.5
|
||||||
chatid "busstop1clippynpc1"
|
chatid NPCinCryoStasis
|
||||||
|
|
||||||
actor 147002e3 165001e3 336e6 "orb_busstop"
|
actor 147002e3 165001e3 336e6 "orb_busstop"
|
||||||
relativeto jupiter
|
relativeto jupiter
|
||||||
|
@ -283,7 +283,7 @@ actor 147002e3 165001e3 336e6 "orb_busstop"
|
||||||
thrust 15 6 3 400 0.5
|
thrust 15 6 3 400 0.5
|
||||||
rotationy -0.5
|
rotationy -0.5
|
||||||
scale 3
|
scale 3
|
||||||
chatid "busstopclippy"
|
chatid ClippyTransOscillation
|
||||||
actor 40 10 40 "orb_busstop"
|
actor 40 10 40 "orb_busstop"
|
||||||
name "Light Orb"
|
name "Light Orb"
|
||||||
relativeto busstopclippy2
|
relativeto busstopclippy2
|
||||||
|
@ -319,7 +319,7 @@ actor 27643e3 -44e3 -124434e3 "orb_busstop"
|
||||||
thrust 15 6 3 400 0.5
|
thrust 15 6 3 400 0.5
|
||||||
rotationy -0.5
|
rotationy -0.5
|
||||||
scale 3
|
scale 3
|
||||||
chatid "busstopclippy"
|
chatid ClippyTransMetis
|
||||||
actor 40 10 40 "orb_busstop"
|
actor 40 10 40 "orb_busstop"
|
||||||
name "Light Orb"
|
name "Light Orb"
|
||||||
relativeto busstopclippy3
|
relativeto busstopclippy3
|
||||||
|
|
Loading…
Reference in a new issue