} //CoroutineRonde /// <summary> /// Identifie le prochain combattant et sa victime, puis declenche son action. /// Au besoin, peut aussi lancer la prochaine ronde, la victoire ou la defaite. /// </summary> private void DeclencherActionSuivante() { if(_lesCombattantsRonde.Count > 0){ if(_lesCombattantsRonde[0].PVAct>0){ //le combattant est encore vivant... Etre combattant = _lesCombattantsRonde[0]; Etre victime = TrouverVictime(combattant); _messAction = combattant.Attaquer(victime); //l'attaque se deroule dans Etre AfficherMessage(_messAction); //Est-ce la fin du combat? : if(ListerLesVivants(TypeEtre.PERSO).Count == 0){ //tous les persos sont morts StartCoroutine( CoroutinePerdre() ); } else if(ListerLesVivants(TypeEtre.MONSTRE).Count == 0){ //tous les monstres sont morts StartCoroutine( CoroutineGagner() ); } else { //ce n'est pas fini _lesCombattantsRonde.RemoveAt(0); //apres son tour, le combattant est retire de la ronde } //if } else { //le combattant est deja mort... //Debug.Log(_lesCombattantsRonde[0].nom + " est mort durant cette ronde, au suivant!"); _lesCombattantsRonde.RemoveAt(0); //le combattant mort est elimine de la ronde DeclencherActionSuivante(); //on passe au suivant sans attendre le delai habituel }//if+else (est vivant) } //if } //DeclencherActionSuivante
} //MettreAJourStats /// <summary> /// Execute l'attaque d'un combattant /// </summary> /// <param name="victime">Instance de la victime cible.</param> /// <returns>La chaine decrivant le deroulement de cette action.</returns> public string Attaquer(Etre victime) { string messAction = ""; int attaque = 0, defense = 0, dommages = 0; //valeurs par defaut if (action == TypeAction.ATTAQUE) { attaque = EtablirAttRonde(); defense = victime.EtablirDefRonde(); dommages = Combat.CalculerDommages(attaque, defense); victime.Blesser(dommages); messAction = FormerPhraseAtt(dommages, victime); JouerAnimAttaque(); } else //c'est donc la magie { ConsommerPM(10); //reduction des points de magie attaque = EtablirAttMagRonde(); defense = victime.EtablirDefMagRonde(); if (nom != "Lucem") //ce n'est pas Lucem { dommages = Combat.CalculerDommages(attaque, defense); victime.Blesser(dommages); } else //c'est Lucem, sa magie est difference: { dommages = attaque; Jeu.Soigner(dommages, false); //applique la guerison a tous les persos } //if+else Lucem? messAction = FormerPhraseAttMag(dommages, victime); JouerAnimAttaque(); //a changer pour montrer une anim de magie } //if+else TypeAction return(messAction); } //Attaquer
} //FormerPhraseAttMag /// <summary> /// Prepare et retourne une phrase qui explique le resultat de l'attaque magique. /// </summary> /// <param name="valeur">Les dommages ou points recuperes.</param> /// <param name="victime">La cible de l'attaque.</param> /// <returns>La phrase finale.</returns> protected string FormerPhraseAttMag(int valeur, Etre victime = null) { string messAction = ""; string boutDePhrase = " lance un sort à "; //valeur par defaut if (_dictBasesPhrasesMagiques.ContainsKey(nom)) { //il y a une entree au dictionnaire: boutDePhrase = _dictBasesPhrasesMagiques[nom]; } //if if (nom == "Lucem") { messAction = nom + boutDePhrase + valeur + " point" + ((valeur > 1)?"s.":"."); } else { messAction = nom + boutDePhrase + victime.nom + ", causant " + valeur + " point" + ((valeur > 1)?"s":"") + " de dommage."; } //if+else return(messAction); } //FormerPhraseAttMag
} //DeclencherActionSuivante /// <summary> /// Trouve la victime correspondante pour un combattant (Monstre ou Perso). /// </summary> /// <param name="leCombattant">Instance du combattant.</param> /// <returns>Instance de la victime.</returns> private Etre TrouverVictime(Etre leCombattant){ Etre victime = null; int iCible; // indice de la cible dans la liste correspondante (Jeu.lesPersos ou _lesMonstres) List<Etre> lesOpposantsVivants; TypeEtre typeVictime; if(leCombattant is Monstre){ typeVictime = TypeEtre.PERSO; } else { typeVictime = TypeEtre.MONSTRE; }//if+else (Monstre ou Perso) lesOpposantsVivants = ListerLesVivants(typeVictime); if(lesOpposantsVivants.Count>0){ if(leCombattant is Monstre){ ((Monstre)leCombattant).ChoisirAction(TypeAction.HASARD); //leCombattant est «casté» comme Monstre iCible = Random.Range(0, lesOpposantsVivants.Count); } else { // les persos visent toujours le 1er vivant disponible (une meilleure mecanique pourrait etre implantee) iCible = 0; }//if+else (Monstre ou Perso) victime = lesOpposantsVivants[iCible]; ////identification de la victime (la cible) } //if opposants vivants return victime; //null si pas de victime possible } //TrouverVictime
} //Attaquer /// <summary> /// Prepare et retourne une phrase qui explique le resultat de l'attaque. /// </summary> /// <param name="valeur">Les dommages ou points recuperes.</param> /// <param name="victime">La cible de l'attaque.</param> /// <returns>La phrase finale.</returns> virtual protected string FormerPhraseAtt(int valeur, Etre victime = null) { string messAction = nom + " fait " + valeur + " point" + ((valeur > 1)?"s":"") + " de dommage sur " + victime.nom + "."; return(messAction); } //FormerPhraseAttMag