using CoreLibrary.Exceptions;
using CoreLibrary.Persistance;
using CoreLibrary.Evenements;
using CoreLibrary.Regles;
using CoreLibrary.Statistiques;
using System.Runtime.Serialization;
namespace CoreLibrary.Joueurs
{
///
/// Classe représentant un joueur.
///
[DataContract]
[KnownType(typeof(ReglesClassiques))]
public class Joueur : IEstPersistant
{
///
/// Événement déclenché lorsque le joueur se connecte.
///
public event EventHandler? JoueurSeConnecter;
private void QuandJoueurSeConnecter() => JoueurSeConnecter?.Invoke(this, new JoueurSeConnecterEventArgs(Nom));
///
/// Dictionnaire des statistiques du joueur avec les règles et les statistiques.
///
[DataMember]
private Dictionary<(IRegles, Statistique), int> statistiques = new Dictionary<(IRegles, Statistique), int>();
///
/// Obtient le nom du joueur.
///
[DataMember]
public string Nom { get; private set; } = "";
///
/// Indique si le joueur est connecté.
///
public bool EstConnecte { get; private set; } = false;
///
/// Constructeur de joueur.
///
public Joueur()
{
}
///
/// Constructeur de joueur avec le nom spécifié.
///
/// Le nom du joueur.
public Joueur(string nom)
{
Nom = nom;
}
///
/// Connecte le joueur actuel avec les informations d'un autre joueur.
///
/// Le joueur à partir duquel copier les informations.
/// Renvoie le joueur actuel connecté.
/// Lancée si le joueur est déjà connecté.
public Joueur SeConnecter(Joueur joueur)
{
if (EstConnecte)
throw new JoueurDejaConnecteException(this);
Nom = joueur.Nom;
statistiques = joueur.statistiques;
EstConnecte = true;
QuandJoueurSeConnecter();
return this;
}
///
/// Retourne une représentation sous forme de chaîne de caractères.
///
/// Renvoie une chaîne de caractères du nom du joueur.
public override string ToString() => Nom;
///
/// Obtient la valeur de la statistique spécifiée pour les règles données.
///
/// Les règles du jeu.
/// Le type de statistique.
/// Renvoie la valeur de la statistique.
public int Statistique(IRegles regles, Statistique statistique) =>
statistiques.GetValueOrDefault((regles, statistique), 0);
///
/// Incrémente la valeur de la statistique spécifiée pour les règles données.
///
/// Les règles du jeu.
/// Le type de statistique.
public void IncrementerStatistique(IRegles regles, Statistique statistique) =>
statistiques[(regles, statistique)] = Statistique(regles, statistique) + 1;
}
}