From 5696086022c93de85de1706203663278ff02415b Mon Sep 17 00:00:00 2001 From: beo3000 Date: Sun, 7 Dec 2025 14:03:02 +0100 Subject: [PATCH] separate gamemodel from gamesate fix next-round detection --- KoogleApp/Games/GameProgress.cs | 16 +- KoogleApp/Games/IGameService.cs | 15 +- KoogleApp/Games/Shit/Reducers.cs | 4 +- KoogleApp/Games/Shit/ShitBoard.razor | 2 +- KoogleApp/Games/Shit/ShitGame.cs | 2 +- KoogleApp/Games/Shit/ShitGameModel.cs | 83 ++ KoogleApp/Games/Shit/ShitGameService.cs | 38 +- KoogleApp/Games/Shit/ShitState.cs | 60 - KoogleApp/Games/Training/BoardTraining.razor | 2 +- KoogleApp/Games/Training/GameTraining.cs | 2 +- .../Games/Training/GameTrainingService.cs | 39 +- KoogleApp/Games/Training/Reducers.cs | 4 +- ...{TrainingState.cs => TrainingGameModel.cs} | 30 +- KoogleApp/Store/Game/Actions.cs | 2 +- KoogleApp/Store/Game/Effects.cs | 4 +- KoogleApp/Store/Game/ThrowPanel/Effects.cs | 20 +- KoogleApp/appdata.json | 1306 ++++++++++++++++- 17 files changed, 1433 insertions(+), 196 deletions(-) create mode 100644 KoogleApp/Games/Shit/ShitGameModel.cs delete mode 100644 KoogleApp/Games/Shit/ShitState.cs rename KoogleApp/Games/Training/{TrainingState.cs => TrainingGameModel.cs} (50%) diff --git a/KoogleApp/Games/GameProgress.cs b/KoogleApp/Games/GameProgress.cs index bd44629..3fcf6e1 100644 --- a/KoogleApp/Games/GameProgress.cs +++ b/KoogleApp/Games/GameProgress.cs @@ -23,7 +23,7 @@ namespace KoogleApp.Games // NextThrowState is used to store the state for the next throw, that is modified by game logic or a user interaction. It overrides the default behaviour of resetting pins etc. public ThrowPanelState? NextThrowState { get; set; } = NextThrowState; - public object NextPlayer(Func getNextPlayer) + public SelectedNextPlayerIds NextPlayer(Func getNextPlayer) { var newPlayersList = getNextPlayer(AfterParticipantsState, StartParams.ParticipantsMode); @@ -42,13 +42,25 @@ namespace KoogleApp.Games public static bool IsNextRound(this GameProgress progress) { - if (progress.BeforeThrowState.ThrowCounter + 1 >= progress.AfterThrowState.ThrowsPerRound) + if (progress.AfterThrowState.ThrowCounterPerRound + 1 > progress.NextThrowState.ThrowsPerRound) { return true; } return false; } + public static bool NextRound(this GameProgress progress) + { + var res = progress.IsNextRound(); + + if (res) + { + + } + + return res; + } + public static bool IsCircle(this GameProgress progress) { var res = 0; diff --git a/KoogleApp/Games/IGameService.cs b/KoogleApp/Games/IGameService.cs index 8ee6791..023bdf7 100644 --- a/KoogleApp/Games/IGameService.cs +++ b/KoogleApp/Games/IGameService.cs @@ -9,11 +9,18 @@ using System.Text.Json.Serialization; namespace KoogleApp.Games { - [JsonDerivedType(typeof(TrainingState), typeDiscriminator: "TrainingState")] - [JsonDerivedType(typeof(ShitState), typeDiscriminator: "ShitState")] + + public interface IGameState + { + + } + + [JsonDerivedType(typeof(TrainingGameModel), typeDiscriminator: "TrainingGameModel")] + [JsonDerivedType(typeof(ShitGameModel), typeDiscriminator: "ShitGameModel")] public interface IGameModel { - IGameModel DeepCopy(); + IGameState ConvertToState(); + //IGameModel DeepCopy(); } [JsonDerivedType(typeof(TrainingSetupState), typeDiscriminator: "TrainingSetupState")] @@ -51,5 +58,7 @@ namespace KoogleApp.Games IGameModel FinalizeGameModel(); GameProgress HandleGameButton(string actionCallback, GameProgress progress, IDispatcher dispatcher); + + //void DispatchGameStateChanged(); } } diff --git a/KoogleApp/Games/Shit/Reducers.cs b/KoogleApp/Games/Shit/Reducers.cs index f11ff9a..b6a39ec 100644 --- a/KoogleApp/Games/Shit/Reducers.cs +++ b/KoogleApp/Games/Shit/Reducers.cs @@ -7,9 +7,9 @@ namespace KoogleApp.Games.Shit public static class Reducers { [ReducerMethod] - public static ShitState? OnGameModelChanged(ShitState state, GameModelChanged action) + public static ShitGameState? OnGameModelChanged(ShitGameState gameModel, GameModelChangedAction action) { - return action.Model as ShitState; + return action.Model as ShitGameState; } } } diff --git a/KoogleApp/Games/Shit/ShitBoard.razor b/KoogleApp/Games/Shit/ShitBoard.razor index 868fd72..d3e8bd1 100644 --- a/KoogleApp/Games/Shit/ShitBoard.razor +++ b/KoogleApp/Games/Shit/ShitBoard.razor @@ -3,7 +3,7 @@ @using KoogleApp.Store.Player @using MudBlazor -@inject IState ShitState +@inject IState ShitState @inject IState PlayersState gesammelt: @ShitState.Value.CollectedPoints diff --git a/KoogleApp/Games/Shit/ShitGame.cs b/KoogleApp/Games/Shit/ShitGame.cs index 80b30be..35c0723 100644 --- a/KoogleApp/Games/Shit/ShitGame.cs +++ b/KoogleApp/Games/Shit/ShitGame.cs @@ -9,7 +9,7 @@ namespace KoogleApp.Games.Shit public Type SetupComponentType => typeof(Setup); public Type SetupModelType => typeof(ShitSetupState); - public Type GameModelType => typeof(ShitState); + public Type GameModelType => typeof(ShitGameModel); public Type GameServiceType => typeof(ShitGameService); public Type BoardComponentType => typeof(ShitBoard); diff --git a/KoogleApp/Games/Shit/ShitGameModel.cs b/KoogleApp/Games/Shit/ShitGameModel.cs new file mode 100644 index 0000000..7638950 --- /dev/null +++ b/KoogleApp/Games/Shit/ShitGameModel.cs @@ -0,0 +1,83 @@ +using Fluxor; +using KoogleApp.Games.Shit; +using KoogleApp.Games.Training; +using KoogleApp.Store.Game.Menus; +using KoogleApp.Store.Game.ThrowPanel; +using System.Reflection.Metadata; + +namespace KoogleApp.Games.Shit +{ + + public record PointStatus + { + public int PlayerId { get; set; } + + //public int[] PointHistory { get; set; } + + public int Points { get; set; } + + //public string PlayerName { get; set; } + } + + + public record ShitGameState( + Dictionary Points, + int CollectedPoints, + int PreviewPointsOk, + int PreviewPointsShit) : IGameState + { + public ShitGameState() : this([], 0, 0, 0) + { + + } + } + + public class ShitGameModel( + Dictionary Points, + int CollectedPoints, + int PreviewPointsOk, + int PreviewPointsShit) : IGameModel + { + public Dictionary Points { get; set; } = Points; + + public int CollectedPoints { get; set; } = CollectedPoints; + + public int PreviewPointsOk { get; set; } = PreviewPointsOk; + + public int PreviewPointsShit { get; set; } = PreviewPointsShit; + + public ShitGameModel() : this([],0,0,0) + { + + } + + //public IGameModel DeepCopy() + //{ + // //// Array und alle Elemente kopieren + // //var itemsCopy = Throws.Select(item => item with { }).ToArray(); + // //return this with { Throws = itemsCopy }; + + + // // Dictionary und alle Elemente kopieren + // // Dictionary und alle Values kopieren + // var itemsCopy = Points.ToDictionary( + // kvp => kvp.Key, // Key kopieren (int ist value type) + // kvp => kvp.Value with { } // Value als Record kopieren + // ); + // this.Points = itemsCopy; + // return this; + //} + public IGameState ConvertToState() + { + return new ShitGameState(Points,CollectedPoints,PreviewPointsOk,PreviewPointsShit); + } + } + + [FeatureState] + public record ShitSetupState: GameSetupModelBase + { + public int ShitNumber { get; set; } = 5; + } + + +} diff --git a/KoogleApp/Games/Shit/ShitGameService.cs b/KoogleApp/Games/Shit/ShitGameService.cs index 1b8f87e..2405c81 100644 --- a/KoogleApp/Games/Shit/ShitGameService.cs +++ b/KoogleApp/Games/Shit/ShitGameService.cs @@ -15,23 +15,28 @@ namespace KoogleApp.Games.Shit public GameProgress HandleThrow(GameProgress progress, IDispatcher dispatcher) { - if (progress.GameModel is not ShitState) + if (progress.GameModel is not ShitGameModel) { throw new InvalidOperationException("game service does not match game model"); } - //if (_isShit) - //{ - // status.Points += GameModel.CollectedPoints; - // GameModel.CollectedPoints = 0; - //} - //else - //{ - // GameModel.CollectedPoints += Game.StateAfter.PinCount; - //} + var pinCount = progress.PinCount(); + var playerId = progress.GetCurrentPlayerId(); + var gameModel = progress.GameModel as ShitGameModel; + var isShit = progress.PinCount() == ((ShitSetupState)progress.StartParams).ShitNumber; + if (isShit) + { + // status.Points += GameModel.CollectedPoints; + gameModel.Points[playerId].Points += gameModel.CollectedPoints; + gameModel.CollectedPoints = 0; + } + else + { + gameModel.CollectedPoints += pinCount; + } - //GameModel.PreviewPointsOk -= Game.StateAfter.PinCount; - //GameModel.PreviewPointsShit += Game.StateAfter.PinCount; + gameModel.PreviewPointsOk -= pinCount; + gameModel.PreviewPointsShit += pinCount; //if (GameModel.PreviewPointsOk <= 0) //{ @@ -65,7 +70,7 @@ namespace KoogleApp.Games.Shit dict.Add(participant, tm); } - var newModel = new ShitState(dict,0,0,0); + var newModel = new ShitGameModel(dict,0,0,0); return newModel; } @@ -85,15 +90,16 @@ namespace KoogleApp.Games.Shit var actions = new List(); - var playerId = progress.GetCurrentPlayerId(); - if (progress.AfterThrowState.ThrowCounterPerRound < 4) // three throws are at least required { return progress; } - // neue Runde starten: nächster Spieler und ThrowCounterPerRound zurücksetzen + + //var playerId = progress.GetCurrentPlayerId(); + + // neue Runde starten: nächster Spieler und ThrowCounterPerRound zurücksetzen var nextPlayerAction = progress.NextPlayer(NextPlayerHandler.GetNextPlayerIndex); if (nextPlayerAction != null) { diff --git a/KoogleApp/Games/Shit/ShitState.cs b/KoogleApp/Games/Shit/ShitState.cs deleted file mode 100644 index f21c6c1..0000000 --- a/KoogleApp/Games/Shit/ShitState.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Fluxor; -using KoogleApp.Games.Shit; -using KoogleApp.Games.Training; -using KoogleApp.Store.Game.Menus; -using KoogleApp.Store.Game.ThrowPanel; -using System.Reflection.Metadata; - -namespace KoogleApp.Games.Shit -{ - - public record PointStatus - { - public int PlayerId { get; set; } - - //public int[] PointHistory { get; set; } - - public int Points { get; set; } - - //public string PlayerName { get; set; } - } - - - - [FeatureState] - public record ShitState( - Dictionary Points, - int CollectedPoints, - int PreviewPointsOk, - int PreviewPointsShit) : IGameModel - { - public ShitState() : this([],0,0,0) - { - - } - - public IGameModel DeepCopy() - { - //// Array und alle Elemente kopieren - //var itemsCopy = Throws.Select(item => item with { }).ToArray(); - //return this with { Throws = itemsCopy }; - - - // Dictionary und alle Elemente kopieren - // Dictionary und alle Values kopieren - var itemsCopy = Points.ToDictionary( - kvp => kvp.Key, // Key kopieren (int ist value type) - kvp => kvp.Value with { } // Value als Record kopieren - ); - return this with { Points = itemsCopy }; - } - } - - [FeatureState] - public record ShitSetupState: GameSetupModelBase - { - public int ShitNumber { get; set; } = 5; - } - - -} diff --git a/KoogleApp/Games/Training/BoardTraining.razor b/KoogleApp/Games/Training/BoardTraining.razor index 3975f09..c07e919 100644 --- a/KoogleApp/Games/Training/BoardTraining.razor +++ b/KoogleApp/Games/Training/BoardTraining.razor @@ -8,7 +8,7 @@ @inherits FluxorComponent -@inject IState TrainingState +@inject IState TrainingState @inject IState ParticipantsState @inject IState PlayersState diff --git a/KoogleApp/Games/Training/GameTraining.cs b/KoogleApp/Games/Training/GameTraining.cs index b779b3a..574ecf0 100644 --- a/KoogleApp/Games/Training/GameTraining.cs +++ b/KoogleApp/Games/Training/GameTraining.cs @@ -14,7 +14,7 @@ namespace KoogleApp.Games.Training public Type SetupModelType => typeof(TrainingSetupState); - public Type GameModelType => typeof(TrainingState); + public Type GameModelType => typeof(TrainingGameModel); public MenuAction[] MenuActions => [ ]; } diff --git a/KoogleApp/Games/Training/GameTrainingService.cs b/KoogleApp/Games/Training/GameTrainingService.cs index 4f82e8d..0399d25 100644 --- a/KoogleApp/Games/Training/GameTrainingService.cs +++ b/KoogleApp/Games/Training/GameTrainingService.cs @@ -15,7 +15,7 @@ namespace KoogleApp.Games.Training public IGameModel InitGameModel(IGameSetupModel startParams, IDispatcher dispatcher) { - var _gameModel = new TrainingState(); + var _gameModel = new TrainingGameModel(); var dict = new Dictionary(); @@ -25,7 +25,7 @@ namespace KoogleApp.Games.Training dict.Add(participant, tm); } - _gameModel = _gameModel with { Throws = dict }; + _gameModel.Throws = dict; return _gameModel; } @@ -41,7 +41,7 @@ namespace KoogleApp.Games.Training public GameProgress HandleThrow(GameProgress progress, IDispatcher dispatcher) { - if (progress.GameModel is not TrainingState) + if (progress.GameModel is not TrainingGameModel) { throw new InvalidOperationException("game service does not match game model"); } @@ -49,44 +49,47 @@ namespace KoogleApp.Games.Training var actions = new List(); var afterParticipantsState = progress.AfterParticipantsState; - if (progress.IsNextRound()) + if (progress.NextRound()) { var action = progress.NextPlayer(NextPlayerHandler.GetNextPlayerIndex); - actions.Add(new SelectedNextPlayerIds(afterParticipantsState)); + actions.Add(action); + + afterParticipantsState = action.ParticipantsState; //var newPlayersList = NextPlayerHandler.GetNextPlayerIndex(progress.AfterParticipantsState, progress.StartParams.ParticipantsMode); //afterParticipantsState = progress.AfterParticipantsState with { PlayerIds = newPlayersList }; //progress.AfterParticipantsState = afterParticipantsState; - + //actions.Add(new SelectedNextPlayerIds(afterParticipantsState)); } var playerId = progress.GetCurrentPlayerId(); - var gm = progress.GameModel as TrainingState; - var newModel = (gm.DeepCopy()) as TrainingState; + var gm = progress.GameModel as TrainingGameModel; + //var newModel = (gm.DeepCopy()) as TrainingGameModel; - var oldThrowStatistic = newModel.Throws[playerId]; + //var oldThrowStatistic = newModel.Throws[playerId]; - newModel.Throws[playerId] = oldThrowStatistic with - { - ThrowCount = oldThrowStatistic.ThrowCount + 1, - PinCount = oldThrowStatistic.PinCount + progress.PinCount(), - CircleCount = oldThrowStatistic.CircleCount + Convert.ToInt32(progress.IsCircle()) - }; + gm.Throws[playerId].ThrowCount += 1; + gm.Throws[playerId].PinCount += progress.PinCount(); + gm.Throws[playerId].CircleCount += Convert.ToInt32(progress.IsCircle()); + //{ + // ThrowCount = oldThrowStatistic.ThrowCount + 1, + // PinCount = oldThrowStatistic.PinCount + progress.PinCount(), + // CircleCount = oldThrowStatistic.CircleCount + Convert.ToInt32(progress.IsCircle()) + //}; - //var newModel = ((TrainingState)(progress.GameModel)) with { Throws = ts.Throws }; + //var newModel = ((TrainingGameModel)(progress.GameModel)) with { Throws = ts.Throws }; //res.Add(new UpdateTrainingStateAction(newModel)); - actions.Add(new GameModelChanged(newModel)); foreach (var action in actions) { dispatcher.Dispatch(action); } - progress.GameModel = newModel; + progress.GameModel = gm; progress.AfterParticipantsState = afterParticipantsState; return progress; diff --git a/KoogleApp/Games/Training/Reducers.cs b/KoogleApp/Games/Training/Reducers.cs index 9281c4b..0453700 100644 --- a/KoogleApp/Games/Training/Reducers.cs +++ b/KoogleApp/Games/Training/Reducers.cs @@ -7,9 +7,9 @@ namespace KoogleApp.Games.Training public static class Reducers { [ReducerMethod] - public static TrainingState? OnGameModelChanged(TrainingState state, GameModelChanged action) + public static TrainingGameState? OnGameModelChangedAction(TrainingGameState gameModel, GameModelChangedAction action) { - return action.Model as TrainingState; + return action.Model as TrainingGameState; } } } diff --git a/KoogleApp/Games/Training/TrainingState.cs b/KoogleApp/Games/Training/TrainingGameModel.cs similarity index 50% rename from KoogleApp/Games/Training/TrainingState.cs rename to KoogleApp/Games/Training/TrainingGameModel.cs index a0d8864..6b54f87 100644 --- a/KoogleApp/Games/Training/TrainingState.cs +++ b/KoogleApp/Games/Training/TrainingGameModel.cs @@ -29,20 +29,34 @@ namespace KoogleApp.Games.Training } [FeatureState] - public record TrainingState(Dictionary Throws) : IGameModel + public record TrainingGameState(Dictionary Throws) : IGameState { - public TrainingState() : this([]) + public TrainingGameState() : this([]) + { + + } + } + + public class TrainingGameModel(Dictionary Throws) : IGameModel + { + public Dictionary Throws { get; set; } = Throws; + + public TrainingGameModel() : this([]) { } - public IGameModel DeepCopy() + //public IGameModel DeepCopy() + //{ + // var itemsCopy = Throws.ToDictionary( + // kvp => kvp.Key, // Key kopieren (int ist value type) + // kvp => kvp.Value with { } // Value als Record kopieren + // ); + // return this with { Throws = itemsCopy }; + //} + public IGameState ConvertToState() { - var itemsCopy = Throws.ToDictionary( - kvp => kvp.Key, // Key kopieren (int ist value type) - kvp => kvp.Value with { } // Value als Record kopieren - ); - return this with { Throws = itemsCopy }; + return new TrainingGameState(Throws); } } diff --git a/KoogleApp/Store/Game/Actions.cs b/KoogleApp/Store/Game/Actions.cs index 23ba627..c5e81c9 100644 --- a/KoogleApp/Store/Game/Actions.cs +++ b/KoogleApp/Store/Game/Actions.cs @@ -2,7 +2,7 @@ namespace KoogleApp.Store.Game { - public record GameModelChanged(IGameModel Model); + public record GameModelChangedAction(IGameState Model); public record LoadGameStatesFromDataServiceAction(); } diff --git a/KoogleApp/Store/Game/Effects.cs b/KoogleApp/Store/Game/Effects.cs index 7bfe80f..e87d441 100644 --- a/KoogleApp/Store/Game/Effects.cs +++ b/KoogleApp/Store/Game/Effects.cs @@ -13,14 +13,14 @@ namespace KoogleApp.Store.Game if (current.Status != null) { var gameModel = current.Status.GameModel; - dispatcher.Dispatch(new GameModelChanged(gameModel)); + dispatcher.Dispatch(new GameModelChangedAction(gameModel.ConvertToState())); } } [EffectMethod] public async Task HandleUpdateStateAfterUndoRedo(UpdateStateAfterUndoRedo action, IDispatcher dispatcher) { - dispatcher.Dispatch(new GameModelChanged(action.GameModel)); + dispatcher.Dispatch(new GameModelChangedAction(action.GameModel.ConvertToState())); } } } diff --git a/KoogleApp/Store/Game/ThrowPanel/Effects.cs b/KoogleApp/Store/Game/ThrowPanel/Effects.cs index c21754f..103e651 100644 --- a/KoogleApp/Store/Game/ThrowPanel/Effects.cs +++ b/KoogleApp/Store/Game/ThrowPanel/Effects.cs @@ -1,5 +1,6 @@ using Fluxor; using KoogleApp.Games; +using KoogleApp.Games.Training; using KoogleApp.Hub; using KoogleApp.Model; using KoogleApp.Model.EventMessages; @@ -10,12 +11,12 @@ using KoogleApp.Store.Game.Setup; using KoogleApp.Store.Game.ThrowTimer; using KoogleApp.Store.Game.UndoRedo; using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.Win32.SafeHandles; using System; using System.Diagnostics; using System.Text.Json; -using KoogleApp.Games.Training; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace KoogleApp.Store.Game.ThrowPanel { @@ -54,9 +55,10 @@ namespace KoogleApp.Store.Game.ThrowPanel var gameService = gameServiceFactory.GetService(startStopAction.StartParams.KnownGameType); var gameModel = gameService.InitGameModel(startStopAction.StartParams, dispatcher); - dispatcher.Dispatch(new GameModelChanged(gameModel)); - + dispatcher.Dispatch(new GameModelChangedAction(gameModel.ConvertToState())); + + var username = await GetUsername(); dataService.UpdateData(new GameStatus() { @@ -65,6 +67,8 @@ namespace KoogleApp.Store.Game.ThrowPanel SetupModel = startStopAction.StartParams, GameModel = gameModel }, username); + + } else // stop action { @@ -161,8 +165,9 @@ namespace KoogleApp.Store.Game.ThrowPanel // 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 nextState = throwPanelState.Value.CalculateNextPanelState(); + var nextState = beforeStates.Status.ThrowPanelState.CalculateNextPanelState(); + //dispatcher.Dispatch(new ThrowUpdateAction(nextState)); var generalGameProgress = new GameProgress( BeforeThrowState: beforeStates.Status?.ThrowPanelState, @@ -177,7 +182,7 @@ namespace KoogleApp.Store.Game.ThrowPanel //var participants = throwAction.ParticipantsState; - + //var gameSpecificProgress = generalGameProgress; var gameSpecificProgress = GameService.HandleThrow(generalGameProgress, dispatcher); //foreach (var action in actions) @@ -188,6 +193,7 @@ namespace KoogleApp.Store.Game.ThrowPanel // } // dispatcher.Dispatch(action); //} + dispatcher.Dispatch(new GameModelChangedAction(gameSpecificProgress.GameModel.ConvertToState())); await ShowBoardForSeconds(dispatcher); diff --git a/KoogleApp/appdata.json b/KoogleApp/appdata.json index aed8813..9133ed2 100644 --- a/KoogleApp/appdata.json +++ b/KoogleApp/appdata.json @@ -6,7 +6,7 @@ "IsStated": true, "BellValue": false, "Pin1State": 0, - "Pin2State": 2, + "Pin2State": 0, "Pin3State": 0, "Pin4State": 0, "Pin5State": 0, @@ -14,25 +14,25 @@ "Pin7State": 0, "Pin8State": 0, "Pin9State": 0, - "ThrowsPerRound": 0, - "ThrowCounterPerRound": 0, + "ThrowsPerRound": 2, + "ThrowCounterPerRound": 1, "ThrowMode": 0, - "ThrowPanelStateStatus": 2, - "ThrowCounter": 1, + "ThrowPanelStateStatus": 3, + "ThrowCounter": 8, "DayId": 35 }, "ParticipantsState": { "PlayerIds": [ + 9, 5, 3, 10, - 12, - 9 + 12 ], "Eliminated": [] }, "GameModel": { - "$type": "TrainingState", + "$type": "TrainingGameModel", "Throws": { "5": { "PlayerId": 5, @@ -48,34 +48,34 @@ "3": { "PlayerId": 3, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "10": { "PlayerId": 10, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "12": { "PlayerId": 12, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "9": { @@ -92,8 +92,8 @@ } } }, - "Version": 5, - "LastModified": "2025-12-05T19:53:05.533106+01:00", + "Version": 17, + "LastModified": "2025-12-07T14:01:52.1939606+01:00", "LastModifiedBy": "test1@test.de" }, "UndoHistory": [ @@ -112,68 +112,68 @@ "Pin7State": 0, "Pin8State": 0, "Pin9State": 1, - "ThrowsPerRound": 3, + "ThrowsPerRound": 2, "ThrowCounterPerRound": 2, "ThrowMode": 0, "ThrowPanelStateStatus": 2, - "ThrowCounter": 1, + "ThrowCounter": 7, "DayId": 35 }, "ParticipantsState": { "PlayerIds": [ + 12, + 9, 5, 3, - 10, - 12, - 9 + 10 ], "Eliminated": [] }, "GameModel": { - "$type": "TrainingState", + "$type": "TrainingGameModel", "Throws": { "5": { "PlayerId": 5, "TeamNr": 0, - "PinCount": 1, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 1, + "ThrowCount": 2, "BellCount": 0 }, "3": { "PlayerId": 3, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "10": { "PlayerId": 10, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "12": { "PlayerId": 12, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "9": { @@ -190,8 +190,8 @@ } } }, - "Version": 4, - "LastModified": "2025-12-05T19:53:05.5213738+01:00", + "Version": 16, + "LastModified": "2025-12-07T14:01:52.1906681+01:00", "LastModifiedBy": "test1@test.de" }, { @@ -209,68 +209,68 @@ "Pin7State": 0, "Pin8State": 0, "Pin9State": 0, - "ThrowsPerRound": 3, + "ThrowsPerRound": 2, "ThrowCounterPerRound": 2, "ThrowMode": 0, "ThrowPanelStateStatus": 3, - "ThrowCounter": 1, + "ThrowCounter": 7, "DayId": 35 }, "ParticipantsState": { "PlayerIds": [ + 12, + 9, 5, 3, - 10, - 12, - 9 + 10 ], "Eliminated": [] }, "GameModel": { - "$type": "TrainingState", + "$type": "TrainingGameModel", "Throws": { "5": { "PlayerId": 5, "TeamNr": 0, - "PinCount": 1, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 1, + "ThrowCount": 2, "BellCount": 0 }, "3": { "PlayerId": 3, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "10": { "PlayerId": 10, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "12": { "PlayerId": 12, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "9": { @@ -287,8 +287,8 @@ } } }, - "Version": 3, - "LastModified": "2025-12-05T19:51:31.2636865+01:00", + "Version": 15, + "LastModified": "2025-12-07T14:01:49.3050805+01:00", "LastModifiedBy": "test1@test.de" }, { @@ -306,7 +306,1171 @@ "Pin7State": 0, "Pin8State": 0, "Pin9State": 1, - "ThrowsPerRound": 3, + "ThrowsPerRound": 2, + "ThrowCounterPerRound": 1, + "ThrowMode": 0, + "ThrowPanelStateStatus": 2, + "ThrowCounter": 6, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 12, + 9, + 5, + 3, + 10 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "9": { + "PlayerId": 9, + "TeamNr": 0, + "PinCount": 0, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 0, + "BellCount": 0 + } + } + } + }, + "Version": 14, + "LastModified": "2025-12-07T14:01:49.3000866+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": 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": 2, + "ThrowCounterPerRound": 1, + "ThrowMode": 0, + "ThrowPanelStateStatus": 3, + "ThrowCounter": 6, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 12, + 9, + 5, + 3, + 10 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "9": { + "PlayerId": 9, + "TeamNr": 0, + "PinCount": 0, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 0, + "BellCount": 0 + } + } + } + }, + "Version": 13, + "LastModified": "2025-12-07T14:01:44.9050183+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": null, + "ThrowPanelState": { + "IsStated": true, + "BellValue": false, + "Pin1State": 0, + "Pin2State": 0, + "Pin3State": 0, + "Pin4State": 0, + "Pin5State": 0, + "Pin6State": 0, + "Pin7State": 0, + "Pin8State": 0, + "Pin9State": 1, + "ThrowsPerRound": 2, + "ThrowCounterPerRound": 2, + "ThrowMode": 0, + "ThrowPanelStateStatus": 2, + "ThrowCounter": 5, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 10, + 12, + 9, + 5, + 3 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "9": { + "PlayerId": 9, + "TeamNr": 0, + "PinCount": 0, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 0, + "BellCount": 0 + } + } + } + }, + "Version": 12, + "LastModified": "2025-12-07T14:01:44.9017993+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": 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": 2, + "ThrowCounterPerRound": 2, + "ThrowMode": 0, + "ThrowPanelStateStatus": 3, + "ThrowCounter": 5, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 10, + 12, + 9, + 5, + 3 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "9": { + "PlayerId": 9, + "TeamNr": 0, + "PinCount": 0, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 0, + "BellCount": 0 + } + } + } + }, + "Version": 11, + "LastModified": "2025-12-07T14:01:41.364891+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": null, + "ThrowPanelState": { + "IsStated": true, + "BellValue": false, + "Pin1State": 0, + "Pin2State": 0, + "Pin3State": 0, + "Pin4State": 0, + "Pin5State": 0, + "Pin6State": 0, + "Pin7State": 0, + "Pin8State": 0, + "Pin9State": 1, + "ThrowsPerRound": 2, + "ThrowCounterPerRound": 1, + "ThrowMode": 0, + "ThrowPanelStateStatus": 2, + "ThrowCounter": 4, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 10, + 12, + 9, + 5, + 3 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "9": { + "PlayerId": 9, + "TeamNr": 0, + "PinCount": 0, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 0, + "BellCount": 0 + } + } + } + }, + "Version": 10, + "LastModified": "2025-12-07T14:01:41.3611943+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": 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": 2, + "ThrowCounterPerRound": 1, + "ThrowMode": 0, + "ThrowPanelStateStatus": 3, + "ThrowCounter": 4, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 10, + 12, + 9, + 5, + 3 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "9": { + "PlayerId": 9, + "TeamNr": 0, + "PinCount": 0, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 0, + "BellCount": 0 + } + } + } + }, + "Version": 9, + "LastModified": "2025-12-07T14:01:34.0163245+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": null, + "ThrowPanelState": { + "IsStated": true, + "BellValue": false, + "Pin1State": 0, + "Pin2State": 0, + "Pin3State": 0, + "Pin4State": 0, + "Pin5State": 0, + "Pin6State": 0, + "Pin7State": 0, + "Pin8State": 0, + "Pin9State": 1, + "ThrowsPerRound": 2, + "ThrowCounterPerRound": 2, + "ThrowMode": 0, + "ThrowPanelStateStatus": 2, + "ThrowCounter": 3, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 3, + 10, + 12, + 9, + 5 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "9": { + "PlayerId": 9, + "TeamNr": 0, + "PinCount": 0, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 0, + "BellCount": 0 + } + } + } + }, + "Version": 8, + "LastModified": "2025-12-07T14:01:34.0080849+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": 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": 2, + "ThrowCounterPerRound": 2, + "ThrowMode": 0, + "ThrowPanelStateStatus": 3, + "ThrowCounter": 3, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 3, + 10, + 12, + 9, + 5 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "9": { + "PlayerId": 9, + "TeamNr": 0, + "PinCount": 0, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 0, + "BellCount": 0 + } + } + } + }, + "Version": 7, + "LastModified": "2025-12-07T14:01:28.518584+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": null, + "ThrowPanelState": { + "IsStated": true, + "BellValue": false, + "Pin1State": 0, + "Pin2State": 0, + "Pin3State": 0, + "Pin4State": 0, + "Pin5State": 0, + "Pin6State": 0, + "Pin7State": 0, + "Pin8State": 0, + "Pin9State": 1, + "ThrowsPerRound": 2, + "ThrowCounterPerRound": 1, + "ThrowMode": 0, + "ThrowPanelStateStatus": 2, + "ThrowCounter": 2, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 3, + 10, + 12, + 9, + 5 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "9": { + "PlayerId": 9, + "TeamNr": 0, + "PinCount": 0, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 0, + "BellCount": 0 + } + } + } + }, + "Version": 6, + "LastModified": "2025-12-07T14:01:28.5140609+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": 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": 2, + "ThrowCounterPerRound": 1, + "ThrowMode": 0, + "ThrowPanelStateStatus": 3, + "ThrowCounter": 2, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 3, + 10, + 12, + 9, + 5 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "9": { + "PlayerId": 9, + "TeamNr": 0, + "PinCount": 0, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 0, + "BellCount": 0 + } + } + } + }, + "Version": 5, + "LastModified": "2025-12-07T14:01:23.3454826+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": null, + "ThrowPanelState": { + "IsStated": true, + "BellValue": false, + "Pin1State": 0, + "Pin2State": 0, + "Pin3State": 0, + "Pin4State": 0, + "Pin5State": 0, + "Pin6State": 0, + "Pin7State": 0, + "Pin8State": 0, + "Pin9State": 1, + "ThrowsPerRound": 2, + "ThrowCounterPerRound": 2, + "ThrowMode": 0, + "ThrowPanelStateStatus": 2, + "ThrowCounter": 1, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 5, + 3, + 10, + 12, + 9 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "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-12-07T14:01:23.340658+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": 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": 2, + "ThrowCounterPerRound": 2, + "ThrowMode": 0, + "ThrowPanelStateStatus": 3, + "ThrowCounter": 1, + "DayId": 35 + }, + "ParticipantsState": { + "PlayerIds": [ + 5, + 3, + 10, + 12, + 9 + ], + "Eliminated": [] + }, + "GameModel": { + "$type": "TrainingGameModel", + "Throws": { + "5": { + "PlayerId": 5, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "3": { + "PlayerId": 3, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "10": { + "PlayerId": 10, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "BellCount": 0 + }, + "12": { + "PlayerId": 12, + "TeamNr": 0, + "PinCount": 2, + "CircleCount": 0, + "SinkCount": 0, + "StrikeCount": 0, + "ClearedCount": 0, + "ThrowCount": 2, + "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-12-07T14:01:18.1311796+01:00", + "LastModifiedBy": "test1@test.de" + }, + { + "Status": { + "SetupModel": null, + "ThrowPanelState": { + "IsStated": true, + "BellValue": false, + "Pin1State": 0, + "Pin2State": 0, + "Pin3State": 0, + "Pin4State": 0, + "Pin5State": 0, + "Pin6State": 0, + "Pin7State": 0, + "Pin8State": 0, + "Pin9State": 1, + "ThrowsPerRound": 2, "ThrowCounterPerRound": 1, "ThrowMode": 0, "ThrowPanelStateStatus": 2, @@ -324,50 +1488,50 @@ "Eliminated": [] }, "GameModel": { - "$type": "TrainingState", + "$type": "TrainingGameModel", "Throws": { "5": { "PlayerId": 5, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "3": { "PlayerId": 3, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "10": { "PlayerId": 10, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "12": { "PlayerId": 12, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "9": { @@ -385,7 +1549,7 @@ } }, "Version": 2, - "LastModified": "2025-12-05T19:51:31.2598989+01:00", + "LastModified": "2025-12-07T14:01:18.1231212+01:00", "LastModifiedBy": "test1@test.de" }, { @@ -394,7 +1558,7 @@ "$type": "TrainingSetupState", "DayId": 35, "ThrowMode": 0, - "ThrowsPerRound": 3, + "ThrowsPerRound": 2, "Participants": [ 5, 3, @@ -417,7 +1581,7 @@ "Pin7State": 0, "Pin8State": 0, "Pin9State": 0, - "ThrowsPerRound": 3, + "ThrowsPerRound": 2, "ThrowCounterPerRound": 1, "ThrowMode": 0, "ThrowPanelStateStatus": 1, @@ -435,50 +1599,50 @@ "Eliminated": [] }, "GameModel": { - "$type": "TrainingState", + "$type": "TrainingGameModel", "Throws": { "5": { "PlayerId": 5, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "3": { "PlayerId": 3, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "10": { "PlayerId": 10, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "12": { "PlayerId": 12, "TeamNr": 0, - "PinCount": 0, + "PinCount": 2, "CircleCount": 0, "SinkCount": 0, "StrikeCount": 0, "ClearedCount": 0, - "ThrowCount": 0, + "ThrowCount": 2, "BellCount": 0 }, "9": { @@ -496,7 +1660,7 @@ } }, "Version": 1, - "LastModified": "2025-12-05T18:51:25.875404Z", + "LastModified": "2025-12-07T13:01:11.1661222Z", "LastModifiedBy": "test1@test.de" } ],