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