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; } }