package game.model.inventory;
import beans.enumeration.*;
import beans.serializable.ChangeStatut;
import beans.serializable.Cost;
import beans.serializable.Skill;
import game.control.SkillController;
import game.entity.Fighter;
import game.model.ListModel;
import java.util.ArrayList;
import java.util.List;
/**
* Modèle qui contrôle la partie compétence de l'inventaire
*
* @author Elragos
* @version InventorySkillModel 1.0
* @since Game 1.0
*/
public class InventorySkillModel extends InventoryModelPatern {
/**
* Liste de compétences courantes, pour la récupération de la description
*
* @since InventorySkillModel 1.0
*/
private final List<Skill> skillList = new ArrayList<Skill>();
/**
* Compétence courant, dont on doit afficher la description
* @since InventorySkillModel 1.0
* @see Skill
*/
private Skill currentSkill;
/**
* Constructeur par défaut.
*
* @since InventorySkillModel 1.0
*/
public InventorySkillModel() {
listModel = new ListModel(10);
resetList();
}
/**
* Gère l'appui sur la touche "entrée".
*
* @return Le mode dans lequel le modèle est.
* @since InventorySkillModel 1.0
*/
@Override
public InventoryMode EnterRequest() {
final Fighter fighter = fighterListModel.get(currentFighter);
final boolean utilisable = (currentSkill.getUse() == Utilization.OUTSIDE_BATTLE || currentSkill.getUse() == Utilization.TWICE);
if (currentSkill != null && utilisable) {
final SkillController skillController = new SkillController(currentSkill, null);
//TODO: Finir les modifications ici pour adapter avec le système de combat
if (currentSkill.getTarget() == Target.ALLY) {
skillController.castSkill(null, fighter);
}
else {
for(Fighter current : fighterListModel){
skillController.castSkill(fighter, current);
}
}
}
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 InventorySkillModel 1.0
*/
@Override
public void moveCursor(final int x, final int y) {
listModel.updateCursorPosition(x, y);
setCurrentSkill(listModel.getCurrentPosition());
setChanged();
notifyObservers();
}
/**
* Retourner au menu principal
*
* @return Le menu principal
* @since InventorySkillModel 1.0
*/
@Override
public InventoryMode back() {
return InventoryMode.MENU;
}
/**
* Réinitialiser la position du curseur et réinitialise le contenu de la
* liste
*
* @since InventorySkillModel 1.0
*/
@Override
public void resetCursor() {
setCurrentSkill(0);
resetList();
listModel.resetCursor();
}
/**
* Récupérer la description de la compétence couramment sélectionné.
*
* @return La description de la compétence courant.
* @since InventorySkillModel 1.0
*/
public Skill getCurrentSkill() {
return currentSkill;
}
/**
* Réinitialiser le contenu de la liste
*
* @since InventorySkillModel 1.0
*/
private void resetList() {
//Initialisation de la liste à afficher
final ArrayList<String> list = new ArrayList<String>();
//Réinitialiser la liste de sorts
skillList.clear();
//skillList.addAll(InventorySkillModel.fighterListModel.get(currentFighter).getStat().getPermanentStats().getSkills());
skillList.add(new Skill("Encourager", "Augmenter la FOR de CHA*2", Target.GROUP, null, null, Utilization.IN_BATTLE, 1));
skillList.add(new Skill("Moquerie", "Diminuer la DEF de CHA*2, mais attire ses coups", Target.ENEMY, null, null, Utilization.IN_BATTLE, 1));
ArrayList<ChangeStatut> changes = new ArrayList<ChangeStatut>();
changes.add(new ChangeStatut(Type.HEAL, Element.NONE, 2, Stat.CHARISMA, Stat.HP));
skillList.add(new Skill("Prière", "Soigne CHA*2 HP", Target.GROUP, changes, null, Utilization.TWICE, 1));
//Pour chaque sort dans la liste des sorts du combattant
for (final Skill spell : skillList) {
//Ajouter le nom du sort à la liste à afficher
list.add(spell.getName());
}
// Mettre la nouvelle liste à afficher
listModel.setModel(list);
}
/**
* Réinitialiser la compétence couramment sélectionné
*
* @param index L 'index du sort à afficher
* @since InventorySkillModel 1.0
*/
private void setCurrentSkill(final int index) {
currentSkill = skillList.get(index);
}
public String displayCout(final List<Cost> cout) {
final StringBuilder result = new StringBuilder();
// Si aucun coup
if (cout == null){
return "-AUCUN";
}
for (final Cost entry : cout) {
result.append(entry.getStat()).append(" ").append(entry.getImpact()).append("\n");
}
return result.toString();
}
}