feat: add consecutive match tracking system for escalating celebrations

Add consecutive match tracking to memory pairs game context to enable
escalating celebration effects based on player streaks:

- Add consecutiveMatches state field to track streaks per player
- Increment consecutive matches on successful pairs
- Reset consecutive matches when player turn switches (failed match)
- Initialize consecutive matches for all players on game start

This provides the foundation for visual celebration escalation based
on player performance streaks.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Thomas Hallock
2025-09-29 10:49:15 -05:00
parent 876ace50ec
commit 111c0ced71
2 changed files with 21 additions and 2 deletions

View File

@@ -34,6 +34,7 @@ const initialState: MemoryPairsState = {
moves: 0,
scores: {},
activePlayers: [],
consecutiveMatches: {},
// Timing
gameStartTime: null,
@@ -73,10 +74,12 @@ function memoryPairsReducer(state: MemoryPairsState, action: MemoryPairsAction):
}
case 'START_GAME':
// Initialize scores for all active players
// Initialize scores and consecutive matches for all active players
const scores: PlayerScore = {}
const consecutiveMatches: { [playerId: number]: number } = {}
action.activePlayers.forEach(playerId => {
scores[playerId] = 0
consecutiveMatches[playerId] = 0
})
return {
@@ -88,6 +91,7 @@ function memoryPairsReducer(state: MemoryPairsState, action: MemoryPairsAction):
matchedPairs: 0,
moves: 0,
scores,
consecutiveMatches,
activePlayers: action.activePlayers,
currentPlayer: action.activePlayers[0] || 1,
gameStartTime: Date.now(),
@@ -135,6 +139,11 @@ function memoryPairsReducer(state: MemoryPairsState, action: MemoryPairsAction):
[state.currentPlayer]: (state.scores[state.currentPlayer] || 0) + 1
}
const newConsecutiveMatches = {
...state.consecutiveMatches,
[state.currentPlayer]: (state.consecutiveMatches[state.currentPlayer] || 0) + 1
}
// Check if game is complete
const isGameComplete = newMatchedPairs === state.totalPairs
@@ -143,6 +152,7 @@ function memoryPairsReducer(state: MemoryPairsState, action: MemoryPairsAction):
gameCards: updatedCards,
matchedPairs: newMatchedPairs,
scores: newScores,
consecutiveMatches: newConsecutiveMatches,
flippedCards: [],
moves: state.moves + 1,
lastMatchedPair: action.cardIds,
@@ -169,9 +179,17 @@ function memoryPairsReducer(state: MemoryPairsState, action: MemoryPairsAction):
// Cycle through all active players
const currentIndex = state.activePlayers.indexOf(state.currentPlayer)
const nextIndex = (currentIndex + 1) % state.activePlayers.length
// Reset consecutive matches for the player who failed
const newConsecutiveMatches = {
...state.consecutiveMatches,
[state.currentPlayer]: 0
}
return {
...state,
currentPlayer: state.activePlayers[nextIndex] || state.activePlayers[0]
currentPlayer: state.activePlayers[nextIndex] || state.activePlayers[0],
consecutiveMatches: newConsecutiveMatches
}
}

View File

@@ -59,6 +59,7 @@ export interface MemoryPairsState {
moves: number
scores: PlayerScore
activePlayers: Player[] // Track active player IDs
consecutiveMatches: { [playerId: number]: number } // Track consecutive matches per player
// Timing
gameStartTime: number | null