view_hand to bevy hand children logic

This commit is contained in:
Tao Tien 2026-02-10 01:01:01 -08:00
parent 47735931b4
commit 6f3d27a6f6

View file

@ -9,7 +9,8 @@ use spacetimedb::Identity;
use spacetimedb_sdk::{DbContext, Table, credentials}; use spacetimedb_sdk::{DbContext, Table, credentials};
use crate::{ use crate::{
SpacetimeDB, creds_store, game, SpacetimeDB, creds_store,
game::{self, player::Player},
stdb::{ stdb::{
self, DbConnection, HandTableAccess, LobbyTableAccess, PlayerTableAccess, RemoteTables, self, DbConnection, HandTableAccess, LobbyTableAccess, PlayerTableAccess, RemoteTables,
ViewPlayerHandTableAccess, add_bot, join_or_create_lobby, login_or_add_player, 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(Update, on_lobby_insert_update)
.add_systems(OnEnter(GameState::Setup), join_or_create_lobby) .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)))
.add_systems(Update, (view_hand).run_if(in_state(GameState::Play)))
// semicolon stopper // semicolon stopper
; ;
} }
} }
fn view_hand(
stdb: SpacetimeDB,
mut commands: Commands,
// hand: Populated<&mut Children, With<Hand>>,
) {
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) { fn on_connect(stdb: SpacetimeDB, mut messages: ReadStdbConnectedMessage, mut commands: Commands) {
for msg in messages.read() { for msg in messages.read() {
info!("you're now jongline"); info!("you're now jongline");
@ -138,9 +127,26 @@ fn on_player_insert_update(
mut messages: ReadInsertUpdateMessage<stdb::Player>, mut messages: ReadInsertUpdateMessage<stdb::Player>,
mut commands: Commands, mut commands: Commands,
mut player: Option<Single<&mut player::Player>>,
) { ) {
use player::*;
for msg in messages.read() { for msg in messages.read() {
debug!("player_insert_update msg:\n{:#?}", msg.new); 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 => { stdb::GameState::Play => {
trace!("game entered 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::<Vec<_>>();
commands.spawn(Hand).add_children(&tiles);
} else {
error!("entered play without a hand")
}
} }
stdb::GameState::Exit => { stdb::GameState::Exit => {
trace!("game enetered 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<Entity, With<Hand>>,
) {
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::<Vec<_>>();
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::<Vec<_>>();
commands.entity(*hand_ent).replace_children(&tiles);
}
}