@Override
	public List<EncounterSet> getEncounters(boolean useTimeOfDay) {
		if (!mapLoadingDone) {
			preprocessMaps();
			mapLoadingDone = true;
		}

		int startOffs = romEntry.getValue("WildPokemon");
		List<EncounterSet> encounterAreas = new ArrayList<EncounterSet>();
		Set<Integer> seenOffsets = new TreeSet<Integer>();
		int offs = startOffs;
		while (true) {
			// Read pointers
			int bank = rom[offs] & 0xFF;
			int map = rom[offs + 1] & 0xFF;
			if (bank == 0xFF && map == 0xFF) {
				break;
			}

			String mapName = mapNames[bank][map];

			int grassPokes = readPointer(offs + 4);
			int waterPokes = readPointer(offs + 8);
			int treePokes = readPointer(offs + 12);
			int fishPokes = readPointer(offs + 16);

			// Add pokemanz
			if (grassPokes != -134217728 && rom[grassPokes] != 0
					&& !seenOffsets.contains(readPointer(grassPokes + 4))) {
				encounterAreas.add(readWildArea(grassPokes, 12, mapName
						+ " Grass/Cave"));
				seenOffsets.add(readPointer(grassPokes + 4));
			}
			if (waterPokes != -134217728 && rom[waterPokes] != 0
					&& !seenOffsets.contains(readPointer(waterPokes + 4))) {
				encounterAreas.add(readWildArea(waterPokes, 5, mapName
						+ " Surfing"));
				seenOffsets.add(readPointer(waterPokes + 4));
			}
			if (treePokes != -134217728 && rom[treePokes] != 0
					&& !seenOffsets.contains(readPointer(treePokes + 4))) {
				encounterAreas.add(readWildArea(treePokes, 5, mapName
						+ " Rock Smash"));
				seenOffsets.add(readPointer(treePokes + 4));
			}
			if (fishPokes != -134217728 && rom[fishPokes] != 0
					&& !seenOffsets.contains(readPointer(fishPokes + 4))) {
				encounterAreas.add(readWildArea(fishPokes, 10, mapName
						+ " Fishing"));
				seenOffsets.add(readPointer(fishPokes + 4));
			}

			offs += 20;
		}
		if (romEntry.arrayEntries.containsKey("BattleTrappersBanned")) {
			// Some encounter sets aren't allowed to have Pokemon
			// with Arena Trap, Shadow Tag etc.
			int[] bannedAreas = romEntry.arrayEntries
					.get("BattleTrappersBanned");
			for (int areaIdx : bannedAreas) {
				encounterAreas.get(areaIdx).battleTrappersBanned = true;
			}
		}
		return encounterAreas;
	}