001package vooga.turnbased.gameobject.battleobject;
002
003import java.awt.Image;
004import java.util.List;
005import java.util.Map;
006import java.util.Random;
007import java.util.Set;
008
009
010/**
011 * This is a test battle monster that will be used to see if the BattleMode
012 * functions.
013 * Extends the abstract class BattleObject.
014 * 
015 * @author Michael Elgart, Tony
016 * 
017 */
018public class BattleSimpleObject extends BattleObject {
019    private final String HEALTH_STAT = "health";
020    private final String ATTACK_STAT = "attack";
021    private final String DEFENSE_STAT = "defense";
022    private final String MAX_HEALTH_STAT = "maxHealth";
023    private final String USED = " used ";
024
025    private final double OPTION1_LOWER_BOUND = .0;
026    private final double OPTION1_UPPER_BOUND = .5;
027    private final double OPTION2_LOWER_BOUND = .5;
028    private final double OPTION2_UPPER_BOUND = .7;
029    private final double OPTION3_LOWER_BOUND = .7;
030    private final double OPTION3_UPPER_BOUND = .9;
031    private final double OPTION4_LOWER_BOUND = .9;
032    private final double OPTION4_UPPER_BOUND = 1;
033
034    /**
035     * Creates a test battle monster.
036     * 
037     * @param allowableModes Set of string names of modes in which object should
038     *        be.
039     * @param condition The action that this object can pass to the GameManager,
040     *        can be GameEvent.NO_ACTION if no action needed
041     * @param stats Map of string names of characteristics to their numerical
042     *        values i.e. defense to
043     *        10.
044     * @param name String name of monster.
045     * @param image The image of this testMonster.
046     */
047    public BattleSimpleObject (Set<String> allowableModes, String condition,
048            Map<String, Number> stats, String name, Image image) {
049        super(allowableModes, condition, stats, name, image);
050    }
051
052    public BattleSimpleObject (Set<String> allowableModes, String condition,
053            Image image, List<String> stats) {
054        super(allowableModes, condition, image, stats);
055    }
056
057    @Override
058    public void takeDamage (int damageDone, List<String> battleMessages) {
059        int healthLost = damageDone - getStat(DEFENSE_STAT).intValue();
060        if (healthLost > 0) {
061            changeStat(HEALTH_STAT, getStat(HEALTH_STAT).intValue()
062                    - healthLost);
063        }
064    }
065
066    @Override
067    public void attackEnemy (BattleObject enemy, List<String> battleMessages) {
068        enemy.takeDamage(getStat(ATTACK_STAT).intValue(), battleMessages);
069    }
070
071    @Override
072    public String getDeathMessage () {
073        return this.getName() + " fainted.";
074    }
075
076    @Override
077    public String getStartFightingMessage (boolean isPlayerControlled) {
078        String name = this.getName();
079        Random randomGenerator = new Random();
080        int i = randomGenerator.nextInt(2);
081
082        if (isPlayerControlled) {
083            String[] messages = { name + " sent out.", name + " GO!" };
084            return messages[i];
085        }
086        else {
087            String[] messages = { name + " encountered.", name + " appeared." };
088            return messages[i];
089        }
090
091    }
092
093    @Override
094    public String[] getOptions () {
095        String[] ret = { "ATTACK", "DEFEND", "CHARGE", "HEAL" };
096        return ret;
097    }
098
099    @Override
100    public void doOption1 (BattleObject target, List<String> battleMessages) {
101        attackEnemy(target, battleMessages);
102        battleMessages.add(getName() + USED + getOptions()[0]);
103    }
104
105    @Override
106    public void doOption2 (BattleObject target, List<String> battleMessages) {
107        changeStat(DEFENSE_STAT, getStat(DEFENSE_STAT).intValue() + 1);
108        battleMessages.add(getName() + USED + getOptions()[1]);
109    }
110
111    @Override
112    public void doOption3 (BattleObject target, List<String> battleMessages) {
113        changeStat(ATTACK_STAT, getStat(ATTACK_STAT).intValue() + 1);
114        battleMessages.add(getName() + USED + getOptions()[2]);
115    }
116
117    @Override
118    public void doOption4 (BattleObject target, List<String> battleMessages) {
119        setCurrentMessage(getName() + USED + getOptions()[3]);
120        changeStat(HEALTH_STAT, getStat(HEALTH_STAT).intValue() + 3);
121        if (getStat(HEALTH_STAT).intValue() > getStat(MAX_HEALTH_STAT)
122                .intValue()) {
123            changeStat(HEALTH_STAT, getStat(MAX_HEALTH_STAT).intValue());
124        }
125        battleMessages.add(getName() + USED + getOptions()[3]);
126    }
127
128    @Override
129    public void doRandomOption (BattleObject target, List<String> battleMessages) {
130        Random randomGenerator = new Random();
131        double random = randomGenerator.nextDouble();
132        if (random >= OPTION1_LOWER_BOUND && random < OPTION1_UPPER_BOUND) {
133            doOption1(target, battleMessages);
134        }
135        if (random >= OPTION2_LOWER_BOUND && random < OPTION2_UPPER_BOUND) {
136            doOption2(target, battleMessages);
137        }
138        if (random >= OPTION3_LOWER_BOUND && random < OPTION3_UPPER_BOUND) {
139            doOption3(target, battleMessages);
140        }
141        if (random >= OPTION4_LOWER_BOUND && random < OPTION4_UPPER_BOUND) {
142            doOption4(target, battleMessages);
143        }
144    }
145
146    @Override
147    protected String[] getStatLines () {
148        String[] ret = new String[3];
149        int myHealth = getStat("health").intValue();
150        int myMaxHealth = getStat("maxHealth").intValue();
151        int myAttack = getStat("attack").intValue();
152        int myDefense = getStat("defense").intValue();
153
154        ret[0] = "Health: " + myHealth + "/" + myMaxHealth;
155        ret[1] = "Attack: " + myAttack;
156        ret[2] = "Defense: " + myDefense;
157
158        return ret;
159
160    }
161
162    @Override
163    public void doOption (int MenuOptionSelected, BattleObject target,
164            List<String> battleMessages) {
165        switch (MenuOptionSelected) {
166            case 1:
167                doOption1(target, battleMessages);
168                break;
169            case 2:
170                doOption2(target, battleMessages);
171                break;
172            case 3:
173                doOption3(target, battleMessages);
174                break;
175            case 4:
176                doOption4(target, battleMessages);
177                break;
178            default:
179                break;
180        }
181    }
182
183}