@Override
	public List<Trainer> getTrainers() {
		List<Trainer> allTrainers = new ArrayList<Trainer>();
		try {
			NARCContents trainers = this.readNARC(romEntry
					.getString("TrainerData"));
			NARCContents trpokes = this.readNARC(romEntry
					.getString("TrainerPokemon"));
			List<String> tclasses = this.getTrainerClassNames();
			List<String> tnames = this.getTrainerNames();
			int trainernum = trainers.files.size();
			for (int i = 1; i < trainernum; i++) {
				byte[] trainer = trainers.files.get(i);
				byte[] trpoke = trpokes.files.get(i);
				Trainer tr = new Trainer();
				tr.poketype = trainer[0] & 0xFF;
				tr.trainerclass = trainer[1] & 0xFF;
				tr.offset = trainer[16] & 0xFF;
				int numPokes = trainer[3] & 0xFF;
				int pokeOffs = 0;
				tr.fullDisplayName = tclasses.get(tr.trainerclass) + " "
						+ tnames.get(i - 1);
				// printBA(trpoke);
				for (int poke = 0; poke < numPokes; poke++) {
					int ailevel = trpoke[pokeOffs] & 0xFF;
					int level = trpoke[pokeOffs + 2] & 0xFF;
					int species = (trpoke[pokeOffs + 4] & 0xFF)
							+ ((trpoke[pokeOffs + 5] & 0x01) << 8);
					// int formnum = (trpoke[pokeOffs + 5] >> 2);
					TrainerPokemon tpk = new TrainerPokemon();
					tpk.level = level;
					tpk.pokemon = pokes[species];
					tpk.AILevel = ailevel;
					tpk.ability = trpoke[pokeOffs + 1] & 0xFF;
					pokeOffs += 6;
					if (tr.poketype >= 2) {
						int heldItem = readWord(trpoke, pokeOffs);
						tpk.heldItem = heldItem;
						pokeOffs += 2;
					}
					if (tr.poketype % 2 == 1) {
						int attack1 = readWord(trpoke, pokeOffs);
						int attack2 = readWord(trpoke, pokeOffs + 2);
						int attack3 = readWord(trpoke, pokeOffs + 4);
						int attack4 = readWord(trpoke, pokeOffs + 6);
						tpk.move1 = attack1;
						tpk.move2 = attack2;
						tpk.move3 = attack3;
						tpk.move4 = attack4;
						pokeOffs += 8;
					}
					// Plat/HGSS have another random pokeOffs +=2 here.
					if (romEntry.romType != Type_DP) {
						pokeOffs += 2;
					}
					tr.pokemon.add(tpk);
				}
				allTrainers.add(tr);
			}
			if (romEntry.romType == Type_DP) {
				tagTrainersDP(allTrainers);
			} else if (romEntry.romType == Type_Plat) {
				tagTrainersPt(allTrainers);
			} else {
				tagTrainersHGSS(allTrainers);
			}
		} catch (IOException ex) {
			// change this later
			ex.printStackTrace();
		}
		return allTrainers;
	}