namespace Akwaier.Engine;
/// Eén van de zes spelers, met banksaldo en aandelenbezit.
public sealed class Speler
{
public Speler(int nummer, string naam)
{
Nummer = nummer;
Naam = naam;
Geld = Regels.Startgeld;
}
public int Nummer { get; }
public string Naam { get; set; }
/// Waar of de speler door de mens bediend wordt.
public bool Mens { get; set; }
/// bezit%(): het banksaldo.
public int Geld { get; set; }
/// aandelen%(): bezit per keten, plaats 1..8.
public int[] Aandelen { get; } = new int[Regels.AantalKetens + 1];
}
/// Wat er van een vakje te zeggen valt, zonder het bord aan te raken.
public sealed class Zetkans
{
public int X { get; init; }
public int Y { get; init; }
/// Onwaar als kanniet% waar zou zijn: hier leggen mag niet.
public bool Mag { get; init; }
/// De aanliggende ketens, ontdubbeld, in de volgorde van DATA 1300.
public List Aanliggend { get; init; } = new();
/// Aanliggende losse stenen; die worden mee opgeslokt.
public List<(int X, int Y)> Losse { get; init; } = new();
/// De grootste aanliggende keten; 0 als er geen keten aanligt.
public int Winnaar { get; init; }
/// kiezen%: meerdere even grote ketens, de speler moet kiezen.
public bool Gelijkspel { get; init; }
public List Gelijken { get; init; } = new();
public bool Fuseert => Aanliggend.Count > 1;
}
/// Wat één opgeslokte keten aan bonus uitkeert.
public sealed class Uitkering
{
public int Keten { get; init; }
public int Naar { get; init; }
public int Grootte { get; init; }
public int Prijs { get; init; }
public int Pot { get; init; }
public Dictionary Bedragen { get; } = new();
}
/// Verslag van één gespeelde steen.
public sealed class Zetverslag
{
public int X { get; init; }
public int Y { get; init; }
/// De keten waar de steen bij hoort; 0 voor een losse steen.
public int Keten { get; set; }
public List Opgeslokt { get; } = new();
public List Uitkeringen { get; } = new();
}
/// Wordt gemeld als een zet tegen de regels ingaat.
public sealed class OngeldigeZet : Exception
{
public OngeldigeZet(string bericht) : base(bericht) { }
}