package game.model.inventory;
import beans.enumeration.InventoryMode;
import beans.enumeration.Target;
import beans.enumeration.Utilization;
import beans.serializable.Objet;
import game.control.ObjetController;
import game.model.ListModel;
import game.entity.Fighter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
* Model qui controle la partie magie de l'inventaire
* @author Elragos
* @version InventoryObjetModel 1.0
* @since Game 1.0
*/
public class InventoryObjetModel extends InventoryModelPatern {
/**
* Liste de sorts courantes, pour la récupération de la description
* @since InventoryObjetModel 1.0
*/
private Map<Objet, Integer> objetList = new HashMap<Objet, Integer>();
/**
* Objet courant, dont on doit afficher la description
* @since InventoryObjetModel 1.0
*/
private Objet currentObjet;
/**
* Constructeur par défaut.
* @since InventoryObjetModel 1.0
*/
public InventoryObjetModel(){
listModel = new ListModel(10);
resetCursor();
}
/**
* Gère l'appui sur la touche "entrée".
* @return Le mode dans lequel le modèle est.
* @since InventoryObjetModel 1.0
*/
@Override
public InventoryMode EnterRequest() {
final Fighter fighter = fighterListModel.get(currentFighter);
final boolean utilisable = (currentObjet.getUse() == Utilization.OUTSIDE_BATTLE || currentObjet.getUse() == Utilization.TWICE);
if (currentObjet != null && utilisable) {
final ObjetController objetController = new ObjetController(currentObjet, null);
if (currentObjet.getTarget() == Target.ALLY || currentObjet.getTarget() == Target.ENEMY) {
fighter.useObjet(currentObjet);
objetController.castObjet(fighter);
}else {
fighter.useObjet(currentObjet);
objetController.castObjet(fighterListModel);
}
}
resetList();
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 InventoryObjetModel 1.0
*/
@Override
public void moveCursor(int x, int y) {
listModel.updateCursorPosition(x, y);
setCurrentObjet(listModel.getCurrentPosition());
setChanged();
notifyObservers();
}
/**
* Retourner au menu principal
* @return Le menu principal
* @since InventoryObjetModel 1.0
*/
@Override
public InventoryMode back() {
return InventoryMode.MENU;
}
/**
* Réinitialiser la position du curseur et réinitialise le contenu de la liste
* @since InventoryObjetModel 1.0
*/
@Override
public void resetCursor() {
resetList();
setCurrentObjet(0);
listModel.resetCursor();
}
/**
* Récupérer la description du sort couramment sélectionné.
* @return La description du sort courant.
* @since InventoryObjetModel 1.0
*/
public Objet getCurrentObjet(){
return currentObjet;
}
/**
* Réinitialiser le contenu de la liste
* @since InventoryObjetModel 1.0
*/
private void resetList() {
//Initialisation de la liste à afficher
final ArrayList<String> list = new ArrayList<String>();
//Réinitialiser la liste de sorts
objetList.clear();
objetList.putAll(fighterListModel.get(currentFighter).getStat().getPermanentStats().getObjets());
//Pour chaque sort dans la liste des sorts du combattant
for (final Entry<Objet, Integer> objet : objetList.entrySet()){
//Ajouter le nom du sort à la liste à afficher
list.add(objet.getValue() + " * " + objet.getKey().getName());
}
// Mettre la nouvelle liste à afficher
listModel.setModel(list);
}
/**
* Réinitialiser le sort couramment sélectionné
* @param index L 'index du sort à afficher
* @since InventoryObjetModel 1.0
*/
private void setCurrentObjet(int index){
if (objetList.keySet().toArray().length > index && index >= 0) {
currentObjet = (Objet) objetList.keySet().toArray()[index];
}else {
currentObjet = null;
}
}
}