diff --git a/Sources/Model/Games/Game.cs b/Sources/Model/Games/Game.cs
index 96dfbbf..8481a30 100644
--- a/Sources/Model/Games/Game.cs
+++ b/Sources/Model/Games/Game.cs
@@ -1,209 +1,212 @@
-๏ปฟusing Model.Dice;
-using Model.Dice.Faces;
-using Model.Players;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Numerics;
-using System.Text;
-
-namespace Model.Games
-{
- public class Game
- {
- ///
- /// the name of the game ๐
- ///
- public string Name
- {
- get
- {
- return name;
- }
- set // GameRunner will need to take care of forbidding
- // (or allowing) having two Games with the same name etc.
- {
- if (string.IsNullOrWhiteSpace(value))
- {
- throw new ArgumentException("param should not be null or blank", nameof(value));
- }
- name = value;
- }
- }
- private string name;
-
- ///
- /// references the position in list of the current player, for a given game.
- ///
- private int nextIndex;
-
- ///
- /// the turns that have been done so far
- ///
- private readonly List turns;
-
- ///
- /// get a READ ONLY enumerable of all turns belonging to this game
- ///
- /// a readonly enumerable of all this game's turns
- public IEnumerable GetHistory() => turns.AsEnumerable();
-
- ///
- /// the game's player manager, doing CRUD on players and switching whose turn it is
- ///
- private readonly IManager playerManager;
-
- ///
- /// the group of dice used for this game
- ///
- public IEnumerable> Dice => dice;
- private readonly IEnumerable> dice;
-
- ///
- /// constructs a Game with its own history of Turns.
- /// If is null, starts a new history
- ///
- /// the name of the game ๐
- /// the turns that have been done so far
- /// the game's player manager, doing CRUD on players and switching whose turn it is
- /// the group of dice used for this game
- public Game(string name, IManager playerManager, IEnumerable> dice, IEnumerable turns)
- {
- Name = name;
- this.turns = turns is null ? new List() : turns.ToList();
- this.playerManager = playerManager;
- this.dice = dice;
- this.nextIndex = 0;
- }
-
- ///
- /// constructs a Game with no history of turns.
- ///
- /// the name of the game ๐
- /// the game's player manager, doing CRUD on players and switching whose turn it is
- /// the group of dice used for this game
- public Game(string name, IManager playerManager, IEnumerable> dice)
- : this(name, playerManager, dice, null)
- { }
-
- ///
- /// performs a Turn, marks this Game as "started", and logs that Turn
- ///
- /// the player whose turn it is
- public void PerformTurn(Player player)
- {
- Turn turn = Turn.CreateWithDefaultTime(
- player,
- ThrowAll()
- );
- turns.Add(turn);
- }
-
- ///
- /// finds and returns the player whose turn it is
- ///
- ///
- ///
- public Player GetWhoPlaysNow()
- {
- if (!playerManager.GetAll().Any())
- {
- throw new MemberAccessException("you are exploring an empty collection\nthis should not have happened");
- }
- return playerManager.GetAll().ElementAt(nextIndex);
- }
-
- ///
- /// this feels very dirty
- ///
- /// the current player
- ///
- ///
- ///
- public void PrepareNextPlayer(Player current)
- {
- if (!playerManager.GetAll().Any())
- {
- throw new MemberAccessException("you are exploring an empty collection\nthis should not have happened");
- }
- if (current == null)
- {
- throw new ArgumentNullException(nameof(current), "param should not be null");
- }
- if (!playerManager.GetAll().Contains(current))
- {
- throw new ArgumentException("param could not be found in this collection\n did you forget to add it?", nameof(current));
- }
- if (playerManager.GetAll().Last() == current)
- {
- // if we've reached the last player, we need the index to loop back around
- nextIndex = 0;
- }
- else
- {
- // else we can just move up by one from the current index
- nextIndex++;
- }
- }
-
- ///
- /// throws all the Dice in FavGroup and returns a list of their Faces
- ///
- /// list of AbstractDieFaces after a throw
- private Dictionary, AbstractDieFace> ThrowAll()
- {
- Dictionary, AbstractDieFace> faces = new();
- foreach (AbstractDie die in dice)
- {
- faces.Add(die, die.GetRandomFace());
- }
- return faces;
- }
-
- public Player AddPlayerToGame(Player player)
- {
- return playerManager.Add(player);
- }
-
- public IEnumerable GetPlayersFromGame()
- {
- return playerManager.GetAll();
- }
-
- public Player UpdatePlayerInGame(Player oldPlayer, Player newPlayer)
- {
- return playerManager.Update(oldPlayer, newPlayer);
- }
-
- public void RemovePlayerFromGame(Player player)
- {
- playerManager.Remove(player);
- }
-
- ///
- /// represents a Game in string format
- ///
- /// a Game in string format
- public override string ToString()
- {
- StringBuilder sb = new();
- sb.Append($"Game: {Name}");
-
- sb.Append("\nPlayers:");
- foreach (Player player in GetPlayersFromGame())
- {
- sb.Append($" {player.ToString()}");
- }
-
- sb.Append($"\nNext: {GetWhoPlaysNow()}");
-
- sb.Append("\nLog:\n");
- foreach (Turn turn in this.turns)
- {
- sb.Append($"\t{turn.ToString()}\n");
- }
-
- return sb.ToString();
- }
- }
-}
+๏ปฟusing Model.Dice;
+using Model.Dice.Faces;
+using Model.Players;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Numerics;
+using System.Text;
+
+namespace Model.Games
+{
+ public class Game
+ {
+ ///
+ /// the name of the game ๐
+ ///
+ public string Name
+ {
+ get
+ {
+ return name;
+ }
+ set // GameRunner will need to take care of forbidding
+ // (or allowing) having two Games with the same name etc.
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ throw new ArgumentException("param should not be null or blank", nameof(value));
+ }
+ name = value;
+ }
+ }
+ private string name;
+
+ ///
+ /// references the position in list of the current player, for a given game.
+ ///
+ private int nextIndex;
+
+ ///
+ /// the turns that have been done so far
+ ///
+ private readonly List turns;
+
+ ///
+ /// get a READ ONLY enumerable of all turns belonging to this game
+ ///
+ /// a readonly enumerable of all this game's turns
+ public IEnumerable GetHistory() => turns.AsEnumerable();
+
+ ///
+ /// the game's player manager, doing CRUD on players and switching whose turn it is
+ ///
+ private readonly IManager playerManager;
+
+ ///
+ /// the group of dice used for this game
+ ///
+ public IEnumerable> Dice => dice;
+ private readonly IEnumerable> dice;
+
+ ///
+ /// constructs a Game with its own history of Turns.
+ /// If is null, starts a new history
+ ///
+ /// the name of the game ๐
+ /// the turns that have been done so far
+ /// the game's player manager, doing CRUD on players and switching whose turn it is
+ /// the group of dice used for this game
+ public Game(string name, IManager playerManager, IEnumerable> dice, IEnumerable turns)
+ {
+ Name = name;
+ this.turns = turns is null ? new List() : turns.ToList();
+ this.playerManager = playerManager;
+ this.dice = dice;
+ this.nextIndex = 0;
+ }
+
+ ///
+ /// constructs a Game with no history of turns.
+ ///
+ /// the name of the game ๐
+ /// the game's player manager, doing CRUD on players and switching whose turn it is
+ /// the group of dice used for this game
+ public Game(string name, IManager playerManager, IEnumerable> dice)
+ : this(name, playerManager, dice, null)
+ { }
+
+ ///
+ /// performs a Turn, marks this Game as "started", and logs that Turn
+ ///
+ /// the player whose turn it is
+ public void PerformTurn(Player player)
+ {
+ Turn turn = Turn.CreateWithDefaultTime(
+ player,
+ ThrowAll()
+ );
+ if(turn != null && !(turns.Contains(turn)))
+ {
+ turns.Add(turn);
+ }
+ }
+
+ ///
+ /// finds and returns the player whose turn it is
+ ///
+ ///
+ ///
+ public Player GetWhoPlaysNow()
+ {
+ if (!playerManager.GetAll().Any())
+ {
+ throw new MemberAccessException("you are exploring an empty collection\nthis should not have happened");
+ }
+ return playerManager.GetAll().ElementAt(nextIndex);
+ }
+
+ ///
+ /// this feels very dirty
+ ///
+ /// the current player
+ ///
+ ///
+ ///
+ public void PrepareNextPlayer(Player current)
+ {
+ if (!playerManager.GetAll().Any())
+ {
+ throw new MemberAccessException("you are exploring an empty collection\nthis should not have happened");
+ }
+ if (current == null)
+ {
+ throw new ArgumentNullException(nameof(current), "param should not be null");
+ }
+ if (!playerManager.GetAll().Contains(current))
+ {
+ throw new ArgumentException("param could not be found in this collection\n did you forget to add it?", nameof(current));
+ }
+ if (playerManager.GetAll().Last() == current)
+ {
+ // if we've reached the last player, we need the index to loop back around
+ nextIndex = 0;
+ }
+ else
+ {
+ // else we can just move up by one from the current index
+ nextIndex++;
+ }
+ }
+
+ ///
+ /// throws all the Dice in FavGroup and returns a list of their Faces
+ ///
+ /// list of AbstractDieFaces after a throw
+ private Dictionary, AbstractDieFace> ThrowAll()
+ {
+ Dictionary, AbstractDieFace> faces = new();
+ foreach (AbstractDie die in dice)
+ {
+ faces.Add(die, die.GetRandomFace());
+ }
+ return faces;
+ }
+
+ public Player AddPlayerToGame(Player player)
+ {
+ return playerManager.Add(player);
+ }
+
+ public IEnumerable GetPlayersFromGame()
+ {
+ return playerManager.GetAll();
+ }
+
+ public Player UpdatePlayerInGame(Player oldPlayer, Player newPlayer)
+ {
+ return playerManager.Update(oldPlayer, newPlayer);
+ }
+
+ public void RemovePlayerFromGame(Player player)
+ {
+ playerManager.Remove(player);
+ }
+
+ ///
+ /// represents a Game in string format
+ ///
+ /// a Game in string format
+ public override string ToString()
+ {
+ StringBuilder sb = new();
+ sb.Append($"Game: {Name}");
+
+ sb.Append("\nPlayers:");
+ foreach (Player player in GetPlayersFromGame())
+ {
+ sb.Append($" {player.ToString()}");
+ }
+
+ sb.Append($"\nNext: {GetWhoPlaysNow()}");
+
+ sb.Append("\nLog:\n");
+ foreach (Turn turn in this.turns)
+ {
+ sb.Append($"\t{turn.ToString()}\n");
+ }
+
+ return sb.ToString();
+ }
+ }
+}