diff --git a/Cargo.lock b/Cargo.lock index 49cf5ed..02ab506 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3274,8 +3274,10 @@ dependencies = [ "bevy_ratatui", "clap", "log", + "rand 0.9.2", "ratatui", "strum", + "tracing", "tracing-subscriber", "tui-logger", ] diff --git a/Cargo.toml b/Cargo.toml index fe51bfd..8ba3c20 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,8 +18,10 @@ log = { version = "0.4.29", features = [ "release_max_level_error", "max_level_trace", ] } +rand = "0.9.2" ratatui = "0.30.0" strum = { version = "0.27.2", features = ["derive"] } +tracing = "0.1.44" tracing-subscriber = "0.3.22" tui-logger = { version = "0.18.0", features = ["tracing-support", "crossterm"] } diff --git a/src/game/mod.rs b/src/game/mod.rs index 14eeaf2..577e397 100644 --- a/src/game/mod.rs +++ b/src/game/mod.rs @@ -1,10 +1,9 @@ - use bevy::prelude::*; use crate::tiles::{self, *}; mod player; -pub(crate) mod wall; +pub mod wall; pub struct Riichi; @@ -13,10 +12,21 @@ impl Plugin for Riichi { app.init_resource::() .add_systems(Startup, init_match) .add_systems(Startup, tiles::init_tiles) - .add_systems(Startup, wall::build_wall); + .add_systems(Update, wall::build_wall) + // semicolon stopper + ; } } +#[derive(States, Default, Hash, Clone, Eq, Debug, PartialEq)] +enum GameState { + #[default] + Setup, + Deal, + Play, + Score, +} + #[derive(Component)] pub(crate) struct Dice(u8, u8); diff --git a/src/game/wall.rs b/src/game/wall.rs index 2692952..4de0558 100644 --- a/src/game/wall.rs +++ b/src/game/wall.rs @@ -1,11 +1,24 @@ - +use bevy::log::tracing::instrument; use bevy::prelude::*; +use rand::seq::SliceRandom; +use crate::game::InWall; use crate::tiles::Tile; #[derive(Component)] -pub(crate) struct Wall(Vec); +#[relationship_target(relationship = InWall)] +pub struct Wall(Vec); -pub(crate) fn build_wall(_tiles: Query<&Tile>) { - info!("built a wall!") +#[instrument(level = "trace", skip_all)] +pub(crate) fn build_wall(mut commands: Commands, tiles: Query>) -> Result { + let mut rng = rand::rng(); + + let mut wall = commands.spawn(Wall(vec![])); + + let mut shuffled = tiles.iter().collect::>(); + shuffled.shuffle(&mut rng); + + wall.replace_children(&shuffled); + + Ok(()) } diff --git a/src/lib.rs b/src/lib.rs index 8a1fb07..1740455 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +#![allow(unused)] + pub mod tiles; pub mod yakus; diff --git a/src/main.rs b/src/main.rs index 641d6df..5c8cbe2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,8 @@ +#![allow(unused)] + use bevy::prelude::*; use clap::{Parser, Subcommand}; -use tracing_subscriber::{layer::SubscriberExt, registry::LookupSpan, util::SubscriberInitExt}; +use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; mod gui; mod tui; @@ -18,11 +20,6 @@ enum Mode { } fn main() { - // tracing_subscriber::fmt() - // .with_writer(std::io::stderr) - // .with_env_filter("warn,jong=trace") - // .init(); - let args = Args::parse(); let mut app = App::new(); diff --git a/src/tiles.rs b/src/tiles.rs index c00ef9c..7716df0 100644 --- a/src/tiles.rs +++ b/src/tiles.rs @@ -1,24 +1,22 @@ use bevy::{ecs::entity::MapEntities, prelude::*}; use strum::FromRepr; - -// #[derive(Component)] -// #[derive(relasionship(re))] -// pub struct TileEntity { -// #[relationship] -// pub parent: Entity, - -// r#type: Tile, -// } - -struct Hand; +use crate::game::wall::Wall; #[derive(Component)] +#[relationship(relationship_target = Wall)] +pub struct InWall(pub Entity); + +// #[derive(Component)] +// #[relationship(relationship_target = WallTiles)] +// pub(crate) struct InHand(pub Entity); + +#[derive(Component, Debug)] pub struct Tile { suit: Suit, } -#[derive(MapEntities)] +#[derive(MapEntities, Debug)] pub enum Suit { Pin(Rank), Sou(Rank), @@ -27,10 +25,10 @@ pub enum Suit { Dragon(Dragon), } -#[derive(Deref, DerefMut)] +#[derive(Deref, DerefMut, Debug)] pub struct Rank(u8); -#[derive(FromRepr)] +#[derive(FromRepr, Debug)] pub enum Wind { Ton, Nan, @@ -38,7 +36,7 @@ pub enum Wind { Pei, } -#[derive(FromRepr)] +#[derive(Debug, FromRepr)] pub enum Dragon { Haku, Hatsu, diff --git a/src/tui/console.rs b/src/tui/console.rs index db20cf8..97b346c 100644 --- a/src/tui/console.rs +++ b/src/tui/console.rs @@ -1,13 +1,12 @@ -use tui_logger::TuiLoggerWidget; - -use bevy_ratatui::RatatuiContext; - use bevy::input::keyboard::Key; +use bevy::prelude::*; +use bevy_ratatui::RatatuiContext; +use tui_logger::TuiLoggerWidget; #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, States)] pub(crate) enum ConsoleState { - Open, #[default] + Open, Closed, } @@ -28,7 +27,6 @@ pub(crate) fn toggle_console( mut next_state: ResMut>, ) { if input.just_pressed(Key::Character("`".into())) { - trace!("toggled"); next_state.set(!*curr_state.get()); } } diff --git a/src/tui/mod.rs b/src/tui/mod.rs index d797779..d960f2e 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -1,10 +1,9 @@ use std::time::Duration; -use bevy::{app::ScheduleRunnerPlugin, input::keyboard::Key, prelude::*, state::app::StatesPlugin}; +use bevy::{app::ScheduleRunnerPlugin, prelude::*, state::app::StatesPlugin}; use bevy_ratatui::{RatatuiContext, RatatuiPlugins}; -use jong::tiles::Tile; -use tui_logger::TuiLoggerSmartWidget; - +use jong::{game::wall::Wall, tiles::Tile}; +use ratatui::widgets::Paragraph; mod console; mod input; @@ -40,10 +39,36 @@ impl Plugin for RiichiTui { // InGame, // } -pub(crate) fn draw_system(mut tui_ctx: ResMut, query: Query<&Tile>) -> Result { +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| { - let text = ratatui::text::Text::raw("tiny riichi"); - frame.render_widget(text, frame.area()); + frame.render_widget(title, frame.area()); + + if let Some(wall) = wall { + frame.render_widget(wall, frame.area()); + } })?; Ok(())