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