diff --git a/src/game/mod.rs b/src/game/mod.rs index 09bf4e6..e1eec8b 100644 --- a/src/game/mod.rs +++ b/src/game/mod.rs @@ -6,10 +6,9 @@ use crate::tiles::{self, *}; pub mod player; pub mod wall; -#[derive(States, Default, Hash, Clone, Eq, Debug, PartialEq)] +#[derive(States, Default, Hash, Clone, Eq, Debug, PartialEq, Copy)] pub enum GameState { #[default] - None, Setup, // Deal, Play, diff --git a/src/tui/console.rs b/src/tui/console.rs index 0b1ceab..0d4ac88 100644 --- a/src/tui/console.rs +++ b/src/tui/console.rs @@ -1,6 +1,8 @@ use bevy::input::keyboard::Key; use bevy::prelude::*; use bevy_ratatui::RatatuiContext; +use bevy_ratatui::event::KeyMessage; +use ratatui::crossterm::event::KeyCode; use ratatui::widgets::Block; use tui_logger::TuiLoggerWidget; @@ -23,12 +25,18 @@ impl std::ops::Not for ConsoleState { } pub(crate) fn toggle_console( - input: Res>, + // input: Res>, + mut messages: MessageReader, curr_state: Res>, mut next_state: ResMut>, ) { - if input.just_pressed(Key::Character("`".into())) { - next_state.set(!*curr_state.get()); + // if input.just_pressed(Key::Character("`".into())) { + // next_state.set(!*curr_state.get()); + // } + for message in messages.read() { + if let KeyCode::Char('`') = message.code { + next_state.set(!*curr_state.get()); + } } } diff --git a/src/tui/input.rs b/src/tui/input.rs deleted file mode 100644 index 6d0d6e4..0000000 --- a/src/tui/input.rs +++ /dev/null @@ -1,22 +0,0 @@ -// use bevy::ecs::message::MessageReader; -use bevy::app::AppExit; -use bevy::input::keyboard::{Key, KeyboardInput}; -use bevy::prelude::*; - -use crate::tui::console::ConsoleState; - -pub(crate) fn keyboard_input_system( - // keycode_input: Option>>, - // key_input: Option>>, - // mut next_state: ResMut>, - mut keyboard_events: MessageReader, -) { - // if let Some(keycode_input) = keycode_input { - // if keycode_input.just_pressed(KeyCode::Backquote) { - // // console_state.set; - // } - // } - for keyboard_input in keyboard_events.read() { - trace!("{:?}", keyboard_input); - } -} diff --git a/src/tui/menu.rs b/src/tui/menu.rs new file mode 100644 index 0000000..72e0301 --- /dev/null +++ b/src/tui/menu.rs @@ -0,0 +1,50 @@ +use bevy::prelude::*; +use bevy_ratatui::RatatuiContext; +use bevy_ratatui::event::KeyMessage; +use ratatui::crossterm::event::KeyCode; +use ratatui::layout::Constraint; +use ratatui::layout::Layout; + +use jong::game::GameState; + +use crate::tui::TuiState; + +const MAINMENU_OPTIONS: [&str; 2] = ["(p)lay", "(q)uit"]; +// const MAINMENU_INPUTS: [char;2] = ['p', 'q']; + +pub(crate) fn draw_mainmenu( + mut tui_ctx: ResMut, + // mut tui_state: ResMut>, + // mut game_state: ResMut>, +) { + let options = MAINMENU_OPTIONS; + let layout = Layout::vertical(vec![Constraint::Min(1); options.len()]); + + tui_ctx.draw(|frame| { + let areas = layout.split(frame.area()); + for (opt, area) in options.into_iter().zip(areas.iter()) { + frame.render_widget(opt, *area) + } + }); +} + +pub(crate) fn mainmenu_input( + // input: Res>, + mut messages: MessageReader, + mut next_tuistate: ResMut>, + mut next_gamestate: ResMut>, + mut exit: MessageWriter, +) { + for message in messages.read() { + match message.code { + KeyCode::Char('p') => { + next_tuistate.set(TuiState::InGame); + next_gamestate.set(GameState::default()); + } + KeyCode::Char('q') => { + exit.write_default(); + } + _ => {} + } + } +} diff --git a/src/tui/mod.rs b/src/tui/mod.rs index 1c3e510..35b0c94 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -8,7 +8,7 @@ use jong::game::GameState; use jong::game::wall::InWall; mod console; -mod input; +mod menu; mod render; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, States, Default)] @@ -31,27 +31,39 @@ impl Plugin for RiichiTui { ))), RatatuiPlugins { // enable_kitty_protocol: todo!(), - // enable_mouse_capture: todo!(), - enable_input_forwarding: true, + enable_mouse_capture: true, + // enable_input_forwarding: false, ..Default::default() }, )) .add_plugins(StatesPlugin) - // setup console .init_state::() .add_systems(Update, console::toggle_console) .add_systems(Update, console::draw_console.run_if(in_state(console::ConsoleState::Open))) - + // other setup .init_state::() - .add_systems(Update, render::draw_mainmenu.run_if(in_state(TuiState::MainMenu))) - // .add_systems(Update, input::keyboard_input_system) - // .add_systems() + .add_computed_state::() + // main menu + .add_systems(Update, (menu::draw_mainmenu,menu::mainmenu_input).run_if(in_state(TuiState::MainMenu))) + // gaming .add_systems(Update, render::ingame::draw_ingame.run_if(in_state(TuiState::InGame))) - .add_systems(Update, render::hand::render_changed_hand.run_if(in_state(GameState::Play))) + .add_systems(Update, render::hand::render_changed_hand.run_if(in_state(InGame).and(in_state(GameState::Play)))) // semicolon stopper ; } } -// fn prompt_names() {} +#[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), + } + } +} diff --git a/src/tui/render/mod.rs b/src/tui/render/mod.rs index fc30799..1c8b3e4 100644 --- a/src/tui/render/mod.rs +++ b/src/tui/render/mod.rs @@ -1,11 +1,13 @@ use bevy::ecs::system::SystemParam; use bevy::prelude::*; use bevy_ratatui::RatatuiContext; -use ratatui::widgets::Paragraph; +use ratatui::{ + layout::{}, + widgets::Paragraph, +}; use jong::{ game::{ - GameState, player::Hand, wall::{Wall, WallTiles}, }, @@ -18,10 +20,3 @@ pub(crate) mod hand; pub(crate) mod ingame; mod tiles; -pub(crate) fn draw_mainmenu( - mut tui_ctx: ResMut, - mut tui_state: ResMut>, - mut game_state: ResMut>, -) { - tui_ctx.draw(|frame| {}); -}