Files
Giants/Src/Giants.Core/Src/Commands/PrepareMatchCommand.cs
mcmuzzle 3dba66344d
All checks were successful
check main state / build (9.0.x) (push) Successful in 2m46s
fin de l'initialisation d'un match et ajout du random aux commandes
2025-04-24 22:31:19 +02:00

111 lines
3.3 KiB
C#

using Giants.Core.Enums;
using Giants.Core.Exceptions;
namespace Giants.Core.Commands;
public class PrepareMatchCommand : BaseMatchCommand<PrepareMatchResult>
{
public required IList<int> PlayerIDs { get; init; }
protected override PrepareMatchResult LocalMatchExecute(Match match)
{
if (PlayerIDs.Count < 3 || PlayerIDs.Count > 5 || null == match)
return new PrepareMatchResult();
//Gestion des assets des joueurs
for (int itePlayer = 0; itePlayer < PlayerIDs.Count; itePlayer++)
{
match.SetPlayer(itePlayer, PlayerIDs[itePlayer]);
Player? player = match.GetPlayer(itePlayer);
if (null == player)
throw new ArgumentException($"Cannot get player {itePlayer} in PrepareMatchCommand");
//socles
int nbSocle = NbSoclePerPlayer(PlayerIDs.Count);
foreach (var socle in player.Bases)
{
if (nbSocle > 0)
{
player.PutPieceInHiddenArea(socle);
nbSocle--;
}
else
{
break;
}
}
//marqueurs tribaux (on ajoute 2 par joueurs et le reste dans l'urne)
int i = 0;
foreach (var marker in player.Markers)
{
if (i < 2)
{
player.PutPieceInHiddenArea(marker);
}
else
{
match.AssignPiece(marker, PiecePosition.Urne);
}
i++;
}
//assigner les ouvriers (1 chef, 1 shaman et 1 worker chacun)
match.AssignPiece(player.Chef, player.HiddenPosition);
match.AssignPiece(player.Shaman, player.HiddenPosition);
int nbWorker = 1;
foreach (PieceIndex worker in player.Workers)
{
if (nbWorker > 0)
{
match.AssignPiece(worker, player.HiddenPosition);
nbWorker--;
}
else
{
match.AssignPiece(worker, PiecePosition.Urne);
}
}
match.AssignPiece(player.Workers.First(), player.HiddenPosition);
//score a zero
for (int iteScore = 0; iteScore < match.NbPlayer; iteScore++)
{
match.SetScore(iteScore, 0);
}
//choix d'un 1er joueur
Player? firstPlayer = match.GetPlayer(Random.Next(match.NbPlayer));
if (null == firstPlayer)
throw new InitialisationException("Cannot select first player, indexOutOfRange");
match.AssignPiece(PieceIndex.StartPlayer, firstPlayer.VisiblePosition);
}
return new PrepareMatchResult()
{
Success = true,
Match = match
};
}
private static int NbSoclePerPlayer(int nbTotalPlayer)
{
return nbTotalPlayer switch
{
3 => 7,
4 => 6,
5 => 5,
_ => throw new DataConversionException("Wrong player count for NbMarkerPerPlayer")
};
}
}
public class PrepareMatchResult : BaseCommandResult
{
public Match? Match { get; init; }
}