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,
|
outcome: outcome,
|
||||||
hit_location: hitLocation,
|
hit_location: hitLocation,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
uiStore.showInfo('Submitting outcome...', 2000)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|||||||
@ -13,12 +13,13 @@
|
|||||||
* - Integration with game store
|
* - 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 { io, Socket } from 'socket.io-client'
|
||||||
import type {
|
import type {
|
||||||
TypedSocket,
|
TypedSocket,
|
||||||
ClientToServerEvents,
|
ClientToServerEvents,
|
||||||
ServerToClientEvents,
|
ServerToClientEvents,
|
||||||
|
PlayResult,
|
||||||
} from '~/types'
|
} from '~/types'
|
||||||
import { useAuthStore } from '~/store/auth'
|
import { useAuthStore } from '~/store/auth'
|
||||||
import { useGameStore } from '~/store/game'
|
import { useGameStore } from '~/store/game'
|
||||||
@ -333,6 +334,31 @@ export function useWebSocket() {
|
|||||||
uiStore.showSuccess('Outcome submitted. Resolving play...', 3000)
|
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
|
// Substitution Events
|
||||||
// ========================================
|
// ========================================
|
||||||
|
|||||||
@ -411,12 +411,10 @@ const handleSubmitOutcome = async (data: { outcome: PlayOutcome; hitLocation?: s
|
|||||||
console.log('[Game Page] Submitting outcome:', data)
|
console.log('[Game Page] Submitting outcome:', data)
|
||||||
try {
|
try {
|
||||||
await actions.submitManualOutcome(
|
await actions.submitManualOutcome(
|
||||||
pendingRoll.value!,
|
|
||||||
data.outcome,
|
data.outcome,
|
||||||
data.hitLocation
|
data.hitLocation
|
||||||
)
|
)
|
||||||
// Clear pending roll after submission
|
// Pending roll will be cleared by backend after successful submission
|
||||||
gameStore.clearPendingRoll()
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[Game Page] Failed to submit outcome:', error)
|
console.error('[Game Page] Failed to submit outcome:', error)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user