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}