tiles are now in hand

This commit is contained in:
Tao Tien 2026-02-12 17:24:51 -08:00
parent a1c72b2c48
commit b9c653f3a2

View file

@ -66,7 +66,7 @@ impl Plugin for Riichi {
// .init_resource::<round::MatchSettings>()
// .init_resource::<round::Compass>()
.add_message::<GameMessage>()
.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<stdb::Player>,
mut commands: Commands,
tiles: Query<(&Tile, Entity)>,
tiles: Query<(&Tile, &TileId, Entity)>,
mut player: Option<Single<&mut player::Player>>,
mut hand_ent: Option<Single<Entity, With<Hand>>>,
) {
@ -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::<Vec<_>>();
// tiles.sort_by_key(|(t, e)| **t);
// tiles.get_many(entities)
let tiles = tiles.into_iter().map(|(_, e)| e).collect::<Vec<_>>();
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