CLAUDE: Connect gameplay loop - dice rolling and play resolution
Frontend changes to complete gameplay loop connection: - Fixed useGameActions.ts submitManualOutcome() signature to match backend API - Added play_resolved WebSocket event handler to useWebSocket.ts - Fixed game page handleSubmitOutcome() to call submitManualOutcome() correctly - Added missing imports (readonly, PlayResult) to useWebSocket.ts Backend handlers already implemented (Phase 3E-Final): - roll_dice: Rolls dice and broadcasts results to game room - submit_manual_outcome: Validates outcome, resolves play, broadcasts result - play_resolved: Emitted after successful play resolution Workflow now complete: 1. User clicks "Roll Dice" → frontend emits roll_dice event 2. Backend rolls dice → broadcasts dice_rolled event 3. Frontend displays dice results → user reads card 4. User selects outcome → frontend emits submit_manual_outcome 5. Backend validates & resolves → broadcasts play_resolved event 6. Frontend displays play result → updates game state Ready for end-to-end testing of complete at-bat workflow. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
9b30d3dfb2
commit
58b5deb88e
@ -170,6 +170,8 @@ export function useGameActions(gameId?: string) {
|
||||
outcome: outcome,
|
||||
hit_location: hitLocation,
|
||||
})
|
||||
|
||||
uiStore.showInfo('Submitting outcome...', 2000)
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
|
||||
@ -13,12 +13,13 @@
|
||||
* - Integration with game store
|
||||
*/
|
||||
|
||||
import { ref, computed, watch, onUnmounted } from 'vue'
|
||||
import { ref, computed, watch, onUnmounted, readonly } from 'vue'
|
||||
import { io, Socket } from 'socket.io-client'
|
||||
import type {
|
||||
TypedSocket,
|
||||
ClientToServerEvents,
|
||||
ServerToClientEvents,
|
||||
PlayResult,
|
||||
} from '~/types'
|
||||
import { useAuthStore } from '~/store/auth'
|
||||
import { useGameStore } from '~/store/game'
|
||||
@ -333,6 +334,31 @@ export function useWebSocket() {
|
||||
uiStore.showSuccess('Outcome submitted. Resolving play...', 3000)
|
||||
})
|
||||
|
||||
socketInstance.on('play_resolved', (data) => {
|
||||
console.log('[WebSocket] Play resolved:', data.description)
|
||||
|
||||
// Convert to PlayResult and add to game store
|
||||
const playResult: PlayResult = {
|
||||
play_number: data.play_number,
|
||||
outcome: data.outcome,
|
||||
hit_location: data.hit_location,
|
||||
description: data.description,
|
||||
outs_recorded: data.outs_recorded,
|
||||
runs_scored: data.runs_scored,
|
||||
batter_result: data.batter_result,
|
||||
runners_advanced: data.runners_advanced,
|
||||
is_hit: data.is_hit,
|
||||
is_out: data.is_out,
|
||||
is_walk: data.is_walk,
|
||||
roll_id: data.roll_id,
|
||||
x_check_details: data.x_check_details,
|
||||
}
|
||||
|
||||
gameStore.setLastPlayResult(playResult)
|
||||
gameStore.addPlayToHistory(playResult)
|
||||
uiStore.showSuccess(data.description, 5000)
|
||||
})
|
||||
|
||||
// ========================================
|
||||
// Substitution Events
|
||||
// ========================================
|
||||
|
||||
@ -411,12 +411,10 @@ const handleSubmitOutcome = async (data: { outcome: PlayOutcome; hitLocation?: s
|
||||
console.log('[Game Page] Submitting outcome:', data)
|
||||
try {
|
||||
await actions.submitManualOutcome(
|
||||
pendingRoll.value!,
|
||||
data.outcome,
|
||||
data.hitLocation
|
||||
)
|
||||
// Clear pending roll after submission
|
||||
gameStore.clearPendingRoll()
|
||||
// Pending roll will be cleared by backend after successful submission
|
||||
} catch (error) {
|
||||
console.error('[Game Page] Failed to submit outcome:', error)
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user