using System; using System.Collections.Generic; using System.ComponentModel; using OrderStacks.model.card; using OrderStacks.model.@event; using OrderStacks.model.piles; using OrderStacks.Resx; namespace OrderStacks.model.manager { public abstract class GameManager: INotifyPropertyChanged { protected Parametreur parametreur; protected List CurrentCardPlayed = new List(); public string EndMessage { get; set; } = ""; protected int currentIndexPlayer; protected List currentHand; protected bool win; public List CurrentHand { get { return currentHand; } set { currentHand = value; OnPropertyChanged("CurrentHand"); } } #region event public event EventHandler EndGame; public event EventHandler PlayerChanged; public event PropertyChangedEventHandler PropertyChanged; /** * Nom de la propriété qui change * Evénement permettant de notifier qu'une propriété a changé */ public virtual void OnPropertyChanged(string info) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info)); } /** * Argument(s) de l'événement * Source de l'événement * Evenement permettant de notifier la fin du jeu */ public void OnEndGame(object source, EventArgs args) { EndGame?.Invoke(source, args); } /** * Argument(s) de l'événement * Source de l'événement * Evenement permettant de changer de joueur actif */ protected internal void OnPlayerChanged(object source, PlayerChangedEventArgs args) { currentIndexPlayer += 1; if (currentIndexPlayer == parametreur.players.Count) { currentIndexPlayer = 0; } CurrentHand = parametreur.players[currentIndexPlayer].getCardList(); int i = 0; while (CurrentHand.Count == 0 && i != 5) { currentIndexPlayer += 1; if (currentIndexPlayer == parametreur.players.Count) { currentIndexPlayer = 0; } CurrentHand = parametreur.players[currentIndexPlayer].getCardList(); i++; // Garde fou } if (i == 5) { EndMessage = AppResources.StrWin; win = true; } else { parametreur.GameMode.TestEndGame(CurrentHand); PlayerChanged?.Invoke(source, new PlayerChangedEventArgs(CurrentHand, parametreur.players[currentIndexPlayer].Pseudo)); parametreur.GameMode.NbCardAtBeginOfTurn = CurrentHand.Count; } } #endregion /** * Parametreur de la partie * Constructeur */ protected GameManager(Parametreur parametreur) { this.parametreur = parametreur; parametreur.Prepare(); parametreur.GameMode.EndGame += OnEndGame; parametreur.GameMode.PlayerChanged += OnPlayerChanged; CurrentHand = parametreur.players[0].getCardList(); } /** * Pile sélectionnée pour essayer de poser la carte *Valeur de la carte séléctionnée * Fonction permettant de tenter de jouer une carte * Booléen de carte joué */ public bool joue(int orderedStackSelected, decimal valueCard) { bool isPlayed = parametreur.GameMode.playCard(valueCard, currentHand, orderedStackSelected, parametreur.players[currentIndexPlayer], CurrentCardPlayed); // Mettre le joueur actif EndMessage = parametreur.GameMode.Message; return isPlayed; } /** * Fonction permettant de terminer son tour et notifier si le jeu est fini * Booléen de fin de jeu */ public bool endTurn() { if(parametreur.GameMode.endTurn(currentHand, CurrentCardPlayed, parametreur.players[currentIndexPlayer])) { EndMessage = parametreur.GameMode.Message + "Il vous restait " + parametreur.getScore() + " cartes à jouer!"; return true; } else { EndMessage = parametreur.GameMode.Message; if (win) { EndMessage = AppResources.StrWin; OnEndGame(this, new EventArgs()); return true; } return false; } } /** * Fonction permettant de retourner les piles * Piles du jeu */ public Piles getPiles() { return parametreur.GameMode.Piles; } } }