static void Main(string[] args) { // Déclaration du Battle Manager qui surveille l'état des personnages participants à la bataille BattleManager manager = new BattleManager(); manager.state = BattleStates.START; // Mise en place des compétences utilisables List <Ability> gameAbilities = new List <Ability> { new Ability(2, -10f, "Griffure", "Coup de griffes acérées perforant les armures", 0), new Ability(3, -15f, "Fendoir", "Coup d'épée infligeant une terrible blessure", 0), new Ability(8, -30f, "Hachoir", "Coup d'épée infligeant une terrible blessure", 3), new Ability(5, -25f, "Tourbillon", "Le tourbillon est une technique mortelle de combat", 2), new Ability(4, -19f, "Coup circulaire", "Terrible coup de faux circulaire", 1), }; // Mise en place du personnage jouable manager.Character = new PartyCharacter { Name = "Geralt of Rivia", HP = 100f, CurrentHP = 100f, ActionPoints = 8, MaxActionPoints = 8, Abilities = new List <Ability> { gameAbilities.ElementAt(1), gameAbilities.ElementAt(3) }, }; // Mise en place des monstres que le joueur peut combattre List <Foe> monsters = new List <Foe> { new Foe { Name = "Noyeur", HP = 35f, CurrentHP = 35f, ActionPoints = 8, MaxActionPoints = 8, Abilities = new List <Ability> { gameAbilities.ElementAt(0), gameAbilities.ElementAt(2) }, }, new Foe { Name = "Spectre", HP = 50f, CurrentHP = 50f, ActionPoints = 8, MaxActionPoints = 8, Abilities = new List <Ability> { gameAbilities.ElementAt(4) }, } }; // Ajout des monstres à la bataille manager.Opponents.AddRange(new List <Foe> { monsters.ElementAt(0), monsters.ElementAt(1) }); // Initialisation de l'observation des personnages par le StateManager manager.BattleCharacters().ForEach(i => i.Observe(manager)); // Booléan définissant si la bataille est en cours ou terminée bool battle = true; // Fonctionnement du jeu while (battle) { // Comportement de l'application selon l'état de la bataille switch (manager.state) { // Si la bataille commence case BattleStates.START: Console.WriteLine("La bataille commence"); manager.state = BattleStates.PLAYERTURN; break; // Si c'est le tour du joueur case BattleStates.PLAYERTURN: manager.Engine.StartTurn(); manager.BattleCharacters().ForEach(i => UI.Display($"{i.Name} : Points d'action restant : {i.ActionPoints}, HP restant : {i.CurrentHP} sur { i.HP }")); UI.Seperate(); // Choix de l'action à effectuer pour le joueur UI.Display("Quelle action voulez-vous effectuer ?"); UI.Display("Appuyez sur A pour attaquer, Q pour abandonner et P pour passer votre tour"); // Demande à l'utilisateur d'entrer une valeur tant que a valeur ne correspond pas à une option possible string value = Console.ReadLine(); while (value != "A" && value != "Q" && value != "P") { UI.Display("Veuillez indiquer une valeur valide"); value = Console.ReadLine(); } switch (value) { case "A": UI.Display("Quelle compétence voulez-vous utiliser ?"); // Affichage de toutes les compétences du personnage et de leur index for (int i = 0; i < manager.Character.Abilities.Count; i++) { UI.Display($"{i} : {manager.Character.Abilities.ElementAt(i).Name} | Coûte {manager.Character.Abilities.ElementAt(i).ActionPoint} points d'action | Délai avant réutilisation {manager.Character.Abilities.ElementAt(i).currentCooldown} tours"); } // Initialisation de l'index à 99 (signifiant que l'index est dans l'attente de recevoir une valeur) int ability_index = -1; while (ability_index == -1) { ability_index = UI.CheckIndexInput(manager.Character.Abilities); if (manager.Character.Abilities.ElementAt(ability_index).Cooldown != 0 && manager.Character.Abilities.ElementAt(ability_index).ActionPoint > manager.Character.ActionPoints) { ability_index = -1; UI.Display("Compétence inutilisable"); } } if (ability_index != 100) { UI.Display("Veuillez renseigner l'index de votre cible parmi les adversaires suivant :"); for (int i = 0; i < manager.Opponents.Count; i++) { UI.Display($"{i} : {manager.Opponents.ElementAt(i).Name} / {manager.Opponents.ElementAt(i).CurrentHP} Hp restants"); } // Fonction permettant de choisir une cible, tant que la cible choisie est hors combat, la demande recommence int target = -1; while (target == -1) { target = UI.CheckIndexInput <Foe>(manager.Opponents); if (manager.Opponents.ElementAt(target).CurrentHP == 0) { target = -1; UI.Display("Veuillez choisir une autre cible"); } } // Si l'index de la cible choisie est 100, l'utilisateur souhaite passer son tour if (target == 100) { UI.Display("Vous passez votre tour"); } else { // Ajoute l'action de la compétence à utiliser aux actions du tour sur l'Engine TurnAction currentAction = new TurnAction { Action = manager.Character.Abilities.ElementAt(ability_index).DoAbility, Source = manager.Character, Target = manager.Opponents.ElementAt(target), ActionName = $"Utilise le sort {manager.Character.Abilities.ElementAt(ability_index).Name}" }; manager.Engine.AppendAction(currentAction); } } else { UI.Display("Vous passez votre tour"); } manager.state = BattleStates.ENEMYTURN; break; case "Q": UI.Display("Vous avez décidé d'abandonner"); manager.state = BattleStates.LOSE; break; case "P": UI.Display("Vous passez votre tour"); manager.state = BattleStates.ENEMYTURN; break; } manager.Engine.DoTurn(); manager.Engine.GetTurnResults().ToList().ForEach(i => UI.Display(i.DisplayText)); manager.Character.Abilities.ForEach(i => i.ReduceCd()); UI.Seperate(); break; // Si c'est le tour de l'adversaire case BattleStates.ENEMYTURN: manager.Engine.StartTurn(); UI.Display("Tour de l'adversaire"); List <TurnAction> actions = new List <TurnAction>(); manager.Opponents.ForEach(i => actions.Add(i.DoTurn(manager.Character))); foreach (TurnAction action in actions) { if (action != null) { manager.Engine.AppendAction(action); } } manager.Engine.DoTurn(); manager.Engine.GetTurnResults().ToList().ForEach(i => UI.Display(i.DisplayText)); manager.Opponents.ForEach(i => i.Abilities.ForEach(a => a.ReduceCd())); // Redonne 3 points d'action aux personnages participants à la bataille AddActionsPoint(manager.BattleCharacters()); if (manager.state != BattleStates.LOSE && manager.state != BattleStates.WIN) { manager.state = BattleStates.PLAYERTURN; } break; // Si le joueur a gagné la bataille case BattleStates.WIN: UI.Display("Vous avez gagné la bataille !"); battle = false; break; // Si le joueur a perdu la bataille case BattleStates.LOSE: UI.Display("Vous avez perdu la bataille"); battle = false; break; } } Console.ReadLine(); }
static void AddActionsPoint(List <Character> characters) { UI.Display("3 points d'action rendus aux personnages, tour suivant"); UI.Seperate(); characters.ForEach(i => i.ActionPoints = Math.Min(i.ActionPoints + 3, i.MaxActionPoints)); }