using CoreLibrary.Persistance;
using CoreLibrary.Evenements;
using CoreLibrary.Regles;
using CoreLibrary.Statistiques;
using System.Runtime.Serialization;
namespace CoreLibrary.Joueurs
{
///
/// Représente un joueur.
///
[DataContract]
public class Joueur : IEstPersistant
{
///
/// Événement déclenché lorsqu'un joueur se connecte.
///
public event EventHandler? JoueurSeConnecter;
private void QuandJoueurSeConnecter(Joueur joueur) => JoueurSeConnecter?.Invoke(this, new JoueurSeConnecterEventArgs(joueur));
[DataMember]
private Dictionary<(IRegles, Statistique), double> statistiques = new Dictionary<(IRegles, Statistique), double>();
///
/// Obtient le nom du joueur.
///
[DataMember]
public string Nom { get; private set; } = "";
///
/// 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.
///
/// Le joueur à connecter.
public void SeConnecter(Joueur joueur)
{
QuandJoueurSeConnecter(joueur);
}
///
/// Permet au joueur de jouer une partie.
///
/// La partie à jouer.
public void JouerPartie(Partie partie)
{
partie.PartieDemanderJoueurJouer += QuandDemanderJoueurJouer;
}
///
/// Méthode appelée lorsque la partie demande à ce joueur de jouer.
///
/// La source de l'événement.
/// Les arguments de l'événement.
public virtual void QuandDemanderJoueurJouer(object? sender, PartieDemanderJoueurJouerEventArgs e)
{
}
///
/// 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 statistique spécifiée pour les règles données.
///
/// Les règles du jeu.
/// Le type de statistique.
/// La valeur de la statistique.
public double 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, double valeur = 1) =>
statistiques[(regles, statistique)] = Statistique(regles, statistique) + valeur;
}
}