use std::{error::Error, time::Instant}; use bevy::prelude::*; use bevy_tts::Tts; use derive_more::{Deref, DerefMut}; use crate::error::error_handler; #[derive(Component, Clone, Debug, Default, Deref, DerefMut)] pub struct Log(pub Vec); impl Log { pub fn push>(&mut self, message: S) { self.0.push(LogEntry { time: Instant::now(), message: message.into(), }) } } #[derive(Component, Clone, Debug)] pub struct LogEntry { pub time: Instant, pub message: String, } fn setup(mut commands: Commands) { commands.spawn().insert(Log::default()); } fn read_log( mut tts: ResMut, mut position: Local, log: Query<&Log, Changed>, ) -> Result<(), Box> { for log in log.iter() { for (index, entry) in log.iter().enumerate() { if index >= *position { tts.speak(entry.message.clone(), false)?; *position = index + 1; } } } Ok(()) } pub struct LogPlugin; impl Plugin for LogPlugin { fn build(&self, app: &mut App) { app.add_startup_system(setup) .add_system_to_stage(CoreStage::PostUpdate, read_log.chain(error_handler)); } }