use std::time::Duration; use bevy::{app::ScheduleRunnerPlugin, prelude::*, state::app::StatesPlugin}; use bevy_ratatui::RatatuiPlugins; use ratatui::{text::ToSpan, widgets::Paragraph}; use jong::game::GameState; // use jong::game::wall::InWall; use crate::tui::{console::ConsoleState, menu::draw_mainmenu, render::ingame::draw_ingame}; mod console; mod menu; mod render; mod input; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, States, Default)] pub(crate) enum TuiState { #[default] MainMenu, InGame, } #[derive(Clone, PartialEq, Eq, Hash, Debug)] struct InGame; impl ComputedStates for InGame { type SourceStates = TuiState; fn compute(sources: Self::SourceStates) -> Option { match sources { TuiState::MainMenu => None, TuiState::InGame => Some(Self), } } } #[derive(Default)] 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: true, enable_input_forwarding: true, ..Default::default() }, )) .add_plugins(StatesPlugin) // console .init_state::() .add_systems(Last, console::draw_console.run_if(in_state(console::ConsoleState::Open))) // general setup .init_state::() .add_computed_state::() .add_systems(PreUpdate, input::kb_input_system) // main menu .add_systems(PostUpdate, menu::draw_mainmenu.run_if(in_state(TuiState::MainMenu))) // gaming .init_resource::() .add_systems(PostUpdate, render::hand::render_hands.run_if(in_state(InGame).and(in_state(GameState::Play)))) .add_systems(PostUpdate, render::ingame::draw_ingame.run_if(in_state(InGame))) // semicolon stopper ; } }