This commit is contained in:
Tao Tien 2026-01-09 06:54:17 -08:00
parent 78029687d7
commit bea146d439
9 changed files with 88 additions and 41 deletions

2
Cargo.lock generated
View file

@ -3274,8 +3274,10 @@ dependencies = [
"bevy_ratatui", "bevy_ratatui",
"clap", "clap",
"log", "log",
"rand 0.9.2",
"ratatui", "ratatui",
"strum", "strum",
"tracing",
"tracing-subscriber", "tracing-subscriber",
"tui-logger", "tui-logger",
] ]

View file

@ -18,8 +18,10 @@ log = { version = "0.4.29", features = [
"release_max_level_error", "release_max_level_error",
"max_level_trace", "max_level_trace",
] } ] }
rand = "0.9.2"
ratatui = "0.30.0" ratatui = "0.30.0"
strum = { version = "0.27.2", features = ["derive"] } strum = { version = "0.27.2", features = ["derive"] }
tracing = "0.1.44"
tracing-subscriber = "0.3.22" tracing-subscriber = "0.3.22"
tui-logger = { version = "0.18.0", features = ["tracing-support", "crossterm"] } tui-logger = { version = "0.18.0", features = ["tracing-support", "crossterm"] }

View file

@ -1,10 +1,9 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::tiles::{self, *}; use crate::tiles::{self, *};
mod player; mod player;
pub(crate) mod wall; pub mod wall;
pub struct Riichi; pub struct Riichi;
@ -13,10 +12,21 @@ impl Plugin for Riichi {
app.init_resource::<Compass>() app.init_resource::<Compass>()
.add_systems(Startup, init_match) .add_systems(Startup, init_match)
.add_systems(Startup, tiles::init_tiles) .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)] #[derive(Component)]
pub(crate) struct Dice(u8, u8); pub(crate) struct Dice(u8, u8);

View file

@ -1,11 +1,24 @@
use bevy::log::tracing::instrument;
use bevy::prelude::*; use bevy::prelude::*;
use rand::seq::SliceRandom;
use crate::game::InWall;
use crate::tiles::Tile; use crate::tiles::Tile;
#[derive(Component)] #[derive(Component)]
pub(crate) struct Wall(Vec<Entity>); #[relationship_target(relationship = InWall)]
pub struct Wall(Vec<Entity>);
pub(crate) fn build_wall(_tiles: Query<&Tile>) { #[instrument(level = "trace", skip_all)]
info!("built a wall!") pub(crate) fn build_wall(mut commands: Commands, tiles: Query<Entity, With<Tile>>) -> Result {
let mut rng = rand::rng();
let mut wall = commands.spawn(Wall(vec![]));
let mut shuffled = tiles.iter().collect::<Vec<_>>();
shuffled.shuffle(&mut rng);
wall.replace_children(&shuffled);
Ok(())
} }

View file

@ -1,3 +1,5 @@
#![allow(unused)]
pub mod tiles; pub mod tiles;
pub mod yakus; pub mod yakus;

View file

@ -1,6 +1,8 @@
#![allow(unused)]
use bevy::prelude::*; use bevy::prelude::*;
use clap::{Parser, Subcommand}; use clap::{Parser, Subcommand};
use tracing_subscriber::{layer::SubscriberExt, registry::LookupSpan, util::SubscriberInitExt}; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
mod gui; mod gui;
mod tui; mod tui;
@ -18,11 +20,6 @@ enum Mode {
} }
fn main() { fn main() {
// tracing_subscriber::fmt()
// .with_writer(std::io::stderr)
// .with_env_filter("warn,jong=trace")
// .init();
let args = Args::parse(); let args = Args::parse();
let mut app = App::new(); let mut app = App::new();

View file

@ -1,24 +1,22 @@
use bevy::{ecs::entity::MapEntities, prelude::*}; use bevy::{ecs::entity::MapEntities, prelude::*};
use strum::FromRepr; use strum::FromRepr;
use crate::game::wall::Wall;
// #[derive(Component)]
// #[derive(relasionship(re))]
// pub struct TileEntity {
// #[relationship]
// pub parent: Entity,
// r#type: Tile,
// }
struct Hand;
#[derive(Component)] #[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 { pub struct Tile {
suit: Suit, suit: Suit,
} }
#[derive(MapEntities)] #[derive(MapEntities, Debug)]
pub enum Suit { pub enum Suit {
Pin(Rank), Pin(Rank),
Sou(Rank), Sou(Rank),
@ -27,10 +25,10 @@ pub enum Suit {
Dragon(Dragon), Dragon(Dragon),
} }
#[derive(Deref, DerefMut)] #[derive(Deref, DerefMut, Debug)]
pub struct Rank(u8); pub struct Rank(u8);
#[derive(FromRepr)] #[derive(FromRepr, Debug)]
pub enum Wind { pub enum Wind {
Ton, Ton,
Nan, Nan,
@ -38,7 +36,7 @@ pub enum Wind {
Pei, Pei,
} }
#[derive(FromRepr)] #[derive(Debug, FromRepr)]
pub enum Dragon { pub enum Dragon {
Haku, Haku,
Hatsu, Hatsu,

View file

@ -1,13 +1,12 @@
use tui_logger::TuiLoggerWidget;
use bevy_ratatui::RatatuiContext;
use bevy::input::keyboard::Key; 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)] #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, States)]
pub(crate) enum ConsoleState { pub(crate) enum ConsoleState {
Open,
#[default] #[default]
Open,
Closed, Closed,
} }
@ -28,7 +27,6 @@ pub(crate) fn toggle_console(
mut next_state: ResMut<NextState<ConsoleState>>, mut next_state: ResMut<NextState<ConsoleState>>,
) { ) {
if input.just_pressed(Key::Character("`".into())) { if input.just_pressed(Key::Character("`".into())) {
trace!("toggled");
next_state.set(!*curr_state.get()); next_state.set(!*curr_state.get());
} }
} }

View file

@ -1,10 +1,9 @@
use std::time::Duration; 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 bevy_ratatui::{RatatuiContext, RatatuiPlugins};
use jong::tiles::Tile; use jong::{game::wall::Wall, tiles::Tile};
use tui_logger::TuiLoggerSmartWidget; use ratatui::widgets::Paragraph;
mod console; mod console;
mod input; mod input;
@ -40,10 +39,36 @@ impl Plugin for RiichiTui {
// InGame, // InGame,
// } // }
pub(crate) fn draw_system(mut tui_ctx: ResMut<RatatuiContext>, query: Query<&Tile>) -> Result { 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
};
tui_ctx.draw(|frame| { tui_ctx.draw(|frame| {
let text = ratatui::text::Text::raw("tiny riichi"); frame.render_widget(title, frame.area());
frame.render_widget(text, frame.area());
if let Some(wall) = wall {
frame.render_widget(wall, frame.area());
}
})?; })?;
Ok(()) Ok(())