2026-01-08 20:49:19 -08:00
|
|
|
use std::time::Duration;
|
|
|
|
|
|
2026-01-09 06:54:17 -08:00
|
|
|
use bevy::{app::ScheduleRunnerPlugin, prelude::*, state::app::StatesPlugin};
|
2026-01-08 20:49:19 -08:00
|
|
|
use bevy_ratatui::{RatatuiContext, RatatuiPlugins};
|
2026-01-09 06:54:17 -08:00
|
|
|
use jong::{game::wall::Wall, tiles::Tile};
|
|
|
|
|
use ratatui::widgets::Paragraph;
|
2026-01-09 03:34:54 -08:00
|
|
|
mod console;
|
2026-01-08 20:49:19 -08:00
|
|
|
mod input;
|
|
|
|
|
|
|
|
|
|
pub struct RiichiTui;
|
2026-01-07 00:51:57 -08:00
|
|
|
|
2026-01-08 20:49:19 -08:00
|
|
|
impl Plugin for RiichiTui {
|
|
|
|
|
fn build(&self, app: &mut App) {
|
|
|
|
|
app.add_plugins((
|
|
|
|
|
MinimalPlugins.set(ScheduleRunnerPlugin::run_loop(Duration::from_secs_f32(
|
2026-01-09 03:34:54 -08:00
|
|
|
1. / 60.,
|
2026-01-08 20:49:19 -08:00
|
|
|
))),
|
|
|
|
|
RatatuiPlugins {
|
|
|
|
|
// enable_kitty_protocol: todo!(),
|
|
|
|
|
// enable_mouse_capture: todo!(),
|
|
|
|
|
enable_input_forwarding: true,
|
|
|
|
|
..Default::default()
|
|
|
|
|
},
|
|
|
|
|
))
|
2026-01-09 03:34:54 -08:00
|
|
|
.add_plugins(StatesPlugin)
|
|
|
|
|
.init_state::<console::ConsoleState>()
|
|
|
|
|
.add_systems(Update, console::toggle_console)
|
|
|
|
|
.add_systems(Update, console::draw_console.run_if(in_state(console::ConsoleState::Open)))
|
2026-01-08 23:58:26 -08:00
|
|
|
.add_systems(Update, input::keyboard_input_system)
|
2026-01-09 03:34:54 -08:00
|
|
|
.add_systems(Update, draw_system)
|
|
|
|
|
// semicolon stopper
|
|
|
|
|
;
|
2026-01-08 20:49:19 -08:00
|
|
|
}
|
|
|
|
|
}
|
2026-01-07 00:51:57 -08:00
|
|
|
|
2026-01-09 03:34:54 -08:00
|
|
|
// #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, States)]
|
|
|
|
|
// enum TuiState {
|
|
|
|
|
// MainMenu,
|
|
|
|
|
// InGame,
|
|
|
|
|
// }
|
|
|
|
|
|
2026-01-09 06:54:17 -08:00
|
|
|
pub(crate) fn draw_system(
|
|
|
|
|
// mut commands: Commands,
|
|
|
|
|
wall: Option<Single<&Wall>>,
|
|
|
|
|
tiles: Option<Populated<&Tile>>,
|
|
|
|
|
mut tui_ctx: ResMut<RatatuiContext>,
|
|
|
|
|
) -> 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::<Result<String, _>>()?;
|
|
|
|
|
|
|
|
|
|
Some(Paragraph::new(text))
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
};
|
|
|
|
|
|
2026-01-09 03:34:54 -08:00
|
|
|
tui_ctx.draw(|frame| {
|
2026-01-09 06:54:17 -08:00
|
|
|
frame.render_widget(title, frame.area());
|
|
|
|
|
|
|
|
|
|
if let Some(wall) = wall {
|
|
|
|
|
frame.render_widget(wall, frame.area());
|
|
|
|
|
}
|
2026-01-07 00:51:57 -08:00
|
|
|
})?;
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|