summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortom-overton <tom.overton@outlook.com>2022-04-06 01:07:30 -0700
committertom-overton <tom.overton@outlook.com>2022-04-06 01:07:30 -0700
commita11ffec9b5aa617a58e378770067f0bd92b7c112 (patch)
tree74796cd5be9ad8405eb732b75dc7e3ce8f2c8cca
parenta0d563b1b4340c9924d87ffc4513e7dbf6d95a75 (diff)
XY: Add support for randomizing the trash can Pokemon (fixes #414)
-rw-r--r--src/com/dabomstew/pkrandom/constants/Gen6Constants.java3
-rw-r--r--src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java78
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]);