summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortom-overton <tom.overton@outlook.com>2021-04-22 04:59:05 -0700
committertom-overton <tom.overton@outlook.com>2021-04-22 04:59:05 -0700
commit81e60b99a79fa046f9c8375297dd2c7bd2e8f0a9 (patch)
treea019fda95fd063505add0d123125632e37d648bb
parentf712c2804e790f0488acd4ecaba5902e24f4f0d5 (diff)
R/S: Randomize the first Poochyena encounter
-rw-r--r--asm/hardcoded_statics/rs_firstbattle.asm53
-rwxr-xr-xsrc/com/dabomstew/pkrandom/config/gen3_offsets.ini8
-rw-r--r--src/com/dabomstew/pkrandom/patches/hardcoded_statics/rs_firstbattle.ipsbin0 -> 104 bytes
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java8
4 files changed, 65 insertions, 4 deletions
diff --git a/asm/hardcoded_statics/rs_firstbattle.asm b/asm/hardcoded_statics/rs_firstbattle.asm
new file mode 100644
index 0000000..b3c3e60
--- /dev/null
+++ b/asm/hardcoded_statics/rs_firstbattle.asm
@@ -0,0 +1,53 @@
+ .gba
+ .thumb
+ .open "pokeruby.gba", "pokeruby_firstbattle.gba", 0x08000000
+
+ SET_UP_BATTLE_VARS_AND_BIRCH_POOCHYENA_HOOK_ADDR equ 0x0800B8EA
+ SET_UP_BATTLE_VARS_AND_BIRCH_POOCHYENA_CONTINUED equ 0x0800B90E
+ CREATE_MON equ 0x0803A798
+ SET_MON_DATA equ 0x0803D1FC
+ NEW_SUBR_ADDR equ 0x08FE0000
+
+ ; Hook that jumps to our new subroutine
+ .org SET_UP_BATTLE_VARS_AND_BIRCH_POOCHYENA_HOOK_ADDR
+ bl org() + 6
+ b SET_UP_BATTLE_VARS_AND_BIRCH_POOCHYENA_CONTINUED
+ ldr r2,=#(NEW_SUBR_ADDR + 1)
+ bx r2
+ .pool
+
+ ; New subroutine that can call CreateMon and SetMonData with a pc-relative loaded constant
+ ; Note that these functions are out of range of using bl, so we call them with an alternate method
+ .org NEW_SUBR_ADDR
+ .area 72
+
+ push { r4-r6, lr }
+ sub sp, #0x14
+ ldr r4,=#0x030045C0
+ ldr r1,=#0x11E ; Poochyena
+ mov r2, #0x2 ; Level 2
+ mov r5, #0x0
+ str r5, [sp]
+ str r5, [sp, #0x4]
+ str r5, [sp, #0x8]
+ str r5, [sp, #0xC]
+ add r0, r4, #0x0
+ mov r3, #0x20
+ bl org() + 6
+ b org() + 6
+ ldr r6,=#(CREATE_MON + 1)
+ bx r6
+ str r5, [sp, #0x10]
+ add r0, r4, #0x0
+ mov r1, #0xC
+ add r2, sp, #0x10
+ bl org() + 6
+ b org() + 6
+ ldr r6,=#(SET_MON_DATA + 1)
+ bx r6
+ add sp, #0x14
+ pop { r4-r6, pc }
+ .pool
+ .endarea
+
+ .close \ No newline at end of file
diff --git a/src/com/dabomstew/pkrandom/config/gen3_offsets.ini b/src/com/dabomstew/pkrandom/config/gen3_offsets.ini
index ca1a58e..6145ef0 100755
--- a/src/com/dabomstew/pkrandom/config/gen3_offsets.ini
+++ b/src/com/dabomstew/pkrandom/config/gen3_offsets.ini
@@ -66,6 +66,9 @@ StaticPokemon{}={Species=[0x14E79A]} // Wynaut Egg
StaticPokemon{}={Species=[0x15AAAF, 0x15AABF], Level=[0x15AAB1]} // Beldum
StaticPokemon{}={Species=[0x163D99], Level=[0x163D9B]} // Castform
StaticEggPokemonOffsets=[15]
+StaticFirstBattleTweak=hardcoded_statics/rs_firstbattle
+StaticFirstBattleSpeciesOffset=0xFE003C
+StaticFirstBattleLevelOffset=0xFE0008
TMText[]=[3,15,0,1,0x70,The TM I handed you contains [move].]
TMText[]=[4,14,0,1,0x74,TATE: That TM04 contains... LIZA: [move]!\pTATE: It’s a move that’s perfect... LIZA: For any POKéMON!]
TMText[]=[5,0,29,12,0x0D,All my POKéMON does is [move]... No one dares to come near me...\pSigh... If you would, please take this TM away...]
@@ -129,6 +132,7 @@ StaticPokemon{}={Species=[0x1A053E, 0x1A0545], Level=[0x1A0540]} // Electrode 2
StaticPokemon{}={Species=[0x14E7BA]} // Wynaut Egg
StaticPokemon{}={Species=[0x15AACF, 0x15AADF], Level=[0x15AAD1]} // Beldum
StaticPokemon{}={Species=[0x163DB9], Level=[0x163DBB]} // Castform
+StaticFirstBattleTweak=hardcoded_statics/rs_firstbattle
[Ruby (U/E) 1.2]
Game=AXVE
@@ -137,6 +141,7 @@ Type=Ruby
CopyStaticPokemon=1
CopyFrom=Ruby (E)
InstantTextTweak=instant_text/ruby_12_instant_text
+StaticFirstBattleTweak=hardcoded_statics/rs_firstbattle
[Sapphire (U)]
Game=AXPE
@@ -182,6 +187,7 @@ StaticPokemon{}={Species=[0x14E72E]} // Wynaut Egg
StaticPokemon{}={Species=[0x15AA3F, 0x15AA4F], Level=[0x15AA41]} // Beldum
StaticPokemon{}={Species=[0x163D29], Level=[0x163D2B]} // Castform
MainGameLegendaries=[382]
+StaticFirstBattleTweak=hardcoded_statics/rs_firstbattle
[Sapphire (E)]
Game=AXPE
@@ -229,6 +235,7 @@ StaticPokemon{}={Species=[0x1A04CE, 0x1A04D5], Level=[0x1A04D0]} // Electrode 2
StaticPokemon{}={Species=[0x14E74E]} // Wynaut Egg
StaticPokemon{}={Species=[0x15AA5F, 0x15AA6F], Level=[0x15AA61]} // Beldum
StaticPokemon{}={Species=[0x163D49], Level=[0x163D4B]} // Castform
+StaticFirstBattleTweak=hardcoded_statics/rs_firstbattle
[Sapphire (U/E) 1.2]
Game=AXPE
@@ -237,6 +244,7 @@ Type=Sapp
CopyStaticPokemon=1
CopyFrom=Sapphire (E)
InstantTextTweak=instant_text/sapphire_12_instant_text
+StaticFirstBattleTweak=hardcoded_statics/rs_firstbattle
[Emerald (U)]
Game=BPEE
diff --git a/src/com/dabomstew/pkrandom/patches/hardcoded_statics/rs_firstbattle.ips b/src/com/dabomstew/pkrandom/patches/hardcoded_statics/rs_firstbattle.ips
new file mode 100644
index 0000000..4d9fd8c
--- /dev/null
+++ b/src/com/dabomstew/pkrandom/patches/hardcoded_statics/rs_firstbattle.ips
Binary files differ
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java
index c5900f0..8321297 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java
@@ -1765,8 +1765,8 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
statics.add(se);
}
- // If it's Emerald, read in and randomize the static starting Zigzagoon fight
- if (romEntry.romType == Gen3Constants.RomType_Em && romEntry.codeTweaks.get("StaticFirstBattleTweak") != null) {
+ // If it's RSE, read in and randomize the static starting Poochyena/Zigzagoon fight
+ if (romEntry.romType != Gen3Constants.RomType_FRLG && romEntry.codeTweaks.get("StaticFirstBattleTweak") != null) {
int startingSpeciesOffset = romEntry.getValue("StaticFirstBattleSpeciesOffset");
int species = readWord(startingSpeciesOffset);
if (species == 0xFFFF) {
@@ -1797,7 +1797,7 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
List<StaticPokemon> staticsHere = romEntry.staticPokemon;
int hardcodedStaticSize = 0;
- if (romEntry.romType == Gen3Constants.RomType_Em && romEntry.codeTweaks.get("StaticFirstBattleTweak") != null) {
+ if (romEntry.romType != Gen3Constants.RomType_FRLG && romEntry.codeTweaks.get("StaticFirstBattleTweak") != null) {
hardcodedStaticSize = 1;
}
if (staticPokemon.size() != staticsHere.size() + hardcodedStaticSize) {
@@ -1809,7 +1809,7 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
staticsHere.get(i).setLevel(rom, staticPokemon.get(i).level, 0);
}
- if (romEntry.romType == Gen3Constants.RomType_Em && romEntry.codeTweaks.get("StaticFirstBattleTweak") != null) {
+ if (romEntry.romType != Gen3Constants.RomType_FRLG && romEntry.codeTweaks.get("StaticFirstBattleTweak") != null) {
StaticEncounter hardcodedStatic = staticPokemon.get(staticPokemon.size() - 1);
int startingSpeciesOffset = romEntry.getValue("StaticFirstBattleSpeciesOffset");
writeWord(startingSpeciesOffset, pokedexToInternal[hardcodedStatic.pkmn.number]);