use spacetimedb::{ReducerContext, Table, ViewContext, reducer, view}; use crate::tables::{player::player, *}; use jong_types::*; pub fn deal_hands(ctx: &ReducerContext, lobby_id: u32) { let players = ctx.db.player().lobby_id().filter(lobby_id); let bots = ctx.db.bot().lobby_id().filter(lobby_id); let mut wall = ctx.db.wall().lobby_id().find(lobby_id).unwrap(); // FIXME rectify deal orders for mut player in players { let mut tiles = wall.tiles.split_off(wall.tiles.len() - 13); wall = ctx.db.wall().lobby_id().update(wall); tiles.sort_by_key(|t| t.tile); player.hand = tiles; ctx.db.player().id().update(player); } for mut bot in bots { let mut tiles = wall.tiles.split_off(wall.tiles.len() - 13); wall = ctx.db.wall().lobby_id().update(wall); tiles.sort_by_key(|t| t.tile); bot.hand = tiles; ctx.db.bot().id().update(bot); } } #[reducer] pub fn draw_tile(ctx: &ReducerContext) { let mut player = ctx.db.player().identity().find(ctx.sender).unwrap(); let mut wall = ctx.db.wall().lobby_id().find(player.lobby_id).unwrap(); // TODO if no more tiles, exhaust somehow player.drawn_tile = wall.tiles.pop(); ctx.db.wall().lobby_id().update(wall); ctx.db.player().id().update(player); } // #[view(name = view_player_hand, public)] // pub fn view_player_hand(ctx: &ViewContext) -> Option { // ctx.db // .player() // .identity() // .find(ctx.sender) // .map(|p| ctx.db.hand().id().find(p.hand_id))? // } // #[reducer] // pub fn sort_hand(ctx: &ReducerContext) { // todo!() // }