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; mod console; mod menu; mod render; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, States, Default)] 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(Update, console::draw_console.run_if(in_state(console::ConsoleState::Open))) // general setup .init_state::() .add_computed_state::() // main menu .add_systems(Update, (menu::draw_mainmenu, menu::mainmenu_input).run_if(in_state(TuiState::MainMenu))) // gaming .init_resource::() .add_systems(Update, render::ingame::draw_ingame.run_if(in_state(InGame))) .add_systems(Update, render::hand::render_changed_hand.run_if(in_state(InGame).and(in_state(GameState::Play)))) // semicolon stopper ; } }