-
- {!hideNav &&
}
+ {/* floating rounded navbar (matches the home screen) */}
+ {!hideNav && (
+
+ )}
);
}
diff --git a/src/lib/game-store.ts b/src/lib/game-store.ts
index fcdd3f3..f5cf8d2 100644
--- a/src/lib/game-store.ts
+++ b/src/lib/game-store.ts
@@ -32,10 +32,8 @@ export const TIMING = {
/** Base turn time (starter league / vs-AI). Higher leagues use less — see
* `turnMsForStake`. Kept for reference; scheduling derives the real value. */
export const TURN_MS = 15000;
-/** Grace period to wait for a disconnected player to return. */
+/** Grace period to wait for a disconnected player to return (live games). */
export const RECONNECT_MS = 15000;
-/** Per-turn chance an online opponent briefly drops (mock). */
-const DISCONNECT_CHANCE = 0.07;
export type GameMode = "ai" | "online";
@@ -267,27 +265,10 @@ export const useGameStore = create
((set, get) => {
scheduleAuto();
}, turnMs);
} else {
- const st = get();
- if (
- st.mode === "online" &&
- st.disconnectedSeat == null &&
- Math.random() < DISCONNECT_CHANCE
- ) {
- // simulate this opponent dropping; wait for them, then they return
- set({
- turnDeadline: null,
- disconnectedSeat: seat,
- reconnectDeadline: Date.now() + RECONNECT_MS,
- });
- const back = Math.floor(RECONNECT_MS * (0.4 + Math.random() * 0.45));
- pending = setTimeout(() => {
- set({ disconnectedSeat: null, reconnectDeadline: null });
- playSeatAI(seat);
- }, back);
- } else {
- set({ turnDeadline: null });
- pending = setTimeout(() => playSeatAI(seat), fast(TIMING.aiPlay));
- }
+ // Opponents (bots / filled seats) simply auto-play their turn — no
+ // simulated disconnects, no pause, no banner.
+ set({ turnDeadline: null });
+ pending = setTimeout(() => playSeatAI(seat), fast(TIMING.aiPlay));
}
break;
}