@Override
	public List<Evolution> getEvolutions() {
		List<Evolution> evos = new ArrayList<Evolution>();
		int pointersOffset = romEntry.getValue("PokemonMovesetsTableOffset");
		List<Evolution> evosForThisPoke = new ArrayList<Evolution>();
		int pkmnCount = romEntry.getValue("InternalPokemonCount");
		for (int i = 1; i <= pkmnCount; i++) {
			int pointer = readWord(pointersOffset + (i - 1) * 2);
			int realPointer = calculateOffset(bankOf(pointersOffset), pointer);
			if (pokeRBYToNumTable[i] != 0) {
				evosForThisPoke.clear();
				int thisPoke = pokeRBYToNumTable[i];
				while (rom[realPointer] != 0) {
					int method = rom[realPointer];
					int otherPoke = pokeRBYToNumTable[rom[realPointer + 2
							+ (method == 2 ? 1 : 0)] & 0xFF];
					Evolution evo = new Evolution(thisPoke, otherPoke, true);
					if (!evos.contains(evo)) {
						evos.add(evo);
						evosForThisPoke.add(evo);
					}
					realPointer += (method == 2 ? 4 : 3);
				}
				// split evos don't carry stats
				if (evosForThisPoke.size() > 1) {
					for (Evolution e : evosForThisPoke) {
						e.carryStats = false;
					}
				}
			}
		}
		return evos;
	}