summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/com/sneed/pkrandom/constants/Gen4Constants.java2
-rwxr-xr-xsrc/com/sneed/pkrandom/romhandlers/Gen4RomHandler.java26
2 files changed, 28 insertions, 0 deletions
diff --git a/src/com/sneed/pkrandom/constants/Gen4Constants.java b/src/com/sneed/pkrandom/constants/Gen4Constants.java
index 7a0acfa..1309073 100644
--- a/src/com/sneed/pkrandom/constants/Gen4Constants.java
+++ b/src/com/sneed/pkrandom/constants/Gen4Constants.java
@@ -770,6 +770,8 @@ public class Gen4Constants {
public static final String friendshipValueForEvoLocator = "DC286AD3";
+ public static final String catchFailBranchLocator = "FF2901D30425";
+
public static final int[] dpptOverworldDexMaps = new int[] {
1, 2, 3, 4, 5, -1, -1, 6, -1, 7, // 0-9 (cities, pkmn league, wind/ironworks)
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 10-19 (all mt coronet)
diff --git a/src/com/sneed/pkrandom/romhandlers/Gen4RomHandler.java b/src/com/sneed/pkrandom/romhandlers/Gen4RomHandler.java
index 7d12c47..cc98c3b 100755
--- a/src/com/sneed/pkrandom/romhandlers/Gen4RomHandler.java
+++ b/src/com/sneed/pkrandom/romhandlers/Gen4RomHandler.java
@@ -5265,6 +5265,7 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
if (romEntry.romType == Gen4Constants.Type_Plat || romEntry.romType == Gen4Constants.Type_HGSS) {
available |= MiscTweak.UPDATE_ROTOM_FORME_TYPING.getValue();
}
+ available |= MiscTweak.GUARANTEED_POKEMON_CATCHING.getValue();
return available;
}
@@ -5291,6 +5292,8 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
applyFastDistortionWorld();
} else if (tweak == MiscTweak.UPDATE_ROTOM_FORME_TYPING) {
updateRotomFormeTyping();
+ } else if (tweak == MiscTweak.GUARANTEED_POKEMON_CATCHING) {
+ enableGuaranteedPokemonCatching();
}
}
@@ -5530,6 +5533,29 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
pokes[Species.Gen4Formes.rotomM].secondaryType = Type.GRASS;
}
+ private void enableGuaranteedPokemonCatching() {
+ try {
+ byte[] battleOverlay = readOverlay(romEntry.getInt("BattleOvlNumber"));
+ int offset = find(battleOverlay, Gen4Constants.catchFailBranchLocator);
+ if (offset > 0) {
+ // In Cmd_handleballthrow (name taken from pokeemerald decomp), the middle of the function checks
+ // if the odds of catching a Pokemon is greater than 254; if it is, then the Pokemon is automatically
+ // caught. In ASM, this is represented by:
+ // cmp r1, #0xFF
+ // bcc oddsLessThanOrEqualTo254
+ // The below code just nops these two instructions so that we *always* act like our odds are 255,
+ // and Pokemon are automatically caught no matter what.
+ battleOverlay[offset] = 0x00;
+ battleOverlay[offset + 1] = 0x00;
+ battleOverlay[offset + 2] = 0x00;
+ battleOverlay[offset + 3] = 0x00;
+ writeOverlay(romEntry.getInt("BattleOvlNumber"), battleOverlay);
+ }
+ } catch (IOException e) {
+ throw new RandomizerIOException(e);
+ }
+ }
+
@Override
public void applyCorrectStaticMusic(Map<Integer,Integer> specialMusicStaticChanges) {
List<Integer> replaced = new ArrayList<>();