diff --git a/renrs-gui/src/lib.rs b/renrs-gui/src/lib.rs index 19c370a..5b09f76 100644 --- a/renrs-gui/src/lib.rs +++ b/renrs-gui/src/lib.rs @@ -3,7 +3,7 @@ use std::thread; use std::time::Duration; use eframe::egui; -use renrs::{State, Command}; +use renrs::State; use sfml::{ graphics::{Color, RenderTarget, RenderWindow, RectangleShape, Transformable}, @@ -41,7 +41,7 @@ impl App { } fn next(&mut self) { - if let Some(Command::Say { name, text }) = self.state.next_command() { + if let Some(renrs::Event::Say { name, text }) = self.state.next() { self.text = match name { Some(name) => format!("{name}: {text}"), None => text, diff --git a/renrs/src/lib.rs b/renrs/src/lib.rs index c347d82..9b84807 100644 --- a/renrs/src/lib.rs +++ b/renrs/src/lib.rs @@ -31,13 +31,28 @@ use Token::*; // Parsed script commands #[derive(Debug)] -pub enum Command { +#[allow(dead_code)] +enum Command { Say { name: Option, text: String }, Eat { food: String, politely: bool }, } use Command::*; +impl Command { + fn is_blocking(&self) -> bool { + match self { + Say { .. } => true, + _ => false, + } + } +} + +#[derive(Debug)] +pub enum Event { + Say { name: Option, text: String }, +} + // Tokenize raw script string fn tokenize(script: &str) -> Vec> { let file = RpyParser::parse(Rule::file, script) @@ -159,7 +174,19 @@ impl State { } } - pub fn next_command(&mut self) -> Option { + pub fn next(&mut self) -> Option { + while let Some(command) = self.next_command() { + if command.is_blocking() { + return Some(match command { + Say { name, text } => Event::Say { name, text }, + _ => unimplemented!(), + }) + } + } + None + } + + fn next_command(&mut self) -> Option { if self.command_queue.len() == 0 { None } else {