package game.model.fight;
import beans.enumeration.Target;
import beans.serializable.ChangeStatut;
import game.core.event.Event;
import game.core.event.FightEvent;
import game.entity.Fighter;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* Modèle représentant un combat.
*
* Ce modèle comprents 2 groupes : le groupe du joueur et le groupe des adversaires.
* Le groupe du joueur se décompose en 3 sous-groupes : <ul>
* <li>Les combattants du joueur, accessibles de façon permanents</li>
* <li>Les alliés temporaires jouables, accessibles uniquement pour ce combat</li>
* <li>Les alliés temporaires non-jouables, accessibles uniquement pour ce combat</li>
* </ul>
* @author Alexandre
* @version FigthModel 1.0
* @since Game 1.0
*/
public class FightModel extends Observable {
/**
* Listes de combattants appartenant aux joueurs (qui gagneront de l'XP).
*
* @since FightModel 1.0
* @see Fighter
*/
private List<Fighter> fighters;
/**
* Listes de combattants aidant le joueurs mais non jouable.
*
* @since FightModel 1.0
* @see Fighter
*/
private List<Fighter> nonPlayableAllies;
/**
* Liste de combattants aidant le joueur et jouable (ne reçoit pas d'XP).
*
* @since FightModel 1.0
* @see Fighter
*/
private List<Fighter> playableAllies;
/**
* Liste de combattants affrontant l'équipe du joueur.
*
* @since FightModel 1.0
* @see Fighter
*/
private List<Fighter> ennemies;
/**
* Liste des persos
*/
private ListPersoModel listPersoModel;
/**
* Créer un combat.
*
* @param fighters
* @param nonPlayableAllies
* @param playableAllies
* @since GameModel 1.0
* @see Fighter
*/
public FightModel(final List<Fighter> fighters, final List<Fighter> nonPlayableAllies, final List<Fighter> playableAllies, final List<Fighter> ennemies) {
this.fighters = fighters;
this.nonPlayableAllies = nonPlayableAllies;
this.playableAllies = playableAllies;
this.ennemies = ennemies;
listPersoModel = new ListPersoModel(this);
Event.setFightEvent(new FightEvent(this));
}
/**
* Récupérer un combattant dans un groupe ciblé.
*
* @param who Le combattant à chercher.
* @param whichGroup Dans quel groupe le chercher.
* @return Le combattant,
* <code>null</code> si non trouvé.
* @since GameModel 1.0
* @see Fighter
* @see Target
*/
public Fighter getFighter(final Fighter who, final Target whichGroup) {
// Index du combattant à modifier
int index;
// Valeur de retour
Fighter ret = null;
// Regarder dans quel type de groupe le combattant est
switch (whichGroup) {
// C'est un allié
case ALLY:
case GROUP:
// Récupérer l'index du combattant dans la liste des combattants du joueur
index = fighters.indexOf(who);
// Si non trouvé
if (index < 0) {
// Récupérer dans la liste des alliés jouables
index = playableAllies.indexOf(who);
// Si non trouvé
if (index < 0) {
// Récupérer dans la liste des alliés PnJ
index = nonPlayableAllies.indexOf(who);
// Si non trouvé
if (index < 0) {
// Renvoyer une erreur (combattant non trouvé)
// TODO: Ecrire dans le fichier de logs l'erreur
} // Sinon
else {
// Appliquer le changement de statut
ret = nonPlayableAllies.get(index);
}
} // Sinon
else {
// Appliquer le changement de statut
ret = playableAllies.get(index);
}
} // Sinon
else {
// Appliquer le changement de statut
ret = fighters.get(index);
}
break;
// C'est un ennemi
case ENEMIES:
case ENEMY:
// Récupérer dans la liste des ennemis
index = ennemies.indexOf(who);
// Si non trouvé
if (index < 0) {
// Renvoyer une erreur (combattant non trouvé)
// TODO: Ecrire dans le fichier de logs l'erreur
} // Sinon
else {
// Appliquer le changement de statut
ret = ennemies.get(index);
}
break;
// Cas par défaut
default:
// Renvoyer une erreur (type de groupe invalide)
// TODO: Ecrire dans le fichier de logs l'erreur
break;
}
// Renvoyer le personnage trouvé
return ret;
}
/**
* Récupérer la liste des combattants d'un groupe.
* @param whichGroup Le groupe à récupérer.
* @return La liste des combattants de ce groupe.
* @since FightModel 1.0
* @see Fighter
*/
public List<Fighter> getFighters(final Target whichGroup){
// Liste retourné
List<Fighter> ret = new ArrayList<Fighter>();
// Regarder le type de groupe souhaité
switch (whichGroup) {
// C'est un allié
case ALLY:
case GROUP:
// Ajouter les combattants du joueur
ret.addAll(fighters);
// Ajouter les PnJ jouables
ret.addAll(playableAllies);
// Ajouter les PnJ non jouables
ret.addAll(nonPlayableAllies);
break;
// C'est un ennemi
case ENEMIES:
case ENEMY:
// Ajouter les ennemis
ret.addAll(ennemies);
// Cas par défaut
default:
// Renvoyer une erreur (type de groupe invalide)
// TODO: Ecrire dans le fichier de logs l'erreur
break;
}
return ret;
}
/**
* Appliquer un changement de statut pour un combattant.
*
* @param who Le combattant sur lequel appliquer les changements
* @param whichGroup Dans quel groupe est le combattant
* @param changeStatus Les changements à appliquer
* @since FightModel 1.0
* @see Fighter
* @see Target
* @see ChangeStatut
*/
public void changeStatus(final Fighter who, final Target whichGroup, final List<ChangeStatut> changeStatus) {
// Récupérer le combattant
final Fighter toChange = getFighter(who, whichGroup);
// Si non trouvé
if (toChange == null) {
// Renvoyer une erreur
// TODO: Ecrire dans le fichier de logs l'erreur
} // Sinon
else {
// Appliquer les changements
toChange.appliqueChangeStatut(changeStatus);
}
// Notifier d'un changement
setChanged();
notifyObservers();
}
/**
* Appliquer un changement de statut pour des combattant d'un même groupe.
*
* @param who Les combattant sur lequel appliquer les changements
* @param whichGroup Dans quel groupe est le combattant
* @param changeStatus Les changements à appliquer
* @since FightModel 1.0
* @see Fighter
* @see Target
* @see ChangeStatut
*/
public void changeStatus(final List<Fighter> who, final Target whichGroup, final List<ChangeStatut> changeStatus) {
// Pour chaque combattant
for (final Fighter toChange : who) {
// Appliquer le changement
changeStatus(toChange, whichGroup, changeStatus);
}
}
public ListPersoModel getListPersoModel() {
return listPersoModel;
}
public void escape() {
}
public void listPersoHasChanged (final ListPersoModel listPersoModel) {
this.listPersoModel = listPersoModel;
setChanged();
notifyObservers();
}
}