diff --git a/client/app.js b/client/app.js index 086e1aa..28c6009 100644 --- a/client/app.js +++ b/client/app.js @@ -56,6 +56,9 @@ class GolfGame { // Track opponent discard animation in progress (prevent renderGame from updating discard) this.opponentDiscardAnimating = false; + // Track deal animation in progress (suppress flip prompts until dealing complete) + this.dealAnimationInProgress = false; + // Track round winners for visual highlight this.roundWinnerNames = new Set(); @@ -1510,11 +1513,16 @@ class GolfGame { this.playerCards.style.visibility = 'hidden'; this.opponentsRow.style.visibility = 'hidden'; + // Suppress flip prompts until dealing complete + this.dealAnimationInProgress = true; + if (window.cardAnimations) { window.cardAnimations.animateDealing( this.gameState, (playerId, cardIdx) => this.getCardSlotRect(playerId, cardIdx), () => { + // Deal complete - allow flip prompts + this.dealAnimationInProgress = false; // Show real cards this.playerCards.style.visibility = 'visible'; this.opponentsRow.style.visibility = 'visible'; @@ -1525,6 +1533,7 @@ class GolfGame { ); } else { // Fallback + this.dealAnimationInProgress = false; this.playerCards.style.visibility = 'visible'; this.opponentsRow.style.visibility = 'visible'; this.playSound('shuffle'); @@ -3386,7 +3395,8 @@ class GolfGame { // Update deck/discard clickability and visual state // Use visual check so indicators sync with opponent swap animation const hasDrawn = this.drawnCard || this.gameState.has_drawn_card; - const canDraw = this.isVisuallyMyTurn() && !hasDrawn && !this.gameState.waiting_for_initial_flip; + const isRoundActive = this.gameState.phase !== 'round_over' && this.gameState.phase !== 'game_over'; + const canDraw = isRoundActive && this.isVisuallyMyTurn() && !hasDrawn && !this.gameState.waiting_for_initial_flip; // Pulse the deck area when it's player's turn to draw const wasTurnToDraw = this.deckArea.classList.contains('your-turn-to-draw'); @@ -3516,8 +3526,8 @@ class GolfGame { this.renderPairIndicators(); // Show flip prompt for initial flip - // Show flip prompt during initial flip phase - if (this.gameState.waiting_for_initial_flip) { + // Show flip prompt during initial flip phase (but not during deal animation) + if (this.gameState.waiting_for_initial_flip && !this.dealAnimationInProgress) { const requiredFlips = this.gameState.initial_flips || 2; const flippedCount = this.locallyFlippedCards.size; const remaining = requiredFlips - flippedCount; diff --git a/client/timing-config.js b/client/timing-config.js index fee2202..5b09e72 100644 --- a/client/timing-config.js +++ b/client/timing-config.js @@ -75,26 +75,26 @@ const TIMING = { // V3_03: Round end reveal timing reveal: { - voluntaryWindow: 4000, // Time for players to flip their own cards - initialPause: 500, // Pause before auto-reveals start - cardStagger: 100, // Between cards in same hand - playerPause: 400, // Pause after each player's reveal - highlightDuration: 200, // Player area highlight fade-in + voluntaryWindow: 2000, // Time for players to flip their own cards + initialPause: 250, // Pause before auto-reveals start + cardStagger: 50, // Between cards in same hand + playerPause: 200, // Pause after each player's reveal + highlightDuration: 100, // Player area highlight fade-in }, // V3_04: Pair celebration celebration: { - pairDuration: 400, // Celebration animation length - pairDelay: 50, // Slight delay before celebration + pairDuration: 200, // Celebration animation length + pairDelay: 25, // Slight delay before celebration }, // V3_07: Score tallying animation tally: { - initialPause: 200, // After reveal, before tally - cardHighlight: 140, // Duration to show each card value - columnPause: 100, // Between columns - pairCelebration: 300, // Pair cancel effect - playerPause: 350, // Between players + initialPause: 100, // After reveal, before tally + cardHighlight: 70, // Duration to show each card value + columnPause: 30, // Between columns + pairCelebration: 200, // Pair cancel effect + playerPause: 50, // Between players finalScoreReveal: 400, // Final score animation },