e8b45fa235
Introduce column-based drop mechanics and game info transfer; add disconnect handling and related API/interface updates. GameField API renamed Place->Drop and PlaceResult->DropResult, added ColumnFull, IsFull, and updated drop logic to insert at lowest empty row. Game model now exposes Players, adds GetPlayerByTag and makes StartGame public. New GameInformationDto conveys game state and field. Hub methods updated: GameCreated->GameJoined, RequestGameInformation, Place now forwards to Drop, and OnDisconnectedAsync notifies GameManager. GameManager implements RequestGameInformation, Drop (validates moves, broadcasts FieldUpdated and GameEnded on win/draw), improved JoinGame logic to auto-start when two players join, and handles player disconnects. Repository and interface extended with GetOneByConnectionId. Also tightened SignalR timeouts in Program.
60 lines
1.3 KiB
C#
60 lines
1.3 KiB
C#
using API.Models.DataClasses;
|
|
|
|
namespace API.Models.Game;
|
|
|
|
public enum GameState
|
|
{
|
|
Lobby,
|
|
Running,
|
|
Ended
|
|
}
|
|
|
|
public class Game(Coordinates gFs, SixDigitInt gameCode)
|
|
{
|
|
public string Id { get; init; } = Guid.NewGuid().ToString();
|
|
public SixDigitInt GameCode { get; } = gameCode;
|
|
public List<Player> Players { get; set; } = new();
|
|
public GameState State { get; private set; } = GameState.Lobby;
|
|
public GameField Field { get; } = new(gFs);
|
|
|
|
public bool AddPlayer(Player player)
|
|
{
|
|
if(Players.Count >= 2)
|
|
return false;
|
|
|
|
player.PlayerTag = Players.Count + 1;
|
|
Players.Add(player);
|
|
|
|
if (Players.Count == 2)
|
|
{
|
|
StartGame();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public void RemovePlayer(string playerConnectionId)
|
|
{
|
|
Players.RemoveAll(x => x.ConnectionId == playerConnectionId);
|
|
}
|
|
|
|
public Player? GetPlayerByConnectionId(string playerConnectionId)
|
|
{
|
|
return Players.FirstOrDefault(x => x.ConnectionId == playerConnectionId);
|
|
}
|
|
|
|
public Player? GetPlayerByTag(int playerTag)
|
|
{
|
|
return Players.FirstOrDefault(x => x.PlayerTag == playerTag);
|
|
}
|
|
|
|
public void StartGame()
|
|
{
|
|
State = GameState.Running;
|
|
}
|
|
|
|
public void EndGame()
|
|
{
|
|
State = GameState.Ended;
|
|
}
|
|
} |