public GameState BuildSettlement(Player player, Intersection inter)
{
var r = player.Resources;
if (!(r.Contains(Resource.Grain) && r.Contains(Resource.Wool) && r.Contains(Resource.Brick) && r.Contains(Resource.Lumber)))
throw new InsufficientResourcesException("Not enough resources to buy a settlement");
if (player.SettlementsLeft == 0)
throw new IllegalActionException("No more settlement pieces left of your color");
if (board.GetPiece(inter) != null)
throw new IllegalBuildPositionException("The chosen position is occupied by another building");
if (!board.HasNoNeighbors(inter))
throw new IllegalBuildPositionException("The chosen position violates the distance rule");
if (board.GetRoad(new Edge(inter.FirstTile,inter.SecondTile)) != player.Id
&& board.GetRoad(new Edge(inter.FirstTile,inter.ThirdTile)) != player.Id
&& board.GetRoad(new Edge(inter.SecondTile, inter.ThirdTile)) != player.Id)
throw new IllegalBuildPositionException("The chosen position has no road leading to it");
if (!board.CanBuildPiece(inter))
throw new IllegalBuildPositionException("The chosen position is not valid");
PayResource(player, Resource.Grain);
PayResource(player, Resource.Wool);
PayResource(player, Resource.Brick);
PayResource(player, Resource.Lumber);
Log(new BuildPieceLogEvent(player.Id, Token.Settlement, inter));
player.SettlementsLeft--;
board = board.PlacePiece(inter, new Piece(Token.Settlement, player.Id));
UpdateLongestRoad();
return CurrentGamestate();
}