001package games.trexgame;
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
010/**
011 * new battle mechanism
012 * 
013 * @author Tony
014 * 
015 */
016public class TRexMonster extends BattleObject {
017        private final String HEALTH_STAT = "health";
018        private final String MAX_HEALTH_STAT = "maxHealth";
019        // private final String MANA_STAT = "MP";
020        // private final String MAX_MANA_STAT = "maxMP";
021        private final String ATTACK_STAT = "atk";
022        private final String DEFENSE_STAT = "def";
023        private final String EVASION_STAT = "eva";
024        private final String ACCURACY_STAT = "acc";
025        private final String CRITICAL_RATE_STAT = "crit";
026        private final String USED = " used ";
027
028        private final double OPTION1_BOUND = .7;
029        private final double OPTION2_BOUND = .8;
030        private final double OPTION3_BOUND = .9;
031        private final double OPTION4_BOUND = 1.0;
032
033        public TRexMonster(Set<String> allowableModes, String condition,
034                        Map<String, Number> stats, String name, Image image) {
035                super(allowableModes, condition, stats, name, image);
036        }
037
038        public TRexMonster(Set<String> allowableModes, String condition,
039                        Image image, List<String> stats) {
040                super(allowableModes, condition, image, stats);
041        }
042
043        @Override
044        public void doRandomOption(BattleObject target, List<String> battleMessages) {
045                Random randomGenerator = new Random();
046                double random = randomGenerator.nextDouble();
047                if (random >= 0 && random < OPTION1_BOUND) {
048                        doOption1(target, battleMessages);
049                }
050                if (random >= OPTION1_BOUND && random < OPTION2_BOUND) {
051                        doOption2(target, battleMessages);
052                }
053                if (random >= OPTION2_BOUND && random < OPTION3_BOUND) {
054                        doOption3(target, battleMessages);
055                }
056                if (random >= OPTION3_BOUND && random < OPTION4_BOUND) {
057                        doOption4(target, battleMessages);
058                }
059        }
060
061        @Override
062        public void doOption(int MenuOptionSelected, BattleObject target,
063                        List<String> battleMessages) {
064                switch (MenuOptionSelected) {
065                case 1:
066                        doOption1(target, battleMessages);
067                        break;
068                case 2:
069                        doOption2(target, battleMessages);
070                        break;
071                case 3:
072                        doOption3(target, battleMessages);
073                        break;
074                case 4:
075                        doOption4(target, battleMessages);
076                        break;
077                default:
078                        break;
079                }
080        }
081
082        @Override
083        protected void doOption1(BattleObject target, List<String> battleMessages) {
084                battleMessages.add(getName() + USED + getOptions()[0]);
085                attackEnemy(target, battleMessages);
086        }
087
088        @Override
089        protected void doOption2(BattleObject target, List<String> battleMessages) {
090                battleMessages.add(getName() + USED + getOptions()[1]);
091                resetStats();
092                changeStat(DEFENSE_STAT, getStat(DEFENSE_STAT).intValue() * 1.5);
093                changeStat(ATTACK_STAT, getStat(ATTACK_STAT).intValue() * 0.6);
094                changeStat(EVASION_STAT, getStat(EVASION_STAT).intValue() * 0.5);
095        }
096
097        @Override
098        protected void doOption3(BattleObject target, List<String> battleMessages) {
099                battleMessages.add(getName() + USED + getOptions()[2]);
100                resetStats();
101                changeStat(DEFENSE_STAT, getStat(DEFENSE_STAT).intValue() * 0.5);
102                changeStat(ATTACK_STAT, getStat(ATTACK_STAT).intValue() * 1.5);
103                changeStat(ACCURACY_STAT, getStat(ACCURACY_STAT).intValue() * 1.3);
104        }
105
106        @Override
107        protected void doOption4(BattleObject target, List<String> battleMessages) {
108                battleMessages.add(getName() + USED + getOptions()[3]);
109                resetStats();
110                changeStat(EVASION_STAT, getStat(EVASION_STAT).intValue() * 1.8);
111                changeStat(ACCURACY_STAT, getStat(ACCURACY_STAT).intValue() * 0.5);
112                changeStat(ACCURACY_STAT, getStat(ATTACK_STAT).intValue() * 0.8);
113        }
114
115        @Override
116        public void takeDamage(int damageDone, List<String> battleMessages) {
117                if (damageDone > 0) {
118                        changeStat(HEALTH_STAT, getStat(HEALTH_STAT).intValue()
119                                        - damageDone);
120                }
121        }
122
123        @Override
124        protected void attackEnemy(BattleObject enemy, List<String> battleMessages) {
125                int atk = getStat(ATTACK_STAT).intValue();
126                int eDef = enemy.getStat(DEFENSE_STAT).intValue();
127                int damage = (atk * atk) / (atk + eDef);
128
129                Random randomGenerator = new Random();
130                double random = randomGenerator.nextDouble();
131                if (random <= getStat(CRITICAL_RATE_STAT).doubleValue()) {
132                        damage *= 2;
133                        battleMessages.add("A critial hit!!");
134                } else {
135                        random = randomGenerator.nextDouble();
136                        double hitRate = (getStat(ACCURACY_STAT).intValue() - enemy
137                                        .getStat(EVASION_STAT).intValue()) / 100.0;
138                        if (random > hitRate) {
139                                damage = 0;
140                                battleMessages.add(enemy.getName() + " evaded the attack");
141                        }
142                }
143                enemy.takeDamage(damage, battleMessages);
144        }
145
146        @Override
147        public String getDeathMessage() {
148                return this.getName() + " fainted.";
149        }
150
151        @Override
152        public String getStartFightingMessage(boolean isPlayerControlled) {
153                String name = this.getName();
154                Random randomGenerator = new Random();
155                int i = randomGenerator.nextInt(2);
156
157                if (isPlayerControlled) {
158                        String[] messages = { name + " sent out.", name + " GO!" };
159                        return messages[i];
160                } else {
161                        String[] messages = { name + " encountered.", name + " appeared." };
162                        return messages[i];
163                }
164        }
165
166        @Override
167        public String[] getOptions() {
168                String[] ret = { "Attack", "Barrier", "Sword Dance", "Agility" };
169                return ret;
170        }
171
172        @Override
173        protected String[] getStatLines() {
174                String[] ret = new String[5];
175                int myHP = getStat(HEALTH_STAT).intValue();
176                int myMaxHP = getStat(MAX_HEALTH_STAT).intValue();
177                // int myMP = getStat(MANA_STAT).intValue();
178                // int myMaxMP = getStat(MAX_MANA_STAT).intValue();
179                int myAtk = getStat(ATTACK_STAT).intValue();
180                int myDef = getStat(DEFENSE_STAT).intValue();
181                int myAcc = getStat(ACCURACY_STAT).intValue();
182                int myEva = getStat(EVASION_STAT).intValue();
183                // double myCrit = getStat(CRITICAL_RATE_STAT).doubleValue();
184
185                ret[0] = "HP: " + myHP + "/" + myMaxHP;
186                // ret[1] = "MP: " + myMP + "/" + myMaxMP;
187                ret[1] = "Attack: " + myAtk;
188                ret[2] = "Defense: " + myDef;
189                ret[3] = "Accuracy: " + myAcc;
190                ret[4] = "Evasion: " + myEva;
191                // ret[6] = "Crit Rate: " + myCrit;
192                return ret;
193        }
194
195}