From a69a8f450d54685e7bf4f54e8008c26c5ef5f1fd Mon Sep 17 00:00:00 2001 From: Christian Kauer Date: Sun, 31 Dec 2023 10:38:21 +0100 Subject: [PATCH] dev --- GameHandler/ExpenseHandler.cs | 48 ++++---- GameHandler/GameExenseEventArgs.cs | 8 +- GameHandler/GameHandler/DeathGameHandler.cs | 12 +- GameHandler/GameHandler/FreeGameHandler.cs | 2 +- GameHandler/GameService.cs | 28 ++--- GameHandler/GameStateHandler.cs | 117 ++++++++++++-------- GameModel/Contracts/IGameHandler.cs | 2 +- GameModel/ExpenseModel.cs | 26 ++--- GameModel/GameState.cs | 2 +- GameModel/PlayerExpense.cs | 6 - 10 files changed, 133 insertions(+), 118 deletions(-) diff --git a/GameHandler/ExpenseHandler.cs b/GameHandler/ExpenseHandler.cs index b11de3d..5e10001 100644 --- a/GameHandler/ExpenseHandler.cs +++ b/GameHandler/ExpenseHandler.cs @@ -23,29 +23,25 @@ namespace GameHandler _expenseRepository = expenseRepository; } - public async Task HandleGameExenseEventArgs(GameExenseEventArgs gameExenseEventArgs, ExpenseModel expenseModelToAppend) + public async Task> HandleGameExenseEventArgs(GameExenseEventArgs gameExenseEventArgs) { if (!gameExenseEventArgs.PlayerIds.Any(_ => _ == gameExenseEventArgs.PlayerId)) { throw new InvalidPinThrowException($"Player {gameExenseEventArgs.PlayerId} not found"); } - List memberExpenses = PrepareResult(ref expenseModelToAppend); + List memberExpenses = new List(); //PrepareResult(ref expenseModelToAppend); var triggers = gameExenseEventArgs.Triggers; - await AssignExpenses(gameExenseEventArgs.PlayerId, gameExenseEventArgs.PlayerIds, memberExpenses, triggers, - gameExenseEventArgs.GameStateId); + await AssignExpenses(gameExenseEventArgs.PlayerId, gameExenseEventArgs.PlayerIds, memberExpenses, triggers); - return expenseModelToAppend with { MemberExpenses = memberExpenses.ToArray() }; + return memberExpenses; } - private async Task AssignExpenses(int playerId, int[] playerIds, - List memberExpenses, ExpenseTrigger[] triggers, - Guid gameStateId) + private async Task AssignExpenses(int playerId, int[] playerIds, List memberExpenses, ExpenseTrigger[] triggers) { var list = await _expenseRepository.GetAll(); - var destExpenses = list - .Where(_ => _.ExpenseTriggers.Any(et => triggers.Any(et2 => et2 == et))); + var destExpenses = list.Where(_ => _.ExpenseTriggers.Any(et => triggers.Any(et2 => et2 == et))); var inversePlayers = playerIds.Where(_ => _ != playerId); foreach (var expense in destExpenses) @@ -54,41 +50,39 @@ namespace GameHandler { foreach (var player in inversePlayers) { - memberExpenses.Add(PlayerExpense.Create(player, expense, gameStateId)); + memberExpenses.Add(PlayerExpense.Create(player, expense)); } } else { - memberExpenses.Add(PlayerExpense.Create(playerId, expense, gameStateId)); + memberExpenses.Add(PlayerExpense.Create(playerId, expense)); } } } - public async Task CheckThrow(BoardState currentState, PinThrow pinThrow, int[] PlayerIds, - Guid gameStateId, - ExpenseModel expenseModelToAppend = null) + public async Task> CheckThrow(BoardState currentState, PinThrow pinThrow, int[] PlayerIds) { if (!PlayerIds.Any(_ => _ == pinThrow.PlayerId)) { throw new InvalidPinThrowException($"Player {pinThrow.PlayerId} not found"); } - List memberExpenses = PrepareResult(ref expenseModelToAppend); + List memberExpenses = new List(); //PrepareResult(ref expenseModelToAppend); var triggers = pinThrow.GetExpenseTriggers(currentState); - await AssignExpenses(pinThrow.PlayerId, PlayerIds, memberExpenses, triggers, gameStateId); + await AssignExpenses(pinThrow.PlayerId, PlayerIds, memberExpenses, triggers); - return expenseModelToAppend with { MemberExpenses = memberExpenses.ToArray() }; - } - - private static List PrepareResult(ref ExpenseModel expenseModelToAppend) - { - if (expenseModelToAppend == null) - { - expenseModelToAppend = new ExpenseModel(Array.Empty()); - } - var memberExpenses = new List(expenseModelToAppend.MemberExpenses); return memberExpenses; } + + //private static List PrepareResult(ref ExpenseModel expenseModelToAppend) + //{ + // if (expenseModelToAppend == null) + // { + // expenseModelToAppend = new ExpenseModel(Array.Empty()); + // } + // var memberExpenses = new List(expenseModelToAppend.MemberExpenses); + // return memberExpenses; + //} } } diff --git a/GameHandler/GameExenseEventArgs.cs b/GameHandler/GameExenseEventArgs.cs index 027b112..396cc4e 100644 --- a/GameHandler/GameExenseEventArgs.cs +++ b/GameHandler/GameExenseEventArgs.cs @@ -10,16 +10,14 @@ namespace GameHandler public class GameExenseEventArgs : EventArgs { public int[] PlayerIds { get; set; } - public int PlayerId { get; set; } - public Guid GameStateId { get; set; } + public int PlayerId { get; set; } public ExpenseTrigger[] Triggers { get; set; } - public GameExenseEventArgs(int playerId, ExpenseTrigger[] triggers, int[] playerIds, Guid gameStateId) + public GameExenseEventArgs(int playerId, ExpenseTrigger[] triggers, int[] playerIds) { PlayerId = playerId; Triggers = triggers; - PlayerIds = playerIds; - GameStateId = gameStateId; + PlayerIds = playerIds; } } } diff --git a/GameHandler/GameHandler/DeathGameHandler.cs b/GameHandler/GameHandler/DeathGameHandler.cs index 8d73829..133b7cf 100644 --- a/GameHandler/GameHandler/DeathGameHandler.cs +++ b/GameHandler/GameHandler/DeathGameHandler.cs @@ -73,17 +73,17 @@ namespace GameHandler.DeathGame } public IGameModel Update(PinThrow pinThrow, IGameModel gameModel, BoardState boardStateBeforeUpdate, - ThrowState throwStateAfterUpdate, Guid gameStateId) + ThrowState throwStateAfterUpdate) { var isTrowIntoAllPins = boardStateBeforeUpdate.PinPicture.UpCount == 9; var boardCleared = pinThrow.IsCleared; var firstThrowInRound = throwStateAfterUpdate.ThrowCount == 1; return CalcNextModel(gameModel as DeathGameModel, pinThrow.PinCount, - isTrowIntoAllPins, boardCleared, firstThrowInRound, gameStateId); + isTrowIntoAllPins, boardCleared, firstThrowInRound); } public DeathGameModel CalcNextModel(DeathGameModel gm, int pinCount, bool isTrowIntoAllPins, - bool boardCleared, bool firstThrowInRound, Guid gameStateId) + bool boardCleared, bool firstThrowInRound) { var current = gm.Coffins.First(); var next = gm.Coffins.Skip(1).First(); @@ -96,7 +96,7 @@ namespace GameHandler.DeathGame incX = true; if ((pinCount < 3) && firstThrowInRound) { - OnFirstThrowFailed(gm, current, gameStateId); + OnFirstThrowFailed(gm, current); incLine = true; } } @@ -195,9 +195,9 @@ namespace GameHandler.DeathGame return result; } - private void OnFirstThrowFailed(DeathGameModel gm, Coffin current, Guid gameStateId) + private void OnFirstThrowFailed(DeathGameModel gm, Coffin current) { - OnGameExpenseOccured(new GameExenseEventArgs(current.PlayerId, new[] { ExpenseTrigger.FirstThrowFail }, gm.PlayerIds, gameStateId)); + OnGameExpenseOccured(new GameExenseEventArgs(current.PlayerId, new[] { ExpenseTrigger.FirstThrowFail }, gm.PlayerIds)); } public static string GameName() diff --git a/GameHandler/GameHandler/FreeGameHandler.cs b/GameHandler/GameHandler/FreeGameHandler.cs index ec44f10..16c9ec0 100644 --- a/GameHandler/GameHandler/FreeGameHandler.cs +++ b/GameHandler/GameHandler/FreeGameHandler.cs @@ -34,7 +34,7 @@ namespace GameHandler.GameHandler } public IGameModel Update(PinThrow pinThrow, IGameModel gameModel, BoardState boardStateBeforeUpdate, - ThrowState throwStateAfterUpdate, Guid gameStateId) + ThrowState throwStateAfterUpdate) { if (gameModel == null) { diff --git a/GameHandler/GameService.cs b/GameHandler/GameService.cs index 85885ce..bbc632c 100644 --- a/GameHandler/GameService.cs +++ b/GameHandler/GameService.cs @@ -69,8 +69,6 @@ namespace GameHandler InitGameServiceBehaviour(gameName); var state = await InitGameState(playerIds, gameSettings, gameName); - await _gameStateHandler.Add(state); - await _gameStateHandler.Add(ExpenseModel.Create()); await _gameStateHandler.Save(); return state; @@ -82,8 +80,11 @@ namespace GameHandler var throwState = ThrowState.Create(_gh.ThrowMode(), _gh.ThrowsPerRount()); _game = await _gameStateHandler.CreateNewGame(gameName); + _gameStateHandler.StartNewState(); var state = GameState.Create(_game.Id, gameName, throwState, _gh.GetCurrentPlayerId(gm), gm); + _gameStateHandler.Add(state); + return state; } @@ -99,8 +100,8 @@ namespace GameHandler private void _gh_GameExpenseOccured(object? sender, EventArgs e) { - var expenseModel = _eh.HandleGameExenseEventArgs(e as GameExenseEventArgs, _gameStateHandler.ExpenseModel).Result; - _gameStateHandler.Add(expenseModel); + var items = _eh.HandleGameExenseEventArgs(e as GameExenseEventArgs).Result; + _gameStateHandler.Add(items); //_lastState = _lastState with { ExpenseModel = expenseModel }; } @@ -111,24 +112,25 @@ namespace GameHandler throw new InvalidGameStateExcpetion("Game not started"); } - var lastGameState = _gameStateHandler.GameState; - var nextGameStateId = Guid.NewGuid(); + _gameStateHandler.StartNewState(); + var lastGameState = _gameStateHandler.GameState; + var boardStateBeforeUpdate = lastGameState.ThrowState.BoardState; pinThrow = AutoCompletePlayerId(pinThrow); var throwStateAfterUpdate = _th.Update(lastGameState.ThrowState, pinThrow); - var gameModel = _gh.Update(pinThrow, lastGameState.GameModel, boardStateBeforeUpdate, throwStateAfterUpdate, nextGameStateId); - var expenseModel = await _eh.CheckThrow(throwStateAfterUpdate.BoardState, pinThrow, gameModel.PlayerIds, nextGameStateId, - _gameStateHandler.ExpenseModel); + var gameModel = _gh.Update(pinThrow, lastGameState.GameModel, boardStateBeforeUpdate, throwStateAfterUpdate); + var expenseModel = await _eh.CheckThrow(throwStateAfterUpdate.BoardState, pinThrow, gameModel.PlayerIds); - var newGameState = lastGameState with { Id = nextGameStateId, ThrowState = throwStateAfterUpdate, GameModel = gameModel, NextPlayerId = _gh.GetCurrentPlayerId(gameModel) }; + var newGameState = lastGameState with { Id = _gameStateHandler.NextGameStateId, ThrowState = throwStateAfterUpdate, GameModel = gameModel, NextPlayerId = _gh.GetCurrentPlayerId(gameModel) }; + + _gameStateHandler.Add(newGameState); + _gameStateHandler.Add(expenseModel); - await _gameStateHandler.Add(newGameState); - await _gameStateHandler.Add(expenseModel); await _gameStateHandler.Save(); - // todo: bei undo wird gamestate nicht korrekt gelöscht + return newGameState; } diff --git a/GameHandler/GameStateHandler.cs b/GameHandler/GameStateHandler.cs index 2afa64d..b456194 100644 --- a/GameHandler/GameStateHandler.cs +++ b/GameHandler/GameStateHandler.cs @@ -27,11 +27,11 @@ namespace GameHandler private Guid _gameStateId; private List> gameStates = new List>(); - private List> expenseModels = new List>(); + //private List> expenseModels = new List>(); private List> memberExpenses = new List>(); private List> redoableGameStates = new List>(); - private List> redoableExpenseModels = new List>(); + //private List> redoableExpenseModels = new List>(); private List> redoableMeberExpenses = new List>(); private IGameRepository _gameRepository; @@ -43,18 +43,18 @@ namespace GameHandler _expenseRepository = expenseRepository; } - public ExpenseModel ExpenseModel - { - get - { - var res = expenseModels.LastOrDefault(); - if (res != null) - { - return res.Data; - } - return null; - } - } + //public ExpenseModel ExpenseModel + //{ + // get + // { + // var res = expenseModels.LastOrDefault(); + // if (res != null) + // { + // return res.Data; + // } + // return null; + // } + //} public GameState GameState { @@ -69,21 +69,50 @@ namespace GameHandler } } - internal async Task Add(ExpenseModel expenseModel) + public Guid NextGameStateId { - if (ExpenseModel != null) + get { - if (!expenseModel.Equals(ExpenseModel)) + if (_gameStateId == Guid.Empty) { - expenseModels.Add(new GameStateHandlerItem(_gameStateId, expenseModel)); + _gameStateId = Guid.NewGuid(); } - } - else - { - expenseModels.Add(new GameStateHandlerItem(_gameStateId, expenseModel)); + return _gameStateId; } } + public Guid StartNewState() + { + _gameStateId = Guid.NewGuid(); + return _gameStateId; + } + + internal void Add(IEnumerable playerExpenses) + { + foreach (var playerExpense in playerExpenses) + { + Add(playerExpense); + } + } + + internal void Add(PlayerExpense playerExpense) + { + var model = playerExpense with { GamestateId = _gameStateId }; + memberExpenses.Add(new GameStateHandlerItem(_gameStateId, model)); + } + + internal void Add(GameState newState) + { + if (newState.Id != Guid.Empty && newState.Id != NextGameStateId) + { + throw new InvalidDataException("GameState is not new"); + } + var model = newState with { Id = _gameStateId, Counter = gameStates.Count + 1 }; + + var item = new GameStateHandlerItem(_gameStateId, model); + gameStates.Add(item); + } + public async Task Save() { await DeleteRedoableStates(); // first delete undone items - otherwise ID is not unique in DB @@ -91,17 +120,22 @@ namespace GameHandler var gameState = gameStates.FirstOrDefault(_ => _.GameStateId == _gameStateId); await Save(gameState); - var expenseModelItem = expenseModels.FirstOrDefault(_ => _.GameStateId == _gameStateId); - if (expenseModelItem != null) + foreach (var memberExpense in memberExpenses.Where(_ => _.GameStateId == _gameStateId)) { - var expenseModel = expenseModelItem.Data; - foreach (var memberExpense in expenseModel.MemberExpenses.Where(_ => _.GamestateId == _gameStateId)) - { - var item = new GameStateHandlerItem(memberExpense.GamestateId, memberExpense); - memberExpenses.Add(item); - await Save(item); - } + await Save(memberExpense); } + + //var expenseModelItem = expenseModels.FirstOrDefault(_ => _.GameStateId == _gameStateId); + //if (expenseModelItem != null) + //{ + // var expenseModel = expenseModelItem.Data; + // foreach (var memberExpense in expenseModel.MemberExpenses.Where(_ => _.GamestateId == _gameStateId)) + // { + // var item = new GameStateHandlerItem(memberExpense.GamestateId, memberExpense); + // memberExpenses.Add(item); + // await Save(item); + // } + //} } @@ -120,18 +154,11 @@ namespace GameHandler redoableMeberExpenses.Clear(); } - redoableExpenseModels.Clear(); + //redoableExpenseModels.Clear(); } - internal async Task Add(GameState newState) - { - if (!newState.Equals(GameState)) - { - _gameStateId = newState.Id; - var item = new GameStateHandlerItem(_gameStateId, newState with { Counter = gameStates.Count + 1 }); - gameStates.Add(item); - } - } + + private async Task Save(GameStateHandlerItem item) { await _expenseRepository.Save(item.Data); @@ -154,11 +181,11 @@ namespace GameHandler var redoId = redoableGameStates.Last().GameStateId; gameStates.AddRange(redoableGameStates.Where(_ => _.GameStateId == redoId)); - expenseModels.AddRange(redoableExpenseModels.Where(_ => _.GameStateId == redoId)); + //expenseModels.AddRange(redoableExpenseModels.Where(_ => _.GameStateId == redoId)); memberExpenses.AddRange(redoableMeberExpenses.Where(_ => _.GameStateId == redoId)); redoableGameStates.RemoveAll(_ => _.GameStateId == redoId); - redoableExpenseModels.RemoveAll(_ => _.GameStateId == redoId); + //redoableExpenseModels.RemoveAll(_ => _.GameStateId == redoId); redoableMeberExpenses.RemoveAll(_ => _.GameStateId == redoId); } @@ -174,11 +201,11 @@ namespace GameHandler } redoableGameStates.AddRange(gameStates.Where(_ => _.GameStateId == _gameStateId)); - redoableExpenseModels.AddRange(expenseModels.Where(_ => _.GameStateId == _gameStateId)); + //redoableExpenseModels.AddRange(expenseModels.Where(_ => _.GameStateId == _gameStateId)); redoableMeberExpenses.AddRange(memberExpenses.Where(_ => _.GameStateId == _gameStateId)); gameStates.RemoveAll(_ => _.GameStateId == _gameStateId); - expenseModels.RemoveAll(_ => _.GameStateId == _gameStateId); + //expenseModels.RemoveAll(_ => _.GameStateId == _gameStateId); memberExpenses.RemoveAll(_ => _.GameStateId == _gameStateId); _gameStateId = gameStates.Last().GameStateId; diff --git a/GameModel/Contracts/IGameHandler.cs b/GameModel/Contracts/IGameHandler.cs index 8e27074..47fe1b0 100644 --- a/GameModel/Contracts/IGameHandler.cs +++ b/GameModel/Contracts/IGameHandler.cs @@ -23,7 +23,7 @@ namespace GameModel.Contract int GetCurrentPlayerId(IGameModel gameModel); IGameModel Update(PinThrow pinThrow, IGameModel gameModel, BoardState boardStateBeforeUpdate, - ThrowState throwStateAfterUpdate, Guid gameStateId); + ThrowState throwStateAfterUpdate); event EventHandler GameExpenseOccured; } diff --git a/GameModel/ExpenseModel.cs b/GameModel/ExpenseModel.cs index 3012ecb..237d6b4 100644 --- a/GameModel/ExpenseModel.cs +++ b/GameModel/ExpenseModel.cs @@ -6,20 +6,20 @@ using System.Threading.Tasks; namespace GameModel { - public record ExpenseModel(PlayerExpense[] MemberExpenses) - { - public virtual bool Equals(ExpenseModel other) - { - if (ReferenceEquals(null, other)) return false; + //public record ExpenseModel(PlayerExpense[] MemberExpenses) + //{ + // public virtual bool Equals(ExpenseModel other) + // { + // if (ReferenceEquals(null, other)) return false; - return MemberExpenses.SequenceEqual(other.MemberExpenses); - } + // return MemberExpenses.SequenceEqual(other.MemberExpenses); + // } - public override int GetHashCode() => MemberExpenses.GetHashCode(); + // public override int GetHashCode() => MemberExpenses.GetHashCode(); - public static ExpenseModel Create() - { - return new ExpenseModel(Array.Empty()); - } - } + // public static ExpenseModel Create() + // { + // return new ExpenseModel(Array.Empty()); + // } + //} } diff --git a/GameModel/GameState.cs b/GameModel/GameState.cs index 6b398b1..f5e2cc5 100644 --- a/GameModel/GameState.cs +++ b/GameModel/GameState.cs @@ -12,7 +12,7 @@ namespace GameModel { public static GameState Create(Guid gameId, string gameName, ThrowState throwState, int nextPlayerId, IGameModel gameModel) { - return new GameState(Guid.NewGuid(), gameId, gameName, throwState, nextPlayerId, gameModel, 0); + return new GameState(Guid.Empty, gameId, gameName, throwState, nextPlayerId, gameModel, 0); } } } diff --git a/GameModel/PlayerExpense.cs b/GameModel/PlayerExpense.cs index af90f88..3e9c624 100644 --- a/GameModel/PlayerExpense.cs +++ b/GameModel/PlayerExpense.cs @@ -14,11 +14,5 @@ namespace GameModel return new PlayerExpense(Guid.NewGuid(), playerId, expense.Id, expense.ExpenseType, DateTime.Now, expense.Price, expense.Name, Guid.Empty); } - - public static PlayerExpense Create(int playerId, Expense expense, Guid gameStateId) - { - return new PlayerExpense(Guid.NewGuid(), playerId, expense.Id, expense.ExpenseType, - DateTime.Now, expense.Price, expense.Name, gameStateId); - } } }