diff --git a/jong/src/game.rs b/jong/src/game.rs index c45ee3b..128b97b 100644 --- a/jong/src/game.rs +++ b/jong/src/game.rs @@ -9,7 +9,8 @@ use spacetimedb::Identity; use spacetimedb_sdk::{DbContext, Table, credentials}; use crate::{ - SpacetimeDB, creds_store, game, + SpacetimeDB, creds_store, + game::{self, player::Player}, stdb::{ self, DbConnection, HandTableAccess, LobbyTableAccess, PlayerTableAccess, RemoteTables, ViewPlayerHandTableAccess, add_bot, join_or_create_lobby, login_or_add_player, @@ -85,22 +86,10 @@ impl Plugin for Riichi { .add_systems(Update, on_lobby_insert_update) .add_systems(OnEnter(GameState::Setup), join_or_create_lobby) .add_systems(Update, view_hand.run_if(in_state(GameState::Play))) - .add_systems(Update, (view_hand).run_if(in_state(GameState::Play))) // semicolon stopper ; } } - -fn view_hand( - stdb: SpacetimeDB, - mut commands: Commands, - // hand: Populated<&mut Children, With>, -) { - if let Some(view) = stdb.db().view_player_hand().iter().next() { - // hand.get_mut(entity) - } -} - fn on_connect(stdb: SpacetimeDB, mut messages: ReadStdbConnectedMessage, mut commands: Commands) { for msg in messages.read() { info!("you're now jongline"); @@ -138,9 +127,26 @@ fn on_player_insert_update( mut messages: ReadInsertUpdateMessage, mut commands: Commands, + mut player: Option>, ) { + use player::*; + for msg in messages.read() { debug!("player_insert_update msg:\n{:#?}", msg.new); + if let Some(ref player) = player { + // player.as_mut() = msg.new + } else { + let player = Player { + name: msg + .new + .name + .as_ref() + .unwrap_or(&"nameless".to_string()) + .clone(), + }; + let bundle = (player, Hand, Pond, MainPlayer, CurrentPlayer); + commands.spawn(bundle); + } } } @@ -198,20 +204,6 @@ fn on_lobby_insert_update( } stdb::GameState::Play => { trace!("game entered play"); - - // TODO this should run once to spawn the hand? or do elsewhere - if let Some(hand) = stdb.db().view_player_hand().iter().next() { - debug!("hand: {hand:?}"); - let tiles = hand - .tiles - .iter() - .map(Into::into) - .map(|t: Tile| commands.spawn(t).id()) - .collect::>(); - commands.spawn(Hand).add_children(&tiles); - } else { - error!("entered play without a hand") - } } stdb::GameState::Exit => { trace!("game enetered exit"); @@ -219,3 +211,33 @@ fn on_lobby_insert_update( } } } + +fn view_hand( + stdb: SpacetimeDB, + + mut commands: Commands, + tiles: Query<(&Tile, Entity)>, + hand_ent: Single>, +) { + trace!("view_hand"); + if let Some(view) = stdb.db().view_player_hand().iter().next() { + debug!("view_hand: {view:?}"); + + let mut view = view.tiles.iter().map(Tile::from).collect::>(); + + let tiles = tiles + .iter() + .filter(|(tt, _)| { + if let Some((i, _)) = view.iter().enumerate().find(|(_, t)| t == tt) { + view.swap_remove(i); + true + } else { + false + } + }) + .map(|(_, e)| e) + .collect::>(); + + commands.entity(*hand_ent).replace_children(&tiles); + } +}