From 5ebf3f6c058484b13a8bc192d7333e6dc71e97d3 Mon Sep 17 00:00:00 2001 From: Tao Tien <29749622+taotien@users.noreply.github.com> Date: Tue, 24 Feb 2026 19:36:39 -0800 Subject: [PATCH] (bug) player now also advances game, but can double discard --- jong-line/src/reducers.rs | 6 +++--- jong-line/src/tables.rs | 2 +- jong/src/riichi.rs | 4 +++- jong/src/tui.rs | 6 +++++- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/jong-line/src/reducers.rs b/jong-line/src/reducers.rs index 83fad96..2929b85 100644 --- a/jong-line/src/reducers.rs +++ b/jong-line/src/reducers.rs @@ -19,9 +19,9 @@ pub fn advance_game(ctx: &ReducerContext, mut game_timer: GameTimer) -> Result<( // checks every second (or more? when users make moves) on whether to advance the game's various states // TODO this, or allow player/debug to call this? - if !ctx.sender_auth().is_internal() { - return Err("This reducer can only be called by the scheduler".to_string()); - } + // if !ctx.sender_auth().is_internal() { + // return Err("This reducer can only be called by the scheduler".to_string()); + // } if let Some(mut lobby) = ctx.db.lobby().id().find(game_timer.lobby_id) { trace!("running schedule for lobby {}", lobby.id); diff --git a/jong-line/src/tables.rs b/jong-line/src/tables.rs index 52c49ba..b851d5f 100644 --- a/jong-line/src/tables.rs +++ b/jong-line/src/tables.rs @@ -108,7 +108,7 @@ pub struct Bot { pub working_tile: Option, } -#[table(name = game_timer, scheduled(advance_game))] +#[table(name = game_timer, scheduled(advance_game), public)] pub struct GameTimer { #[primary_key] #[auto_inc] diff --git a/jong/src/riichi.rs b/jong/src/riichi.rs index d5ae098..fa0d772 100644 --- a/jong/src/riichi.rs +++ b/jong/src/riichi.rs @@ -4,7 +4,7 @@ use bevy_spacetimedb::{ ReadUpdateMessage, StdbPlugin, }; -use jong_db::{self, add_bot, set_ready}; +use jong_db::{self, GameTimerTableAccess, add_bot, set_ready}; use jong_db::{ BotTableAccess, DbConnection, LobbyTableAccess, PlayerHand, PlayerTableAccess, RemoteTables, ViewClosedHandsTableAccess, ViewHandTableAccess, @@ -26,6 +26,7 @@ impl Plugin for Riichi { .with_run_fn(DbConnection::run_threaded) .add_table(RemoteTables::player) .add_table(RemoteTables::lobby) + .add_table(RemoteTables::game_timer) // TODO check bevy_spacetimedb PR status .add_view_with_pk(RemoteTables::view_hand, |p| p.id) .add_view_with_pk(RemoteTables::view_closed_hands, |p| { @@ -102,6 +103,7 @@ fn subscriptions(stdb: SpacetimeDB, mut commands: Commands) { "SELECT b.* FROM bot b JOIN lobby l ON l.id = b.lobby_id".to_string(), "SELECT * FROM view_hand".to_string(), "SELECT * FROM view_closed_hands".to_string(), + "SELECT g.* FROM game_timer g JOIN player p ON g.lobby_id = p.lobby_id".to_string(), ]); while let Ok(event) = recv.recv() { diff --git a/jong/src/tui.rs b/jong/src/tui.rs index 75df4b8..6b17733 100644 --- a/jong/src/tui.rs +++ b/jong/src/tui.rs @@ -4,10 +4,11 @@ use std::time::Duration; use bevy::{app::ScheduleRunnerPlugin, prelude::*, state::app::StatesPlugin}; use bevy_ratatui::RatatuiPlugins; +use spacetimedb_sdk::Table; use tui_logger::TuiWidgetState; use jong::{SpacetimeDB, riichi::player::*}; -use jong_db::{self, discard_tile as _}; +use jong_db::{self, GameTimerTableAccess, advance_game, discard_tile as _}; use jong_types::states::{GameState, TurnState}; mod input; @@ -109,6 +110,9 @@ fn discard_tile( while let Some(message) = selected.read().next() { if let Ok(tile_id) = tiles.get(message.0) { stdb.reducers().discard_tile(tile_id.0).unwrap(); + stdb.reducers() + .advance_game(stdb.db().game_timer().iter().next().unwrap()) + .unwrap(); commands.entity(drawn.0).remove::(); } }