From ea08ff9a5ba4b50c45250dcfd1e7319700fda7c8 Mon Sep 17 00:00:00 2001 From: beo3000 Date: Sat, 27 Dec 2025 19:14:36 +0100 Subject: [PATCH] fix throwhandle: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zusammenfassung der Fixes: 1. Fix 1 (HandlePinClick und HandleNumberClick): _hasModifiedPins = true wird jetzt VOR dem Dispatch gesetzt, um zu verhindern, dass OnGameStateChanged den Before-State während der Pin-Modifikation überschreibt. 2. Fix 2 (ConfirmThrow): Nach dem Dispatch wird explizit CaptureBeforeThrowState() aufgerufen. Das ist der wichtigste Fix: - Nach RecordThrowAction Dispatch sind alle Reducer/Effects durchgelaufen - Der State ist bereits mit den neuen Pin-Zuständen aktualisiert - _beforeThrowState wird mit dem NEUEN Zustand für den nächsten Wurf erfasst Vorher wurde _beforeThrowState nie nach einem Wurf aktualisiert (weil _hasModifiedPins zum falschen Zeitpunkt gesetzt war), sodass beim zweiten Wurf der stale Before-State verwendet wurde. --- src/Koogle.Web/Components/Game/GameInputPanel.razor | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Koogle.Web/Components/Game/GameInputPanel.razor b/src/Koogle.Web/Components/Game/GameInputPanel.razor index 3db5d3d..3609731 100644 --- a/src/Koogle.Web/Components/Game/GameInputPanel.razor +++ b/src/Koogle.Web/Components/Game/GameInputPanel.razor @@ -208,8 +208,8 @@ var newStatus = currentStatus == PinStatus.Standing ? PinStatus.Fallen : PinStatus.Standing; - Dispatcher.Dispatch(new SetPinStatusAction(pinNumber, newStatus)); _hasModifiedPins = true; + Dispatcher.Dispatch(new SetPinStatusAction(pinNumber, newStatus)); _selectedNumber = null; } @@ -224,15 +224,16 @@ newState = newState.SetPin(i, status); } + // Set flag BEFORE dispatching to prevent CaptureBeforeThrowState in StateChanged + _hasModifiedPins = true; + _selectedNumber = number; + // Dispatch individual pin updates to match the new state for (int i = 1; i <= 9; i++) { var targetStatus = i <= number ? PinStatus.Fallen : PinStatus.Standing; Dispatcher.Dispatch(new SetPinStatusAction(i, targetStatus)); } - - _selectedNumber = number; - _hasModifiedPins = true; } private void HandleBellClick() @@ -276,9 +277,11 @@ // Dispatch record throw action - game logic will handle pin reset and player rotation Dispatcher.Dispatch(new RecordThrowAction(beforeState, currentThrowPanel, isGutter, isLeftGutter)); - // Reset local state + // Reset local state and capture new before-state for next throw + // (Dispatch is synchronous, so state is already updated with pin reset) _selectedNumber = null; _hasModifiedPins = false; + CaptureBeforeThrowState(); // Notify parent (for timer/tab switching) await OnThrowCompleted.InvokeAsync(result);