package game.model.inventory;
import beans.enumeration.InventoryMode;
import beans.enumeration.Target;
import beans.enumeration.Utilization;
import beans.serializable.Cost;
import beans.serializable.Spell;
import game.control.SpellController;
import game.entity.Fighter;
import game.model.ListModel;
import java.util.ArrayList;
import java.util.List;
/**
* Model qui controle la partie magie de l'inventaire
*
* @author Elragos
* @version InventorySpellModel 1.0
* @since Game 1.0
*/
public class InventorySpellModel extends InventoryModelPatern {
/**
* Liste de sorts courantes, pour la récupération de la description
*
* @since InventorySpellModel 1.0
*/
private List<Spell> spellList = new ArrayList<Spell>();
;
/**
* Sort courant, dont on doit afficher la description
* @since InventorySpellModel 1.0
*/
private Spell currentSpell;
/**
* Constructeur par défaut.
*
* @since InventorySpellModel 1.0
*/
public InventorySpellModel() {
listModel = new ListModel(10);
resetList();
}
/**
* Gère l'appui sur la touche "entrée".
*
* @return Le mode dans lequel le modèle est.
* @since InventorySpellModel 1.0
*/
@Override
public InventoryMode EnterRequest() {
final Fighter fighter = fighterListModel.get(currentFighter);
final boolean utilisable = (currentSpell.getUse() == Utilization.OUTSIDE_BATTLE || currentSpell.getUse() == Utilization.TWICE);
if (currentSpell != null && utilisable) {
final SpellController spellController = new SpellController(currentSpell, null);
if (currentSpell.getTarget() == Target.ALLY || currentSpell.getTarget() == Target.ENEMY) {
spellController.castSpell(fighter, fighter);
} else {
spellController.castSpell(fighter, fighterListModel);
}
}
return InventoryMode.SAME;
}
/**
* Gère le changement de position du curseur
*
* @param x La position du curseur en x
* @param y La position du curseur en y
* @since InventorySpellModel 1.0
*/
@Override
public void moveCursor(int x, int y) {
listModel.updateCursorPosition(x, y);
setCurrentSpell(listModel.getCurrentPosition());
setChanged();
notifyObservers();
}
/**
* Retourner au menu principal
*
* @return Le menu principal
* @since InventorySpellModel 1.0
*/
@Override
public InventoryMode back() {
return InventoryMode.MENU;
}
/**
* Réinitialiser la position du curseur et réinitialise le contenu de la
* liste
*
* @since InventorySpellModel 1.0
*/
@Override
public void resetCursor() {
setCurrentSpell(0);
resetList();
listModel.resetCursor();
}
/**
* Récupérer la description du sort couramment sélectionné.
*
* @return La description du sort courant.
* @since InventorySpellModel 1.0
*/
public Spell getCurrentSpell() {
return currentSpell;
}
/**
* Réinitialiser le contenu de la liste
*
* @since InventorySpellModel 1.0
*/
private void resetList() {
//Initialisation de la liste à afficher
final ArrayList<String> list = new ArrayList<String>();
//Réinitialiser la liste de sorts
spellList.clear();
spellList.addAll(InventorySpellModel.fighterListModel.get(currentFighter).getStat().getPermanentStats().getSpells());
//Pour chaque sort dans la liste des sorts du combattant
for (final Spell spell : spellList) {
//Ajouter le nom du sort à la liste à afficher
list.add(spell.getName());
}
// Mettre la nouvelle liste à afficher
listModel.setModel(list);
}
/**
* Réinitialiser le sort couramment sélectionné
*
* @param index L 'index du sort à afficher
* @since InventorySpellModel 1.0
*/
private void setCurrentSpell(int index) {
currentSpell = spellList.get(index);
}
public String displayCout(final List<Cost> cout) {
final StringBuilder result = new StringBuilder();
for (final Cost entry : cout) {
result.append(entry.getStat()).append(" ").append(entry.getImpact()).append("\n");
}
return result.toString();
}
}