Uploaded main files
This commit is contained in:
parent
12265045d3
commit
42ff37ce5f
452
Game.java
Normal file
452
Game.java
Normal file
@ -0,0 +1,452 @@
|
||||
import java.util.Scanner;
|
||||
import java.util.ArrayList;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.PrintWriter;
|
||||
import java.lang.NumberFormatException;
|
||||
import java.text.NumberFormat;
|
||||
import java.util.Locale;
|
||||
import java.text.ParseException;
|
||||
|
||||
/** Simulates the game Pokémon. */
|
||||
public class Game {
|
||||
public static void main(String[] args) {
|
||||
ArrayList<Pokemon> pokemon = readPokemon();
|
||||
int initialPokemon = pokemon.size();
|
||||
ArrayList<Pokemon> temporaryPokemonList = readPokemon();
|
||||
ArrayList<Pokemon> usersPokemon = new ArrayList<Pokemon>();
|
||||
for (int i = 1; i <= 6; i++) {
|
||||
usersPokemon.add(pick(temporaryPokemonList));
|
||||
}
|
||||
temporaryPokemonList.clear();
|
||||
ArrayList<Item> usersItems = prepareInventory();
|
||||
boolean done = false;
|
||||
Pokemon opponentPokemon = null;
|
||||
Pokemon trainersPokemon = null;
|
||||
Item currentItem = null;
|
||||
boolean fleeSuccess = false;
|
||||
Pokemon pokemonToHeal = null;
|
||||
Scanner in = new Scanner(System.in);
|
||||
|
||||
opponentPokemon = randomPokemon(pokemon);
|
||||
System.out.printf("A wild %s appeared.%n", opponentPokemon.getName());
|
||||
|
||||
while (!done) {
|
||||
if (opponentPokemon == null) {
|
||||
System.out.printf("You have brutally murdered %d pokemon.%n"
|
||||
+ "The only ones left are the ones in your posession.%n"
|
||||
+ "There really is nothing more to do here.%n", initialPokemon);
|
||||
return;
|
||||
}
|
||||
if (!consciousPokemon(usersPokemon)) {
|
||||
System.out.println("All your pokemon have fainted. Your journey ends here.");
|
||||
return;
|
||||
}
|
||||
while (trainersPokemon == null || !trainersPokemon.isConscious()) {
|
||||
availablePokemon(usersPokemon, "conscious");
|
||||
trainersPokemon = usersChoice(usersPokemon, true);
|
||||
}
|
||||
System.out.printf("Opponent: %s%nWhat will you do?%n", opponentPokemon);
|
||||
System.out.printf("b: battle"
|
||||
+ "%nh: heal or revive"
|
||||
+ "%nt: throw pokeball"
|
||||
+ "%nc: change pokemon"
|
||||
+ "%nf: flee"
|
||||
+ "%nv: view my pokemon"
|
||||
+ "%ns: save"
|
||||
+ "%nl: load"
|
||||
+ "%nq: quit%n>");
|
||||
char command = in.next().toLowerCase().charAt(0);
|
||||
switch (command) {
|
||||
case 'b':
|
||||
if (opponentPokemon.isConscious() && trainersPokemon.isConscious()) {
|
||||
trainersPokemon.attack(opponentPokemon);
|
||||
if (opponentPokemon.isConscious()) {
|
||||
opponentPokemon.attack(trainersPokemon);
|
||||
if (!trainersPokemon.isConscious()) {
|
||||
System.out.println("Your pokemon fainted.");
|
||||
}
|
||||
} else {
|
||||
pokemonFainted(pokemon, opponentPokemon);
|
||||
System.out.println("The opponent pokemon fainted.");
|
||||
opponentPokemon = randomPokemon(pokemon);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
if (itemsLeft(usersItems, Item.Target.SELF)) {
|
||||
availableItems(usersItems, Item.Target.SELF);
|
||||
currentItem = chosenItem(usersItems, Item.Target.SELF);
|
||||
if (currentItem == null) {
|
||||
System.out.println("Invalid item.");
|
||||
} else {
|
||||
if (currentItem.needsAlive()) {
|
||||
availablePokemon(usersPokemon, "conscious");
|
||||
pokemonToHeal = usersChoice(usersPokemon, true);
|
||||
} else {
|
||||
availablePokemon(usersPokemon, "fainted");
|
||||
pokemonToHeal = usersChoice(usersPokemon, false);
|
||||
}
|
||||
if (pokemonToHeal == null) {
|
||||
System.out.println("That is not a valid pokemon");
|
||||
} else {
|
||||
if (currentItem.use(pokemonToHeal)) {
|
||||
opponentPokemon.attack(trainersPokemon);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
System.out.println("You have used all your healing items.");
|
||||
}
|
||||
break;
|
||||
case 't':
|
||||
if (itemsLeft(usersItems, Item.Target.OTHER)) {
|
||||
availableItems(usersItems, Item.Target.OTHER);
|
||||
currentItem = chosenItem(usersItems, Item.Target.OTHER);
|
||||
if (currentItem == null) {
|
||||
System.out.println("Invalid pokeball.");
|
||||
} else {
|
||||
if (currentItem.getName().toLowerCase().replace(" ", "").equals("masterball")) {
|
||||
currentItem.use(opponentPokemon, pokemon, usersPokemon);
|
||||
opponentPokemon = randomPokemon(pokemon);
|
||||
System.out.printf("A wild %s appeared.%n", opponentPokemon.getName());
|
||||
} else {
|
||||
boolean captured = currentItem.use(opponentPokemon, pokemon, usersPokemon);
|
||||
if (captured) {
|
||||
opponentPokemon = randomPokemon(pokemon);
|
||||
System.out.printf("A wild %s appeared.%n", opponentPokemon.getName());
|
||||
} else {
|
||||
opponentPokemon.attack(trainersPokemon);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
System.out.println("You have used all your pokeballs.");
|
||||
}
|
||||
break;
|
||||
case 'c':
|
||||
availablePokemon(usersPokemon, "conscious");
|
||||
trainersPokemon = usersChoice(usersPokemon, true);
|
||||
while (trainersPokemon == null) {
|
||||
availablePokemon(usersPokemon, "conscious");
|
||||
trainersPokemon = usersChoice(usersPokemon, true);
|
||||
}
|
||||
opponentPokemon.attack(trainersPokemon);
|
||||
break;
|
||||
case 's':
|
||||
savePokemon(pokemon, "pokemon.save");
|
||||
savePokemon(usersPokemon, "user.save");
|
||||
saveItems(usersItems, "items.save");
|
||||
break;
|
||||
case 'l':
|
||||
ArrayList<Pokemon> loadedPokemon = loadPokemon("pokemon.save");
|
||||
ArrayList<Pokemon> loadedUsersPokemon = loadPokemon("user.save");
|
||||
ArrayList<Item> loadedUsersItems = loadItems("items.save");
|
||||
if (loadedPokemon == null || loadedUsersPokemon == null || loadedUsersItems == null) {
|
||||
System.out.println("One or more savefiles seem corrupt. Please delete or fix the affected file(s).");
|
||||
} else {
|
||||
pokemon = loadedPokemon;
|
||||
usersPokemon = loadedUsersPokemon;
|
||||
usersItems = loadedUsersItems;
|
||||
if (pokemon.size() > 0 && usersPokemon.size() > 0) {
|
||||
do {
|
||||
availablePokemon(usersPokemon, "conscious");
|
||||
trainersPokemon = usersChoice(usersPokemon, true);
|
||||
} while (trainersPokemon == null || !trainersPokemon.isConscious());
|
||||
opponentPokemon = randomPokemon(pokemon);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'f':
|
||||
fleeSuccess = trainersPokemon.flee(opponentPokemon);
|
||||
if (fleeSuccess) {
|
||||
System.out.println("You fled the battle.");
|
||||
opponentPokemon = randomPokemon(pokemon);
|
||||
System.out.printf("A wild %s appeared.%n", opponentPokemon.getName());
|
||||
} else {
|
||||
System.out.printf("Failed to flee from %s.%n", opponentPokemon.getName());
|
||||
opponentPokemon.attack(trainersPokemon);
|
||||
}
|
||||
break;
|
||||
case 'v':
|
||||
availablePokemon(usersPokemon, "all");
|
||||
System.out.println();
|
||||
break;
|
||||
case 'q':
|
||||
done = true;
|
||||
break;
|
||||
default:
|
||||
System.out.println("[Invalid command]");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevents wild fainted pokemon to ever be encountered again.
|
||||
* @param pokemonList List of pokemon to search.
|
||||
* @param target The pokemon to remove.
|
||||
*/
|
||||
public static void pokemonFainted(ArrayList<Pokemon> pokemonList, Pokemon target) {
|
||||
for (int i = 0; i < pokemonList.size(); i++) {
|
||||
if (pokemonList.get(i).equals(target)) {
|
||||
pokemonList.remove(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists all currently available items for the user.
|
||||
* @param items List of all of the user's items.
|
||||
* @param target We are either listing items targeted at an opponent pokemon or at our own pokemon.
|
||||
*/
|
||||
public static void availableItems(ArrayList<Item> items, Item.Target target) {
|
||||
System.out.println("You may choose from these items:");
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
if (items.get(i).getAmount() > 0 && items.get(i).getTarget().equals(target)) {
|
||||
System.out.printf("%d: %s%n", i + 1, items.get(i));
|
||||
}
|
||||
}
|
||||
System.out.print(">");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives a trainer necessary starting items.
|
||||
* @return A list of items.
|
||||
*/
|
||||
public static ArrayList<Item> prepareInventory() {
|
||||
ArrayList<Item> usersItems = new ArrayList<Item>();
|
||||
usersItems.add(new Item("Poke Ball", "A device for catching wild Pokémon. It's thrown like a ball at a Pokémon, comfortably encapsulating its target.", 15, Item.Target.OTHER));
|
||||
usersItems.add(new Item("Great ball", "A good, high-performance Poké Ball that provides a higher Pokémon catch rate than a standard Poké Ball.", 10, Item.Target.OTHER));
|
||||
usersItems.add(new Item("Ultra ball", "An ultra-high-performance Poké Ball that provides a higher success rate for catching Pokémon than a Great Ball.", 5, Item.Target.OTHER));
|
||||
usersItems.add(new Item("Master ball", "The best Poké Ball with the ultimate level of performance. With it, you will catch any wild Pokémon without fail.", 1, Item.Target.OTHER));
|
||||
usersItems.add(new Item("Potion", "Heals a pokemon for 20 HP.", 20, Item.Target.SELF));
|
||||
usersItems.add(new Item("Super Potion", "Heals a pokemon for 50 HP.", 10, Item.Target.SELF));
|
||||
usersItems.add(new Item("Hyper Potion", "Heals a pokemon for 200 HP.", 5, Item.Target.SELF));
|
||||
usersItems.add(new Item("Max Potion", "Fully heals a pokemon.", 1, Item.Target.SELF));
|
||||
usersItems.add(new Item("Revive", "Revives a fainted pokemon.", 2, Item.Target.SELF, false));
|
||||
return usersItems;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the user has any item left of any type.
|
||||
* @param items List of all of the user's items.
|
||||
* @return True if any items are left. False otherwise.
|
||||
*/
|
||||
public static boolean itemsLeft(ArrayList<Item> items, Item.Target target) {
|
||||
int count = 0;
|
||||
for (Item item : items) {
|
||||
if (item.getAmount() > 0 && item.getTarget().equals(target)) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lists all currently available pokemon for the user.
|
||||
* @param pokemonList List of all the user's pokemon.
|
||||
* @param type Should we only include a certain type of pokemon.
|
||||
*/
|
||||
public static void availablePokemon(ArrayList<Pokemon> pokemonList, String type) {
|
||||
System.out.println("You may choose from these pokemon:");
|
||||
for (int i = 0; i < pokemonList.size(); i++) {
|
||||
switch (type) {
|
||||
case "conscious":
|
||||
if (pokemonList.get(i).isConscious()) {
|
||||
System.out.printf("%d: %s%n", i + 1, pokemonList.get(i));
|
||||
}
|
||||
break;
|
||||
case "fainted":
|
||||
if (!pokemonList.get(i).isConscious()) {
|
||||
System.out.printf("%d: %s%n", i + 1, pokemonList.get(i));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
System.out.printf("%d: %s%n", i + 1, pokemonList.get(i));
|
||||
}
|
||||
|
||||
}
|
||||
System.out.print(">");
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if all of the pokemon in a list have fainted.
|
||||
* @param pokemonList List of the user's pokemon.
|
||||
* @return True if the user has at least one pokemon left. False otherwise.
|
||||
*/
|
||||
public static boolean consciousPokemon(ArrayList<Pokemon> pokemonList) {
|
||||
int pokemonLeft = 0;
|
||||
for (Pokemon pokemon : pokemonList) {
|
||||
if (pokemon.isConscious()) {
|
||||
pokemonLeft++;
|
||||
}
|
||||
}
|
||||
return pokemonLeft > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Asks the user for the name of a pokemon and returns it.
|
||||
* @param pokemonList A list of available pokemon
|
||||
* @return A pokemon object or null.
|
||||
*/
|
||||
public static Pokemon usersChoice(ArrayList<Pokemon> pokemonList, boolean alive) {
|
||||
Scanner in = new Scanner(System.in);
|
||||
if (in.hasNextInt()) {
|
||||
int choice = in.nextInt() - 1;
|
||||
in.nextLine();
|
||||
if (choice >= 0 && choice < pokemonList.size() && alive && pokemonList.get(choice).isConscious()) {
|
||||
return pokemonList.get(choice);
|
||||
} else if (choice >= 0 && choice < pokemonList.size() && !alive && !pokemonList.get(choice).isConscious()) {
|
||||
return pokemonList.get(choice);
|
||||
} else {
|
||||
System.out.println("Invalid pokemon");
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Asks the user for an item, and validates it.
|
||||
* @param itemList Available items.
|
||||
* @return An Item object or null.
|
||||
*/
|
||||
public static Item chosenItem(ArrayList<Item> itemList, Item.Target target) {
|
||||
Scanner in = new Scanner(System.in);
|
||||
if (in.hasNextInt()) {
|
||||
int choice = in.nextInt() - 1;
|
||||
in.nextLine();
|
||||
if (choice >= 0 && choice < itemList.size()) {
|
||||
return itemList.get(choice);
|
||||
} else {
|
||||
System.out.println("Invalid item");
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Chooses a random pokemon from a list.
|
||||
* @param pokemon The list to choose from.
|
||||
* @return A Pokemon object, or null if the list is empty.
|
||||
*/
|
||||
public static Pokemon randomPokemon(ArrayList<Pokemon> pokemon) {
|
||||
if (pokemon.size() > 0) {
|
||||
return pokemon.get((int)(Math.random() * pokemon.size()));
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads pokemon from Pokemon.txt to an ArrayList.
|
||||
* @return An ArrayList of pokemon objects.
|
||||
*/
|
||||
public static ArrayList<Pokemon> readPokemon() {
|
||||
ArrayList<Pokemon> pokemon = new ArrayList<Pokemon>();
|
||||
try (Scanner in = new Scanner(new File("Pokemon.txt"))) {
|
||||
while (in.hasNextLine()) {
|
||||
pokemon.add(new Pokemon(in.nextLine()));
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
System.out.println("You seem to be missing one of the necessary files to run this program.");
|
||||
}
|
||||
return pokemon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Picks a random pokemon from a list.
|
||||
* @param pokemon A list of pokemon objects.
|
||||
* @return A pokemon object.
|
||||
*/
|
||||
public static Pokemon pick(ArrayList<Pokemon> pokemon) {
|
||||
int index = (int)(Math.random() * (pokemon.size()));
|
||||
Pokemon randomPokemon = pokemon.get(index);
|
||||
pokemon.remove(index);
|
||||
return randomPokemon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves all pokemon in a list with stats to a text file.
|
||||
* @param pokemonList List of Pokemon objects to save.
|
||||
* @param savefile The file to write to.
|
||||
*/
|
||||
public static void savePokemon(ArrayList<Pokemon> pokemonList, String savefile) {
|
||||
try (PrintWriter file = new PrintWriter(savefile)) {
|
||||
for (Pokemon pokemon : pokemonList) {
|
||||
file.println(pokemon.saveString());
|
||||
}
|
||||
System.out.println("Successfully saved pokemon.");
|
||||
} catch (FileNotFoundException e) {
|
||||
System.out.println("The savefile could not be written.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves all items in a list to a text file.
|
||||
* @param itemList List of Item objects to save.
|
||||
* @param savefile The file to write to.
|
||||
*/
|
||||
public static void saveItems(ArrayList<Item> itemList, String savefile) {
|
||||
try (PrintWriter file = new PrintWriter(savefile)) {
|
||||
for (Item item : itemList) {
|
||||
file.println(item.saveString());
|
||||
}
|
||||
System.out.println("Successfully saved items.");
|
||||
} catch (FileNotFoundException e) {
|
||||
System.out.println("The savefile could not be written.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads pokemon from a text file.
|
||||
* @param savefile The file to write to.
|
||||
* @return A list of pokemon or null on failiure.
|
||||
*/
|
||||
public static ArrayList<Pokemon> loadPokemon(String savefile) {
|
||||
ArrayList<Pokemon> pokemon = new ArrayList<Pokemon>();
|
||||
try (Scanner in = new Scanner(new File(savefile))) {
|
||||
NumberFormat format = NumberFormat.getInstance(Locale.ENGLISH);
|
||||
while (in.hasNextLine()) {
|
||||
String[] data = in.nextLine().split(";");
|
||||
try {
|
||||
pokemon.add(new Pokemon(data[0], Integer.parseInt(data[1]), Integer.parseInt(data[2]), Integer.parseInt(data[3]), format.parse(data[4]).doubleValue(), Integer.parseInt(data[5]), Integer.parseInt(data[6]), Integer.parseInt(data[7])));
|
||||
} catch (NumberFormatException e) {
|
||||
System.out.println("Malformed number " + e);
|
||||
} catch (ParseException e) {
|
||||
System.out.println("Malformed number " + e);
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
System.out.println("Invalid savefile: " + savefile);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
System.out.println("Successfully loaded pokemon.");
|
||||
} catch (FileNotFoundException e) {
|
||||
System.out.println("You don't have a valid savefile.");
|
||||
}
|
||||
return pokemon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads items from a text file.
|
||||
* @param savefile The file to write to.
|
||||
* @return A list of items or null on failiure.
|
||||
*/
|
||||
public static ArrayList<Item> loadItems(String savefile) {
|
||||
ArrayList<Item> items = new ArrayList<Item>();
|
||||
try (Scanner in = new Scanner(new File(savefile))) {
|
||||
while (in.hasNextLine()) {
|
||||
try {
|
||||
String[] data = in.nextLine().split(";");
|
||||
items.add(new Item(data[0], data[1], Integer.parseInt(data[2]), Item.Target.valueOf(data[3]), Boolean.parseBoolean(data[4])));
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
System.out.println("Invalid savefile: " + savefile);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
System.out.println("Successfully loaded items.");
|
||||
} catch (FileNotFoundException e) {
|
||||
System.out.println("You don't have a valid savefile.");
|
||||
}
|
||||
return items;
|
||||
}
|
||||
}
|
138
Item.java
Normal file
138
Item.java
Normal file
@ -0,0 +1,138 @@
|
||||
import java.util.ArrayList;
|
||||
public class Item {
|
||||
public enum Target { SELF, OTHER }
|
||||
private String name;
|
||||
private String description;
|
||||
private Target target;
|
||||
private boolean alive;
|
||||
private int amount;
|
||||
|
||||
public Item(String name, String description, int amount, Target target) {
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
this.target = target;
|
||||
this.alive = true;
|
||||
this.amount = amount;
|
||||
}
|
||||
|
||||
public Item(String name, String description, int amount, Target target, boolean alive) {
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
this.target = target;
|
||||
this.alive = alive;
|
||||
this.amount = amount;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return String.format("(%d) %s: %s", this.amount, this.name, this.description);
|
||||
}
|
||||
|
||||
public String saveString() {
|
||||
return String.format("%s;%s;%d;%s;%b", this.name, this.description, this.amount, this.target, this.alive);
|
||||
}
|
||||
|
||||
public int getAmount() {
|
||||
return this.amount;
|
||||
}
|
||||
|
||||
public Target getTarget() {
|
||||
return this.target;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
/** Checks if an item should be used on alive or fainted pokemon. */
|
||||
public boolean needsAlive() {
|
||||
return alive;
|
||||
}
|
||||
|
||||
/**
|
||||
* Spends an item and does something based on the type of item.
|
||||
* @param target Which pokemon should the item be used on.
|
||||
* @return True if nothing went wrong. False otherwise.
|
||||
*/
|
||||
public boolean use(Pokemon target) {
|
||||
if (this.amount > 0) {
|
||||
String name = this.name.toLowerCase().replace(" ", "");
|
||||
switch (name) {
|
||||
case "potion":
|
||||
return potion(target, 20);
|
||||
case "superpotion":
|
||||
return potion(target, 50);
|
||||
case "hyperpotion":
|
||||
return potion(target, 200);
|
||||
case "maxpotion":
|
||||
return potion(target, -1);
|
||||
case "revive":
|
||||
if (!target.isConscious()) {
|
||||
this.amount--;
|
||||
target.revive();
|
||||
System.out.printf("%s was revived.%n", target.getName());
|
||||
return true;
|
||||
} else {
|
||||
System.out.println("You can't revive a conscious pokemon.");
|
||||
return false;
|
||||
}
|
||||
default:
|
||||
System.out.printf("Invalid item %s%n", name);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
System.out.println("No cheating!");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a pokemon is able to, and in need of a potion. If it is, heal it.
|
||||
* @param target The pokemon to heal.
|
||||
* @param amount The amount to heal the pokemon.
|
||||
* @return True if nothing went wrong. False otherwise.
|
||||
*/
|
||||
private boolean potion(Pokemon target, int amount) {
|
||||
if (target.isConscious()) {
|
||||
if (target.isDamaged()) {
|
||||
this.amount--;
|
||||
int healed = target.heal(amount);
|
||||
System.out.printf("%s was healed for %d HP and now has %d HP.%n", target.getName(), healed, target.getHP());
|
||||
} else {
|
||||
System.out.printf("%s has not taken damage, and does not require a potion.%n", target.getName());
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
System.out.println("You can't heal a fainted pokemon.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses a pokeball on an opponent.
|
||||
* @param target Which pokemon to target.
|
||||
* @param current Current list the pokemon belongs to.
|
||||
* @param catcher Where we send the pokemon on a successfull capture.
|
||||
* @return True if nothing went wrong. False otherwise.
|
||||
*/
|
||||
public boolean use(Pokemon target, ArrayList<Pokemon> current, ArrayList<Pokemon> catcher) {
|
||||
if (this.amount > 0) {
|
||||
this.amount--;
|
||||
switch (this.name.toLowerCase().replace(" ", "")) {
|
||||
case "pokeball":
|
||||
return target.tryCapture(current, catcher, 255);
|
||||
case "greatball":
|
||||
return target.tryCapture(current, catcher, 200);
|
||||
case "ultraball":
|
||||
return target.tryCapture(current, catcher, 150);
|
||||
case "masterball":
|
||||
return target.tryCapture(current, catcher, 0);
|
||||
default:
|
||||
System.out.println("That item does not exist.");
|
||||
}
|
||||
} else {
|
||||
System.out.println("No cheating!");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
203
Pokemon.java
Normal file
203
Pokemon.java
Normal file
@ -0,0 +1,203 @@
|
||||
import java.util.Random;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class Pokemon {
|
||||
private String name;
|
||||
private int healthPoints;
|
||||
private int maxHealthPoints;
|
||||
private int strength;
|
||||
private double criticalChance;
|
||||
private Random random;
|
||||
private int catchRate;
|
||||
private int exp;
|
||||
private int level;
|
||||
private int fleeCount;
|
||||
|
||||
public Pokemon(String name) {
|
||||
this.random = new Random();
|
||||
this.name = name;
|
||||
this.healthPoints = 30 + random.nextInt(70);
|
||||
this.maxHealthPoints = this.healthPoints;
|
||||
this.criticalChance = Math.abs(0.1 * random.nextGaussian());
|
||||
this.catchRate = (int)(Math.random() * 256);
|
||||
this.exp = 0;
|
||||
this.level = (int)(Math.abs(2 * random.nextGaussian()) + 1);
|
||||
this.strength = random.nextInt(7) + this.level;
|
||||
this.fleeCount = 0;
|
||||
}
|
||||
|
||||
public Pokemon(String name, int healthPoints, int maxHealthPoints, int strength, double criticalChance, int catchRate, int exp, int level) {
|
||||
this.random = new Random();
|
||||
this.name = name;
|
||||
this.healthPoints = healthPoints;
|
||||
this.maxHealthPoints = maxHealthPoints;
|
||||
this.criticalChance = criticalChance;
|
||||
this.catchRate = catchRate;
|
||||
this.exp = exp;
|
||||
this.level = level;
|
||||
this.strength = strength;
|
||||
this.fleeCount = 0;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return String.format("Level %d %s HP: (%d/%d) STR: %d CHC: %.0f%%", this.level, this.name, this.healthPoints, this.maxHealthPoints, this.strength, (this.criticalChance*100));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string containing all the pokemon's data.
|
||||
*/
|
||||
public String saveString() {
|
||||
return String.format("%s;%d;%d;%d;%f;%d;%d;%d", this.name, this.healthPoints, this.maxHealthPoints, this.strength, this.criticalChance, this.catchRate, this.exp, this.level);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public int getHP() {
|
||||
return this.healthPoints;
|
||||
}
|
||||
|
||||
public boolean equals(Pokemon target) {
|
||||
return target == this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Heals a pokemon.
|
||||
* @param amount How many hitpoints to heal.
|
||||
* @return The exact amount of hitpoints healed.
|
||||
*/
|
||||
public int heal(int amount) {
|
||||
if (amount < 0) {
|
||||
amount = this.maxHealthPoints - this.healthPoints;
|
||||
} else {
|
||||
amount = Math.min(this.maxHealthPoints - this.healthPoints, amount);
|
||||
}
|
||||
this.healthPoints += amount;
|
||||
return amount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a pokemon has not taken any damage or is fully healed.
|
||||
* @param return True if health is full. False otherwise.
|
||||
*/
|
||||
public boolean isDamaged() {
|
||||
return this.healthPoints < this.maxHealthPoints;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to catch a pokemon.
|
||||
* @param current The list where the pokemon currently belongs.
|
||||
* @param catcher The list to send the pokemon on successfull capture.
|
||||
* @return True on successfull capture. False otherwise.
|
||||
*/
|
||||
public boolean tryCapture(ArrayList<Pokemon> current, ArrayList<Pokemon> catcher, int range) {
|
||||
if (range == 0) {
|
||||
this.capture(current, catcher);
|
||||
System.out.printf("%s was caught.%n", this.name);
|
||||
return true;
|
||||
}
|
||||
if ((int)(Math.random() * (range + 1)) < Math.max((3 * this.maxHealthPoints - 2 * this.healthPoints) * this.catchRate / (3 * this.maxHealthPoints), 1)) {
|
||||
this.capture(current, catcher);
|
||||
System.out.printf("%s was caught.%n", this.name);
|
||||
return true;
|
||||
} else {
|
||||
System.out.printf("%s escaped from the pokeball.%n", this.name);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Captures a wild pokemon.
|
||||
* @param current The pokemon list the pokemon belongs to.
|
||||
* @param catcher The pokemon list of the trainer.
|
||||
*/
|
||||
private void capture(ArrayList<Pokemon> current, ArrayList<Pokemon> catcher) {
|
||||
catcher.add(this);
|
||||
for (int i = 0; i < current.size(); i++) {
|
||||
if (current.get(i) == this) {
|
||||
current.remove(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Restores the health of a fainted pokemon. */
|
||||
public void revive() {
|
||||
this.healthPoints = this.maxHealthPoints;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the pokemon has any HP left.
|
||||
* @return True if any HP is left. False otherwise.
|
||||
*/
|
||||
public boolean isConscious() {
|
||||
return this.healthPoints > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Damages a pokemon.
|
||||
* @param How many hitpoints are to be deducted.
|
||||
*/
|
||||
public void damage(int damageTaken) {
|
||||
this.healthPoints = Math.max(this.healthPoints -= damageTaken, 0);
|
||||
System.out.printf("%s takes %d damage and is left with %d/%d HP%n", this.name, damageTaken, this.healthPoints, this.maxHealthPoints);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives a pokemon exp after each successfull battle. Also handles leveling up.
|
||||
* @target Which pokemon did we beat.
|
||||
*/
|
||||
private void giveEXP(Pokemon target) {
|
||||
int exp = (100 * target.level)/7;
|
||||
this.exp += exp;
|
||||
System.out.printf("%s gained %d exp.%n", this.name, exp);
|
||||
if (this.exp > (4 * Math.pow(this.level, 3)) / 5) {
|
||||
this.level++;
|
||||
this.maxHealthPoints += 5;
|
||||
this.healthPoints = maxHealthPoints;
|
||||
this.strength += 1;
|
||||
System.out.printf("%s is now level %d. Health has been increased and restored. Strength has been increased.%n", this.name, this.level);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes a pokemon attack another pokemon.
|
||||
* @param target The pokemon to take damage.
|
||||
*/
|
||||
public void attack(Pokemon target) {
|
||||
if (this.healthPoints > 0) {
|
||||
System.out.printf("%s attacks %s.%n", this.getName(), target.getName());
|
||||
double critical = 1;
|
||||
if (Math.random() < this.criticalChance) {
|
||||
System.out.println("Critical hit!");
|
||||
critical = (2 * this.level +5) / (this.level + 5);
|
||||
}
|
||||
double randomDouble = 0.85 + (1.0 - 0.85) * random.nextDouble();
|
||||
int moveDamage = (int)(Math.random() * 60 + 40);
|
||||
int damageInflicted = this.level + (int)((((((2 * this.strength) / 5) + 2) * moveDamage * 1.75) / 50 + 2) * critical * randomDouble);
|
||||
target.damage(damageInflicted);
|
||||
if (!target.isConscious()) {
|
||||
System.out.printf("%s is defeated by %s.%n", target.getName(), this.getName());
|
||||
this.giveEXP(target);
|
||||
this.fleeCount = 0;
|
||||
}
|
||||
} else {
|
||||
System.out.println("No cheating!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The trainer may flee if the battle is too hard.
|
||||
* @param target Who are we trying to flee from
|
||||
* @return True on successfull escape. False otherwise.
|
||||
*/
|
||||
public boolean flee(Pokemon target) {
|
||||
if (random.nextInt(256) < (this.level * 128 / target.level) + (30 * this.fleeCount % 256)) {
|
||||
this.fleeCount = 0;
|
||||
return true;
|
||||
} else {
|
||||
this.fleeCount++;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
719
Pokemon.txt
Normal file
719
Pokemon.txt
Normal file
@ -0,0 +1,719 @@
|
||||
Bulbasaur
|
||||
Ivysaur
|
||||
Venusaur
|
||||
Charmander
|
||||
Charmeleon
|
||||
Charizard
|
||||
Squirtle
|
||||
Wartortle
|
||||
Blastoise
|
||||
Caterpie
|
||||
Metapod
|
||||
Butterfree
|
||||
Weedle
|
||||
Kakuna
|
||||
Beedrill
|
||||
Pidgey
|
||||
Pidgeotto
|
||||
Pidgeot
|
||||
Rattata
|
||||
Raticate
|
||||
Spearow
|
||||
Fearow
|
||||
Ekans
|
||||
Arbok
|
||||
Pikachu
|
||||
Raichu
|
||||
Sandshrew
|
||||
Sandslash
|
||||
Nidoran♀
|
||||
Nidorina
|
||||
Nidoqueen
|
||||
Nidoran♂
|
||||
Nidorino
|
||||
Nidoking
|
||||
Clefairy
|
||||
Clefable
|
||||
Vulpix
|
||||
Ninetales
|
||||
Jigglypuff
|
||||
Wigglytuff
|
||||
Zubat
|
||||
Golbat
|
||||
Oddish
|
||||
Gloom
|
||||
Vileplume
|
||||
Paras
|
||||
Parasect
|
||||
Venonat
|
||||
Venomoth
|
||||
Diglett
|
||||
Dugtrio
|
||||
Meowth
|
||||
Persian
|
||||
Psyduck
|
||||
Golduck
|
||||
Mankey
|
||||
Primeape
|
||||
Growlithe
|
||||
Arcanine
|
||||
Poliwag
|
||||
Poliwhirl
|
||||
Poliwrath
|
||||
Abra
|
||||
Kadabra
|
||||
Alakazam
|
||||
Machop
|
||||
Machoke
|
||||
Machamp
|
||||
Bellsprout
|
||||
Weepinbell
|
||||
Victreebel
|
||||
Tentacool
|
||||
Tentacruel
|
||||
Geodude
|
||||
Graveler
|
||||
Golem
|
||||
Ponyta
|
||||
Rapidash
|
||||
Slowpoke
|
||||
Slowbro
|
||||
Magnemite
|
||||
Magneton
|
||||
Farfetch'd
|
||||
Doduo
|
||||
Dodrio
|
||||
Seel
|
||||
Dewgong
|
||||
Grimer
|
||||
Muk
|
||||
Shellder
|
||||
Cloyster
|
||||
Gastly
|
||||
Haunter
|
||||
Gengar
|
||||
Onix
|
||||
Drowzee
|
||||
Hypno
|
||||
Krabby
|
||||
Kingler
|
||||
Voltorb
|
||||
Electrode
|
||||
Exeggcute
|
||||
Exeggutor
|
||||
Cubone
|
||||
Marowak
|
||||
Hitmonlee
|
||||
Hitmonchan
|
||||
Lickitung
|
||||
Koffing
|
||||
Weezing
|
||||
Rhyhorn
|
||||
Rhydon
|
||||
Chansey
|
||||
Tangela
|
||||
Kangaskhan
|
||||
Horsea
|
||||
Seadra
|
||||
Goldeen
|
||||
Seaking
|
||||
Staryu
|
||||
Starmie
|
||||
Mr. Mime
|
||||
Scyther
|
||||
Jynx
|
||||
Electabuzz
|
||||
Magmar
|
||||
Pinsir
|
||||
Tauros
|
||||
Magikarp
|
||||
Gyarados
|
||||
Lapras
|
||||
Ditto
|
||||
Eevee
|
||||
Vaporeon
|
||||
Jolteon
|
||||
Flareon
|
||||
Porygon
|
||||
Omanyte
|
||||
Omastar
|
||||
Kabuto
|
||||
Kabutops
|
||||
Aerodactyl
|
||||
Snorlax
|
||||
Articuno
|
||||
Zapdos
|
||||
Moltres
|
||||
Dratini
|
||||
Dragonair
|
||||
Dragonite
|
||||
Mewtwo
|
||||
Mew
|
||||
Chikorita
|
||||
Bayleef
|
||||
Meganium
|
||||
Cyndaquil
|
||||
Quilava
|
||||
Typhlosion
|
||||
Totodile
|
||||
Croconaw
|
||||
Feraligatr
|
||||
Sentret
|
||||
Furret
|
||||
Hoothoot
|
||||
Noctowl
|
||||
Ledyba
|
||||
Ledian
|
||||
Spinarak
|
||||
Ariados
|
||||
Crobat
|
||||
Chinchou
|
||||
Lanturn
|
||||
Pichu
|
||||
Cleffa
|
||||
Igglybuff
|
||||
Togepi
|
||||
Togetic
|
||||
Natu
|
||||
Xatu
|
||||
Mareep
|
||||
Flaaffy
|
||||
Ampharos
|
||||
Bellossom
|
||||
Marill
|
||||
Azumarill
|
||||
Sudowoodo
|
||||
Politoed
|
||||
Hoppip
|
||||
Skiploom
|
||||
Jumpluff
|
||||
Aipom
|
||||
Sunkern
|
||||
Sunflora
|
||||
Yanma
|
||||
Wooper
|
||||
Quagsire
|
||||
Espeon
|
||||
Umbreon
|
||||
Murkrow
|
||||
Slowking
|
||||
Misdreavus
|
||||
Unown
|
||||
Wobbuffet
|
||||
Girafarig
|
||||
Pineco
|
||||
Forretress
|
||||
Dunsparce
|
||||
Gligar
|
||||
Steelix
|
||||
Snubbull
|
||||
Granbull
|
||||
Qwilfish
|
||||
Scizor
|
||||
Shuckle
|
||||
Heracross
|
||||
Sneasel
|
||||
Teddiursa
|
||||
Ursaring
|
||||
Slugma
|
||||
Magcargo
|
||||
Swinub
|
||||
Piloswine
|
||||
Corsola
|
||||
Remoraid
|
||||
Octillery
|
||||
Delibird
|
||||
Mantine
|
||||
Skarmory
|
||||
Houndour
|
||||
Houndoom
|
||||
Kingdra
|
||||
Phanpy
|
||||
Donphan
|
||||
Porygon2
|
||||
Stantler
|
||||
Smeargle
|
||||
Tyrogue
|
||||
Hitmontop
|
||||
Smoochum
|
||||
Elekid
|
||||
Magby
|
||||
Miltank
|
||||
Blissey
|
||||
Raikou
|
||||
Entei
|
||||
Suicune
|
||||
Larvitar
|
||||
Pupitar
|
||||
Tyranitar
|
||||
Lugia
|
||||
Ho-Oh
|
||||
Celebi
|
||||
Treecko
|
||||
Grovyle
|
||||
Sceptile
|
||||
Torchic
|
||||
Combusken
|
||||
Blaziken
|
||||
Mudkip
|
||||
Marshtomp
|
||||
Swampert
|
||||
Poochyena
|
||||
Mightyena
|
||||
Zigzagoon
|
||||
Linoone
|
||||
Wurmple
|
||||
Silcoon
|
||||
Beautifly
|
||||
Cascoon
|
||||
Dustox
|
||||
Lotad
|
||||
Lombre
|
||||
Ludicolo
|
||||
Seedot
|
||||
Nuzleaf
|
||||
Shiftry
|
||||
Taillow
|
||||
Swellow
|
||||
Wingull
|
||||
Pelipper
|
||||
Ralts
|
||||
Kirlia
|
||||
Gardevoir
|
||||
Surskit
|
||||
Masquerain
|
||||
Shroomish
|
||||
Breloom
|
||||
Slakoth
|
||||
Vigoroth
|
||||
Slaking
|
||||
Nincada
|
||||
Ninjask
|
||||
Shedinja
|
||||
Whismur
|
||||
Loudred
|
||||
Exploud
|
||||
Makuhita
|
||||
Hariyama
|
||||
Azurill
|
||||
Nosepass
|
||||
Skitty
|
||||
Delcatty
|
||||
Sableye
|
||||
Mawile
|
||||
Aron
|
||||
Lairon
|
||||
Aggron
|
||||
Meditite
|
||||
Medicham
|
||||
Electrike
|
||||
Manectric
|
||||
Plusle
|
||||
Minun
|
||||
Volbeat
|
||||
Illumise
|
||||
Roselia
|
||||
Gulpin
|
||||
Swalot
|
||||
Carvanha
|
||||
Sharpedo
|
||||
Wailmer
|
||||
Wailord
|
||||
Numel
|
||||
Camerupt
|
||||
Torkoal
|
||||
Spoink
|
||||
Grumpig
|
||||
Spinda
|
||||
Trapinch
|
||||
Vibrava
|
||||
Flygon
|
||||
Cacnea
|
||||
Cacturne
|
||||
Swablu
|
||||
Altaria
|
||||
Zangoose
|
||||
Seviper
|
||||
Lunatone
|
||||
Solrock
|
||||
Barboach
|
||||
Whiscash
|
||||
Corphish
|
||||
Crawdaunt
|
||||
Baltoy
|
||||
Claydol
|
||||
Lileep
|
||||
Cradily
|
||||
Anorith
|
||||
Armaldo
|
||||
Feebas
|
||||
Milotic
|
||||
Castform
|
||||
Kecleon
|
||||
Shuppet
|
||||
Banette
|
||||
Duskull
|
||||
Dusclops
|
||||
Tropius
|
||||
Chimecho
|
||||
Absol
|
||||
Wynaut
|
||||
Snorunt
|
||||
Glalie
|
||||
Spheal
|
||||
Sealeo
|
||||
Walrein
|
||||
Clamperl
|
||||
Huntail
|
||||
Gorebyss
|
||||
Relicanth
|
||||
Luvdisc
|
||||
Bagon
|
||||
Shelgon
|
||||
Salamence
|
||||
Beldum
|
||||
Metang
|
||||
Metagross
|
||||
Regirock
|
||||
Regice
|
||||
Registeel
|
||||
Latias
|
||||
Latios
|
||||
Kyogre
|
||||
Groudon
|
||||
Rayquaza
|
||||
Jirachi
|
||||
Deoxys
|
||||
Turtwig
|
||||
Grotle
|
||||
Torterra
|
||||
Chimchar
|
||||
Monferno
|
||||
Infernape
|
||||
Piplup
|
||||
Prinplup
|
||||
Empoleon
|
||||
Starly
|
||||
Staravia
|
||||
Staraptor
|
||||
Bidoof
|
||||
Bibarel
|
||||
Kricketot
|
||||
Kricketune
|
||||
Shinx
|
||||
Luxio
|
||||
Luxray
|
||||
Budew
|
||||
Roserade
|
||||
Cranidos
|
||||
Rampardos
|
||||
Shieldon
|
||||
Bastiodon
|
||||
Burmy
|
||||
Wormadam
|
||||
Mothim
|
||||
Combee
|
||||
Vespiquen
|
||||
Pachirisu
|
||||
Buizel
|
||||
Floatzel
|
||||
Cherubi
|
||||
Cherrim
|
||||
Shellos
|
||||
Gastrodon
|
||||
Ambipom
|
||||
Drifloon
|
||||
Drifblim
|
||||
Buneary
|
||||
Lopunny
|
||||
Mismagius
|
||||
Honchkrow
|
||||
Glameow
|
||||
Purugly
|
||||
Chingling
|
||||
Stunky
|
||||
Skuntank
|
||||
Bronzor
|
||||
Bronzong
|
||||
Bonsly
|
||||
Mime Jr.
|
||||
Happiny
|
||||
Chatot
|
||||
Spiritomb
|
||||
Gible
|
||||
Gabite
|
||||
Garchomp
|
||||
Munchlax
|
||||
Riolu
|
||||
Lucario
|
||||
Hippopotas
|
||||
Hippowdon
|
||||
Skorupi
|
||||
Drapion
|
||||
Croagunk
|
||||
Toxicroak
|
||||
Carnivine
|
||||
Finneon
|
||||
Lumineon
|
||||
Mantyke
|
||||
Snover
|
||||
Abomasnow
|
||||
Weavile
|
||||
Magnezone
|
||||
Lickilicky
|
||||
Rhyperior
|
||||
Tangrowth
|
||||
Electivire
|
||||
Magmortar
|
||||
Togekiss
|
||||
Yanmega
|
||||
Leafeon
|
||||
Glaceon
|
||||
Gliscor
|
||||
Mamoswine
|
||||
Porygon-Z
|
||||
Gallade
|
||||
Probopass
|
||||
Dusknoir
|
||||
Froslass
|
||||
Rotom
|
||||
Uxie
|
||||
Mesprit
|
||||
Azelf
|
||||
Dialga
|
||||
Palkia
|
||||
Heatran
|
||||
Regigigas
|
||||
Giratina
|
||||
Cresselia
|
||||
Phione
|
||||
Manaphy
|
||||
Darkrai
|
||||
Shaymin
|
||||
Arceus
|
||||
Victini
|
||||
Snivy
|
||||
Servine
|
||||
Serperior
|
||||
Tepig
|
||||
Pignite
|
||||
Emboar
|
||||
Oshawott
|
||||
Dewott
|
||||
Samurott
|
||||
Patrat
|
||||
Watchog
|
||||
Lillipup
|
||||
Herdier
|
||||
Stoutland
|
||||
Purrloin
|
||||
Liepard
|
||||
Pansage
|
||||
Simisage
|
||||
Pansear
|
||||
Simisear
|
||||
Panpour
|
||||
Simipour
|
||||
Munna
|
||||
Musharna
|
||||
Pidove
|
||||
Tranquill
|
||||
Unfezant
|
||||
Blitzle
|
||||
Zebstrika
|
||||
Roggenrola
|
||||
Boldore
|
||||
Gigalith
|
||||
Woobat
|
||||
Swoobat
|
||||
Drilbur
|
||||
Excadrill
|
||||
Audino
|
||||
Timburr
|
||||
Gurdurr
|
||||
Conkeldurr
|
||||
Tympole
|
||||
Palpitoad
|
||||
Seismitoad
|
||||
Throh
|
||||
Sawk
|
||||
Sewaddle
|
||||
Swadloon
|
||||
Leavanny
|
||||
Venipede
|
||||
Whirlipede
|
||||
Scolipede
|
||||
Cottonee
|
||||
Whimsicott
|
||||
Petilil
|
||||
Lilligant
|
||||
Basculin
|
||||
Sandile
|
||||
Krokorok
|
||||
Krookodile
|
||||
Darumaka
|
||||
Darmanitan
|
||||
Maractus
|
||||
Dwebble
|
||||
Crustle
|
||||
Scraggy
|
||||
Scrafty
|
||||
Sigilyph
|
||||
Yamask
|
||||
Cofagrigus
|
||||
Tirtouga
|
||||
Carracosta
|
||||
Archen
|
||||
Archeops
|
||||
Trubbish
|
||||
Garbodor
|
||||
Zorua
|
||||
Zoroark
|
||||
Minccino
|
||||
Cinccino
|
||||
Gothita
|
||||
Gothorita
|
||||
Gothitelle
|
||||
Solosis
|
||||
Duosion
|
||||
Reuniclus
|
||||
Ducklett
|
||||
Swanna
|
||||
Vanillite
|
||||
Vanillish
|
||||
Vanilluxe
|
||||
Deerling
|
||||
Sawsbuck
|
||||
Emolga
|
||||
Karrablast
|
||||
Escavalier
|
||||
Foongus
|
||||
Amoonguss
|
||||
Frillish
|
||||
Jellicent
|
||||
Alomomola
|
||||
Joltik
|
||||
Galvantula
|
||||
Ferroseed
|
||||
Ferrothorn
|
||||
Klink
|
||||
Klang
|
||||
Klinklang
|
||||
Tynamo
|
||||
Eelektrik
|
||||
Eelektross
|
||||
Elgyem
|
||||
Beheeyem
|
||||
Litwick
|
||||
Lampent
|
||||
Chandelure
|
||||
Axew
|
||||
Fraxure
|
||||
Haxorus
|
||||
Cubchoo
|
||||
Beartic
|
||||
Cryogonal
|
||||
Shelmet
|
||||
Accelgor
|
||||
Stunfisk
|
||||
Mienfoo
|
||||
Mienshao
|
||||
Druddigon
|
||||
Golett
|
||||
Golurk
|
||||
Pawniard
|
||||
Bisharp
|
||||
Bouffalant
|
||||
Rufflet
|
||||
Braviary
|
||||
Vullaby
|
||||
Mandibuzz
|
||||
Heatmor
|
||||
Durant
|
||||
Deino
|
||||
Zweilous
|
||||
Hydreigon
|
||||
Larvesta
|
||||
Volcarona
|
||||
Cobalion
|
||||
Terrakion
|
||||
Virizion
|
||||
Tornadus
|
||||
Thundurus
|
||||
Reshiram
|
||||
Zekrom
|
||||
Landorus
|
||||
Kyurem
|
||||
Keldeo
|
||||
Meloetta
|
||||
Genesect
|
||||
Chespin
|
||||
Quilladin
|
||||
Chesnaught
|
||||
Fennekin
|
||||
Braixen
|
||||
Delphox
|
||||
Froakie
|
||||
Frogadier
|
||||
Greninja
|
||||
Bunnelby
|
||||
Diggersby
|
||||
Fletchling
|
||||
Fletchinder
|
||||
Talonflame
|
||||
Scatterbug
|
||||
Spewpa
|
||||
Vivillon
|
||||
Litleo
|
||||
Pyroar
|
||||
Flabébé
|
||||
Floette
|
||||
Florges
|
||||
Skiddo
|
||||
Gogoat
|
||||
Pancham
|
||||
Pangoro
|
||||
Furfrou
|
||||
Espurr
|
||||
Meowstic
|
||||
Honedge
|
||||
Doublade
|
||||
Aegislash
|
||||
Spritzee
|
||||
Aromatisse
|
||||
Swirlix
|
||||
Slurpuff
|
||||
Inkay
|
||||
Malamar
|
||||
Binacle
|
||||
Barbaracle
|
||||
Skrelp
|
||||
Dragalge
|
||||
Clauncher
|
||||
Clawitzer
|
||||
Helioptile
|
||||
Heliolisk
|
||||
Tyrunt
|
||||
Tyrantrum
|
||||
Amaura
|
||||
Aurorus
|
||||
Sylveon
|
||||
Hawlucha
|
||||
Dedenne
|
||||
Carbink
|
||||
Goomy
|
||||
Sliggoo
|
||||
Goodra
|
||||
Klefki
|
||||
Phantump
|
||||
Trevenant
|
||||
Pumpkaboo
|
||||
Gourgeist
|
||||
Bergmite
|
||||
Avalugg
|
||||
Noibat
|
||||
Noivern
|
||||
Xerneas
|
||||
Yveltal
|
||||
Zygarde
|
||||
Diancie
|
Loading…
Reference in New Issue
Block a user