diff --git a/KoogleApp/Games/GameProgressExtension.cs b/KoogleApp/Games/GameProgressExtension.cs index e0f439c..f03275b 100644 --- a/KoogleApp/Games/GameProgressExtension.cs +++ b/KoogleApp/Games/GameProgressExtension.cs @@ -12,5 +12,86 @@ namespace KoogleApp.Games } return false; } + + public static bool IsCircle(this GameProgress progress) + { + var res = 0; + var possible = progress.BeforeThrowState.Pin5State == PinStatus.Standing && progress.AfterThrowState.Pin5State == PinStatus.Standing; + if (progress.BeforeThrowState.Pin1State == PinStatus.Standing && progress.AfterThrowState.Pin1State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin2State == PinStatus.Standing && progress.AfterThrowState.Pin2State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin3State == PinStatus.Standing && progress.AfterThrowState.Pin3State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin4State == PinStatus.Standing && progress.AfterThrowState.Pin4State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin6State == PinStatus.Standing && progress.AfterThrowState.Pin6State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin7State == PinStatus.Standing && progress.AfterThrowState.Pin7State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin8State == PinStatus.Standing && progress.AfterThrowState.Pin8State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin9State == PinStatus.Standing && progress.AfterThrowState.Pin9State == PinStatus.Fallen) + { + res++; + } + return res == 8 && possible; + } + + public static int PinCount(this GameProgress progress) + { + var res = 0; + if (progress.BeforeThrowState.Pin1State == PinStatus.Standing && progress.AfterThrowState.Pin1State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin2State == PinStatus.Standing && progress.AfterThrowState.Pin2State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin3State == PinStatus.Standing && progress.AfterThrowState.Pin3State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin4State == PinStatus.Standing && progress.AfterThrowState.Pin4State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin5State == PinStatus.Standing && progress.AfterThrowState.Pin5State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin6State == PinStatus.Standing && progress.AfterThrowState.Pin6State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin7State == PinStatus.Standing && progress.AfterThrowState.Pin7State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin8State == PinStatus.Standing && progress.AfterThrowState.Pin8State == PinStatus.Fallen) + { + res++; + } + if (progress.BeforeThrowState.Pin9State == PinStatus.Standing && progress.AfterThrowState.Pin9State == PinStatus.Fallen) + { + res++; + } + return res; + } } } diff --git a/KoogleApp/Games/Training/BoardTraining.razor b/KoogleApp/Games/Training/BoardTraining.razor index d3fa745..3975f09 100644 --- a/KoogleApp/Games/Training/BoardTraining.razor +++ b/KoogleApp/Games/Training/BoardTraining.razor @@ -20,6 +20,8 @@ Spieler Würfe + Kegel + Kränze @@ -28,6 +30,8 @@ @PlayersState.GetName(item.Key) @item.Value.ThrowCount + @item.Value.PinCount + @item.Value.CircleCount } diff --git a/KoogleApp/Games/Training/GameTrainingService.cs b/KoogleApp/Games/Training/GameTrainingService.cs index 27a55a8..b895316 100644 --- a/KoogleApp/Games/Training/GameTrainingService.cs +++ b/KoogleApp/Games/Training/GameTrainingService.cs @@ -58,7 +58,9 @@ namespace KoogleApp.Games.Training var tm = ts.Throws[playerId]; ts.Throws[playerId] = tm with { - ThrowCount = tm.ThrowCount+1 + ThrowCount = tm.ThrowCount + 1, + PinCount = tm.PinCount + progress.PinCount(), + CircleCount = tm.CircleCount + Convert.ToInt32(progress.IsCircle()) }; var newModel = ((TrainingState)(progress.GameModel)) with { Throws = ts.Throws }; diff --git a/KoogleApp/Store/Game/ThrowPanel/Actions.cs b/KoogleApp/Store/Game/ThrowPanel/Actions.cs index c7ecb85..7b8280e 100644 --- a/KoogleApp/Store/Game/ThrowPanel/Actions.cs +++ b/KoogleApp/Store/Game/ThrowPanel/Actions.cs @@ -37,7 +37,7 @@ namespace KoogleApp.Store.Game.ThrowPanel public record ThrowAction(bool LeftSink, bool RightSink, ParticipantsState ParticipantsState); - public record ThrowUpdateAction(bool LeftSink, bool RightSink); + public record ThrowUpdateAction(ThrowPanelState State); public record UpdateStateAfterUndoRedo(ThrowPanelState ThrowPanelState, ParticipantsState ParticipantsState); @@ -46,7 +46,8 @@ namespace KoogleApp.Store.Game.ThrowPanel public record GameProgress(ThrowPanelState? BeforeThrowState, ParticipantsState? BeforeParticipantsState, ThrowPanelState AfterThrowState, ParticipantsState AfterParticipantsState, - StartParams StartParams, IGameModel GameModel); + StartParams StartParams, IGameModel GameModel, + ThrowPanelState? NextThrowState); public record DeleteThrowPanelSessionAction(); diff --git a/KoogleApp/Store/Game/ThrowPanel/Effects.cs b/KoogleApp/Store/Game/ThrowPanel/Effects.cs index 3cb9675..799ecf2 100644 --- a/KoogleApp/Store/Game/ThrowPanel/Effects.cs +++ b/KoogleApp/Store/Game/ThrowPanel/Effects.cs @@ -151,33 +151,32 @@ namespace KoogleApp.Store.Game.ThrowPanel [EffectMethod] public async Task HandleThrowAction(ThrowAction throwAction, IDispatcher dispatcher) { - - var beforeStates = dataService.GetCurrentData(); // change ThrowStatus and save - here we need to save the old state, before it is changed by ThrowUpdateAction, so that undo/redo works correctly dispatcher.Dispatch(new EnsureBeforeThrowStatusAction(throwAction.ParticipantsState, beforeStates.Status.GameModel)); - // perform throw - dispatcher.Dispatch(new ThrowUpdateAction(throwAction.LeftSink, throwAction.RightSink)); - - var afterState = throwPanelState.Value; + // perform throw - we will get the new state after resetting all pins for the next throw. + // For the calculation of the game-progress in HandleThrow nextState if normally not useful + var nextState = throwPanelState.Value.CalculateNextPanelState(); + dispatcher.Dispatch(new ThrowUpdateAction(nextState)); - var progress = new GameProgress( + var generalGameProgress = new GameProgress( BeforeThrowState: beforeStates.Status?.ThrowPanelState, BeforeParticipantsState: throwAction.ParticipantsState, - AfterThrowState: afterState, + AfterThrowState: throwPanelState.Value, AfterParticipantsState: throwAction.ParticipantsState, StartParams: dataService.StartParams, - GameModel: beforeStates.Status.GameModel); + GameModel: beforeStates.Status.GameModel, + NextThrowState: nextState); - dispatcher.Dispatch(progress); // currently unused + dispatcher.Dispatch(generalGameProgress); // currently unused - var participants = throwAction.ParticipantsState; + //var participants = throwAction.ParticipantsState; + var gameSpecificProgress = gameService.HandleThrow(generalGameProgress, dispatcher); - var progress2 = gameService.HandleThrow(progress, dispatcher); //foreach (var action in actions) //{ // if (action is SelectedNextPlayerIds) @@ -191,7 +190,8 @@ namespace KoogleApp.Store.Game.ThrowPanel // save again - save the new state after the throw - dispatcher.Dispatch(new TriggerNewThrowPanelStateChangedAction(true, progress2.AfterParticipantsState, progress2.GameModel)); // this will trigger ThrowPanelStateChangedAction with the new state (not current _throwPanelState.Value) + dispatcher.Dispatch(new TriggerNewThrowPanelStateChangedAction(true, + gameSpecificProgress.AfterParticipantsState, gameSpecificProgress.GameModel)); // this will trigger ThrowPanelStateChangedAction with the new state (not current _throwPanelState.Value) } diff --git a/KoogleApp/Store/Game/ThrowPanel/Extensions.cs b/KoogleApp/Store/Game/ThrowPanel/Extensions.cs new file mode 100644 index 0000000..b14ea56 --- /dev/null +++ b/KoogleApp/Store/Game/ThrowPanel/Extensions.cs @@ -0,0 +1,78 @@ +namespace KoogleApp.Store.Game.ThrowPanel +{ + class PinState(PinStatus pinStatus) + { + public PinStatus PinStatus { get; set; } = pinStatus; + } + + public static class ThrowPanelStateExtensions + { + public static ThrowPanelState CalculateNextPanelState(this ThrowPanelState state) + { + var nextCounter = 1; + var reset = true; + if (state.ThrowCounterPerRound < state.ThrowsPerRound) + { + nextCounter = state.ThrowCounterPerRound + 1; + reset = state.ThrowMode != ThrowMode.Decrease; + } + + var _pins = new List + { + new(state.Pin9State), new(state.Pin8State), + new(state.Pin7State), + new(state.Pin6State), + new(state.Pin5State), + new(state.Pin4State), + new(state.Pin3State), + new(state.Pin2State), + new( state.Pin1State), + }; + + if (_pins.All(_ => _.PinStatus == PinStatus.Fallen)) // abgeräumt + { + reset = true; + } + + if (reset) + { + foreach (var pin in _pins) + { + pin.PinStatus = PinStatus.Standing; + } + } + else + { + if (state.ThrowMode == ThrowMode.Decrease) + { + foreach (var pin in _pins) + { + var nr = _pins.IndexOf(pin) + 1; + if (pin.PinStatus != PinStatus.Disabled && pin.PinStatus == PinStatus.Fallen) + { + pin.PinStatus = PinStatus.Disabled; + } + } + } + } + + + return state with + { + Pin1State = _pins[8].PinStatus, + Pin2State = _pins[7].PinStatus, + Pin3State = _pins[6].PinStatus, + Pin4State = _pins[5].PinStatus, + Pin5State = _pins[4].PinStatus, + Pin6State = _pins[3].PinStatus, + Pin7State = _pins[2].PinStatus, + Pin8State = _pins[1].PinStatus, + Pin9State = _pins[0].PinStatus, + ThrowCounterPerRound = nextCounter, + BellValue = false, + ThrowPanelStateStatus = ThrowPanelStateStatus.AfterThrow, + ThrowCounter = state.ThrowCounter + 1 + }; + } + } +} diff --git a/KoogleApp/Store/Game/ThrowPanel/Reducers.cs b/KoogleApp/Store/Game/ThrowPanel/Reducers.cs index a592e54..b91fd7c 100644 --- a/KoogleApp/Store/Game/ThrowPanel/Reducers.cs +++ b/KoogleApp/Store/Game/ThrowPanel/Reducers.cs @@ -5,7 +5,8 @@ namespace KoogleApp.Store.Game.ThrowPanel public static class ThrowPanelStateReducer { [ReducerMethod] - public static ThrowPanelState OnReceiveStateFromServer(ThrowPanelState state, ReceiveThrowPanelStateFromServerAction action) + public static ThrowPanelState OnReceiveStateFromServer(ThrowPanelState state, + ReceiveThrowPanelStateFromServerAction action) { return action.State; } @@ -52,7 +53,7 @@ namespace KoogleApp.Store.Game.ThrowPanel ThrowPanelStateStatus = ThrowPanelStateStatus.BeforeThrow }; case 7: - return state with + return state with { Pin7State = action.IsHit ? PinStatus.Fallen : PinStatus.Standing, ThrowPanelStateStatus = ThrowPanelStateStatus.BeforeThrow @@ -139,13 +140,14 @@ namespace KoogleApp.Store.Game.ThrowPanel }; } - class PinState(PinStatus pinStatus) - { - public PinStatus PinStatus { get; set; } = pinStatus; - } + //class PinState(PinStatus pinStatus) + //{ + // public PinStatus PinStatus { get; set; } = pinStatus; + //} [ReducerMethod] - public static ThrowPanelState OnUpdatePinStateByNumber(ThrowPanelState state, UpdatePinStateByNumberAction action) + public static ThrowPanelState OnUpdatePinStateByNumber(ThrowPanelState state, + UpdatePinStateByNumberAction action) { var chgCnt = 0; @@ -210,7 +212,8 @@ namespace KoogleApp.Store.Game.ThrowPanel } [ReducerMethod] - public static ThrowPanelState OnEnsureBeforeThrowStatusAction(ThrowPanelState state, EnsureBeforeThrowStatusAction action) + public static ThrowPanelState OnEnsureBeforeThrowStatusAction(ThrowPanelState state, + EnsureBeforeThrowStatusAction action) { return state with { @@ -221,71 +224,76 @@ namespace KoogleApp.Store.Game.ThrowPanel [ReducerMethod] public static ThrowPanelState OnThrowUpdateAction(ThrowPanelState state, ThrowUpdateAction action) { - var nextCounter = 1; - var reset = true; - if (state.ThrowCounterPerRound < state.ThrowsPerRound) - { - nextCounter = state.ThrowCounterPerRound + 1; - reset = state.ThrowMode != ThrowMode.Decrease; - } - - var _pins = new List - { - new(state.Pin9State), new(state.Pin8State), - new(state.Pin7State), - new(state.Pin6State), - new(state.Pin5State), - new(state.Pin4State), - new(state.Pin3State), - new(state.Pin2State), - new( state.Pin1State), - }; - - if (_pins.All(_ => _.PinStatus == PinStatus.Fallen)) // abgeräumt - { - reset = true; - } - - if (reset) - { - foreach (var pin in _pins) - { - pin.PinStatus = PinStatus.Standing; - } - } - else - { - if (state.ThrowMode == ThrowMode.Decrease) - { - foreach (var pin in _pins) - { - var nr = _pins.IndexOf(pin) + 1; - if (pin.PinStatus != PinStatus.Disabled && pin.PinStatus == PinStatus.Fallen) - { - pin.PinStatus = PinStatus.Disabled; - } - } - } - } - - - return state with - { - Pin1State = _pins[8].PinStatus, - Pin2State = _pins[7].PinStatus, - Pin3State = _pins[6].PinStatus, - Pin4State = _pins[5].PinStatus, - Pin5State = _pins[4].PinStatus, - Pin6State = _pins[3].PinStatus, - Pin7State = _pins[2].PinStatus, - Pin8State = _pins[1].PinStatus, - Pin9State = _pins[0].PinStatus, - ThrowCounterPerRound = nextCounter, - BellValue = false, - ThrowPanelStateStatus = ThrowPanelStateStatus.AfterThrow, - ThrowCounter = state.ThrowCounter + 1 - }; + return action.State; } + //[ReducerMethod] + //public static ThrowPanelState OnThrowUpdateAction(ThrowPanelState state, ThrowUpdateAction action) + //{ + // var nextCounter = 1; + // var reset = true; + // if (state.ThrowCounterPerRound < state.ThrowsPerRound) + // { + // nextCounter = state.ThrowCounterPerRound + 1; + // reset = state.ThrowMode != ThrowMode.Decrease; + // } + + // var _pins = new List + // { + // new(state.Pin9State), new(state.Pin8State), + // new(state.Pin7State), + // new(state.Pin6State), + // new(state.Pin5State), + // new(state.Pin4State), + // new(state.Pin3State), + // new(state.Pin2State), + // new( state.Pin1State), + // }; + + // if (_pins.All(_ => _.PinStatus == PinStatus.Fallen)) // abgeräumt + // { + // reset = true; + // } + + // if (reset) + // { + // foreach (var pin in _pins) + // { + // pin.PinStatus = PinStatus.Standing; + // } + // } + // else + // { + // if (state.ThrowMode == ThrowMode.Decrease) + // { + // foreach (var pin in _pins) + // { + // var nr = _pins.IndexOf(pin) + 1; + // if (pin.PinStatus != PinStatus.Disabled && pin.PinStatus == PinStatus.Fallen) + // { + // pin.PinStatus = PinStatus.Disabled; + // } + // } + // } + // } + + + // return state with + // { + // Pin1State = _pins[8].PinStatus, + // Pin2State = _pins[7].PinStatus, + // Pin3State = _pins[6].PinStatus, + // Pin4State = _pins[5].PinStatus, + // Pin5State = _pins[4].PinStatus, + // Pin6State = _pins[3].PinStatus, + // Pin7State = _pins[2].PinStatus, + // Pin8State = _pins[1].PinStatus, + // Pin9State = _pins[0].PinStatus, + // ThrowCounterPerRound = nextCounter, + // BellValue = false, + // ThrowPanelStateStatus = ThrowPanelStateStatus.AfterThrow, + // ThrowCounter = state.ThrowCounter + 1 + // }; + //} [ReducerMethod] public static ThrowPanelState OnUpdateStateAfterUndoRedo(ThrowPanelState state, UpdateStateAfterUndoRedo action) diff --git a/KoogleApp/Store/Game/ThrowTimer/Effects.cs b/KoogleApp/Store/Game/ThrowTimer/Effects.cs index 53e52a4..d076a55 100644 --- a/KoogleApp/Store/Game/ThrowTimer/Effects.cs +++ b/KoogleApp/Store/Game/ThrowTimer/Effects.cs @@ -5,6 +5,12 @@ using KoogleApp.Services; namespace KoogleApp.Store.Game.ThrowTimer { + /// + /// + /// https://learn.microsoft.com/en-us/aspnet/core/blazor/components/synchronization-context?view=aspnetcore-10.0 + /// + /// + /// public class TimerEffects(ILogger logger, IMyEventAggregator eventAggregator) { private CancellationTokenSource? _timerCancellation; diff --git a/KoogleApp/appdata.json b/KoogleApp/appdata.json index 3b0754b..d808372 100644 --- a/KoogleApp/appdata.json +++ b/KoogleApp/appdata.json @@ -15,16 +15,16 @@ "Pin8State": 0, "Pin9State": 0, "ThrowsPerRound": 3, - "ThrowCounterPerRound": 3, - "ThrowMode": 0, + "ThrowCounterPerRound": 2, + "ThrowMode": 1, "ThrowPanelStateStatus": 3, - "ThrowCounter": 2, + "ThrowCounter": 1, "DayId": 35 }, "ParticipantsState": { "PlayerIds": [ - 3, 5, + 3, 10, 12, 9 @@ -37,7 +37,7 @@ "5": { "PlayerId": 5, "TeamNr": 0, - "PinCount": 0, + "PinCount": 9, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, @@ -53,7 +53,7 @@ "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 1, + "ThrowCount": 0, "BellCount": 0 }, "10": { @@ -92,8 +92,8 @@ } } }, - "Version": 5, - "LastModified": "2025-11-25T21:04:40.615022+01:00", + "Version": 3, + "LastModified": "2025-11-26T17:43:59.6602498+01:00", "LastModifiedBy": "test1@test.de" }, "UndoHistory": [ @@ -103,212 +103,18 @@ "ThrowPanelState": { "IsStated": true, "BellValue": false, - "Pin1State": 0, - "Pin2State": 0, - "Pin3State": 0, - "Pin4State": 0, - "Pin5State": 0, - "Pin6State": 0, - "Pin7State": 0, - "Pin8State": 0, - "Pin9State": 1, - "ThrowsPerRound": 3, - "ThrowCounterPerRound": 2, - "ThrowMode": 0, - "ThrowPanelStateStatus": 2, - "ThrowCounter": 1, - "DayId": 35 - }, - "ParticipantsState": { - "PlayerIds": [ - 3, - 5, - 10, - 12, - 9 - ], - "Eliminated": [] - }, - "GameModel": { - "$type": "TrainingState", - "Throws": { - "5": { - "PlayerId": 5, - "TeamNr": 0, - "PinCount": 0, - "CircleCount": 0, - "SinkCount": 0, - "StrikeCount": 0, - "ClearedCount": 0, - "ThrowCount": 1, - "BellCount": 0 - }, - "3": { - "PlayerId": 3, - "TeamNr": 0, - "PinCount": 0, - "CircleCount": 0, - "SinkCount": 0, - "StrikeCount": 0, - "ClearedCount": 0, - "ThrowCount": 1, - "BellCount": 0 - }, - "10": { - "PlayerId": 10, - "TeamNr": 0, - "PinCount": 0, - "CircleCount": 0, - "SinkCount": 0, - "StrikeCount": 0, - "ClearedCount": 0, - "ThrowCount": 0, - "BellCount": 0 - }, - "12": { - "PlayerId": 12, - "TeamNr": 0, - "PinCount": 0, - "CircleCount": 0, - "SinkCount": 0, - "StrikeCount": 0, - "ClearedCount": 0, - "ThrowCount": 0, - "BellCount": 0 - }, - "9": { - "PlayerId": 9, - "TeamNr": 0, - "PinCount": 0, - "CircleCount": 0, - "SinkCount": 0, - "StrikeCount": 0, - "ClearedCount": 0, - "ThrowCount": 0, - "BellCount": 0 - } - } - } - }, - "Version": 4, - "LastModified": "2025-11-25T21:04:40.6119067+01:00", - "LastModifiedBy": "test1@test.de" - }, - { - "Status": { - "StartParams": null, - "ThrowPanelState": { - "IsStated": true, - "BellValue": false, - "Pin1State": 0, - "Pin2State": 0, - "Pin3State": 0, - "Pin4State": 0, - "Pin5State": 0, - "Pin6State": 0, - "Pin7State": 0, - "Pin8State": 0, - "Pin9State": 0, - "ThrowsPerRound": 3, - "ThrowCounterPerRound": 2, - "ThrowMode": 0, - "ThrowPanelStateStatus": 3, - "ThrowCounter": 1, - "DayId": 35 - }, - "ParticipantsState": { - "PlayerIds": [ - 5, - 3, - 10, - 12, - 9 - ], - "Eliminated": [] - }, - "GameModel": { - "$type": "TrainingState", - "Throws": { - "5": { - "PlayerId": 5, - "TeamNr": 0, - "PinCount": 0, - "CircleCount": 0, - "SinkCount": 0, - "StrikeCount": 0, - "ClearedCount": 0, - "ThrowCount": 1, - "BellCount": 0 - }, - "3": { - "PlayerId": 3, - "TeamNr": 0, - "PinCount": 0, - "CircleCount": 0, - "SinkCount": 0, - "StrikeCount": 0, - "ClearedCount": 0, - "ThrowCount": 1, - "BellCount": 0 - }, - "10": { - "PlayerId": 10, - "TeamNr": 0, - "PinCount": 0, - "CircleCount": 0, - "SinkCount": 0, - "StrikeCount": 0, - "ClearedCount": 0, - "ThrowCount": 0, - "BellCount": 0 - }, - "12": { - "PlayerId": 12, - "TeamNr": 0, - "PinCount": 0, - "CircleCount": 0, - "SinkCount": 0, - "StrikeCount": 0, - "ClearedCount": 0, - "ThrowCount": 0, - "BellCount": 0 - }, - "9": { - "PlayerId": 9, - "TeamNr": 0, - "PinCount": 0, - "CircleCount": 0, - "SinkCount": 0, - "StrikeCount": 0, - "ClearedCount": 0, - "ThrowCount": 0, - "BellCount": 0 - } - } - } - }, - "Version": 3, - "LastModified": "2025-11-25T21:04:29.212834+01:00", - "LastModifiedBy": "test1@test.de" - }, - { - "Status": { - "StartParams": null, - "ThrowPanelState": { - "IsStated": true, - "BellValue": false, - "Pin1State": 0, - "Pin2State": 0, - "Pin3State": 0, - "Pin4State": 0, - "Pin5State": 0, - "Pin6State": 0, - "Pin7State": 0, - "Pin8State": 0, + "Pin1State": 1, + "Pin2State": 1, + "Pin3State": 1, + "Pin4State": 1, + "Pin5State": 1, + "Pin6State": 1, + "Pin7State": 1, + "Pin8State": 1, "Pin9State": 1, "ThrowsPerRound": 3, "ThrowCounterPerRound": 1, - "ThrowMode": 0, + "ThrowMode": 1, "ThrowPanelStateStatus": 2, "ThrowCounter": 0, "DayId": 35 @@ -329,7 +135,7 @@ "5": { "PlayerId": 5, "TeamNr": 0, - "PinCount": 0, + "PinCount": 9, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, @@ -345,7 +151,7 @@ "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 1, + "ThrowCount": 0, "BellCount": 0 }, "10": { @@ -385,14 +191,14 @@ } }, "Version": 2, - "LastModified": "2025-11-25T21:04:29.205203+01:00", + "LastModified": "2025-11-26T17:43:59.6569595+01:00", "LastModifiedBy": "test1@test.de" }, { "Status": { "StartParams": { "DayId": 35, - "ThrowMode": 0, + "ThrowMode": 1, "ThrowsPerRound": 3, "Participants": [ 5, @@ -401,7 +207,7 @@ 12, 9 ], - "ParticipantsMode": 1, + "ParticipantsMode": 0, "KnownGameType": "GameTraining" }, "ThrowPanelState": { @@ -418,7 +224,7 @@ "Pin9State": 0, "ThrowsPerRound": 3, "ThrowCounterPerRound": 1, - "ThrowMode": 0, + "ThrowMode": 1, "ThrowPanelStateStatus": 1, "ThrowCounter": 0, "DayId": 35 @@ -439,7 +245,7 @@ "5": { "PlayerId": 5, "TeamNr": 0, - "PinCount": 0, + "PinCount": 9, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, @@ -455,7 +261,7 @@ "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 1, + "ThrowCount": 0, "BellCount": 0 }, "10": { @@ -495,7 +301,7 @@ } }, "Version": 1, - "LastModified": "2025-11-25T20:04:22.1609288Z", + "LastModified": "2025-11-26T16:43:52.6721758Z", "LastModifiedBy": "test1@test.de" } ],