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:
Cal Corum 2025-11-20 23:55:19 -06:00
parent 9b30d3dfb2
commit 58b5deb88e
3 changed files with 30 additions and 4 deletions

View File

@ -170,6 +170,8 @@ export function useGameActions(gameId?: string) {
outcome: outcome,
hit_location: hitLocation,
})
uiStore.showInfo('Submitting outcome...', 2000)
}
// ============================================================================

View File

@ -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
// ========================================

View File

@ -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)
}