@Override
	public void removeTradeEvolutions(boolean changeMoveEvos) {
		// Evolution data is stored before learnmoves.
		// no move evos, so no need to check for those
		int pointersOffset = romEntry.getValue("PokemonMovesetsTableOffset");
		log("--Removing Trade Evolutions--");
		for (int i = 1; i <= 251; i++) {
			int pointer = readWord(pointersOffset + (i - 1) * 2);
			int realPointer = calculateOffset(bankOf(pointersOffset), pointer);
			// Evolution data
			// Type 1: 01 LV PK
			// Type 2: 02 ITEM PK
			// Type 3: 03 ITEM/FF PK (trade, FF for no item reqd)
			// Type 4: 04 HAPPCOND PK
			// Type 5: 05 LV TYROGUECOND PK
			// HAPPCOND: 01 none 02 day only 03 night only
			// TYROGUECOND: 01 Attack>Defense 02 Attack<Defense
			// 03 Attack=Defense

			while (rom[realPointer] != 0) {
				if (rom[realPointer] == 5) {
					realPointer += 4;
				} else if (rom[realPointer] == 3) {
					int evolvingTo = rom[realPointer + 2] & 0xFF;
					// What to do?
					if (i == 79) {
						// Slowpoke: Make water stone => Slowking
						rom[realPointer] = 2;
						rom[realPointer + 1] = 24;
						logEvoChangeStone(pokes[i].name,
								pokes[evolvingTo].name, itemNames[24]);
					} else if (i == 117) {
						// Seadra: level 40
						rom[realPointer] = 1;
						rom[realPointer + 1] = 40;
						logEvoChangeLevel(pokes[i].name,
								pokes[evolvingTo].name, 40);
					} else if (i == 61 || (rom[realPointer + 1] & 0xFF) == 0xFF) {
						// Poliwhirl or any of the original 4 trade evos
						// Level 37
						rom[realPointer] = 1;
						rom[realPointer + 1] = 37;
						logEvoChangeLevel(pokes[i].name,
								pokes[evolvingTo].name, 37);
					} else {
						// A new trade evo of a single stage Pokemon
						// level 30
						rom[realPointer] = 1;
						rom[realPointer + 1] = 30;
						logEvoChangeLevel(pokes[i].name,
								pokes[evolvingTo].name, 30);
					}
					// Regardless of whatever we did, advance past it
					realPointer += 3;
				} else {
					realPointer += 3;
				}
			}
		}
		logBlankLine();

	}