@Override
	public List<String> getTrainerNames() {
		int traineroffset = romEntry.getValue("TrainerDataTableOffset");
		int traineramount = romEntry.getValue("TrainerClassAmount");
		int[] trainerclasslimits = romEntry.arrayEntries
				.get("TrainerDataClassCounts");

		int[] pointers = new int[traineramount + 1];
		for (int i = 1; i <= traineramount; i++) {
			int pointer = readWord(traineroffset + (i - 1) * 2);
			pointers[i] = calculateOffset(bankOf(traineroffset), pointer);
		}

		List<String> allTrainers = new ArrayList<String>();
		for (int i = 1; i <= traineramount; i++) {
			int offs = pointers[i];
			int limit = trainerclasslimits[i];
			for (int trnum = 0; trnum < limit; trnum++) {
				String name = readVariableLengthString(offs);
				allTrainers.add(name);
				offs += name.length() + 1;
				int dataType = rom[offs] & 0xFF;
				offs++;
				while ((rom[offs] & 0xFF) != 0xFF) {
					offs += 2;
					if (dataType == 2 || dataType == 3) {
						offs++;
					}
					if (dataType % 2 == 1) {
						offs += 4;
					}
				}
				offs++;
			}
		}
		return allTrainers;
	}