diff options
author | tom-overton <tom.overton@outlook.com> | 2022-04-06 01:07:30 -0700 |
---|---|---|
committer | tom-overton <tom.overton@outlook.com> | 2022-04-06 01:07:30 -0700 |
commit | a11ffec9b5aa617a58e378770067f0bd92b7c112 (patch) | |
tree | 74796cd5be9ad8405eb732b75dc7e3ce8f2c8cca | |
parent | a0d563b1b4340c9924d87ffc4513e7dbf6d95a75 (diff) |
XY: Add support for randomizing the trash can Pokemon (fixes #414)
-rw-r--r-- | src/com/dabomstew/pkrandom/constants/Gen6Constants.java | 3 | ||||
-rw-r--r-- | src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java | 78 |
2 files changed, 81 insertions, 0 deletions
diff --git a/src/com/dabomstew/pkrandom/constants/Gen6Constants.java b/src/com/dabomstew/pkrandom/constants/Gen6Constants.java index 28a433e..bc252c2 100644 --- a/src/com/dabomstew/pkrandom/constants/Gen6Constants.java +++ b/src/com/dabomstew/pkrandom/constants/Gen6Constants.java @@ -354,6 +354,9 @@ public class Gen6Constants { public static final String xyRoamerFreeSpacePostfix = "540095E50220A0E30810A0E1", xyRoamerSpeciesLocator = "9040A0030400000A", xyRoamerLevelPrefix = "B020DDE13F3BC1E3"; + public static final String xyTrashEncountersTablePrefix = "4028100000"; + public static final int xyTrashEncounterDataLength = 16, xyTrashCanEncounterCount = 24; + public static List<Integer> xyHardcodedTradeOffsets = Arrays.asList(1, 8); public static List<Integer> xyHardcodedTradeTexts = Arrays.asList(129, 349); diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java index 2a80788..b405de2 100644 --- a/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java +++ b/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java @@ -2151,6 +2151,41 @@ public class Gen6RomHandler extends Abstract3DSRomHandler { } statics.add(se); } + + // X/Y Trash Can Pokemon + if (romEntry.romType == Gen6Constants.Type_XY) { + offset = find(code, Gen6Constants.xyTrashEncountersTablePrefix); + if (offset > 0) { + offset += Gen6Constants.xyTrashEncountersTablePrefix.length() / 2; // because it was a prefix + // Pokemon Village Encounters + Map<Pokemon, StaticEncounter> pokemonVillagePokemon = new HashMap<>(); + for (int i = 0; i < Gen6Constants.xyTrashCanEncounterCount / 2; i++) { + StaticEncounter se = readTrashCanEncounter(offset); + if (pokemonVillagePokemon.containsKey(se.pkmn)) { + StaticEncounter mainEncounter = pokemonVillagePokemon.get(se.pkmn); + mainEncounter.linkedEncounters.add(se); + } else { + statics.add(se); + pokemonVillagePokemon.put(se.pkmn, se); + } + offset += Gen6Constants.xyTrashEncounterDataLength; + } + + // Lost Hotel Encounters + Map<Pokemon, StaticEncounter> lostHotelPokemon = new HashMap<>(); + for (int i = Gen6Constants.xyTrashCanEncounterCount / 2; i < Gen6Constants.xyTrashCanEncounterCount; i++) { + StaticEncounter se = readTrashCanEncounter(offset); + if (lostHotelPokemon.containsKey(se.pkmn)) { + StaticEncounter mainEncounter = lostHotelPokemon.get(se.pkmn); + mainEncounter.linkedEncounters.add(se); + } else { + statics.add(se); + lostHotelPokemon.put(se.pkmn, se); + } + offset += Gen6Constants.xyTrashEncounterDataLength; + } + } + } } catch (IOException e) { throw new RandomizerIOException(e); } @@ -2172,6 +2207,24 @@ public class Gen6RomHandler extends Abstract3DSRomHandler { } } + private StaticEncounter readTrashCanEncounter(int offset) { + int species = FileFunctions.readFullInt(code, offset); + int forme = FileFunctions.readFullInt(code, offset + 4); + int level = FileFunctions.readFullInt(code, offset + 8); + StaticEncounter se = new StaticEncounter(); + Pokemon pokemon = pokes[species]; + if (forme > pokemon.cosmeticForms && forme != 30 && forme != 31) { + int speciesWithForme = absolutePokeNumByBaseForme + .getOrDefault(species, dummyAbsolutePokeNums) + .getOrDefault(forme, 0); + pokemon = pokes[speciesWithForme]; + } + se.pkmn = pokemon; + se.forme = forme; + se.level = level; + return se; + } + @Override public boolean setStaticPokemon(List<StaticEncounter> staticPokemon) { // Static Pokemon @@ -2217,6 +2270,31 @@ public class Gen6RomHandler extends Abstract3DSRomHandler { } writeFile(romEntry.getFile("StaticPokemon"),staticCRO); + // X/Y Trash Can Pokemon + if (romEntry.romType == Gen6Constants.Type_XY) { + offset = find(code, Gen6Constants.xyTrashEncountersTablePrefix); + if (offset > 0) { + offset += Gen6Constants.xyTrashEncountersTablePrefix.length() / 2; // because it was a prefix + int currentCount = 0; + while (currentCount != Gen6Constants.xyTrashCanEncounterCount) { + StaticEncounter se = staticIter.next(); + FileFunctions.writeFullInt(code, offset, se.pkmn.getBaseNumber()); + FileFunctions.writeFullInt(code, offset + 4, se.forme); + FileFunctions.writeFullInt(code, offset + 8, se.level); + offset += Gen6Constants.xyTrashEncounterDataLength; + currentCount++; + for (int i = 0; i < se.linkedEncounters.size(); i++) { + StaticEncounter linkedEncounter = se.linkedEncounters.get(i); + FileFunctions.writeFullInt(code, offset, linkedEncounter.pkmn.getBaseNumber()); + FileFunctions.writeFullInt(code, offset + 4, linkedEncounter.forme); + FileFunctions.writeFullInt(code, offset + 8, linkedEncounter.level); + offset += Gen6Constants.xyTrashEncounterDataLength; + currentCount++; + } + } + } + } + if (romEntry.romType == Gen6Constants.Type_XY) { int[] boxLegendaryOffsets = romEntry.arrayEntries.get("BoxLegendaryOffsets"); StaticEncounter boxLegendaryEncounter = staticPokemon.get(boxLegendaryOffsets[0]); |