Uploaded main files
This commit is contained in:
		
							
								
								
									
										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
 | 
			
		||||
		Reference in New Issue
	
	Block a user