Add turn tracking and enforce turn order
Introduce CurrentTurn to Game (default 1) and expose it via GameInformationDto. Update GameManager to include CurrentTurn in the GameInformation payload, validate that a player can only Drop when it is their turn, and toggle CurrentTurn between 1 and 2 after a successful move. Also use a safe fallback (0) when game is null.
This commit is contained in:
@@ -14,6 +14,7 @@ public class Game(Coordinates gFs, SixDigitInt gameCode)
|
|||||||
public string Id { get; init; } = Guid.NewGuid().ToString();
|
public string Id { get; init; } = Guid.NewGuid().ToString();
|
||||||
public SixDigitInt GameCode { get; } = gameCode;
|
public SixDigitInt GameCode { get; } = gameCode;
|
||||||
public List<Player> Players { get; set; } = new();
|
public List<Player> Players { get; set; } = new();
|
||||||
|
public int CurrentTurn { get; set; } = 1;
|
||||||
public GameState State { get; private set; } = GameState.Lobby;
|
public GameState State { get; private set; } = GameState.Lobby;
|
||||||
public GameField Field { get; } = new(gFs);
|
public GameField Field { get; } = new(gFs);
|
||||||
|
|
||||||
|
|||||||
@@ -6,5 +6,6 @@
|
|||||||
public List<Player> Players { get; set; }
|
public List<Player> Players { get; set; }
|
||||||
public GameState? State { get; set; }
|
public GameState? State { get; set; }
|
||||||
public int[,] CurrentField { get; set; }
|
public int[,] CurrentField { get; set; }
|
||||||
|
public int CurrentTurn { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ public class GameManager(IGameRepository gameRepository, IHubContext<GameHubSock
|
|||||||
{
|
{
|
||||||
Players = game?.Players,
|
Players = game?.Players,
|
||||||
CurrentField = game?.Field.CurrentField,
|
CurrentField = game?.Field.CurrentField,
|
||||||
State = game?.State
|
State = game?.State,
|
||||||
|
CurrentTurn = game?.CurrentTurn ?? 0
|
||||||
};
|
};
|
||||||
|
|
||||||
await hubContext.Clients.Client(playerConnectionId).SendAsync("GameInformation", gameInfoDto);
|
await hubContext.Clients.Client(playerConnectionId).SendAsync("GameInformation", gameInfoDto);
|
||||||
@@ -57,6 +58,9 @@ public class GameManager(IGameRepository gameRepository, IHubContext<GameHubSock
|
|||||||
if (player == null)
|
if (player == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(game.CurrentTurn != player.PlayerTag)
|
||||||
|
return;
|
||||||
|
|
||||||
var result = game.Field.Drop(column, player.PlayerTag);
|
var result = game.Field.Drop(column, player.PlayerTag);
|
||||||
|
|
||||||
if (result != DropResult.Placed)
|
if (result != DropResult.Placed)
|
||||||
@@ -92,6 +96,8 @@ public class GameManager(IGameRepository gameRepository, IHubContext<GameHubSock
|
|||||||
|
|
||||||
ScheduleGameDeletion(game.Id, TimeSpan.FromSeconds(5));
|
ScheduleGameDeletion(game.Id, TimeSpan.FromSeconds(5));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
game.CurrentTurn = game.CurrentTurn == 1 ? 2 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task DisconnectedPlayer(string playerConnectionId)
|
public Task DisconnectedPlayer(string playerConnectionId)
|
||||||
|
|||||||
Reference in New Issue
Block a user