@Override
	public Map<Pokemon, List<MoveLearnt>> getMovesLearnt() {
		Map<Pokemon, List<MoveLearnt>> movesets = new TreeMap<Pokemon, List<MoveLearnt>>();
		int pointersOffset = romEntry.getValue("PokemonMovesetsTableOffset");
		int pokeStatsOffset = romEntry.getValue("PokemonStatsOffset");
		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) {
				Pokemon pkmn = pokes[pokeRBYToNumTable[i]];
				int statsOffset = 0;
				if (pokeRBYToNumTable[i] == 151 && !romEntry.isYellow) {
					// Mewww
					statsOffset = romEntry.getValue("MewStatsOffset");
				} else {
					statsOffset = (pokeRBYToNumTable[i] - 1) * 0x1C
							+ pokeStatsOffset;
				}
				List<MoveLearnt> ourMoves = new ArrayList<MoveLearnt>();
				for (int delta = 0x0F; delta < 0x13; delta++) {
					if (rom[statsOffset + delta] != 0x00) {
						MoveLearnt learnt = new MoveLearnt();
						learnt.level = 1;
						learnt.move = moveRomToNumTable[rom[statsOffset + delta] & 0xFF];
						ourMoves.add(learnt);
					}
				}
				// Skip over evolution data
				while (rom[realPointer] != 0) {
					if (rom[realPointer] == 1) {
						realPointer += 3;
					} else if (rom[realPointer] == 2) {
						realPointer += 4;
					} else if (rom[realPointer] == 3) {
						realPointer += 3;
					}
				}
				realPointer++;
				while (rom[realPointer] != 0) {
					MoveLearnt learnt = new MoveLearnt();
					learnt.level = rom[realPointer] & 0xFF;
					learnt.move = moveRomToNumTable[rom[realPointer + 1] & 0xFF];
					ourMoves.add(learnt);
					realPointer += 2;
				}
				movesets.put(pkmn, ourMoves);
			}
		}
		return movesets;
	}