fix throwhandle:

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.
This commit is contained in:
beo3000 2025-12-27 19:14:36 +01:00
parent e50b13f092
commit ea08ff9a5b
1 changed files with 8 additions and 5 deletions

View File

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