001package games.AdventureRPG;
002
003import java.awt.Image;
004import java.util.List;
005import java.util.Map;
006import java.util.Random;
007import java.util.Set;
008import vooga.turnbased.gameobject.battleobject.BattleObject;
009
010public class AdventureMob extends BattleObject {
011    private final String HEALTH_STAT = "health";
012    private final String ENERGY_STAT = "energy";
013    private final String ATTACK_STAT = "attack";
014    private final String DEFENSE_STAT = "defense";
015    private final String MAX_HEALTH_STAT = "maxHealth";
016    private final String USED = " used "; 
017    
018    
019    private final double OPTION1_LOWER_BOUND = .0;
020    private final double OPTION1_UPPER_BOUND = .5;
021    private final double OPTION2_LOWER_BOUND = .5;
022    private final double OPTION2_UPPER_BOUND = .7;
023    private final double OPTION3_LOWER_BOUND = .7;
024    private final double OPTION3_UPPER_BOUND = .9;
025    private final double OPTION4_LOWER_BOUND = .9;
026    private final double OPTION4_UPPER_BOUND = 1;
027
028    public AdventureMob (Set<String> allowableModes, String condition,
029            Map<String, Number> stats, String name, Image image) {
030        super(allowableModes, condition, stats, name, image);
031    }
032
033    public AdventureMob (Set<String> allowableModes, String condition,
034            Image image, List<String> stats) {
035        super(allowableModes, condition, image, stats);
036    }
037
038    @Override
039    public void doRandomOption(BattleObject target, List<String> battleMessages) {
040        Random randomGenerator = new Random();
041        double random = randomGenerator.nextDouble();
042        String message = null;
043        if (random >= OPTION1_LOWER_BOUND && random < OPTION1_UPPER_BOUND) {
044            doOption1(target, battleMessages);
045        }
046        if (random >= OPTION2_LOWER_BOUND && random < OPTION2_UPPER_BOUND) {
047            doOption2(target, battleMessages);
048        }
049        if (random >= OPTION3_LOWER_BOUND && random < OPTION3_UPPER_BOUND) {
050            doOption3(target, battleMessages);
051        }
052        if (random >= OPTION4_LOWER_BOUND && random < OPTION4_UPPER_BOUND) {
053            doOption4(target, battleMessages);
054        }
055
056    }
057
058    @Override
059    public void doOption (int MenuOptionSelected, BattleObject target, List<String> battleMessages) {
060        String message = getName() + " didn't do anything";
061        switch (MenuOptionSelected){
062            case 1: doOption1(target, battleMessages);
063            break;
064            case 2: doOption2(target, battleMessages);
065            break;
066            case 3: doOption3(target, battleMessages);
067            break;
068            case 4: doOption4(target, battleMessages);
069            break;
070            default: 
071                battleMessages.add(message);
072                break;
073        }
074    }
075
076    @Override
077    protected void doOption1 (BattleObject target, List<String> battleMessages) {
078        //Quick attack
079        healMe(10);
080        attackEnemy(target, battleMessages);
081        battleMessages.add((getName() + USED + getOptions()[0]));
082    }
083
084    @Override
085    protected void doOption2 (BattleObject target, List<String> battleMessages) {
086        //Concentrate
087        healMe(10);
088        int oldEnergy = getStat(ENERGY_STAT).intValue();
089        if (oldEnergy <  4) {
090            changeStat(ENERGY_STAT, oldEnergy + 2);
091        }
092        else {
093            int newEnergy = oldEnergy * 5 / 4 + 1;
094            changeStat(ENERGY_STAT, newEnergy);
095        }
096        battleMessages.add((getName() + USED + getOptions()[1]));
097    }
098
099    @Override
100    protected void doOption3 (BattleObject target, List<String> battleMessages) {
101        // Powerful Attack
102        int damage = getStat(ENERGY_STAT).intValue() + getStat(ATTACK_STAT).intValue();
103        attackEnemy(target, damage);
104        battleMessages.add((getName() + USED + getOptions()[2]));
105        changeStat(ENERGY_STAT, 1);
106    }
107
108    @Override
109    protected void doOption4 (BattleObject target, List<String> battleMessages) {
110        // Steal Energy
111        healMe(5);
112        AdventureMob enemy = (AdventureMob) target;
113        int energyReceived = enemy.loseEnergy();
114        changeStat(ENERGY_STAT, getStat(ENERGY_STAT).intValue() + energyReceived - 2);
115        battleMessages.add (getName() + USED + getOptions()[3]);
116    }
117
118    @Override
119    public void takeDamage (int damageDone, List<String> battleMessages) {
120        int healthLost = damageDone - getStat(DEFENSE_STAT).intValue();
121        if (healthLost > 0) {
122            changeStat(HEALTH_STAT, getStat(HEALTH_STAT).intValue() - healthLost);
123        }
124    }
125
126    @Override
127    protected void attackEnemy (BattleObject enemy, List<String> battleMessages) {
128        AdventureMob target = (AdventureMob) enemy;
129        target.takeDamage(getStat(ATTACK_STAT).intValue(), battleMessages);
130    }
131    
132    protected void attackEnemy (BattleObject enemy, int damage){
133        AdventureMob target = (AdventureMob) enemy;
134        target.takeDamage(damage, null);
135    }
136    
137    protected int loseEnergy () {
138        int energyChange = 0;
139        int oldEnergy = getStat(ENERGY_STAT).intValue();
140        if (oldEnergy <  3) {
141            changeStat(ENERGY_STAT, 0);
142            energyChange = 2;
143        }
144        else {
145            int newEnergy = oldEnergy * 2 / 3;
146            energyChange = oldEnergy * 1 / 3;
147            changeStat(ENERGY_STAT, newEnergy);
148        }
149        return energyChange;
150    }
151
152    @Override
153    public String getDeathMessage () {
154        
155        return getName() + " has been beaten.";
156    }
157
158    @Override
159    public String getStartFightingMessage (boolean isPlayerControlled) {
160        return getName() + " has engaged!";
161    }
162
163    @Override
164    public String[] getOptions () {
165        String[] ret = {"QUICK ATTACK", "CONCENTRATE", "POWER ATTACK", "STEAL ENERGY"};
166        return ret;
167    }
168
169    @Override
170    protected String[] getStatLines () {
171        String[] ret = new String[2];
172        int myHealth = getStat("health").intValue();
173        int myMaxHealth = getStat("maxHealth").intValue();
174        int myEnergy = getStat(ENERGY_STAT).intValue();
175
176        ret[0] = "Health: " + myHealth + "/" + myMaxHealth;
177        ret[1] = "Energy: " + myEnergy;
178
179        return ret;
180    }
181    
182    private void healMe(int amount){
183        changeStat(HEALTH_STAT, getStat(HEALTH_STAT).intValue() + amount);
184        if (getStat(HEALTH_STAT).intValue() > getStat(MAX_HEALTH_STAT).intValue()) {
185            changeStat(HEALTH_STAT, getStat(MAX_HEALTH_STAT).intValue());
186        }
187    }
188
189}
190