diff --git a/jong/src/game.rs b/jong/src/game.rs index 85ff3cd..0c0d2b8 100644 --- a/jong/src/game.rs +++ b/jong/src/game.rs @@ -66,7 +66,7 @@ impl Plugin for Riichi { // .init_resource::() // .init_resource::() .add_message::() - .add_systems(Startup, tile::init_tiles) + // .add_systems(Startup, tile::init_tiles) // .add_systems(Update, hand::sort_hands.run_if(in_state(GameState::Play))) // .add_systems(OnEnter(TurnState::Tsumo), round::tsumo) // .add_systems(OnEnter(TurnState::Menzen), round::menzen) @@ -118,13 +118,16 @@ fn subscriptions(stdb: SpacetimeDB) { // .subscribe_to_all_tables(); } +#[derive(Component)] +struct TileId(u32); + fn on_player_insert_update( stdb: SpacetimeDB, mut messages: ReadInsertUpdateMessage, mut commands: Commands, - tiles: Query<(&Tile, Entity)>, + tiles: Query<(&Tile, &TileId, Entity)>, mut player: Option>, mut hand_ent: Option>>, ) { @@ -132,34 +135,29 @@ fn on_player_insert_update( for msg in messages.read() { debug!("player_insert_update msg:\n{:#?}", msg.new); - if let Some(ref player) = player { + if let (Some(player), Some(hand_ent)) = (player.as_ref(), hand_ent.as_ref()) { // if msg.old.as_ref().is_some_and(|m| !m.ready) && msg.new.ready { // trace!("entered ready"); // // TODO add a start game button in the future // stdb.reducers().start_game().unwrap(); // } - let mut view: Vec<_> = msg.new.hand.iter().map(Tile::from).collect(); - // let mut tiles = tiles - // .iter() - // .filter(|(tt, _)| { - // if let Some((i, _)) = view.iter().enumerate().find(|(_, t)| t == tt) { - // view.swap_remove(i); - // true - // } else { - // false - // } - // }) - // // .map(|(t, e)| e) - // .collect::>(); - // tiles.sort_by_key(|(t, e)| **t); - // tiles.get_many(entities) - - - let tiles = tiles.into_iter().map(|(_, e)| e).collect::>(); - - commands - .entity(**hand_ent.as_ref().unwrap()) - .replace_children(&tiles); + let mut tiles: Vec<_> = msg + .new + .hand + .iter() + .map(|dbt| { + if let Some(ent) = tiles + .iter() + .find(|(_, id, _)| id.0 == dbt.id) + .map(|(_, _, e)| e) + { + ent + } else { + commands.spawn((Tile::from(&dbt.tile), TileId(dbt.id))).id() + } + }) + .collect(); + commands.entity(**hand_ent).replace_children(&tiles); } else { let player = Player { name: msg