diff --git a/src/game/hand.rs b/src/game/hand.rs index 424d9b4..4daa915 100644 --- a/src/game/hand.rs +++ b/src/game/hand.rs @@ -1,9 +1,6 @@ use bevy::prelude::*; -use crate::{ - game::{player::Player, wall::WallTiles}, - tiles::Tile, -}; +use crate::{game::wall::WallTiles, tiles::Tile}; #[derive(Component)] pub struct Hand; @@ -20,39 +17,38 @@ pub(crate) fn deal_hands( mut commands: Commands, walltiles: Single<&WallTiles>, walltiles_entity: Single>, - players: Populated>, ) -> Result { - let mut wall = walltiles.iter().collect::>(); + let hand = walltiles.iter().collect::>(); - for player_entity in players { - let hand = wall.split_off(13); + commands + .get_entity(*walltiles_entity)? + .remove_children(hand.last_chunk::<13>().unwrap()); - commands - .get_entity(*walltiles_entity)? - .remove_children(&hand); - - let handtiles = commands.spawn((Hand, HandTiles(hand))).id(); - - commands - .get_entity(player_entity)? - .add_children(&[handtiles]); - } + commands.spawn((Hand, HandTiles(hand))); trace!("dealt hands"); Ok(()) } -#[allow(clippy::type_complexity)] -pub(crate) fn sort_hands( +pub(crate) fn sort_hand( mut commands: Commands, tiles: Populated<&Tile>, - mut hands: Populated<&mut Children, Changed>, + handtiles_entity: Single>, + handtiles: Single<&HandTiles, Changed>, ) -> Result { - for (mut children) in hands { - children.sort_unstable_by_key(|e| tiles.get(*e).unwrap().suit); - trace!("sorted a hand") - } + let mut hand: Vec<_> = handtiles + .iter() + .map(|e| -> Result<(_, _)> { Ok((tiles.get(e)?, e)) }) + .collect::>()?; - trace!("sort_hands"); + hand.sort_by_key(|(t, _)| t.suit); + + let hand: Vec<_> = hand.iter().map(|(_, e)| *e).collect(); + + commands + .get_entity(*handtiles_entity)? + .replace_children(&hand); + + trace!("sort_hand"); Ok(()) } diff --git a/src/game/mod.rs b/src/game/mod.rs index 6b3b83f..b099460 100644 --- a/src/game/mod.rs +++ b/src/game/mod.rs @@ -1,9 +1,6 @@ use bevy::prelude::*; -use crate::{ - game::player::MainPlayer, - tiles::{self, *}, -}; +use crate::tiles::{self, *}; pub mod hand; pub mod player; @@ -27,7 +24,7 @@ impl Plugin for Riichi { .add_systems(Startup, tiles::init_tiles) .init_state::() .add_systems(OnEnter(GameState::Setup), (wall::build_wall, hand::deal_hands, setup_done).chain()) - .add_systems(Update, (hand::sort_hands).run_if(in_state(GameState::Play))) + .add_systems(Update, (hand::sort_hand).run_if(in_state(GameState::Play))) // semicolon stopper ; } @@ -82,7 +79,7 @@ pub(crate) fn init_match( player_count, }); - let players = (2..=player_count) + let players = (1..=player_count) .map(|i| { ( player::Player { @@ -93,13 +90,6 @@ pub(crate) fn init_match( }) .collect::>(); commands.spawn_batch(players); - let main_player = ( - player::Player { - name: format!("Player {}", 1), - }, - player::Points(starting), - ); - commands.spawn((main_player, MainPlayer)); // *compass = Compass { // prevalent_wind: Wind::Ton, diff --git a/src/game/player.rs b/src/game/player.rs index a99e5cd..e4e3323 100644 --- a/src/game/player.rs +++ b/src/game/player.rs @@ -6,12 +6,12 @@ use crate::{ }; #[derive(Component)] -pub struct Player { - pub name: String, +pub(crate) struct Player { + pub(crate) name: String, } -#[derive(Component)] -pub struct Points(pub isize); +fn spawn_players(mut commands: Commands) {} #[derive(Component)] -pub struct MainPlayer; +pub(crate) struct Points(pub isize); + diff --git a/src/main.rs b/src/main.rs index 1a8dd9a..0481b30 100644 --- a/src/main.rs +++ b/src/main.rs @@ -43,7 +43,7 @@ fn main() { tui_logger::init_logger(tui_logger::LevelFilter::Trace).unwrap(); tui_logger::set_env_filter_from_string(FILTERSTRING); - app.add_plugins(tui::RiichiTui) + app.add_plugins(tui::RiichiTui::default()) } }; diff --git a/src/tui/console.rs b/src/tui/console.rs index efdcd7a..f668331 100644 --- a/src/tui/console.rs +++ b/src/tui/console.rs @@ -5,8 +5,8 @@ use tui_logger::TuiLoggerWidget; #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Default, States)] pub(crate) enum ConsoleState { - Closed, #[default] + Closed, Open, } diff --git a/src/tui/mod.rs b/src/tui/mod.rs index cde1cf2..e90a87f 100644 --- a/src/tui/mod.rs +++ b/src/tui/mod.rs @@ -110,17 +110,11 @@ pub(crate) fn input_system( _ => {} }, TuiState::InGame => match gs { - GameState::Setup => match message.code { - _ => {} - }, - GameState::Play => match message.code { - KeyCode::Char('q') => { - exit.write_default(); - } - _ => {} - }, + // GameState::None => todo!(), + GameState::Setup => todo!(), + GameState::Play => todo!(), GameState::Score => todo!(), - _ => unreachable!("TuiState::InGame but GameState invalid") + _ => todo!() }, } } diff --git a/src/tui/render/hand.rs b/src/tui/render/hand.rs index d2fcc69..9c76106 100644 --- a/src/tui/render/hand.rs +++ b/src/tui/render/hand.rs @@ -7,26 +7,32 @@ use jong::tiles::Tile; use crate::tui::render::tiles; #[derive(Resource, Default)] -pub(crate) struct RenderedHand(pub(crate) Vec>>); +pub(crate) struct RenderedHand(pub(crate) Vec>); pub(crate) fn render_changed_hand( - hands: Populated<&Children, Changed>, + hand: Single<&HandTiles, Changed>, tiles: Populated<&Tile>, mut target: ResMut, ) -> Result { - let mut rendered = vec![]; - - for hand in hands { - let tiles = hand - .iter() - .map(|inhand| tiles.get(inhand).map(tiles::draw_tile).unwrap()) - .collect(); - - rendered.push(tiles); - } - - target.0 = rendered; - trace!("render_changed_hand"); + + render_hand(hand, tiles, target)?; + + Ok(()) +} + +pub(crate) fn render_hand( + hand: Single<&HandTiles, Changed>, + tiles: Populated<&Tile>, + mut target: ResMut, +) -> Result { + trace!("render_hand"); + + let hand_tiles = hand + .iter() + .map(|inhand| -> Result<_> { Ok(tiles.get(inhand).map(tiles::draw_tile)?) }) + .collect::>>()?; + target.0 = hand_tiles; + Ok(()) } diff --git a/src/tui/render/ingame.rs b/src/tui/render/ingame.rs index b8e01cc..6a30d4e 100644 --- a/src/tui/render/ingame.rs +++ b/src/tui/render/ingame.rs @@ -17,10 +17,8 @@ pub(crate) fn draw_ingame( let mut area = frame.area(); area.height = 4; let areas = layout.areas::<13>(area); - if let Some(tiles) = rendered_hand.0.first() { - for (tile, area) in tiles.iter().zip(areas.iter()) { - frame.render_widget(tile, *area); - } + for (tile, area) in rendered_hand.0.iter().zip(areas.iter()) { + frame.render_widget(tile, *area); } })?;