From 0c3fe6f87a3ce5bc3047f3db43d4da72f59ca7e0 Mon Sep 17 00:00:00 2001 From: Tao Tien <29749622+taotien@users.noreply.github.com> Date: Mon, 2 Mar 2026 22:43:49 -0800 Subject: [PATCH] some stuff --- jong/src/riichi.rs | 269 ++++++++++++++-------------------- jong/src/riichi/connection.rs | 3 - jong/src/riichi/player.rs | 7 + 3 files changed, 113 insertions(+), 166 deletions(-) diff --git a/jong/src/riichi.rs b/jong/src/riichi.rs index 2f99ad9..60b5cbc 100644 --- a/jong/src/riichi.rs +++ b/jong/src/riichi.rs @@ -46,25 +46,20 @@ impl Plugin for Riichi { app.add_plugins(plugins) .init_state::() .add_sub_state::() - .add_message::() - .add_message::() - .add_message::() + .init_resource::() .add_systems(Startup, subscriptions) .add_systems(Update, (connection::on_connect, connection::on_disconnect)) .add_systems( Update, ( - ( - on_lobby_insert_update, - on_player_insert_update, - on_bot_insert_update, - ), - (sync_player, sync_bot), + on_lobby_insert_update, + on_player_insert_update, + on_bot_insert_update, ), ) .add_systems( Update, - ((on_view_hand_insert, on_view_hand_update), (sync_open_hand)) + (on_view_hand_insert, on_view_hand_update) .run_if(in_state(GameState::Play).or(in_state(GameState::Deal))), ); } @@ -115,135 +110,6 @@ fn subscriptions(stdb: SpacetimeDB, mut commands: Commands) { } } -#[derive(Message)] -struct SyncPlayer(u32); - -#[derive(Message)] -struct SyncBot(u32); - -#[derive(Message)] -struct SyncOpenHand(u32); - -#[derive(Message)] -struct SyncClosedHand(PlayerOrBot); - -#[derive(Message)] -struct SyncPlayerClock(u32); - -fn sync_player( - stdb: SpacetimeDB, - - mut messages: MessageReader, - mut commands: Commands, - - players: Query<(Entity, &Player)>, -) { - for SyncPlayer(id) in messages.read() { - trace!("sync_player"); - let Some(player) = stdb.db().player().id().find(id) else { - todo!() - }; - - let player_ent = players - .iter() - .find_map(|(e, p)| (p.id == PlayerOrBot::Player { id: player.id }).then_some(e)) - .unwrap_or_else(|| { - commands - .spawn(Player { - id: PlayerOrBot::Player { id: player.id }, - }) - .id() - }); - - if player.identity == stdb.identity() { - commands.entity(player_ent).insert(MainPlayer); - } else { - } - } -} - -fn sync_bot( - stdb: SpacetimeDB, - mut messages: MessageReader, - mut commands: Commands, - players: Query<(Entity, &Player)>, -) { -} - -fn sync_open_hand( - stdb: SpacetimeDB, - - mut messages: MessageReader, - mut commands: Commands, - - tiles: Query<(Entity, &TileId)>, - hands: Query<(Entity, &Hand)>, - ponds: Query<(Entity, &Pond)>, - - mut next_turnstate: ResMut>, -) { - for SyncOpenHand(id) in messages.read() { - trace!("sync_open_hand"); - let Some(player_hand) = stdb.db().view_hand().iter().find(|hand| hand.id == *id) else { - todo!() - }; - - let hand_ent = hands - .iter() - .find_map(|(e, h)| (h.owner == PlayerOrBot::Player { id: *id }).then_some(e)) - .unwrap_or_else(|| { - commands - .spawn(Hand { - owner: PlayerOrBot::Player { id: *id }, - }) - .id() - }); - let pond_ent = ponds - .iter() - .find_map(|(e, p)| (p.owner == PlayerOrBot::Player { id: *id }).then_some(e)) - .unwrap_or_else(|| { - commands - .spawn(Pond { - owner: PlayerOrBot::Player { id: *id }, - }) - .id() - }); - - // hand and pond both still need ability to spawn for the reconnect case - let hand: Vec = player_hand - .hand - .iter() - .map(|dbt| { - tiles - .iter() - .find_map(|(e, i)| (i.0 == dbt.id).then_some(e)) - .unwrap_or_else(|| commands.spawn((Tile::from(&dbt.tile), TileId(dbt.id))).id()) - }) - .collect(); - let pond: Vec = player_hand - .pond - .iter() - .map(|dbt| { - tiles - .iter() - .find_map(|(e, i)| (i.0 == dbt.id).then_some(e)) - .unwrap_or_else(|| commands.spawn((Tile::from(&dbt.tile), TileId(dbt.id))).id()) - }) - .collect(); - - commands.entity(hand_ent).replace_children(&hand); - commands.entity(pond_ent).replace_children(&pond); - - if let Some(dbt) = player_hand.working_tile - && player_hand.turn_state == jong_db::TurnState::Tsumo - { - commands.spawn((Drawn, Tile::from(&dbt.tile), TileId(dbt.id))); - } - - next_turnstate.set(player_hand.turn_state.into()); - } -} - fn sync_closed_hand( stdb: SpacetimeDB, @@ -298,28 +164,42 @@ fn sync_closed_hand( fn sync_player_clock() {} fn on_player_insert_update( - mut db_messages: ReadInsertUpdateMessage, + stdb: SpacetimeDB, + mut messages: ReadInsertUpdateMessage, - mut writer: MessageWriter, + mut commands: Commands, + + players: Query<(Entity, &Player)>, ) { - for msg in db_messages.read() { + for msg in messages.read() { trace!("on_player_insert_update"); - writer.write(SyncPlayer(msg.new.id)); + let player = &msg.new; + + let player_ent = players + .iter() + .find_map(|(e, p)| (p.id == PlayerOrBot::Player { id: player.id }).then_some(e)) + .unwrap_or_else(|| { + commands + .spawn(Player { + id: PlayerOrBot::Player { id: msg.new.id }, + }) + .id() + }); + + if player.identity == stdb.identity() { + commands.entity(player_ent).insert(MainPlayer); + } else { + } } } -fn on_bot_insert_update( - mut db_messages: ReadInsertUpdateMessage, - mut writer: MessageWriter, -) { - for msg in db_messages.read() { - writer.write(SyncBot(msg.new.id)); - } +fn on_bot_insert_update(stdb: SpacetimeDB, mut messages: ReadInsertUpdateMessage) { + for msg in messages.read() {} } -#[derive(Resource)] -struct Lobby { - players: Vec, +#[derive(Resource, Default)] +pub struct Lobby { + pub players: Vec, } fn on_lobby_insert_update( @@ -327,6 +207,10 @@ fn on_lobby_insert_update( mut messages: ReadInsertUpdateMessage, mut commands: Commands, + + mut lobby: ResMut, + players: Query<(Entity, &Player)>, + mut next_gamestate: ResMut>, ) { for msg in messages.read() { @@ -367,26 +251,85 @@ fn on_lobby_insert_update( } } + lobby.players = msg.new.players.iter().map(|p| p.into()).collect(); + next_gamestate.set(msg.new.game_state.into()); } } -fn on_view_hand_insert( - mut messages: ReadInsertMessage, - mut writer: MessageWriter, -) { +fn on_view_hand_insert(mut messages: ReadInsertMessage) { for msg in messages.read() { trace!("on_view_hand_insert"); - writer.write(SyncOpenHand(msg.row.id)); + + } } -fn on_view_hand_update( - mut messages: ReadUpdateMessage, - mut writer: MessageWriter, -) { +fn on_view_hand_update(mut messages: ReadUpdateMessage) { for msg in messages.read() { trace!("on_view_hand_update"); - writer.write(SyncOpenHand(msg.new.player_id)); } } + +fn sync_open_hand( + commands: Commands, + tiles: Query<(Entity, &TileId)>, + hands: Query<(Entity, &Hand)>, + ponds: Query<(Entity, &Pond)>, + next_turnstate: &mut ResMut>, + player_hand: PlayerHand, +) { + let hand_ent = hands + .iter() + .find_map(|(e, h)| (h.owner == player_hand.player_id).then_some(e)) + .unwrap_or_else(|| { + commands + .spawn(Hand { + owner: PlayerOrBot::Player { id: *id }, + }) + .id() + }); + let pond_ent = ponds + .iter() + .find_map(|(e, p)| (p.owner == PlayerOrBot::Player { id: *id }).then_some(e)) + .unwrap_or_else(|| { + commands + .spawn(Pond { + owner: PlayerOrBot::Player { id: *id }, + }) + .id() + }); + + // hand and pond both still need ability to spawn for the reconnect case + let hand: Vec = player_hand + .hand + .iter() + .map(|dbt| { + tiles + .iter() + .find_map(|(e, i)| (i.0 == dbt.id).then_some(e)) + .unwrap_or_else(|| commands.spawn((Tile::from(&dbt.tile), TileId(dbt.id))).id()) + }) + .collect(); + let pond: Vec = player_hand + .pond + .iter() + .map(|dbt| { + tiles + .iter() + .find_map(|(e, i)| (i.0 == dbt.id).then_some(e)) + .unwrap_or_else(|| commands.spawn((Tile::from(&dbt.tile), TileId(dbt.id))).id()) + }) + .collect(); + + commands.entity(hand_ent).replace_children(&hand); + commands.entity(pond_ent).replace_children(&pond); + + if let Some(dbt) = player_hand.working_tile + && player_hand.turn_state == jong_db::TurnState::Tsumo + { + commands.spawn((Drawn, Tile::from(&dbt.tile), TileId(dbt.id))); + } + + next_turnstate.set(player_hand.turn_state.into()); +} diff --git a/jong/src/riichi/connection.rs b/jong/src/riichi/connection.rs index c6d220b..b869105 100644 --- a/jong/src/riichi/connection.rs +++ b/jong/src/riichi/connection.rs @@ -8,9 +8,6 @@ pub(crate) fn on_connect(stdb: SpacetimeDB, mut messages: ReadStdbConnectedMessa for msg in messages.read() { info!("you're now jongline"); - // FIXME hack that doesn't work for startup crash? - while stdb.try_identity().is_none() {} - debug!("with identity: {}", stdb.identity()); creds_store() .save(&msg.access_token) diff --git a/jong/src/riichi/player.rs b/jong/src/riichi/player.rs index 8b6225d..3ae2681 100644 --- a/jong/src/riichi/player.rs +++ b/jong/src/riichi/player.rs @@ -13,6 +13,13 @@ pub struct MainPlayer; #[derive(Component)] pub struct CurrentPlayer; +#[derive(Component)] +pub struct TopLord; +#[derive(Component)] +pub struct RightLord; +#[derive(Component)] +pub struct LeftLord; + #[derive(Component, PartialEq, Eq, Debug)] pub struct TileId(pub u32);