diff --git a/GameHandler.UnitTests/GameServiceTests.cs b/GameHandler.UnitTests/GameServiceTests.cs index 61c7587..c62c613 100644 --- a/GameHandler.UnitTests/GameServiceTests.cs +++ b/GameHandler.UnitTests/GameServiceTests.cs @@ -49,11 +49,11 @@ namespace GameHandler.UnitTests { GameService service = new GameService(); var ts1 = service.Start(DeathGameHandler.GAMENAME_DEATHBOX); - var bs1 = ts1.BoardState; + var bs1 = ts1.ThrowState.BoardState; var pinThrow = PinThrow.Create(1,PinPicture.Create(1,PinState.Down), false, false); var ts2 = service.HandleThrow(pinThrow); - var bs2 = ts2.BoardState; + var bs2 = ts2.ThrowState.BoardState; Assert.That(bs2, Is.Not.EqualTo(bs1)); diff --git a/GameHandler/GameHandler/DeathGameHandler.cs b/GameHandler/GameHandler/DeathGameHandler.cs index e1106a4..58eb01c 100644 --- a/GameHandler/GameHandler/DeathGameHandler.cs +++ b/GameHandler/GameHandler/DeathGameHandler.cs @@ -193,6 +193,13 @@ namespace GameHandler.DeathGame public ThrowMode ThrowMode() => GameModel.ThrowMode.Decrease; public bool FreePlayerSelection() => false; - + + public int GetCurrentPlayerId(IGameModel gameModel) + { + var gm = gameModel as DeathGameModel; + return gm.Coffins.First().PlayerId; + } + + public int ThrowsPerRount() => 3; } } diff --git a/GameHandler/GameHandler/FreeGameHandler.cs b/GameHandler/GameHandler/FreeGameHandler.cs index a6a362c..2ddce14 100644 --- a/GameHandler/GameHandler/FreeGameHandler.cs +++ b/GameHandler/GameHandler/FreeGameHandler.cs @@ -17,9 +17,15 @@ namespace GameHandler.GameHandler return GAMENAME_FREETRAINING; } + public int GetCurrentPlayerId(IGameModel gameModel) + { + var gm = gameModel as FreeGameModel; + return gm.PlayerIds.First(); + } + public IGameModel InitGameModel(int[] playerIds, IGameSettings gameSettings) { - return new FreeGameModel(); + return new FreeGameModel(playerIds); } } } diff --git a/GameHandler/GameService.cs b/GameHandler/GameService.cs index 7022120..25c5451 100644 --- a/GameHandler/GameService.cs +++ b/GameHandler/GameService.cs @@ -11,6 +11,7 @@ using GameHandler.GameHandler; using GameHandler.Parser; using GameModel.Contract; using GameModel.DeathGame; +using GameModel.Contracts; namespace GameHandler { @@ -19,7 +20,7 @@ namespace GameHandler private bool _isStarted = false; private IGameHandler _gh; private ThrowHandler _th; - private ThrowState _lastState; + private GameState _lastState; public GameService() { @@ -32,7 +33,7 @@ namespace GameHandler { if (_lastState != null) { - return _lastState.BoardState.ThrowMode == ThrowMode.Decrease ? "Abräumen" : "Volle"; + return _lastState.ThrowState.BoardState.ThrowMode == ThrowMode.Decrease ? "Abräumen" : "Volle"; } return string.Empty; } @@ -40,12 +41,12 @@ namespace GameHandler static int[] defaultPlayerIds => new[] {1,2,3,4}; - public ThrowState Start(string gameName = FreeGameHandler.GAMENAME_FREETRAINING) + public GameState Start(string gameName = FreeGameHandler.GAMENAME_FREETRAINING) { return Start(defaultPlayerIds, new DeathGameSettings(6), gameName); } - public ThrowState Start(int[] playerIds, IGameSettings gameSettings, string gameName = FreeGameHandler.GAMENAME_FREETRAINING) + public GameState Start(int[] playerIds, IGameSettings gameSettings, string gameName = FreeGameHandler.GAMENAME_FREETRAINING) { if (_isStarted) { @@ -58,12 +59,13 @@ namespace GameHandler _th = new ThrowHandler(); - _lastState = ThrowState.Create(_gh.ThrowMode(), _gh.ThrowsPerRount()); + var throwState = ThrowState.Create(_gh.ThrowMode(), _gh.ThrowsPerRount()); + _lastState = GameState.Create(throwState, _gh.GetCurrentPlayerId(gm), gm); return _lastState; } - public ThrowState HandleThrow(PinThrow pinThrow) + public GameState HandleThrow(PinThrow pinThrow) { if (!_isStarted) { @@ -72,8 +74,9 @@ namespace GameHandler pinThrow = AutoCompletePlayerId(pinThrow); - _lastState = _th.Update(_lastState, pinThrow); - return _lastState; + var throwState = _th.Update(_lastState.ThrowState, pinThrow); + _lastState = _lastState with { ThrowState = throwState }; + return _lastState ; } private PinThrow AutoCompletePlayerId(PinThrow pinThrow) @@ -87,8 +90,8 @@ namespace GameHandler { return pinThrow; } - - return pinThrow with { PlayerId = _gh.GetCurrentPlayerId() }; + + return pinThrow with { PlayerId = _gh.GetCurrentPlayerId(_lastState.GameModel) }; } public void Stop() @@ -102,7 +105,7 @@ namespace GameHandler public ThrowCommandData ParseThrowData(string stringData) { - return ThrowCommandParser.Parse(stringData, _gh.FreePlayerSelection(), 0); // TOOD: Player + return ThrowCommandParser.Parse(stringData, _gh.FreePlayerSelection(), 0); } public bool FreePlayerSelection => _gh.FreePlayerSelection(); diff --git a/GameModel/Contracts/IGameHandler.cs b/GameModel/Contracts/IGameHandler.cs index 5a520d8..cd14aaa 100644 --- a/GameModel/Contracts/IGameHandler.cs +++ b/GameModel/Contracts/IGameHandler.cs @@ -20,7 +20,7 @@ namespace GameModel.Contract bool FreePlayerSelection() => true; IGameModel InitGameModel(int[] playerIds, IGameSettings gameSettings); - int GetCurrentPlayerId(); + int GetCurrentPlayerId(IGameModel gameModel); } } diff --git a/GameModel/Contracts/IGameModel.cs b/GameModel/Contracts/IGameModel.cs index c5e4468..be8804d 100644 --- a/GameModel/Contracts/IGameModel.cs +++ b/GameModel/Contracts/IGameModel.cs @@ -7,6 +7,6 @@ using System.Threading.Tasks; namespace GameModel.Contracts { public interface IGameModel - { + { } } diff --git a/GameModel/FreeGame/FreeGameModel.cs b/GameModel/FreeGame/FreeGameModel.cs index cbc6676..637ef60 100644 --- a/GameModel/FreeGame/FreeGameModel.cs +++ b/GameModel/FreeGame/FreeGameModel.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace GameModel.FreeGame { - public record FreeGameModel : IGameModel + public record FreeGameModel(int[] PlayerIds) : IGameModel { } } diff --git a/GameModel/GameState.cs b/GameModel/GameState.cs new file mode 100644 index 0000000..e50ec32 --- /dev/null +++ b/GameModel/GameState.cs @@ -0,0 +1,17 @@ +using GameModel.Contracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GameModel +{ + public record GameState(ThrowState ThrowState, int NextPlayerId, IGameModel GameModel) + { + public static GameState Create(ThrowState throwState, int nextPlayerId, IGameModel gm) + { + return new GameState(throwState, nextPlayerId, gm); + } + } +} diff --git a/KoogleCli/Program.cs b/KoogleCli/Program.cs index 9a2e818..26535f0 100644 --- a/KoogleCli/Program.cs +++ b/KoogleCli/Program.cs @@ -83,7 +83,7 @@ void StartGameAction(string gameName) do { - var proptText = _gs.FreePlayerSelection ? $"Spieler,Wurf [yellow]{bs.ThrowCount + 1}[/]:" : $"Wurf [yellow]{bs.ThrowCount + 1}[/]"; + var proptText = _gs.FreePlayerSelection ? $"Spieler,Wurf [yellow]{bs.ThrowState.ThrowCount + 1}[/]:" : $"Wurf [yellow]{bs.ThrowState.ThrowCount + 1}[/]"; var stringData = AnsiConsole.Prompt( new TextPrompt(proptText) @@ -126,14 +126,14 @@ IGameSettings GetGameSettings(string gameName) return null; } -void Show(ThrowState throwState) +void Show(GameState gameState) { AnsiConsole.Clear(); ShowPlayer(); - ShowThrow(throwState); - ShowBoard(throwState.BoardState); + ShowThrow(gameState.ThrowState); + ShowBoard(gameState.ThrowState.BoardState);