package game.view.fight;
import beans.core.GeneralConstant;
import beans.enumeration.Stat;
import game.entity.Fighter;
import game.model.ListModel;
import game.model.fight.ListPersoModel;
import game.view.Displayable;
import game.view.ListScreen;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* Vues des personnages utilisables en combat par le joueur.
*
* @author Alexandre
* @since Game 1.0
* @version ListPerso 1.0
*/
public class ListPerso implements Observer, Displayable {
private List<ListScreen> fightersStats = new ArrayList<ListScreen>();
private ListPersoModel listPersoModel;
/**
* Longueur de l'image représentant la liste.
*
* @since ListPerso 1.0
*/
public final int SIZE_X = GeneralConstant.TAILLE_ECRAN_X / 2;
/**
* Largeur de l'image représentant la liste.
*
* @since ListPerso 1.0
*/
public final int SIZE_Y = 200;
/**
* Créer la vue des personnages utilisables en combat par le joueur.
*
* @param fighters La liste des combattants.
* @param toDisplay Le nombre de personnages à afficher en même temps.
* @since ListPerso 1.0
* @see Fighter
*/
public ListPerso(final ListPersoModel listPersoModel) {
this.listPersoModel = listPersoModel;
listPersoModel.addObserver(this);
ListScreen list = new ListScreen(new ListModel(listPersoModel.getToDisplay()));
fightersStats.add(list);
list = new ListScreen(new ListModel(listPersoModel.getToDisplay()));
list.displayCursor(false);
fightersStats.add(list);
list = new ListScreen(new ListModel(listPersoModel.getToDisplay()));
list.displayCursor(false);
fightersStats.add(list);
fightersStats.get(0).getListModel().setHead("Name");
fightersStats.get(1).getListModel().setHead(Stat.HP.name().toLowerCase());
fightersStats.get(2).getListModel().setHead(Stat.MP.name().toLowerCase());
// Pour chaque personnage
for (final Fighter current : listPersoModel.getFightersList()) {
// Observer ce combattant
//current.addObserver(this);
fightersStats.get(0).getListModel().add(current.getName());
fightersStats.get(1).getListModel().add(current.getStat().getCurrentHP().toString() + " / " + current.getStat().getTotalHPMax().toString());
fightersStats.get(2).getListModel().add(current.getStat().getCurrentMP().toString() + " / " + current.getStat().getTotalMPMax().toString());
}
}
/**
* Met à jour le contenu de la liste correspondant à la caractéristique mis
* à jour.
*
* @param updatedStat La caractéristique mise à jour.
* @since ListPerso 1.0
* @see Fighter
*/
private void updateList(final Stat updatedStat) {
if (updatedStat != null) {
int indexStat = 0;
switch (updatedStat) {
case HP:
indexStat = 1;
break;
case MP:
indexStat = 2;
break;
}
fightersStats.set(indexStat, new ListScreen(new ListModel(listPersoModel.getToDisplay())));
fightersStats.get(indexStat).getListModel().add(updatedStat.name().toLowerCase());
// Pour chaque personnage
for (final Fighter current : listPersoModel.getFightersList()) {
// Regarder quelle stat a été mise à jour
switch (updatedStat) {
// Si HP
case HP:
// Ajouter ses HPs dans la liste des HPs
fightersStats.get(1).getListModel().add(current.getStat().getCurrentHP().toString() + "/" + current.getStat().getTotalHPMax().toString());
break;
// Si MP
case MP:
// Ajouter ses MP dans la liste des HPs
fightersStats.get(2).getListModel().add(current.getStat().getCurrentMP().toString() + "/" + current.getStat().getTotalMPMax().toString());
break;
}
}
}
}
/**
* Renvoie l'image correspondant à la liste des personnages ainsi que leurs
* statistiques courantes.
*
* @return L'image affichant les stats du personnage
* @since ListPerso 1.0
*/
@Override
public Image getImage() {
//Initialiser l'affichage
final BufferedImage image = new BufferedImage(SIZE_X, SIZE_Y, BufferedImage.TYPE_INT_ARGB);
final Graphics2D graphic = image.createGraphics();
graphic.setColor(Color.red);
graphic.fillRect(0, 0, SIZE_X, SIZE_Y);
int i = 0;
int previewMaxSize = 0;
for (final ListScreen entry : fightersStats) {
graphic.drawImage(entry.getImage(), i * (previewMaxSize + 20), 0, null);
i++;
previewMaxSize = entry.getImage().getWidth(null);
}
// Fin du dessin
graphic.dispose();
return image;
}
/**
* Mettre à jour la liste.
*
* @param o Le modèle mis à jour (un objet de classe Fighter).
* @param arg Les paramètres de modification. Doit être un Stat.
* @since ListPerso 1.0
*/
@Override
public void update(final Observable o, final Object arg) {
listPersoModel = (ListPersoModel)o;
final int previewCursorPosition = fightersStats.get(0).getListModel().getCurrentPosition();
fightersStats.get(0).getListModel().updateCursorPosition(0, listPersoModel.getCurrentPersoIndex() - previewCursorPosition);
}
}