implement showing all first-level messages of a chat
This commit is contained in:
parent
b41891ba3b
commit
eff6306a93
50
src/chat.rs
50
src/chat.rs
|
@ -9,14 +9,17 @@ pub const CHATS: &[&str] = &[
|
|||
];
|
||||
|
||||
pub const TOKEN_CHAT: &str = "chat";
|
||||
pub const TALKER_SPEED_FACTOR: f32 = 1.0 / 17.0;
|
||||
pub const CHAT_SPEED_MIN_LEN: f32 = 40.0;
|
||||
|
||||
pub struct ChatPlugin;
|
||||
impl Plugin for ChatPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.add_systems(Startup, load_chats);
|
||||
app.add_systems(Update, (
|
||||
handle_new_conversations,
|
||||
handle_chat_events.after(handle_new_conversations),
|
||||
handle_new_conversations.before(handle_chat_events),
|
||||
handle_chat_events,
|
||||
handle_chat_timer.before(handle_chat_events),
|
||||
));
|
||||
app.add_event::<StartConversationEvent>();
|
||||
app.add_event::<ChatEvent>();
|
||||
|
@ -29,6 +32,7 @@ pub struct Chat {
|
|||
pub id: usize,
|
||||
pub position: usize,
|
||||
pub timer: f64,
|
||||
pub talker: Talker,
|
||||
}
|
||||
|
||||
#[derive(Component)]
|
||||
|
@ -66,9 +70,17 @@ impl ChatDB {
|
|||
|
||||
pub fn advance_chat(&self, chat: &mut Chat, event: &mut EventWriter<ChatEvent>) {
|
||||
event.send(ChatEvent::DespawnAllChoices);
|
||||
let conv = &self.0[chat.id];
|
||||
let conv = &self.0[chat.id].as_vec();
|
||||
if conv.is_none() {
|
||||
return;
|
||||
}
|
||||
let conv = conv.unwrap();
|
||||
chat.position += 1;
|
||||
dbg!(chat.position);
|
||||
if chat.position >= conv.len() {
|
||||
event.send(ChatEvent::DisplayMessage("Disconnected.".to_string()));
|
||||
event.send(ChatEvent::DespawnAllChats);
|
||||
return;
|
||||
}
|
||||
if let Some(message) = conv[chat.position].as_str() {
|
||||
event.send(ChatEvent::DisplayMessage(message.to_string()));
|
||||
}
|
||||
|
@ -81,6 +93,7 @@ pub struct Talker {
|
|||
pub conv_id: String,
|
||||
pub name: Option<String>,
|
||||
pub pronoun: Option<String>,
|
||||
pub talking_speed: f32,
|
||||
}
|
||||
|
||||
#[derive(Event)]
|
||||
|
@ -91,6 +104,7 @@ pub struct StartConversationEvent {
|
|||
#[derive(Event)]
|
||||
pub enum ChatEvent {
|
||||
DespawnAllChoices,
|
||||
DespawnAllChats,
|
||||
DisplayMessage(String),
|
||||
//SpawnChoice(String),
|
||||
//Script(String, String, String),
|
||||
|
@ -125,6 +139,7 @@ pub fn handle_new_conversations(
|
|||
id: chat_id,
|
||||
position: 0,
|
||||
timer: time.elapsed_seconds_f64(),
|
||||
talker: event.talker.clone(),
|
||||
};
|
||||
chatdb.advance_chat(&mut chat, &mut ew_chatevent);
|
||||
commands.spawn((
|
||||
|
@ -139,21 +154,48 @@ pub fn handle_new_conversations(
|
|||
}
|
||||
}
|
||||
|
||||
pub fn handle_chat_timer(
|
||||
time: Res<Time>,
|
||||
chatdb: Res<ChatDB>,
|
||||
mut q_chats: Query<&mut Chat>,
|
||||
mut ew_chatevent: EventWriter<ChatEvent>,
|
||||
) {
|
||||
let now = time.elapsed_seconds_f64();
|
||||
for mut chat in &mut q_chats {
|
||||
if now >= chat.timer {
|
||||
chatdb.advance_chat(&mut chat, &mut ew_chatevent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn handle_chat_events(
|
||||
mut commands: Commands,
|
||||
mut er_chatevent: EventReader<ChatEvent>,
|
||||
mut log: ResMut<hud::Log>,
|
||||
q_choices: Query<Entity, With<Choice>>,
|
||||
mut q_chats: Query<(Entity, &mut Chat)>,
|
||||
time: Res<Time>,
|
||||
) {
|
||||
for event in er_chatevent.read() {
|
||||
let now = time.elapsed_seconds_f64();
|
||||
let chat_maybe = q_chats.get_single_mut();
|
||||
if chat_maybe.is_err() {
|
||||
return;
|
||||
}
|
||||
let (chat_entity, mut chat) = chat_maybe.unwrap();
|
||||
|
||||
match event {
|
||||
ChatEvent::DespawnAllChoices => {
|
||||
for entity in &q_choices {
|
||||
commands.entity(entity).despawn();
|
||||
}
|
||||
}
|
||||
ChatEvent::DespawnAllChats => {
|
||||
commands.entity(chat_entity).despawn();
|
||||
}
|
||||
ChatEvent::DisplayMessage(message) => {
|
||||
log.chat(message.into(), "Someone".to_string());
|
||||
chat.timer = now + ((message.len() as f32).max(CHAT_SPEED_MIN_LEN) * TALKER_SPEED_FACTOR * chat.talker.talking_speed) as f64;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
|
||||
|
||||
- chat: Icarus
|
||||
- TEST MESSAGE
|
||||
- if talkcount > 0:
|
||||
- "Oh, hi again! How are you?"
|
||||
- goto: howru
|
||||
|
|
|
@ -695,6 +695,7 @@ fn spawn_entities(
|
|||
conv_id: state.chat.clone(),
|
||||
name: state.name.clone(),
|
||||
pronoun: Some(state.pronoun.clone()),
|
||||
talking_speed: 1.0,
|
||||
});
|
||||
}
|
||||
if state.is_vehicle {
|
||||
|
|
Loading…
Reference in a new issue