use std::time::Duration; use bevy::{app::ScheduleRunnerPlugin, prelude::*, state::app::StatesPlugin}; use bevy_ratatui::{RatatuiContext, RatatuiPlugins}; use jong::{game::wall::Wall, tiles::Tile}; use ratatui::widgets::Paragraph; mod console; mod input; pub struct RiichiTui; impl Plugin for RiichiTui { fn build(&self, app: &mut App) { app.add_plugins(( MinimalPlugins.set(ScheduleRunnerPlugin::run_loop(Duration::from_secs_f32( 1. / 60., ))), RatatuiPlugins { // enable_kitty_protocol: todo!(), // enable_mouse_capture: todo!(), enable_input_forwarding: true, ..Default::default() }, )) .add_plugins(StatesPlugin) .init_state::() .add_systems(Update, console::toggle_console) .add_systems(Update, console::draw_console.run_if(in_state(console::ConsoleState::Open))) .add_systems(Update, input::keyboard_input_system) .add_systems(Update, draw_system) // semicolon stopper ; } } // #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, States)] // enum TuiState { // MainMenu, // InGame, // } pub(crate) fn draw_system( // mut commands: Commands, wall: Option>, tiles: Option>, mut tui_ctx: ResMut, ) -> Result { let title = ratatui::text::Text::raw("tiny riichi"); let wall = if let Some(wall) = wall { let text = (*wall) .iter() .map(|c| { tiles .as_ref() .unwrap() .get(c) .map(|tile| format!("{tile:?}")) }) .collect::>()?; Some(Paragraph::new(text)) } else { None }; tui_ctx.draw(|frame| { frame.render_widget(title, frame.area()); if let Some(wall) = wall { frame.render_widget(wall, frame.area()); } })?; Ok(()) }