@Override
	public List<EncounterSet> getEncounters(boolean useTimeOfDay) {
		int offset = romEntry.getValue("WildPokemonOffset");
		List<EncounterSet> areas = new ArrayList<EncounterSet>();
		offset = readLandEncounters(offset, areas, useTimeOfDay); // Johto
		offset = readSeaEncounters(offset, areas); // Johto
		offset = readLandEncounters(offset, areas, useTimeOfDay); // Kanto
		offset = readSeaEncounters(offset, areas); // Kanto
		offset = readLandEncounters(offset, areas, useTimeOfDay); // Specials
		offset = readSeaEncounters(offset, areas); // Specials

		// Fishing Data
		offset = romEntry.getValue("FishingWildsOffset");
		int rootOffset = offset;
		for (int k = 0; k < 12; k++) {
			EncounterSet es = new EncounterSet();
			es.displayName = "Fishing Group " + (k + 1);
			for (int i = 0; i < 11; i++) {
				offset++;
				int pokeNum = rom[offset++] & 0xFF;
				int level = rom[offset++] & 0xFF;
				if (pokeNum == 0) {
					if (!useTimeOfDay) {
						// read the encounter they put here for DAY
						int specialOffset = rootOffset + 33 * 12 + level * 4
								+ 2;
						Encounter enc = new Encounter();
						enc.pokemon = pokes[rom[specialOffset] & 0xFF];
						enc.level = rom[specialOffset + 1] & 0xFF;
						es.encounters.add(enc);
					}
					// else will be handled by code below
				} else {
					Encounter enc = new Encounter();
					enc.pokemon = pokes[pokeNum];
					enc.level = level;
					es.encounters.add(enc);
				}
			}
			areas.add(es);
		}
		if (useTimeOfDay) {
			for (int k = 0; k < 11; k++) {
				EncounterSet es = new EncounterSet();
				es.displayName = "Time-Specific Fishing " + (k + 1);
				for (int i = 0; i < 4; i++) {
					int pokeNum = rom[offset++] & 0xFF;
					int level = rom[offset++] & 0xFF;
					Encounter enc = new Encounter();
					enc.pokemon = pokes[pokeNum];
					enc.level = level;
					es.encounters.add(enc);
				}
				areas.add(es);
			}
		}

		// Headbutt Data
		offset = romEntry.getValue("HeadbuttWildsOffset");
		int limit = romEntry.getValue("HeadbuttTableSize");
		for (int i = 0; i < limit; i++) {
			EncounterSet es = new EncounterSet();
			es.displayName = "Headbutt Trees Set " + (i + 1);
			while ((rom[offset] & 0xFF) != 0xFF) {
				offset++;
				int pokeNum = rom[offset++] & 0xFF;
				int level = rom[offset++] & 0xFF;
				Encounter enc = new Encounter();
				enc.pokemon = pokes[pokeNum];
				enc.level = level;
				es.encounters.add(enc);
			}
			offset++;
			areas.add(es);
		}

		// Bug Catching Contest Data
		offset = romEntry.getValue("BCCWildsOffset");
		EncounterSet bccES = new EncounterSet();
		bccES.displayName = "Bug Catching Contest";
		while ((rom[offset] & 0xFF) != 0xFF) {
			offset++;
			Encounter enc = new Encounter();
			enc.pokemon = pokes[rom[offset++] & 0xFF];
			enc.level = rom[offset++] & 0xFF;
			enc.maxLevel = rom[offset++] & 0xFF;
			bccES.encounters.add(enc);
		}
		areas.add(bccES);

		return areas;
	}