summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortom-overton <tom.overton@outlook.com>2021-02-17 04:30:02 -0800
committertom-overton <tom.overton@outlook.com>2021-02-17 04:30:02 -0800
commita0bddd97e2c3cae5993af98788710fd7d7f1f0bc (patch)
tree206e31ac1c9d44a2ff41ff26ab63e9f524f85299 /src
parentaea4578aa9a644560ce6c556fef062bf258ba750 (diff)
Add the Percentage Level Modifier option for Static Pokemon in Gens 3-7 (WHOA)
Diffstat (limited to 'src')
-rw-r--r--src/com/dabomstew/pkrandom/Randomizer.java28
-rw-r--r--src/com/dabomstew/pkrandom/Settings.java25
-rwxr-xr-xsrc/com/dabomstew/pkrandom/config/gen3_offsets.ini1559
-rwxr-xr-xsrc/com/dabomstew/pkrandom/config/gen4_offsets.ini229
-rwxr-xr-xsrc/com/dabomstew/pkrandom/config/gen5_offsets.ini236
-rw-r--r--src/com/dabomstew/pkrandom/config/gen6_offsets.ini2
-rw-r--r--src/com/dabomstew/pkrandom/config/gen7_offsets.ini2
-rw-r--r--src/com/dabomstew/pkrandom/newgui/Bundle.properties2
-rw-r--r--src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.form38
-rw-r--r--src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.java26
-rw-r--r--src/com/dabomstew/pkrandom/pokemon/StaticEncounter.java41
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/AbstractRomHandler.java120
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java83
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/Gen4RomHandler.java193
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/Gen5RomHandler.java155
-rw-r--r--src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java67
-rw-r--r--src/com/dabomstew/pkrandom/romhandlers/Gen7RomHandler.java42
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/RomHandler.java5
18 files changed, 1684 insertions, 1169 deletions
diff --git a/src/com/dabomstew/pkrandom/Randomizer.java b/src/com/dabomstew/pkrandom/Randomizer.java
index 524c215..079960a 100644
--- a/src/com/dabomstew/pkrandom/Randomizer.java
+++ b/src/com/dabomstew/pkrandom/Randomizer.java
@@ -930,35 +930,41 @@ public class Randomizer {
if (settings.getStaticPokemonMod() == Settings.StaticPokemonMod.RANDOM_MATCHING) { // Legendary for L
romHandler.randomizeStaticPokemon(true, false,settings.isLimitMusketeers(),
settings.isLimit600(), settings.isAllowStaticAltFormes(), settings.isSwapStaticMegaEvos(),
- settings.getAbilitiesMod() == Settings.AbilitiesMod.RANDOMIZE);
+ settings.getAbilitiesMod() == Settings.AbilitiesMod.RANDOMIZE,
+ settings.isStaticLevelModified() ? settings.getStaticLevelModifier() : 0);
} else if (settings.getStaticPokemonMod() == Settings.StaticPokemonMod.COMPLETELY_RANDOM) {
romHandler.randomizeStaticPokemon(false, false,settings.isLimitMusketeers(),
settings.isLimit600(), settings.isAllowStaticAltFormes(), settings.isSwapStaticMegaEvos(),
- settings.getAbilitiesMod() == Settings.AbilitiesMod.RANDOMIZE);
+ settings.getAbilitiesMod() == Settings.AbilitiesMod.RANDOMIZE,
+ settings.isStaticLevelModified() ? settings.getStaticLevelModifier() : 0);
} else if (settings.getStaticPokemonMod() == Settings.StaticPokemonMod.SIMILAR_STRENGTH) {
romHandler.randomizeStaticPokemon(false, true,settings.isLimitMusketeers(),
settings.isLimit600(), settings.isAllowStaticAltFormes(), settings.isSwapStaticMegaEvos(),
- settings.getAbilitiesMod() == Settings.AbilitiesMod.RANDOMIZE);
+ settings.getAbilitiesMod() == Settings.AbilitiesMod.RANDOMIZE,
+ settings.isStaticLevelModified() ? settings.getStaticLevelModifier() : 0);
+ } else if (settings.isStaticLevelModified()) {
+ romHandler.onlyChangeStaticLevels(settings.getStaticLevelModifier());
}
List<StaticEncounter> newStatics = romHandler.getStaticPokemon();
- if (settings.getStaticPokemonMod() == Settings.StaticPokemonMod.UNCHANGED) {
+ if (settings.getStaticPokemonMod() == Settings.StaticPokemonMod.UNCHANGED && !settings.isStaticLevelModified()) {
log.println("Static Pokemon: Unchanged." + NEWLINE);
} else {
log.println("--Static Pokemon--");
- Map<Pokemon, Integer> seenPokemon = new TreeMap<>();
+ Map<String, Integer> seenPokemon = new TreeMap<>();
for (int i = 0; i < oldStatics.size(); i++) {
StaticEncounter oldP = oldStatics.get(i);
StaticEncounter newP = newStatics.get(i);
checkValue = addToCV(checkValue, newP.pkmn.number);
- log.print(oldP.toString());
- if (seenPokemon.containsKey(oldP.pkmn)) {
- int amount = seenPokemon.get(oldP.pkmn);
+ String oldStaticString = oldP.toString(settings.isStaticLevelModified());
+ log.print(oldStaticString);
+ if (seenPokemon.containsKey(oldStaticString)) {
+ int amount = seenPokemon.get(oldStaticString);
log.print("(" + (++amount) + ")");
- seenPokemon.put(oldP.pkmn, amount);
+ seenPokemon.put(oldStaticString, amount);
} else {
- seenPokemon.put(oldP.pkmn, 1);
+ seenPokemon.put(oldStaticString, 1);
}
- log.println(" => " + newP.toString());
+ log.println(" => " + newP.toString(settings.isStaticLevelModified()));
}
log.println();
}
diff --git a/src/com/dabomstew/pkrandom/Settings.java b/src/com/dabomstew/pkrandom/Settings.java
index 29c2075..60528bb 100644
--- a/src/com/dabomstew/pkrandom/Settings.java
+++ b/src/com/dabomstew/pkrandom/Settings.java
@@ -49,7 +49,7 @@ public class Settings {
public static final int VERSION = Version.VERSION;
- public static final int LENGTH_OF_SETTINGS_DATA = 47;
+ public static final int LENGTH_OF_SETTINGS_DATA = 48;
private CustomNamesSet customNames;
@@ -208,6 +208,8 @@ public class Settings {
private boolean allowStaticAltFormes;
private boolean swapStaticMegaEvos;
+ private boolean staticLevelModified;
+ private int staticLevelModifier = 0; // -50 ~ 50
public enum TotemPokemonMod {
UNCHANGED, RANDOM, SIMILAR_STRENGTH
@@ -539,6 +541,8 @@ public class Settings {
out.write(selectedEXPCurve.toByte());
+ out.write((staticLevelModified ? 0x80 : 0) | (staticLevelModifier+50));
+
try {
byte[] romName = this.romName.getBytes("US-ASCII");
out.write(romName.length);
@@ -803,6 +807,9 @@ public class Settings {
settings.setSelectedEXPCurve(ExpCurve.fromByte(data[46]));
+ settings.setStaticLevelModified(restoreState(data[47],7));
+ settings.setStaticLevelModifier((data[47] & 0x7F) - 50);
+
int romNameLength = data[LENGTH_OF_SETTINGS_DATA] & 0xFF;
String romName = new String(data, LENGTH_OF_SETTINGS_DATA + 1, romNameLength, "US-ASCII");
settings.setRomName(romName);
@@ -1745,6 +1752,22 @@ public class Settings {
this.swapStaticMegaEvos = swapStaticMegaEvos;
}
+ public boolean isStaticLevelModified() {
+ return staticLevelModified;
+ }
+
+ public void setStaticLevelModified(boolean staticLevelModified) {
+ this.staticLevelModified = staticLevelModified;
+ }
+
+ public int getStaticLevelModifier() {
+ return staticLevelModifier;
+ }
+
+ public void setStaticLevelModifier(int staticLevelModifier) {
+ this.staticLevelModifier = staticLevelModifier;
+ }
+
public TotemPokemonMod getTotemPokemonMod() {
return totemPokemonMod;
}
diff --git a/src/com/dabomstew/pkrandom/config/gen3_offsets.ini b/src/com/dabomstew/pkrandom/config/gen3_offsets.ini
index d0199de..b6a3182 100755
--- a/src/com/dabomstew/pkrandom/config/gen3_offsets.ini
+++ b/src/com/dabomstew/pkrandom/config/gen3_offsets.ini
@@ -47,24 +47,25 @@ CatchingTutorialPlayerMonOffset=0x10F62E
PCPotionOffset=0x4062F0
InstantTextTweak=ruby_10_instant_text
StaticPokemonSupport=1
-StaticPokemon[]=[0x157663, 0x157691] // Lileep
-StaticPokemon[]=[0x1576B6, 0x1576E4] // Anorith
-StaticPokemon[]=[0x1A04A3, 0x15DE26, 0x15DE2D] // Groudon
-StaticPokemon[]=[0x15CB89, 0x15CB92] // Regirock
-StaticPokemon[]=[0x15EFA1, 0x15EFAA] // Regice
-StaticPokemon[]=[0x15F054, 0x15F05D] // Registeel
-StaticPokemon[]=[0x160BCE, 0x160BF4] // Latias (Southern Island)
-StaticPokemon[]=[0x15F319, 0x15F320] // Rayquaza
-StaticPokemon[]=[0x1A05E2, 0x1A05EB] // Kecleons on OW (7)
-StaticPokemon[]=[0x1518E8, 0x1518F1] // Kecleon w/ Steven
-StaticPokemon[]=[0x15E903, 0x15E90A] // Voltorb 1
-StaticPokemon[]=[0x15E921, 0x15E928] // Voltorb 2
-StaticPokemon[]=[0x15E93F, 0x15E946] // Voltorb 3
-StaticPokemon[]=[0x1A0500, 0x1A0507] // Electrode 1
-StaticPokemon[]=[0x1A051E, 0x1A0525] // Electrode 2
-StaticPokemon[]=[0x14E79A] // Wynaut Egg
-StaticPokemon[]=[0x15AAAF, 0x15AABF] // Beldum
-StaticPokemon[]=[0x163D99] // Castform
+StaticPokemon{}={Species=[0x157663, 0x157691], Level=[0x157693]} // Lileep
+StaticPokemon{}={Species=[0x1576B6, 0x1576E4], Level=[0x1576E6]} // Anorith
+StaticPokemon{}={Species=[0x1A04A3, 0x15DE26, 0x15DE2D], Level=[0x15DE28]} // Groudon
+StaticPokemon{}={Species=[0x15CB89, 0x15CB92], Level=[0x15CB94]} // Regirock
+StaticPokemon{}={Species=[0x15EFA1, 0x15EFAA], Level=[0x15EFAC]} // Regice
+StaticPokemon{}={Species=[0x15F054, 0x15F05D], Level=[0x15F05F]} // Registeel
+StaticPokemon{}={Species=[0x160BCE, 0x160BF4], Level=[0x160BF6]} // Latias (Southern Island)
+StaticPokemon{}={Species=[0x15F319, 0x15F320], Level=[0x15F31B]} // Rayquaza
+StaticPokemon{}={Species=[0x1A05E2, 0x1A05EB], Level=[0x1A05ED]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x1518E8, 0x1518F1], Level=[0x1518F3]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15E903, 0x15E90A], Level=[0x15E905]} // Voltorb 1
+StaticPokemon{}={Species=[0x15E921, 0x15E928], Level=[0x15E923]} // Voltorb 2
+StaticPokemon{}={Species=[0x15E93F, 0x15E946], Level=[0x15E941]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A0500, 0x1A0507], Level=[0x1A0502]} // Electrode 1
+StaticPokemon{}={Species=[0x1A051E, 0x1A0525], Level=[0x1A0520]} // Electrode 2
+StaticPokemon{}={Species=[0x14E79A]} // Wynaut Egg
+StaticPokemon{}={Species=[0x15AAAF, 0x15AABF], Level=[0x15AAB1]} // Beldum
+StaticPokemon{}={Species=[0x163D99], Level=[0x163D9B]} // Castform
+StaticEggPokemonOffsets=[15]
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...]
@@ -109,24 +110,24 @@ CatchingTutorialPlayerMonOffset=0x10F64E
PCPotionOffset=0x40630C
InstantTextTweak=ruby_11_instant_text
StaticPokemonSupport=1
-StaticPokemon[]=[0x157683, 0x1576B1]
-StaticPokemon[]=[0x1576D6, 0x157704]
-StaticPokemon[]=[0x1A04C3, 0x15DE46, 0x15DE4D]
-StaticPokemon[]=[0x15CBA9, 0x15CBB2]
-StaticPokemon[]=[0x15EFC1, 0x15EFCA]
-StaticPokemon[]=[0x15F074, 0x15F07D]
-StaticPokemon[]=[0x160BEE, 0x160C14]
-StaticPokemon[]=[0x15F339, 0x15F340]
-StaticPokemon[]=[0x1A0602, 0x1A060B]
-StaticPokemon[]=[0x151908, 0x151911]
-StaticPokemon[]=[0x15E923, 0x15E92A]
-StaticPokemon[]=[0x15E941, 0x15E948]
-StaticPokemon[]=[0x15E95F, 0x15E966]
-StaticPokemon[]=[0x1A0520, 0x1A0527]
-StaticPokemon[]=[0x1A053E, 0x1A0545]
-StaticPokemon[]=[0x14E7BA]
-StaticPokemon[]=[0x15AACF, 0x15AADF]
-StaticPokemon[]=[0x163DB9]
+StaticPokemon{}={Species=[0x157683, 0x1576B1], Level=[0x1576B3]} // Lileep
+StaticPokemon{}={Species=[0x1576D6, 0x157704], Level=[0x157706]} // Anorith
+StaticPokemon{}={Species=[0x1A04C3, 0x15DE46, 0x15DE4D], Level=[0x15DE48]} // Groudon
+StaticPokemon{}={Species=[0x15CBA9, 0x15CBB2], Level=[0x15CBB4]} // Regirock
+StaticPokemon{}={Species=[0x15EFC1, 0x15EFCA], Level=[0x15EFCC]} // Regice
+StaticPokemon{}={Species=[0x15F074, 0x15F07D], Level=[0x15F07F]} // Registeel
+StaticPokemon{}={Species=[0x160BEE, 0x160C14], Level=[0x160C16]} // Latias (Southern Island)
+StaticPokemon{}={Species=[0x15F339, 0x15F340], Level=[0x15F33B]} // Rayquaza
+StaticPokemon{}={Species=[0x1A0602, 0x1A060B], Level=[0x1A060D]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x151908, 0x151911], Level=[0x151913]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15E923, 0x15E92A], Level=[0x15E925]} // Voltorb 1
+StaticPokemon{}={Species=[0x15E941, 0x15E948], Level=[0x15E943]} // Voltorb 2
+StaticPokemon{}={Species=[0x15E95F, 0x15E966], Level=[0x15E961]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A0520, 0x1A0527], Level=[0x1A0522]} // Electrode 1
+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
[Ruby (U/E) 1.2]
Game=AXVE
@@ -161,24 +162,24 @@ RunIndoorsTweakOffset=0xE5E00
PCPotionOffset=0x406348
InstantTextTweak=sapphire_10_instant_text
StaticPokemonSupport=1
-StaticPokemon[]=[0x1575F3, 0x157621] // Lileep
-StaticPokemon[]=[0x157646, 0x157674] // Anorith
-StaticPokemon[]=[0x1A0433, 0x15DDB6, 0x15DDBD] // Kyogre
-StaticPokemon[]=[0x15CB19, 0x15CB22] // Regirock
-StaticPokemon[]=[0x15EF31, 0x15EF3A] // Regice
-StaticPokemon[]=[0x15EFE4, 0x15EFED] // Registeel
-StaticPokemon[]=[0x160B5E, 0x160B84] // Latios (Southern Island)
-StaticPokemon[]=[0x15F2A9, 0x15F2B0] // Rayquaza
-StaticPokemon[]=[0x1A0572, 0x1A057B] // Kecleons on OW (7)
-StaticPokemon[]=[0x15187C, 0x151885] // Kecleon w/ Steven
-StaticPokemon[]=[0x15E893, 0x15E89A] // Voltorb 1
-StaticPokemon[]=[0x15E8B1, 0x15E8B8] // Voltorb 2
-StaticPokemon[]=[0x15E8CF, 0x15E8D6] // Voltorb 3
-StaticPokemon[]=[0x1A0490, 0x1A0497] // Electrode 1
-StaticPokemon[]=[0x1A04AE, 0x1A04B5] // Electrode 2
-StaticPokemon[]=[0x14E72E] // Wynaut Egg
-StaticPokemon[]=[0x15AA3F, 0x15AA4F] // Beldum
-StaticPokemon[]=[0x163D29] // Castform
+StaticPokemon{}={Species=[0x1575F3, 0x157621], Level=[0x157623]} // Lileep
+StaticPokemon{}={Species=[0x157646, 0x157674], Level=[0x157676]} // Anorith
+StaticPokemon{}={Species=[0x1A0433, 0x15DDB6, 0x15DDBD], Level=[0x15DDB8]} // Kyogre
+StaticPokemon{}={Species=[0x15CB19, 0x15CB22], Level=[0x15CB24]} // Regirock
+StaticPokemon{}={Species=[0x15EF31, 0x15EF3A], Level=[0x15EF3C]} // Regice
+StaticPokemon{}={Species=[0x15EFE4, 0x15EFED], Level=[0x15EFEF]} // Registeel
+StaticPokemon{}={Species=[0x160B5E, 0x160B84], Level=[0x160B86]} // Latios (Southern Island)
+StaticPokemon{}={Species=[0x15F2A9, 0x15F2B0], Level=[0x15F2AB]} // Rayquaza
+StaticPokemon{}={Species=[0x1A0572, 0x1A057B], Level=[0x1A057D]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x15187C, 0x151885], Level=[0x151887]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15E893, 0x15E89A], Level=[0x15E895]} // Voltorb 1
+StaticPokemon{}={Species=[0x15E8B1, 0x15E8B8], Level=[0x15E8B3]} // Voltorb 2
+StaticPokemon{}={Species=[0x15E8CF, 0x15E8D6], Level=[0x15E8D1]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A0490, 0x1A0497], Level=[0x1A0492]} // Electrode 1
+StaticPokemon{}={Species=[0x1A04AE, 0x1A04B5], Level=[0x1A04B0]} // Electrode 2
+StaticPokemon{}={Species=[0x14E72E]} // Wynaut Egg
+StaticPokemon{}={Species=[0x15AA3F, 0x15AA4F], Level=[0x15AA41]} // Beldum
+StaticPokemon{}={Species=[0x163D29], Level=[0x163D2B]} // Castform
[Sapphire (E)]
Game=AXPE
@@ -208,24 +209,24 @@ CatchingTutorialPlayerMonOffset=0x10F64E
PCPotionOffset=0x406368
InstantTextTweak=sapphire_11_instant_text
StaticPokemonSupport=1
-StaticPokemon[]=[0x157613, 0x157641]
-StaticPokemon[]=[0x157666, 0x157694]
-StaticPokemon[]=[0x1A0453, 0x15DDD6, 0x15DDDD]
-StaticPokemon[]=[0x15CB39, 0x15CB42]
-StaticPokemon[]=[0x15EF51, 0x15EF5A]
-StaticPokemon[]=[0x15F004, 0x15F00D]
-StaticPokemon[]=[0x160B7E, 0x160BA4]
-StaticPokemon[]=[0x15F2C9, 0x15F2D0]
-StaticPokemon[]=[0x1A0592, 0x1A059B]
-StaticPokemon[]=[0x15189C, 0x1518A5]
-StaticPokemon[]=[0x15E8B3, 0x15E8BA]
-StaticPokemon[]=[0x15E8D1, 0x15E8D8]
-StaticPokemon[]=[0x15E8EF, 0x15E8F6]
-StaticPokemon[]=[0x1A04B0, 0x1A04B7]
-StaticPokemon[]=[0x1A04CE, 0x1A04D5]
-StaticPokemon[]=[0x14E74E]
-StaticPokemon[]=[0x15AA5F, 0x15AA6F]
-StaticPokemon[]=[0x163D49]
+StaticPokemon{}={Species=[0x157613, 0x157641], Level=[0x157643]} // Lileep
+StaticPokemon{}={Species=[0x157666, 0x157694], Level=[0x157696]} // Anorith
+StaticPokemon{}={Species=[0x1A0453, 0x15DDD6, 0x15DDDD], Level=[0x15DDD8]} // Kyogre
+StaticPokemon{}={Species=[0x15CB39, 0x15CB42], Level=[0x15CB44]} // Regirock
+StaticPokemon{}={Species=[0x15EF51, 0x15EF5A], Level=[0x15EF5C]} // Regice
+StaticPokemon{}={Species=[0x15F004, 0x15F00D], Level=[0x15F00F]} // Registeel
+StaticPokemon{}={Species=[0x160B7E, 0x160BA4], Level=[0x160BA6]} // Latios (Southern Island)
+StaticPokemon{}={Species=[0x15F2C9, 0x15F2D0], Level=[0x15F2CB]} // Rayquaza
+StaticPokemon{}={Species=[0x1A0592, 0x1A059B], Level=[0x1A059D]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x15189C, 0x1518A5], Level=[0x1518A7]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15E8B3, 0x15E8BA], Level=[0x15E8B5]} // Voltorb 1
+StaticPokemon{}={Species=[0x15E8D1, 0x15E8D8], Level=[0x15E8D3]} // Voltorb 2
+StaticPokemon{}={Species=[0x15E8EF, 0x15E8F6], Level=[0x15E8F1]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A04B0, 0x1A04B7], Level=[0x1A04B2]} // Electrode 1
+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
[Sapphire (U/E) 1.2]
Game=AXPE
@@ -280,31 +281,32 @@ CatchingTutorialOpponentMonOffset=0xB0870
CatchingTutorialPlayerMonOffset=0x139472
PCPotionOffset=0x5DFEFC
StaticPokemonSupport=1
-StaticPokemon[]=[0x211A1C, 0x211A41, 0x211A44, 0x211AC6, 0x211AD4] // Lileep
-StaticPokemon[]=[0x211A2E, 0x211AE4, 0x211AE7, 0x211B69, 0x211B77] // Anorith
-StaticPokemon[]=[0x23B032, 0x23B040, 0x23B095] // Kyogre
-StaticPokemon[]=[0x23B103, 0x23B111, 0x23B166] // Groudon
-StaticPokemon[]=[0x22DA06, 0x22DA0F, 0x22DA55] // Regirock
-StaticPokemon[]=[0x238F5C, 0x238F65, 0x238FAB] // Regice
-StaticPokemon[]=[0x23905E, 0x239067, 0x2390AD] // Registeel
-StaticPokemon[]=[0x239725, 0x23972E, 0x239774] // Rayquaza
-StaticPokemon[]=[0x272384, 0x27238D] // Kecleons on OW (7)
-StaticPokemon[]=[0x1F56D6, 0x1F56DF] // Kecleon w/ Steven
-StaticPokemon[]=[0x2377B2, 0x2377B9] // Voltorb 1
-StaticPokemon[]=[0x2377FF, 0x237806] // Voltorb 2
-StaticPokemon[]=[0x23784C, 0x237853] // Voltorb 3
-StaticPokemon[]=[0x2339EE, 0x2339F5] // Electrode 1
-StaticPokemon[]=[0x233A3B, 0x233A42] // Electrode 2
-StaticPokemon[]=[0x242D1B, 0x242D29] // Sudowoodo in Battle Frontier
-StaticPokemon[]=[0x242BA7]
-StaticPokemon[]=[0x242BBA] // Latias/Latios on Southern Island
-StaticPokemon[]=[0x267FE7, 0x267FF7, 0x268041, 0x26804C] // Deoxys on Birth Island
-StaticPokemon[]=[0x267E0D, 0x267E47, 0x267E9C, 0x267EA7] // Mew on Faraway Island
-StaticPokemon[]=[0x26919F, 0x2691CE, 0x26921D, 0x269228] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x2692E7, 0x2692F2, 0x26933C, 0x269347] // Lugia on Navel Rock
-StaticPokemon[]=[0x1EA783] // Wynaut Egg
-StaticPokemon[]=[0x222868, 0x22286B, 0x2228ED, 0x2228FE] // Beldum
-StaticPokemon[]=[0x270058, 0x27005B] // Castform
+StaticPokemon{}={Species=[0x211A1C, 0x211A41, 0x211A44, 0x211AC6, 0x211AD4], Level=[0x211A46]} // Lileep
+StaticPokemon{}={Species=[0x211A2E, 0x211AE4, 0x211AE7, 0x211B69, 0x211B77], Level=[0x211AE9]} // Anorith
+StaticPokemon{}={Species=[0x23B032, 0x23B040, 0x23B095, 0x1E5982, 0x1E5A02, 0x1E5ABE, 0x1E5B3E], Level=[0x23B042]} // Kyogre
+StaticPokemon{}={Species=[0x23B103, 0x23B111, 0x23B166, 0x1E59C2, 0x1E5AFE], Level=[0x23B113]} // Groudon
+StaticPokemon{}={Species=[0x22DA06, 0x22DA0F, 0x22DA55], Level=[0x22DA11]} // Regirock
+StaticPokemon{}={Species=[0x238F5C, 0x238F65, 0x238FAB], Level=[0x238F67]} // Regice
+StaticPokemon{}={Species=[0x23905E, 0x239067, 0x2390AD], Level=[0x239069]} // Registeel
+StaticPokemon{}={Species=[0x239725, 0x23972E, 0x239774, 0x2397C3, 0x2397E1, 0x1E5C60, 0x1E5C7E, 0x1E5D14, 0x1E5D32], Level=[0x239730]} // Rayquaza
+StaticPokemon{}={Species=[0x272384, 0x27238D], Level=[0x27238F]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x1F56D6, 0x1F56DF], Level=[0x1F56E1]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x2377B2, 0x2377B9], Level=[0x2377B4]} // Voltorb 1
+StaticPokemon{}={Species=[0x2377FF, 0x237806], Level=[0x237801]} // Voltorb 2
+StaticPokemon{}={Species=[0x23784C, 0x237853], Level=[0x23784E]} // Voltorb 3
+StaticPokemon{}={Species=[0x2339EE, 0x2339F5], Level=[0x2339F0]} // Electrode 1
+StaticPokemon{}={Species=[0x233A3B, 0x233A42], Level=[0x233A3D]} // Electrode 2
+StaticPokemon{}={Species=[0x242D1B, 0x242D29], Level=[0x242D2B]} // Sudowoodo in Battle Frontier
+StaticPokemon{}={Species=[0x242A92, 0x242BA7], Level=[0x242BAC]} // Latios on Southern Island
+StaticPokemon{}={Species=[0x242A9D, 0x242BBA], Level=[0x242BBF]} // Latias on Southern Island
+StaticPokemon{}={Species=[0x267FE7, 0x267FF7, 0x268041, 0x26804C], Level=[0x267FFC]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x267E0D, 0x267E47, 0x267E9C, 0x267EA7], Level=[0x267E4C]} // Mew on Faraway Island
+StaticPokemon{}={Species=[0x26919F, 0x2691CE, 0x26921D, 0x269228], Level=[0x2691D3]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x2692E7, 0x2692F2, 0x26933C, 0x269347], Level=[0x2692F7]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x1EA783]} // Wynaut Egg
+StaticPokemon{}={Species=[0x222868, 0x22286B, 0x2228ED, 0x2228FE], Level=[0x22286D]} // Beldum
+StaticPokemon{}={Species=[0x270058, 0x27005B, 0x2700E7], Level=[0x27005D]} // Castform
+StaticEggPokemonOffsets=[22]
TMText[]=[3,15,0,1,0xA9,The TECHNICAL MACHINE I handed you contains [move].\p… … … … … …]
TMText[]=[4,14,0,1,0xB8,TATE: That TM04 contains... LIZA: [move]!\pTATE: It’s a move that’s perfect... LIZA: For any POKéMON!\p… … … … … …]
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...]
@@ -343,7 +345,6 @@ MoveTutorText[]=[25,9,6,9,0x0D,Heh! My POKéMON totally rules! It’s cooler tha
MoveTutorText[]=[25,9,6,9,0x30,All right, which POKéMON wants to learn how to [move]?]
MoveTutorText[]=[25,9,6,9,0x60,I’ll just praise my POKéMON from now on without the [move].]
-
[Fire Red (U) 1.0]
Game=BPRE
Version=0
@@ -389,31 +390,31 @@ InstantTextTweak=fr_instant_text
CatchingTutorialOpponentMonOffset=0x7F88C
PCPotionOffset=0x402220
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C472, 0x16C475, 0x16C4B5, 0x16C4E9] // Eevee in Celadon Mansion
-StaticPokemon[]=[0x16EC0C, 0x16EC13] // Hitmonlee in Fighting Dojo
-StaticPokemon[]=[0x16EC52, 0x16EC59] // Hitmonchan in Fighting Dojo
-StaticPokemon[]=[0x163840, 0x163847] // Electrode in The Power Plant
-StaticPokemon[]=[0x16389E, 0x1638A5] // Electrode in The Power Plant
-StaticPokemon[]=[0x1637CC, 0x1637D3, 0x163827] // Zapdos in the Power Plant
-StaticPokemon[]=[0x1631C0, 0x1631C7, 0x16321B] // Articuno in the Seafoams
-StaticPokemon[]=[0x163B47, 0x163B4E, 0x163BA2] // Moltres in Mt.Ember
-StaticPokemon[]=[0x16250A, 0x16251E, 0x162564] // Mewtwo in Unk. Dungeon
-StaticPokemon[]=[0x168049, 0x168050] // Sleeping Snorlax (12)
-StaticPokemon[]=[0x168156, 0x16815D] // Sleeping Snorlax (16)
-StaticPokemon[]=[0x163CBC, 0x163CC2] // Hypno in Berry Forest
-StaticPokemon[]=[0x1652E6, 0x1652F6, 0x165340, 0x16534B] // Deoxys on Birth Island
-StaticPokemon[]=[0x16503C, 0x16506B, 0x1650BA, 0x1650C5] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x16518A, 0x165195, 0x1651DF, 0x1651EA] // Lugia on Navel Rock
-StaticPokemon[]=[0x16E7E5, 0x16E7E9, 0x16E7F4, 0x16E6E6] // Old Amber
-StaticPokemon[]=[0x16E75B, 0x16E75F, 0x16E76A, 0x16E66A] // Helix Fossil
-StaticPokemon[]=[0x16E7A0, 0x16E7A4, 0x16E7AF, 0x16E6A8] // Dome Fossil
-StaticPokemon[]=[0x161AE1, 0x161B20, 0x161B53] // Lapras in Silph. Co
-StaticPokemon[]=[0x16F7C6, 0x16F885] // Magikarp in Mt.Moon Center
-StaticPokemon[]=[0x16CC18, 0x16CC94] // Abra
-StaticPokemon[]=[0x16CC28, 0x16CC9F] // Clefairy
-StaticPokemon[]=[0x16CC48, 0x16CCB5] // Scyther
-StaticPokemon[]=[0x16CC38, 0x16CCAA] // Dratini
-StaticPokemon[]=[0x16CC58, 0x16CCC0] // Porygon
+StaticPokemon{}={Species=[0x16C472, 0x16C475, 0x16C4B5, 0x16C4E9], Level=[0x16C477]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EC0C, 0x16EC13], Level=[0x16EC86]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16EC52, 0x16EC59], Level=[0x16EC86]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x163840, 0x163847], Level=[0x163842]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16389E, 0x1638A5], Level=[0x1638A0]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x1637CC, 0x1637D3, 0x163827], Level=[0x1637CE]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x1631C0, 0x1631C7, 0x16321B, 0x17009D, 0x1700A9], Level=[0x1631C2]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163B47, 0x163B4E, 0x163BA2], Level=[0x163B49]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x16250A, 0x16251E, 0x162564], Level=[0x162520]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x168049, 0x168050, 0x160CA2, 0x160CA8], Level=[0x16804B]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x168156, 0x16815D], Level=[0x168158]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163CBC, 0x163CC2], Level=[0x163CC4]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x1652E6, 0x1652F6, 0x165340, 0x16534B], Level=[0x1652FB]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x16503C, 0x16506B, 0x1650BA, 0x1650C5], Level=[0x165070]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x16518A, 0x165195, 0x1651DF, 0x1651EA], Level=[0x16519A]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E7E5, 0x16E7E9, 0x16E7F4, 0x16E6E6], Level=[0x16E7F6]} // Old Amber
+StaticPokemon{}={Species=[0x16E75B, 0x16E75F, 0x16E76A, 0x16E66A], Level=[0x16E76C]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E7A0, 0x16E7A4, 0x16E7AF, 0x16E6A8], Level=[0x16E7B1]} // Dome Fossil
+StaticPokemon{}={Species=[0x161ADE, 0x161AE1, 0x161B20, 0x161B53], Level=[0x161AE3]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F7C3, 0x16F7C6, 0x16F885], Level=[0x16F7C8]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CC18, 0x16CC94], Level=[0x16CCD7]} // Abra
+StaticPokemon{}={Species=[0x16CC28, 0x16CC9F], Level=[0x16CCEC]} // Clefairy
+StaticPokemon{}={Species=[0x16CC48, 0x16CCB5], Level=[0x16CD16]} // Scyther
+StaticPokemon{}={Species=[0x16CC38, 0x16CCAA], Level=[0x16CD01]} // Dratini
+StaticPokemon{}={Species=[0x16CC58, 0x16CCC0], Level=[0x16CD2B]} // Porygon
TMText[]=[3,7,5,3,0x2A,TM03 teaches [move].\pUse it on a worthy POKéMON!]
TMText[]=[4,14,3,7,0x2A,TM04 is [move].]
TMText[]=[6,11,3,7,0x91,Sealed within that TM06 lies [move]!\pIt is a secret technique dating back some four hundred years.]
@@ -494,31 +495,31 @@ InstantTextTweak=lg_instant_text
CatchingTutorialOpponentMonOffset=0x7F860
PCPotionOffset=0x40205C
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C44E, 0x16C451, 0x16C491, 0x16C4C5] // Eevee in Celadon Mansion
-StaticPokemon[]=[0x16EBE8, 0x16EBEF] // Hitmonlee in Fighting Dojo
-StaticPokemon[]=[0x16EC2E, 0x16EC35] // Hitmonchan in Fighting Dojo
-StaticPokemon[]=[0x16381C, 0x163823] // Electrode in The Power Plant
-StaticPokemon[]=[0x16387A, 0x163881] // Electrode in The Power Plant
-StaticPokemon[]=[0x1637A8, 0x1637AF, 0x163803] // Zapdos in the Power Plant
-StaticPokemon[]=[0x16319C, 0x1631A3, 0x1631F7] // Articuno in the Seafoams
-StaticPokemon[]=[0x163B23, 0x163B2A, 0x163B7E] // Moltres in Mt.Ember
-StaticPokemon[]=[0x1624E6, 0x1624FA, 0x162540] // Mewtwo in Unk. Dungeon
-StaticPokemon[]=[0x168025, 0x16802C] // Sleeping Snorlax (12)
-StaticPokemon[]=[0x168132, 0x168139] // Sleeping Snorlax (16)
-StaticPokemon[]=[0x163C98, 0x163C9E] // Hypno in Berry Forest
-StaticPokemon[]=[0x1652C2, 0x1652D2, 0x16531C, 0x165327] // Deoxys on Birth Island
-StaticPokemon[]=[0x165018, 0x165047, 0x165096, 0x1650A1] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x165166, 0x165171, 0x1651BB, 0x1651C6] // Lugia on Navel Rock
-StaticPokemon[]=[0x16E7C1, 0x16E7C5, 0x16E7D0, 0x16E6C2] // Old Amber
-StaticPokemon[]=[0x16E737, 0x16E73B, 0x16E746, 0x16E646] // Helix Fossil
-StaticPokemon[]=[0x16E77C, 0x16E780, 0x16E78B, 0x16E684] // Dome Fossil
-StaticPokemon[]=[0x161ABD, 0x161AFC, 0x161B2F] // Lapras in Silph. Co
-StaticPokemon[]=[0x16F7A2, 0x16F861] // Magikarp in Mt.Moon Center
-StaticPokemon[]=[0x16CBF4, 0x16CC70] // Abra
-StaticPokemon[]=[0x16CC04, 0x16CC7B] // Clefairy
-StaticPokemon[]=[0x16CC14, 0x16CCA7] // Pinsir
-StaticPokemon[]=[0x16CC24, 0x16CC86] // Dratini
-StaticPokemon[]=[0x16CC34, 0x16CC9C] // Porygon
+StaticPokemon{}={Species=[0x16C44E, 0x16C451, 0x16C491, 0x16C4C5], Level=[0x16C453]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EBE8, 0x16EBEF], Level=[0x16EC62]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16EC2E, 0x16EC35], Level=[0x16EC62]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x16381C, 0x163823], Level=[0x16381E]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16387A, 0x163881], Level=[0x16387C]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x1637A8, 0x1637AF, 0x163803], Level=[0x1637AA]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x16319C, 0x1631A3, 0x1631F7, 0x170079, 0x170085], Level=[0x16319E]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163B23, 0x163B2A, 0x163B7E], Level=[0x163B25]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x1624E6, 0x1624FA, 0x162540], Level=[0x1624FC]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x168025, 0x16802C, 0x160C7E, 0x160C84], Level=[0x168027]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x168132, 0x168139], Level=[0x168134]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163C98, 0x163C9E], Level=[0x163CA0]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x1652C2, 0x1652D2, 0x16531C, 0x165327], Level=[0x1652D7]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x165018, 0x165047, 0x165096, 0x1650A1], Level=[0x16504C]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x165166, 0x165171, 0x1651BB, 0x1651C6], Level=[0x165176]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E7C1, 0x16E7C5, 0x16E7D0, 0x16E6C2], Level=[0x16E7D2]} // Old Amber
+StaticPokemon{}={Species=[0x16E737, 0x16E73B, 0x16E746, 0x16E646], Level=[0x16E748]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E77C, 0x16E780, 0x16E78B, 0x16E684], Level=[0x16E78D]} // Dome Fossil
+StaticPokemon{}={Species=[0x161ABA, 0x161ABD, 0x161AFC, 0x161B2F], Level=[0x161ABF]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F79F, 0x16F7A2, 0x16F861], Level=[0x16F7A4]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CBF4, 0x16CC70], Level=[0x16CCB3]} // Abra
+StaticPokemon{}={Species=[0x16CC04, 0x16CC7B], Level=[0x16CCC8]} // Clefairy
+StaticPokemon{}={Species=[0x16CC14, 0x16CCA7], Level=[0x16CD1C]} // Pinsir
+StaticPokemon{}={Species=[0x16CC24, 0x16CC86], Level=[0x16CCDD]} // Dratini
+StaticPokemon{}={Species=[0x16CC34, 0x16CC9C], Level=[0x16CD07]} // Porygon
[Fire Red (U) 1.1]
Game=BPRE
@@ -546,31 +547,31 @@ TextSpeedValuesOffset=0x41F498
CatchingTutorialOpponentMonOffset=0x7F8A0
PCPotionOffset=0x402290
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C4EA, 0x16C4ED, 0x16C52D, 0x16C561]
-StaticPokemon[]=[0x16EC84, 0x16EC8B]
-StaticPokemon[]=[0x16ECCA, 0x16ECD1]
-StaticPokemon[]=[0x1638B8, 0x1638BF]
-StaticPokemon[]=[0x163916, 0x16391D]
-StaticPokemon[]=[0x163844, 0x16384B, 0x16389F]
-StaticPokemon[]=[0x163238, 0x16323F, 0x163293]
-StaticPokemon[]=[0x163BBF, 0x163BC6, 0x163C1A]
-StaticPokemon[]=[0x162582, 0x162596, 0x1625DC]
-StaticPokemon[]=[0x1680C1, 0x1680C8]
-StaticPokemon[]=[0x1681CE, 0x1681D5]
-StaticPokemon[]=[0x163D34, 0x163D3A]
-StaticPokemon[]=[0x16535E, 0x16536E, 0x1653B8, 0x1653C3]
-StaticPokemon[]=[0x1650B4, 0x1650E3, 0x165132, 0x16513D]
-StaticPokemon[]=[0x165202, 0x16520D, 0x165257, 0x165262]
-StaticPokemon[]=[0x16E85D, 0x16E861, 0x16E86C, 0x16E75E]
-StaticPokemon[]=[0x16E7D3, 0x16E7D7, 0x16E7E2, 0x16E6E2]
-StaticPokemon[]=[0x16E818, 0x16E81C, 0x16E827, 0x16E720]
-StaticPokemon[]=[0x161B59, 0x161B98, 0x161BCB]
-StaticPokemon[]=[0x16F83E, 0x16F8FD]
-StaticPokemon[]=[0x16CC90, 0x16CD0C]
-StaticPokemon[]=[0x16CCA0, 0x16CD17]
-StaticPokemon[]=[0x16CCC0, 0x16CD2D]
-StaticPokemon[]=[0x16CCB0, 0x16CD22]
-StaticPokemon[]=[0x16CCD0, 0x16CD38]
+StaticPokemon{}={Species=[0x16C4EA, 0x16C4ED, 0x16C52D, 0x16C561], Level=[0x16C4EF]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EC84, 0x16EC8B], Level=[0x16ECFE]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16ECCA, 0x16ECD1], Level=[0x16ECFE]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x1638B8, 0x1638BF], Level=[0x1638BA]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x163916, 0x16391D], Level=[0x163918]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x163844, 0x16384B, 0x16389F], Level=[0x163846]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x163238, 0x16323F, 0x163293, 0x170115, 0x170121], Level=[0x16323A]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163BBF, 0x163BC6, 0x163C1A], Level=[0x163BC1]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x162582, 0x162596, 0x1625DC], Level=[0x162598]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x1680C1, 0x1680C8, 0x160D1A, 0x160D20], Level=[0x1680C3]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x1681CE, 0x1681D5], Level=[0x1681D0]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163D34, 0x163D3A], Level=[0x163D3C]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16535E, 0x16536E, 0x1653B8, 0x1653C3], Level=[0x165373]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x1650B4, 0x1650E3, 0x165132, 0x16513D], Level=[0x1650E8]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x165202, 0x16520D, 0x165257, 0x165262], Level=[0x165212]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E85D, 0x16E861, 0x16E86C, 0x16E75E], Level=[0x16E86E]} // Old Amber
+StaticPokemon{}={Species=[0x16E7D3, 0x16E7D7, 0x16E7E2, 0x16E6E2], Level=[0x16E7E4]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E818, 0x16E81C, 0x16E827, 0x16E720], Level=[0x16E829]} // Dome Fossil
+StaticPokemon{}={Species=[0x161B56, 0x161B59, 0x161B98, 0x161BCB], Level=[0x161B5B]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F83B, 0x16F83E, 0x16F8FD], Level=[0x16F840]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CC90, 0x16CD0C], Level=[0x16CD4F]} // Abra
+StaticPokemon{}={Species=[0x16CCA0, 0x16CD17], Level=[0x16CD64]} // Clefairy
+StaticPokemon{}={Species=[0x16CCC0, 0x16CD2D], Level=[0x16CD8E]} // Scyther
+StaticPokemon{}={Species=[0x16CCB0, 0x16CD22], Level=[0x16CD79]} // Dratini
+StaticPokemon{}={Species=[0x16CCD0, 0x16CD38], Level=[0x16CDA3]} // Porygon
[Leaf Green (U) 1.1]
Game=BPGE
@@ -598,31 +599,31 @@ TextSpeedValuesOffset=0x41F2D4
CatchingTutorialOpponentMonOffset=0x7F874
PCPotionOffset=0x4020CC
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C4C6, 0x16C4C9, 0x16C509, 0x16C53D]
-StaticPokemon[]=[0x16EC60, 0x16EC67]
-StaticPokemon[]=[0x16ECA6, 0x16ECAD]
-StaticPokemon[]=[0x163894, 0x16389B]
-StaticPokemon[]=[0x1638F2, 0x1638F9]
-StaticPokemon[]=[0x163820, 0x163827, 0x16387B]
-StaticPokemon[]=[0x163214, 0x16321B, 0x16326F]
-StaticPokemon[]=[0x163B9B, 0x163BA2, 0x163BF6]
-StaticPokemon[]=[0x16255E, 0x162572, 0x1625B8]
-StaticPokemon[]=[0x16809D, 0x1680A4]
-StaticPokemon[]=[0x1681AA, 0x1681B1]
-StaticPokemon[]=[0x163D10, 0x163D16]
-StaticPokemon[]=[0x16533A, 0x16534A, 0x165394, 0x16539F]
-StaticPokemon[]=[0x165090, 0x1650BF, 0x16510E, 0x165119]
-StaticPokemon[]=[0x1651DE, 0x1651E9, 0x165233, 0x16523E]
-StaticPokemon[]=[0x16E839, 0x16E83D, 0x16E848, 0x16E73A]
-StaticPokemon[]=[0x16E7AF, 0x16E7B3, 0x16E7BE, 0x16E6BE]
-StaticPokemon[]=[0x16E7F4, 0x16E7F8, 0x16E803, 0x16E6FC]
-StaticPokemon[]=[0x161B35, 0x161B74, 0x161BA7]
-StaticPokemon[]=[0x16F81A, 0x16F8D9]
-StaticPokemon[]=[0x16CC6C, 0x16CCE8]
-StaticPokemon[]=[0x16CC7C, 0x16CCF3]
-StaticPokemon[]=[0x16CC8C, 0x16CD1F]
-StaticPokemon[]=[0x16CC9C, 0x16CCFE]
-StaticPokemon[]=[0x16CCAC, 0x16CD14]
+StaticPokemon{}={Species=[0x16C4C6, 0x16C4C9, 0x16C509, 0x16C53D], Level=[0x16C4CB]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EC60, 0x16EC67], Level=[0x16ECDA]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16ECA6, 0x16ECAD], Level=[0x16ECDA]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x163894, 0x16389B], Level=[0x163896]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x1638F2, 0x1638F9], Level=[0x1638F4]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x163820, 0x163827, 0x16387B], Level=[0x163822]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x163214, 0x16321B, 0x16326F, 0x1700F1, 0x1700FD], Level=[0x163216]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163B9B, 0x163BA2, 0x163BF6], Level=[0x163B9D]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x16255E, 0x162572, 0x1625B8], Level=[0x162574]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x16809D, 0x1680A4, 0x160CF6, 0x160CFC], Level=[0x16809F]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x1681AA, 0x1681B1], Level=[0x1681AC]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163D10, 0x163D16], Level=[0x163D18]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16533A, 0x16534A, 0x165394, 0x16539F], Level=[0x16534F]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x165090, 0x1650BF, 0x16510E, 0x165119], Level=[0x1650C4]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x1651DE, 0x1651E9, 0x165233, 0x16523E], Level=[0x1651EE]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E839, 0x16E83D, 0x16E848, 0x16E73A], Level=[0x16E84A]} // Old Amber
+StaticPokemon{}={Species=[0x16E7AF, 0x16E7B3, 0x16E7BE, 0x16E6BE], Level=[0x16E7C0]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E7F4, 0x16E7F8, 0x16E803, 0x16E6FC], Level=[0x16E805]} // Dome Fossil
+StaticPokemon{}={Species=[0x161B32, 0x161B35, 0x161B74, 0x161BA7], Level=[0x161B37]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F817, 0x16F81A, 0x16F8D9], Level=[0x16F81C]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CC6C, 0x16CCE8], Level=[0x16CD2B]} // Abra
+StaticPokemon{}={Species=[0x16CC7C, 0x16CCF3], Level=[0x16CD40]} // Clefairy
+StaticPokemon{}={Species=[0x16CC8C, 0x16CD1F], Level=[0x16CD94]} // Pinsir
+StaticPokemon{}={Species=[0x16CC9C, 0x16CCFE], Level=[0x16CD55]} // Dratini
+StaticPokemon{}={Species=[0x16CCAC, 0x16CD14], Level=[0x16CD7F]} // Porygon
[Ruby (F)]
Game=AXVF
@@ -655,24 +656,24 @@ CatchingTutorialOpponentMonOffset=0x8201C
CatchingTutorialPlayerMonOffset=0x10FB2A
PCPotionOffset=0x40DC10
StaticPokemonSupport=1
-StaticPokemon[]=[0x157B23, 0x157B51]
-StaticPokemon[]=[0x157B76, 0x157BA4]
-StaticPokemon[]=[0x1A58A8, 0x15E2E6, 0x15E2ED]
-StaticPokemon[]=[0x15D049, 0x15D052]
-StaticPokemon[]=[0x15F461, 0x15F46A]
-StaticPokemon[]=[0x15F514, 0x15F51D]
-StaticPokemon[]=[0x16108E, 0x1610B4]
-StaticPokemon[]=[0x15F7D9, 0x15F7E0]
-StaticPokemon[]=[0x1A59E7, 0x1A59F0]
-StaticPokemon[]=[0x151DA8, 0x151DB1]
-StaticPokemon[]=[0x15EDC3, 0x15EDCA]
-StaticPokemon[]=[0x15EDE1, 0x15EDE8]
-StaticPokemon[]=[0x15EDFF, 0x15EE06]
-StaticPokemon[]=[0x1A5905, 0x1A590C]
-StaticPokemon[]=[0x1A5923, 0x1A592A]
-StaticPokemon[]=[0x14EC5A]
-StaticPokemon[]=[0x15AF6F, 0x15AF7F]
-StaticPokemon[]=[0x164259]
+StaticPokemon{}={Species=[0x157B23, 0x157B51], Level=[0x157B53]} // Lileep
+StaticPokemon{}={Species=[0x157B76, 0x157BA4], Level=[0x157BA6]} // Anorith
+StaticPokemon{}={Species=[0x1A58A8, 0x15E2E6, 0x15E2ED], Level=[0x15E2E8]} // Groudon
+StaticPokemon{}={Species=[0x15D049, 0x15D052], Level=[0x15D054]} // Regirock
+StaticPokemon{}={Species=[0x15F461, 0x15F46A], Level=[0x15F46C]} // Regice
+StaticPokemon{}={Species=[0x15F514, 0x15F51D], Level=[0x15F51F]} // Registeel
+StaticPokemon{}={Species=[0x16108E, 0x1610B4], Level=[0x1610B6]} // Latias (Southern Island)
+StaticPokemon{}={Species=[0x15F7D9, 0x15F7E0], Level=[0x15F7DB]} // Rayquaza
+StaticPokemon{}={Species=[0x1A59E7, 0x1A59F0], Level=[0x1A59F2]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x151DA8, 0x151DB1], Level=[0x151DB3]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15EDC3, 0x15EDCA], Level=[0x15EDC5]} // Voltorb 1
+StaticPokemon{}={Species=[0x15EDE1, 0x15EDE8], Level=[0x15EDE3]} // Voltorb 2
+StaticPokemon{}={Species=[0x15EDFF, 0x15EE06], Level=[0x15EE01]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A5905, 0x1A590C], Level=[0x1A5907]} // Electrode 1
+StaticPokemon{}={Species=[0x1A5923, 0x1A592A], Level=[0x1A5925]} // Electrode 2
+StaticPokemon{}={Species=[0x14EC5A]} // Wynaut Egg
+StaticPokemon{}={Species=[0x15AF6F, 0x15AF7F], Level=[0x15AF71]} // Beldum
+StaticPokemon{}={Species=[0x164259], Level=[0x16425B]} // Castform
[Ruby (F) 1.1]
Game=AXVF
@@ -705,24 +706,24 @@ TradeTableOffset=0x21DEA0
RunIndoorsTweakOffset=0xE6220
PCPotionOffset=0x40D740
StaticPokemonSupport=1
-StaticPokemon[]=[0x157AB3, 0x157AE1]
-StaticPokemon[]=[0x157B06, 0x157B34]
-StaticPokemon[]=[0x1A5838, 0x15E276, 0x15E27D]
-StaticPokemon[]=[0x15CFD9, 0x15CFE2]
-StaticPokemon[]=[0x15F3F1, 0x15F3FA]
-StaticPokemon[]=[0x15F4A4, 0x15F4AD]
-StaticPokemon[]=[0x16101E, 0x161044]
-StaticPokemon[]=[0x15F769, 0x15F770]
-StaticPokemon[]=[0x1A5977, 0x1A5980]
-StaticPokemon[]=[0x151D3C, 0x151D45]
-StaticPokemon[]=[0x15ED53, 0x15ED5A]
-StaticPokemon[]=[0x15ED71, 0x15ED78]
-StaticPokemon[]=[0x15ED8F, 0x15ED96]
-StaticPokemon[]=[0x1A5895, 0x1A589C]
-StaticPokemon[]=[0x1A58B3, 0x1A58BA]
-StaticPokemon[]=[0x14EBEE]
-StaticPokemon[]=[0x15AEFF, 0x15AF0F]
-StaticPokemon[]=[0x1641E9]
+StaticPokemon{}={Species=[0x157AB3, 0x157AE1], Level=[0x157AE3]} // Lileep
+StaticPokemon{}={Species=[0x157B06, 0x157B34], Level=[0x157B36]} // Anorith
+StaticPokemon{}={Species=[0x1A5838, 0x15E276, 0x15E27D], Level=[0x15E278]} // Kyogre
+StaticPokemon{}={Species=[0x15CFD9, 0x15CFE2], Level=[0x15CFE4]} // Regirock
+StaticPokemon{}={Species=[0x15F3F1, 0x15F3FA], Level=[0x15F3FC]} // Regice
+StaticPokemon{}={Species=[0x15F4A4, 0x15F4AD], Level=[0x15F4AF]} // Registeel
+StaticPokemon{}={Species=[0x16101E, 0x161044], Level=[0x161046]} // Latios (Southern Island)
+StaticPokemon{}={Species=[0x15F769, 0x15F770], Level=[0x15F76B]} // Rayquaza
+StaticPokemon{}={Species=[0x1A5977, 0x1A5980], Level=[0x1A5982]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x151D3C, 0x151D45], Level=[0x151D47]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15ED53, 0x15ED5A], Level=[0x15ED55]} // Voltorb 1
+StaticPokemon{}={Species=[0x15ED71, 0x15ED78], Level=[0x15ED73]} // Voltorb 2
+StaticPokemon{}={Species=[0x15ED8F, 0x15ED96], Level=[0x15ED91]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A5895, 0x1A589C], Level=[0x1A5897]} // Electrode 1
+StaticPokemon{}={Species=[0x1A58B3, 0x1A58BA], Level=[0x1A58B5]} // Electrode 2
+StaticPokemon{}={Species=[0x14EBEE]} // Wynaut Egg
+StaticPokemon{}={Species=[0x15AEFF, 0x15AF0F], Level=[0x15AF01]} // Beldum
+StaticPokemon{}={Species=[0x1641E9], Level=[0x1641EB]} // Castform
[Sapphire (F) 1.1]
Game=AXPF
@@ -758,31 +759,31 @@ CatchingTutorialOpponentMonOffset=0xB0884
CatchingTutorialPlayerMonOffset=0x1390B6
PCPotionOffset=0x5E43FC
StaticPokemonSupport=1
-StaticPokemon[]=[0x2142C0, 0x2142E5, 0x2142E8, 0x21436A, 0x214378]
-StaticPokemon[]=[0x2142D2, 0x214388, 0x21438B, 0x21440D, 0x21441B]
-StaticPokemon[]=[0x23FEE1, 0x23FEEF, 0x23FF44]
-StaticPokemon[]=[0x23FFB2, 0x23FFC0, 0x240015]
-StaticPokemon[]=[0x231B1F, 0x231B28, 0x231B6E]
-StaticPokemon[]=[0x23DC62, 0x23DC6B, 0x23DCB1]
-StaticPokemon[]=[0x23DD64, 0x23DD6D, 0x23DDB3]
-StaticPokemon[]=[0x23E449, 0x23E452, 0x23E498]
-StaticPokemon[]=[0x277645, 0x27764E]
-StaticPokemon[]=[0x1F68F4, 0x1F68FD]
-StaticPokemon[]=[0x23C389, 0x23C390]
-StaticPokemon[]=[0x23C3D6, 0x23C3DD]
-StaticPokemon[]=[0x23C423, 0x23C42A]
-StaticPokemon[]=[0x23827E, 0x238285]
-StaticPokemon[]=[0x2382CB, 0x2382D2]
-StaticPokemon[]=[0x247FC7, 0x247FD5]
-StaticPokemon[]=[0x247E53]
-StaticPokemon[]=[0x247E66]
-StaticPokemon[]=[0x26CE61, 0x26CE71, 0x26CEBB, 0x26CEC6]
-StaticPokemon[]=[0x26CC78, 0x26CCB2, 0x26CD07, 0x26CD12]
-StaticPokemon[]=[0x26E00D, 0x26E03C, 0x26E08B, 0x26E096]
-StaticPokemon[]=[0x26E155, 0x26E160, 0x26E1AA, 0x26E1B5]
-StaticPokemon[]=[0x1EB1A5]
-StaticPokemon[]=[0x22607E, 0x226081, 0x226103, 0x226114]
-StaticPokemon[]=[0x275296, 0x275299]
+StaticPokemon{}={Species=[0x2142C0, 0x2142E5, 0x2142E8, 0x21436A, 0x214378], Level=[0x2142EA]} // Lileep
+StaticPokemon{}={Species=[0x2142D2, 0x214388, 0x21438B, 0x21440D, 0x21441B], Level=[0x21438D]} // Anorith
+StaticPokemon{}={Species=[0x23FEE1, 0x23FEEF, 0x23FF44, 0x1E5FD2, 0x1E6052, 0x1E610E, 0x1E618E], Level=[0x23FEF1]} // Kyogre
+StaticPokemon{}={Species=[0x23FFB2, 0x23FFC0, 0x240015, 0x1E6012, 0x1E614E], Level=[0x23FFC2]} // Groudon
+StaticPokemon{}={Species=[0x231B1F, 0x231B28, 0x231B6E], Level=[0x231B2A]} // Regirock
+StaticPokemon{}={Species=[0x23DC62, 0x23DC6B, 0x23DCB1], Level=[0x23DC6D]} // Regice
+StaticPokemon{}={Species=[0x23DD64, 0x23DD6D, 0x23DDB3], Level=[0x23DD6F]} // Registeel
+StaticPokemon{}={Species=[0x23E449, 0x23E452, 0x23E498, 0x23E4E7, 0x23E505, 0x1E62B0, 0x1E62CE, 0x1E6364, 0x1E6382], Level=[0x23E454]} // Rayquaza
+StaticPokemon{}={Species=[0x277645, 0x27764E], Level=[0x277650]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x1F68F4, 0x1F68FD], Level=[0x1F68FF]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x23C389, 0x23C390], Level=[0x23C38B]} // Voltorb 1
+StaticPokemon{}={Species=[0x23C3D6, 0x23C3DD], Level=[0x23C3D8]} // Voltorb 2
+StaticPokemon{}={Species=[0x23C423, 0x23C42A], Level=[0x23C425]} // Voltorb 3
+StaticPokemon{}={Species=[0x23827E, 0x238285], Level=[0x238280]} // Electrode 1
+StaticPokemon{}={Species=[0x2382CB, 0x2382D2], Level=[0x2382CD]} // Electrode 2
+StaticPokemon{}={Species=[0x247FC7, 0x247FD5], Level=[0x247FD7]} // Sudowoodo in Battle Frontier
+StaticPokemon{}={Species=[0x247D3E, 0x247E53], Level=[0x247E58]} // Latios on Southern Island
+StaticPokemon{}={Species=[0x247D49, 0x247E66], Level=[0x247E6B]} // Latias on Southern Island
+StaticPokemon{}={Species=[0x26CE61, 0x26CE71, 0x26CEBB, 0x26CEC6], Level=[0x26CE76]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x26CC78, 0x26CCB2, 0x26CD07, 0x26CD12], Level=[0x26CCB7]} // Mew on Faraway Island
+StaticPokemon{}={Species=[0x26E00D, 0x26E03C, 0x26E08B, 0x26E096], Level=[0x26E041]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x26E155, 0x26E160, 0x26E1AA, 0x26E1B5], Level=[0x26E165]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x1EB1A5]} // Wynaut Egg
+StaticPokemon{}={Species=[0x22607E, 0x226081, 0x226103, 0x226114], Level=[0x226083]} // Beldum
+StaticPokemon{}={Species=[0x275296, 0x275299, 0x275325], Level=[0x27529B]} // Castform
[Ruby (G)]
Game=AXVD
@@ -815,24 +816,24 @@ CatchingTutorialOpponentMonOffset=0x81F34
CatchingTutorialPlayerMonOffset=0x10FA22
PCPotionOffset=0x412770
StaticPokemonSupport=1
-StaticPokemon[]=[0x157A3B, 0x157A69]
-StaticPokemon[]=[0x157A8E, 0x157ABC]
-StaticPokemon[]=[0x1A8695, 0x15E1FE, 0x15E205]
-StaticPokemon[]=[0x15CF61, 0x15CF6A]
-StaticPokemon[]=[0x15F379, 0x15F382]
-StaticPokemon[]=[0x15F42C, 0x15F435]
-StaticPokemon[]=[0x160FA6, 0x160FCC]
-StaticPokemon[]=[0x15F6F1, 0x15F6F8]
-StaticPokemon[]=[0x1A87D4, 0x1A87DD]
-StaticPokemon[]=[0x151CC0, 0x151CC9]
-StaticPokemon[]=[0x15ECDB, 0x15ECE2]
-StaticPokemon[]=[0x15ECF9, 0x15ED00]
-StaticPokemon[]=[0x15ED17, 0x15ED1E]
-StaticPokemon[]=[0x1A86F2, 0x1A86F9]
-StaticPokemon[]=[0x1A8710, 0x1A8717]
-StaticPokemon[]=[0x14EB72]
-StaticPokemon[]=[0x15AE87, 0x15AE97]
-StaticPokemon[]=[0x164171]
+StaticPokemon{}={Species=[0x157A3B, 0x157A69], Level=[0x157A6B]} // Lileep
+StaticPokemon{}={Species=[0x157A8E, 0x157ABC], Level=[0x157ABE]} // Anorith
+StaticPokemon{}={Species=[0x1A8695, 0x15E1FE, 0x15E205], Level=[0x15E200]} // Groudon
+StaticPokemon{}={Species=[0x15CF61, 0x15CF6A], Level=[0x15CF6C]} // Regirock
+StaticPokemon{}={Species=[0x15F379, 0x15F382], Level=[0x15F384]} // Regice
+StaticPokemon{}={Species=[0x15F42C, 0x15F435], Level=[0x15F437]} // Registeel
+StaticPokemon{}={Species=[0x160FA6, 0x160FCC], Level=[0x160FCE]} // Latias (Southern Island)
+StaticPokemon{}={Species=[0x15F6F1, 0x15F6F8], Level=[0x15F6F3]} // Rayquaza
+StaticPokemon{}={Species=[0x1A87D4, 0x1A87DD], Level=[0x1A87DF]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x151CC0, 0x151CC9], Level=[0x151CCB]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15ECDB, 0x15ECE2], Level=[0x15ECDD]} // Voltorb 1
+StaticPokemon{}={Species=[0x15ECF9, 0x15ED00], Level=[0x15ECFB]} // Voltorb 2
+StaticPokemon{}={Species=[0x15ED17, 0x15ED1E], Level=[0x15ED19]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A86F2, 0x1A86F9], Level=[0x1A86F4]} // Electrode 1
+StaticPokemon{}={Species=[0x1A8710, 0x1A8717], Level=[0x1A8712]} // Electrode 2
+StaticPokemon{}={Species=[0x14EB72]} // Wynaut Egg
+StaticPokemon{}={Species=[0x15AE87, 0x15AE97], Level=[0x15AE89]} // Beldum
+StaticPokemon{}={Species=[0x164171], Level=[0x164173]} // Castform
[Ruby (G) 1.1]
Game=AXVD
@@ -865,24 +866,24 @@ TradeTableOffset=0x222A28
RunIndoorsTweakOffset=0xE613C
PCPotionOffset=0x4126DC
StaticPokemonSupport=1
-StaticPokemon[]=[0x1579CF, 0x1579FD]
-StaticPokemon[]=[0x157A22, 0x157A50]
-StaticPokemon[]=[0x1A8629, 0x15E192, 0x15E199]
-StaticPokemon[]=[0x15CEF5, 0x15CEFE]
-StaticPokemon[]=[0x15F30D, 0x15F316]
-StaticPokemon[]=[0x15F3C0, 0x15F3C9]
-StaticPokemon[]=[0x160F3A, 0x160F60]
-StaticPokemon[]=[0x15F685, 0x15F68C]
-StaticPokemon[]=[0x1A8768, 0x1A8771]
-StaticPokemon[]=[0x151C58, 0x151C61]
-StaticPokemon[]=[0x15EC6F, 0x15EC76]
-StaticPokemon[]=[0x15EC8D, 0x15EC94]
-StaticPokemon[]=[0x15ECAB, 0x15ECB2]
-StaticPokemon[]=[0x1A8686, 0x1A868D]
-StaticPokemon[]=[0x1A86A4, 0x1A86AB]
-StaticPokemon[]=[0x14EB0A]
-StaticPokemon[]=[0x15AE1B, 0x15AE2B]
-StaticPokemon[]=[0x164105]
+StaticPokemon{}={Species=[0x1579CF, 0x1579FD], Level=[0x1579FF]} // Lileep
+StaticPokemon{}={Species=[0x157A22, 0x157A50], Level=[0x157A52]} // Anorith
+StaticPokemon{}={Species=[0x1A8629, 0x15E192, 0x15E199], Level=[0x15E194]} // Kyogre
+StaticPokemon{}={Species=[0x15CEF5, 0x15CEFE], Level=[0x15CF00]} // Regirock
+StaticPokemon{}={Species=[0x15F30D, 0x15F316], Level=[0x15F318]} // Regice
+StaticPokemon{}={Species=[0x15F3C0, 0x15F3C9], Level=[0x15F3CB]} // Registeel
+StaticPokemon{}={Species=[0x160F3A, 0x160F60], Level=[0x160F62]} // Latios (Southern Island)
+StaticPokemon{}={Species=[0x15F685, 0x15F68C], Level=[0x15F687]} // Rayquaza
+StaticPokemon{}={Species=[0x1A8768, 0x1A8771], Level=[0x1A8773]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x151C58, 0x151C61], Level=[0x151C63]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15EC6F, 0x15EC76], Level=[0x15EC71]} // Voltorb 1
+StaticPokemon{}={Species=[0x15EC8D, 0x15EC94], Level=[0x15EC8F]} // Voltorb 2
+StaticPokemon{}={Species=[0x15ECAB, 0x15ECB2], Level=[0x15ECAD]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A8686, 0x1A868D], Level=[0x1A8688]} // Electrode 1
+StaticPokemon{}={Species=[0x1A86A4, 0x1A86AB], Level=[0x1A86A6]} // Electrode 2
+StaticPokemon{}={Species=[0x14EB0A]} // Wynaut Egg
+StaticPokemon{}={Species=[0x15AE1B, 0x15AE2B], Level=[0x15AE1D]} // Beldum
+StaticPokemon{}={Species=[0x164105], Level=[0x164107]} // Castform
[Sapphire (G) 1.1]
Game=AXPD
@@ -918,31 +919,31 @@ CatchingTutorialOpponentMonOffset=0xB088C
CatchingTutorialPlayerMonOffset=0x139096
PCPotionOffset=0x5F12C8
StaticPokemonSupport=1
-StaticPokemon[]=[0x215CD3, 0x215CF8, 0x215CFB, 0x215D7D, 0x215D8B]
-StaticPokemon[]=[0x215CE5, 0x215D9B, 0x215D9E, 0x215E20, 0x215E2E]
-StaticPokemon[]=[0x24354E, 0x24355C, 0x2435B1]
-StaticPokemon[]=[0x24361F, 0x24362D, 0x243682]
-StaticPokemon[]=[0x234815, 0x23481E, 0x234864]
-StaticPokemon[]=[0x2411BD, 0x2411C6, 0x24120C]
-StaticPokemon[]=[0x2412BF, 0x2412C8, 0x24130E]
-StaticPokemon[]=[0x2419BC, 0x2419C5, 0x241A0B]
-StaticPokemon[]=[0x27DA85, 0x27DA8E]
-StaticPokemon[]=[0x1F7227, 0x1F7230]
-StaticPokemon[]=[0x23F82B, 0x23F832]
-StaticPokemon[]=[0x23F878, 0x23F87F]
-StaticPokemon[]=[0x23F8C5, 0x23F8CC]
-StaticPokemon[]=[0x23B4C0, 0x23B4C7]
-StaticPokemon[]=[0x23B50D, 0x23B514]
-StaticPokemon[]=[0x24B918, 0x24B926]
-StaticPokemon[]=[0x24B7A4]
-StaticPokemon[]=[0x24B7B7]
-StaticPokemon[]=[0x272CA4, 0x272CB4, 0x272CFE, 0x272D09]
-StaticPokemon[]=[0x272AB8, 0x272AF2, 0x272B47, 0x272B52]
-StaticPokemon[]=[0x273F63, 0x273F92, 0x273FE1, 0x273FEC]
-StaticPokemon[]=[0x2740AB, 0x2740B6, 0x274100, 0x27410B]
-StaticPokemon[]=[0x1EB5E8]
-StaticPokemon[]=[0x228813, 0x228816, 0x228898, 0x2288A9]
-StaticPokemon[]=[0x27B588, 0x27B58B]
+StaticPokemon{}={Species=[0x215CD3, 0x215CF8, 0x215CFB, 0x215D7D, 0x215D8B], Level=[0x215CFD]} // Lileep
+StaticPokemon{}={Species=[0x215CE5, 0x215D9B, 0x215D9E, 0x215E20, 0x215E2E], Level=[0x215DA0]} // Anorith
+StaticPokemon{}={Species=[0x24354E, 0x24355C, 0x2435B1, 0x1E6397, 0x1E6417, 0x1E64D3, 0x1E6553], Level=[0x24355E]} // Kyogre
+StaticPokemon{}={Species=[0x24361F, 0x24362D, 0x243682, 0x1E63D7, 0x1E6513], Level=[0x24362F]} // Groudon
+StaticPokemon{}={Species=[0x234815, 0x23481E, 0x234864], Level=[0x234820]} // Regirock
+StaticPokemon{}={Species=[0x2411BD, 0x2411C6, 0x24120C], Level=[0x2411C8]} // Regice
+StaticPokemon{}={Species=[0x2412BF, 0x2412C8, 0x24130E], Level=[0x2412CA]} // Registeel
+StaticPokemon{}={Species=[0x2419BC, 0x2419C5, 0x241A0B, 0x241A5A, 0x241A78, 0x1E6675, 0x1E6693, 0x1E6729, 0x1E6747], Level=[0x2419C7]} // Rayquaza
+StaticPokemon{}={Species=[0x27DA85, 0x27DA8E], Level=[0x27DA90]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x1F7227, 0x1F7230], Level=[0x1F7232]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x23F82B, 0x23F832], Level=[0x23F82D]} // Voltorb 1
+StaticPokemon{}={Species=[0x23F878, 0x23F87F], Level=[0x23F87A]} // Voltorb 2
+StaticPokemon{}={Species=[0x23F8C5, 0x23F8CC], Level=[0x23F8C7]} // Voltorb 3
+StaticPokemon{}={Species=[0x23B4C0, 0x23B4C7], Level=[0x23B4C2]} // Electrode 1
+StaticPokemon{}={Species=[0x23B50D, 0x23B514], Level=[0x23B50F]} // Electrode 2
+StaticPokemon{}={Species=[0x24B918, 0x24B926], Level=[0x24B928]} // Sudowoodo in Battle Frontier
+StaticPokemon{}={Species=[0x24B68F, 0x24B7A4], Level=[0x24B7A9]} // Latios on Southern Island
+StaticPokemon{}={Species=[0x24B69A, 0x24B7B7], Level=[0x24B7BC]} // Latias on Southern Island
+StaticPokemon{}={Species=[0x272CA4, 0x272CB4, 0x272CFE, 0x272D09], Level=[0x272CB9]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x272AB8, 0x272AF2, 0x272B47, 0x272B52], Level=[0x272AF7]} // Mew on Faraway Island
+StaticPokemon{}={Species=[0x273F63, 0x273F92, 0x273FE1, 0x273FEC], Level=[0x273F97]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x2740AB, 0x2740B6, 0x274100, 0x27410B], Level=[0x2740BB]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x1EB5E8]} // Wynaut Egg
+StaticPokemon{}={Species=[0x228813, 0x228816, 0x228898, 0x2288A9], Level=[0x228818]} // Beldum
+StaticPokemon{}={Species=[0x27B588, 0x27B58B, 0x27B617], Level=[0x27B58D]} // Castform
[Ruby (S)]
Game=AXVS
@@ -975,24 +976,24 @@ CatchingTutorialOpponentMonOffset=0x81FBC
CatchingTutorialPlayerMonOffset=0x10FB26
PCPotionOffset=0x409FE0
StaticPokemonSupport=1
-StaticPokemon[]=[0x157B5F, 0x157B8D]
-StaticPokemon[]=[0x157BB2, 0x157BE0]
-StaticPokemon[]=[0x1A376D, 0x15E322, 0x15E329]
-StaticPokemon[]=[0x15D085, 0x15D08E]
-StaticPokemon[]=[0x15F49D, 0x15F4A6]
-StaticPokemon[]=[0x15F550, 0x15F559]
-StaticPokemon[]=[0x1610CA, 0x1610F0]
-StaticPokemon[]=[0x15F815, 0x15F81C]
-StaticPokemon[]=[0x1A38AC, 0x1A38B5]
-StaticPokemon[]=[0x151DE4, 0x151DED]
-StaticPokemon[]=[0x15EDFF, 0x15EE06]
-StaticPokemon[]=[0x15EE1D, 0x15EE24]
-StaticPokemon[]=[0x15EE3B, 0x15EE42]
-StaticPokemon[]=[0x1A37CA, 0x1A37D1]
-StaticPokemon[]=[0x1A37E8, 0x1A37EF]
-StaticPokemon[]=[0x14EC96]
-StaticPokemon[]=[0x15AFAB, 0x15AFBB]
-StaticPokemon[]=[0x164295]
+StaticPokemon{}={Species=[0x157B5F, 0x157B8D], Level=[0x157B8F]} // Lileep
+StaticPokemon{}={Species=[0x157BB2, 0x157BE0], Level=[0x157BE2]} // Anorith
+StaticPokemon{}={Species=[0x1A376D, 0x15E322, 0x15E329], Level=[0x15E324]} // Groudon
+StaticPokemon{}={Species=[0x15D085, 0x15D08E], Level=[0x15D090]} // Regirock
+StaticPokemon{}={Species=[0x15F49D, 0x15F4A6], Level=[0x15F4A8]} // Regice
+StaticPokemon{}={Species=[0x15F550, 0x15F559], Level=[0x15F55B]} // Registeel
+StaticPokemon{}={Species=[0x1610CA, 0x1610F0], Level=[0x1610F2]} // Latias (Southern Island)
+StaticPokemon{}={Species=[0x15F815, 0x15F81C], Level=[0x15F817]} // Rayquaza
+StaticPokemon{}={Species=[0x1A38AC, 0x1A38B5], Level=[0x1A38B7]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x151DE4, 0x151DED], Level=[0x151DEF]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15EDFF, 0x15EE06], Level=[0x15EE01]} // Voltorb 1
+StaticPokemon{}={Species=[0x15EE1D, 0x15EE24], Level=[0x15EE1F]} // Voltorb 2
+StaticPokemon{}={Species=[0x15EE3B, 0x15EE42], Level=[0x15EE3D]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A37CA, 0x1A37D1], Level=[0x1A37CC]} // Electrode 1
+StaticPokemon{}={Species=[0x1A37E8, 0x1A37EF], Level=[0x1A37EA]} // Electrode 2
+StaticPokemon{}={Species=[0x14EC96]} // Wynaut Egg
+StaticPokemon{}={Species=[0x15AFAB, 0x15AFBB], Level=[0x15AFAD]} // Beldum
+StaticPokemon{}={Species=[0x164295], Level=[0x164297]} // Castform
[Ruby (S) 1.1]
Game=AXVS
@@ -1025,24 +1026,24 @@ TradeTableOffset=0x21A7D0
RunIndoorsTweakOffset=0xE620C
PCPotionOffset=0x409D1C
StaticPokemonSupport=1
-StaticPokemon[]=[0x157AEF, 0x157B1D]
-StaticPokemon[]=[0x157B42, 0x157B70]
-StaticPokemon[]=[0x1A36FD, 0x15E2B2, 0x15E2B9]
-StaticPokemon[]=[0x15D015, 0x15D01E]
-StaticPokemon[]=[0x15F42D, 0x15F436]
-StaticPokemon[]=[0x15F4E0, 0x15F4E9]
-StaticPokemon[]=[0x16105A, 0x161080]
-StaticPokemon[]=[0x15F7A5, 0x15F7AC]
-StaticPokemon[]=[0x1A383C, 0x1A3845]
-StaticPokemon[]=[0x151D78, 0x151D81]
-StaticPokemon[]=[0x15ED8F, 0x15ED96]
-StaticPokemon[]=[0x15EDAD, 0x15EDB4]
-StaticPokemon[]=[0x15EDCB, 0x15EDD2]
-StaticPokemon[]=[0x1A375A, 0x1A3761]
-StaticPokemon[]=[0x1A3778, 0x1A377F]
-StaticPokemon[]=[0x14EC2A]
-StaticPokemon[]=[0x15AF3B, 0x15AF4B]
-StaticPokemon[]=[0x164225]
+StaticPokemon{}={Species=[0x157AEF, 0x157B1D], Level=[0x157B1F]} // Lileep
+StaticPokemon{}={Species=[0x157B42, 0x157B70], Level=[0x157B72]} // Anorith
+StaticPokemon{}={Species=[0x1A36FD, 0x15E2B2, 0x15E2B9], Level=[0x15E2B4]} // Kyogre
+StaticPokemon{}={Species=[0x15D015, 0x15D01E], Level=[0x15D020]} // Regirock
+StaticPokemon{}={Species=[0x15F42D, 0x15F436], Level=[0x15F438]} // Regice
+StaticPokemon{}={Species=[0x15F4E0, 0x15F4E9], Level=[0x15F4EB]} // Registeel
+StaticPokemon{}={Species=[0x16105A, 0x161080], Level=[0x161082]} // Latios (Southern Island)
+StaticPokemon{}={Species=[0x15F7A5, 0x15F7AC], Level=[0x15F7A7]} // Rayquaza
+StaticPokemon{}={Species=[0x1A383C, 0x1A3845], Level=[0x1A3847]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x151D78, 0x151D81], Level=[0x151D83]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15ED8F, 0x15ED96], Level=[0x15ED91]} // Voltorb 1
+StaticPokemon{}={Species=[0x15EDAD, 0x15EDB4], Level=[0x15EDAF]} // Voltorb 2
+StaticPokemon{}={Species=[0x15EDCB, 0x15EDD2], Level=[0x15EDCD]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A375A, 0x1A3761], Level=[0x1A375C]} // Electrode 1
+StaticPokemon{}={Species=[0x1A3778, 0x1A377F], Level=[0x1A377A]} // Electrode 2
+StaticPokemon{}={Species=[0x14EC2A]} // Wynaut Egg
+StaticPokemon{}={Species=[0x15AF3B, 0x15AF4B], Level=[0x15AF3D]} // Beldum
+StaticPokemon{}={Species=[0x164225], Level=[0x164227]} // Castform
[Sapphire (S) 1.1]
Game=AXPS
@@ -1078,31 +1079,31 @@ CatchingTutorialOpponentMonOffset=0xB0884
CatchingTutorialPlayerMonOffset=0x13908A
PCPotionOffset=0x5E2CD4
StaticPokemonSupport=1
-StaticPokemon[]=[0x21307F, 0x2130A4, 0x2130A7, 0x213129, 0x213137]
-StaticPokemon[]=[0x213091, 0x213147, 0x21314A, 0x2131CC, 0x2131DA]
-StaticPokemon[]=[0x23DCC5, 0x23DCD3, 0x23DD28]
-StaticPokemon[]=[0x23DD96, 0x23DDA4, 0x23DDF9]
-StaticPokemon[]=[0x22FD3F, 0x22FD48, 0x22FD8E]
-StaticPokemon[]=[0x23BB32, 0x23BB3B, 0x23BB81]
-StaticPokemon[]=[0x23BC34, 0x23BC3D, 0x23BC83]
-StaticPokemon[]=[0x23C305, 0x23C30E, 0x23C354]
-StaticPokemon[]=[0x276188, 0x276191]
-StaticPokemon[]=[0x1F5CDA, 0x1F5CE3]
-StaticPokemon[]=[0x23A38F, 0x23A396]
-StaticPokemon[]=[0x23A3DC, 0x23A3E3]
-StaticPokemon[]=[0x23A429, 0x23A430]
-StaticPokemon[]=[0x236418, 0x23641F]
-StaticPokemon[]=[0x236465, 0x23646C]
-StaticPokemon[]=[0x245C8C, 0x245C9A]
-StaticPokemon[]=[0x245B18]
-StaticPokemon[]=[0x245B2B]
-StaticPokemon[]=[0x26B948, 0x26B958, 0x26B9A2, 0x26B9AD]
-StaticPokemon[]=[0x26B75A, 0x26B794, 0x26B7E9, 0x26B7F4]
-StaticPokemon[]=[0x26CBEA, 0x26CC19, 0x26CC68, 0x26CC73]
-StaticPokemon[]=[0x26CD32, 0x26CD3D, 0x26CD87, 0x26CD92]
-StaticPokemon[]=[0x1EA97A]
-StaticPokemon[]=[0x22477B, 0x22477E, 0x224800, 0x224811]
-StaticPokemon[]=[0x273D60, 0x273D63]
+StaticPokemon{}={Species=[0x21307F, 0x2130A4, 0x2130A7, 0x213129, 0x213137], Level=[0x2130A9]} // Lileep
+StaticPokemon{}={Species=[0x213091, 0x213147, 0x21314A, 0x2131CC, 0x2131DA], Level=[0x21314C]} // Anorith
+StaticPokemon{}={Species=[0x23DCC5, 0x23DCD3, 0x23DD28, 0x1E5B08, 0x1E5B88, 0x1E5C44, 0x1E5CC4], Level=[0x23DCD5]} // Kyogre
+StaticPokemon{}={Species=[0x23DD96, 0x23DDA4, 0x23DDF9, 0x1E5B48, 0x1E5C84], Level=[0x23DDA6]} // Groudon
+StaticPokemon{}={Species=[0x22FD3F, 0x22FD48, 0x22FD8E], Level=[0x22FD4A]} // Regirock
+StaticPokemon{}={Species=[0x23BB32, 0x23BB3B, 0x23BB81], Level=[0x23BB3D]} // Regice
+StaticPokemon{}={Species=[0x23BC34, 0x23BC3D, 0x23BC83], Level=[0x23BC3F]} // Registeel
+StaticPokemon{}={Species=[0x23C305, 0x23C30E, 0x23C354, 0x23C3A3, 0x23C3C1, 0x1E5DE6, 0x1E5E04, 0x1E5E9A, 0x1E5EB8], Level=[0x23C310]} // Rayquaza
+StaticPokemon{}={Species=[0x276188, 0x276191], Level=[0x276193]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x1F5CDA, 0x1F5CE3], Level=[0x1F5CE5]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x23A38F, 0x23A396], Level=[0x23A391]} // Voltorb 1
+StaticPokemon{}={Species=[0x23A3DC, 0x23A3E3], Level=[0x23A3DE]} // Voltorb 2
+StaticPokemon{}={Species=[0x23A429, 0x23A430], Level=[0x23A42B]} // Voltorb 3
+StaticPokemon{}={Species=[0x236418, 0x23641F], Level=[0x23641A]} // Electrode 1
+StaticPokemon{}={Species=[0x236465, 0x23646C], Level=[0x236467]} // Electrode 2
+StaticPokemon{}={Species=[0x245C8C, 0x245C9A], Level=[0x245C9C]} // Sudowoodo in Battle Frontier
+StaticPokemon{}={Species=[0x245A03, 0x245B18], Level=[0x245B1D]} // Latios on Southern Island
+StaticPokemon{}={Species=[0x245A0E, 0x245B2B], Level=[0x245B30]} // Latias on Southern Island
+StaticPokemon{}={Species=[0x26B948, 0x26B958, 0x26B9A2, 0x26B9AD], Level=[0x26B95D]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x26B75A, 0x26B794, 0x26B7E9, 0x26B7F4], Level=[0x26B799]} // Mew on Faraway Island
+StaticPokemon{}={Species=[0x26CBEA, 0x26CC19, 0x26CC68, 0x26CC73], Level=[0x26CC1E]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x26CD32, 0x26CD3D, 0x26CD87, 0x26CD92], Level=[0x26CD42]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x1EA97A]} // Wynaut Egg
+StaticPokemon{}={Species=[0x22477B, 0x22477E, 0x224800, 0x224811], Level=[0x224780]} // Beldum
+StaticPokemon{}={Species=[0x273D60, 0x273D63, 0x273DEF], Level=[0x273D65]} // Castform
[Ruby (I)]
Game=AXVI
@@ -1135,24 +1136,24 @@ CatchingTutorialOpponentMonOffset=0x81ED4
CatchingTutorialPlayerMonOffset=0x10FA22
PCPotionOffset=0x406FE0
StaticPokemonSupport=1
-StaticPokemon[]=[0x157A87, 0x157AB5]
-StaticPokemon[]=[0x157ADA, 0x157B08]
-StaticPokemon[]=[0x1A0E4D, 0x15E24A, 0x15E251]
-StaticPokemon[]=[0x15CFAD, 0x15CFB6]
-StaticPokemon[]=[0x15F3C5, 0x15F3CE]
-StaticPokemon[]=[0x15F478, 0x15F481]
-StaticPokemon[]=[0x160FF2, 0x161018]
-StaticPokemon[]=[0x15F73D, 0x15F744]
-StaticPokemon[]=[0x1A0F8C, 0x1A0F95]
-StaticPokemon[]=[0x151D0C, 0x151D15]
-StaticPokemon[]=[0x15ED27, 0x15ED2E]
-StaticPokemon[]=[0x15ED45, 0x15ED4C]
-StaticPokemon[]=[0x15ED63, 0x15ED6A]
-StaticPokemon[]=[0x1A0EAA, 0x1A0EB1]
-StaticPokemon[]=[0x1A0EC8, 0x1A0ECF]
-StaticPokemon[]=[0x14EBBE]
-StaticPokemon[]=[0x15AED3, 0x15AEE3]
-StaticPokemon[]=[0x1641BD]
+StaticPokemon{}={Species=[0x157A87, 0x157AB5], Level=[0x157AB7]} // Lileep
+StaticPokemon{}={Species=[0x157ADA, 0x157B08], Level=[0x157B0A]} // Anorith
+StaticPokemon{}={Species=[0x1A0E4D, 0x15E24A, 0x15E251], Level=[0x15E24C]} // Groudon
+StaticPokemon{}={Species=[0x15CFAD, 0x15CFB6], Level=[0x15CFB8]} // Regirock
+StaticPokemon{}={Species=[0x15F3C5, 0x15F3CE], Level=[0x15F3D0]} // Regice
+StaticPokemon{}={Species=[0x15F478, 0x15F481], Level=[0x15F483]} // Registeel
+StaticPokemon{}={Species=[0x160FF2, 0x161018], Level=[0x16101A]} // Latias (Southern Island)
+StaticPokemon{}={Species=[0x15F73D, 0x15F744], Level=[0x15F73F]} // Rayquaza
+StaticPokemon{}={Species=[0x1A0F8C, 0x1A0F95], Level=[0x1A0F97]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x151D0C, 0x151D15], Level=[0x151D17]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15ED27, 0x15ED2E], Level=[0x15ED29]} // Voltorb 1
+StaticPokemon{}={Species=[0x15ED45, 0x15ED4C], Level=[0x15ED47]} // Voltorb 2
+StaticPokemon{}={Species=[0x15ED63, 0x15ED6A], Level=[0x15ED65]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A0EAA, 0x1A0EB1], Level=[0x1A0EAC]} // Electrode 1
+StaticPokemon{}={Species=[0x1A0EC8, 0x1A0ECF], Level=[0x1A0ECA]} // Electrode 2
+StaticPokemon{}={Species=[0x14EBBE]} // Wynaut Egg
+StaticPokemon{}={Species=[0x15AED3, 0x15AEE3], Level=[0x15AED5]} // Beldum
+StaticPokemon{}={Species=[0x1641BD], Level=[0x1641BF]} // Castform
[Ruby (I) 1.1]
Game=AXVI
@@ -1185,24 +1186,24 @@ TradeTableOffset=0x21772C
RunIndoorsTweakOffset=0xE6118
PCPotionOffset=0x406C84
StaticPokemonSupport=1
-StaticPokemon[]=[0x157A17, 0x157A45]
-StaticPokemon[]=[0x157A6A, 0x157A98]
-StaticPokemon[]=[0x1A0DDD, 0x15E1DA, 0x15E1E1]
-StaticPokemon[]=[0x15CF3D, 0x15CF46]
-StaticPokemon[]=[0x15F355, 0x15F35E]
-StaticPokemon[]=[0x15F408, 0x15F411]
-StaticPokemon[]=[0x160F82, 0x160FA8]
-StaticPokemon[]=[0x15F6CD, 0x15F6D4]
-StaticPokemon[]=[0x1A0F1C, 0x1A0F25]
-StaticPokemon[]=[0x151CA0, 0x151CA9]
-StaticPokemon[]=[0x15ECB7, 0x15ECBE]
-StaticPokemon[]=[0x15ECD5, 0x15ECDC]
-StaticPokemon[]=[0x15ECF3, 0x15ECFA]
-StaticPokemon[]=[0x1A0E3A, 0x1A0E41]
-StaticPokemon[]=[0x1A0E58, 0x1A0E5F]
-StaticPokemon[]=[0x14EB52]
-StaticPokemon[]=[0x15AE63, 0x15AE73]
-StaticPokemon[]=[0x16414D]
+StaticPokemon{}={Species=[0x157A17, 0x157A45], Level=[0x157A47]} // Lileep
+StaticPokemon{}={Species=[0x157A6A, 0x157A98], Level=[0x157A9A]} // Anorith
+StaticPokemon{}={Species=[0x1A0DDD, 0x15E1DA, 0x15E1E1], Level=[0x15E1DC]} // Kyogre
+StaticPokemon{}={Species=[0x15CF3D, 0x15CF46], Level=[0x15CF48]} // Regirock
+StaticPokemon{}={Species=[0x15F355, 0x15F35E], Level=[0x15F360]} // Regice
+StaticPokemon{}={Species=[0x15F408, 0x15F411], Level=[0x15F413]} // Registeel
+StaticPokemon{}={Species=[0x160F82, 0x160FA8], Level=[0x160FAA]} // Latios (Southern Island)
+StaticPokemon{}={Species=[0x15F6CD, 0x15F6D4], Level=[0x15F6CF]} // Rayquaza
+StaticPokemon{}={Species=[0x1A0F1C, 0x1A0F25], Level=[0x1A0F27]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x151CA0, 0x151CA9], Level=[0x151CAB]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x15ECB7, 0x15ECBE], Level=[0x15ECB9]} // Voltorb 1
+StaticPokemon{}={Species=[0x15ECD5, 0x15ECDC], Level=[0x15ECD7]} // Voltorb 2
+StaticPokemon{}={Species=[0x15ECF3, 0x15ECFA], Level=[0x15ECF5]} // Voltorb 3
+StaticPokemon{}={Species=[0x1A0E3A, 0x1A0E41], Level=[0x1A0E3C]} // Electrode 1
+StaticPokemon{}={Species=[0x1A0E58, 0x1A0E5F], Level=[0x1A0E5A]} // Electrode 2
+StaticPokemon{}={Species=[0x14EB52]} // Wynaut Egg
+StaticPokemon{}={Species=[0x15AE63, 0x15AE73], Level=[0x15AE65]} // Beldum
+StaticPokemon{}={Species=[0x16414D], Level=[0x16414F]} // Castform
[Sapphire (I) 1.1]
Game=AXPI
@@ -1238,31 +1239,31 @@ CatchingTutorialOpponentMonOffset=0xB0884
CatchingTutorialPlayerMonOffset=0x139082
PCPotionOffset=0x5DCA48
StaticPokemonSupport=1
-StaticPokemon[]=[0x211669, 0x21168E, 0x211691, 0x211713, 0x211721]
-StaticPokemon[]=[0x21167B, 0x211731, 0x211734, 0x2117B6, 0x2117C4]
-StaticPokemon[]=[0x23B0B6, 0x23B0C4, 0x23B119]
-StaticPokemon[]=[0x23B187, 0x23B195, 0x23B1EA]
-StaticPokemon[]=[0x22D8D2, 0x22D8DB, 0x22D921]
-StaticPokemon[]=[0x239092, 0x23909B, 0x2390E1]
-StaticPokemon[]=[0x239194, 0x23919D, 0x2391E3]
-StaticPokemon[]=[0x23983F, 0x239848, 0x23988E]
-StaticPokemon[]=[0x271FDB, 0x271FE4]
-StaticPokemon[]=[0x1F51E3, 0x1F51EC]
-StaticPokemon[]=[0x23794B, 0x237952]
-StaticPokemon[]=[0x237998, 0x23799F]
-StaticPokemon[]=[0x2379E5, 0x2379EC]
-StaticPokemon[]=[0x233AB2, 0x233AB9]
-StaticPokemon[]=[0x233AFF, 0x233B06]
-StaticPokemon[]=[0x242D25, 0x242D33]
-StaticPokemon[]=[0x242BB1]
-StaticPokemon[]=[0x242BC4]
-StaticPokemon[]=[0x267A89, 0x267A99, 0x267AE3, 0x267AEE]
-StaticPokemon[]=[0x2678A1, 0x2678DB, 0x267930, 0x26793B]
-StaticPokemon[]=[0x268C5D, 0x268C8C, 0x268CDB, 0x268CE6]
-StaticPokemon[]=[0x268DA5, 0x268DB0, 0x268DFA, 0x268E05]
-StaticPokemon[]=[0x1EA261]
-StaticPokemon[]=[0x222657, 0x22265A, 0x2226DC, 0x2226ED]
-StaticPokemon[]=[0x26FC1D, 0x26FC20]
+StaticPokemon{}={Species=[0x211669, 0x21168E, 0x211691, 0x211713, 0x211721], Level=[0x211693]} // Lileep
+StaticPokemon{}={Species=[0x21167B, 0x211731, 0x211734, 0x2117B6, 0x2117C4], Level=[0x211736]} // Anorith
+StaticPokemon{}={Species=[0x23B0B6, 0x23B0C4, 0x23B119, 0x1E54AB, 0x1E552B, 0x1E55E7, 0x1E5667], Level=[0x23B0C6]} // Kyogre
+StaticPokemon{}={Species=[0x23B187, 0x23B195, 0x23B1EA, 0x1E54EB, 0x1E5627], Level=[0x23B197]} // Groudon
+StaticPokemon{}={Species=[0x22D8D2, 0x22D8DB, 0x22D921], Level=[0x22D8DD]} // Regirock
+StaticPokemon{}={Species=[0x239092, 0x23909B, 0x2390E1], Level=[0x23909D]} // Regice
+StaticPokemon{}={Species=[0x239194, 0x23919D, 0x2391E3], Level=[0x23919F]} // Registeel
+StaticPokemon{}={Species=[0x23983F, 0x239848, 0x23988E, 0x2398DD, 0x2398FB, 0x1E5789, 0x1E57A7, 0x1E583D, 0x1E585B], Level=[0x23984A]} // Rayquaza
+StaticPokemon{}={Species=[0x271FDB, 0x271FE4], Level=[0x271FE6]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x1F51E3, 0x1F51EC], Level=[0x1F51EE]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x23794B, 0x237952], Level=[0x23794D]} // Voltorb 1
+StaticPokemon{}={Species=[0x237998, 0x23799F], Level=[0x23799A]} // Voltorb 2
+StaticPokemon{}={Species=[0x2379E5, 0x2379EC], Level=[0x2379E7]} // Voltorb 3
+StaticPokemon{}={Species=[0x233AB2, 0x233AB9], Level=[0x233AB4]} // Electrode 1
+StaticPokemon{}={Species=[0x233AFF, 0x233B06], Level=[0x233B01]} // Electrode 2
+StaticPokemon{}={Species=[0x242D25, 0x242D33], Level=[0x242D35]} // Sudowoodo in Battle Frontier
+StaticPokemon{}={Species=[0x242A9C, 0x242BB1], Level=[0x242BB6]} // Latios on Southern Island
+StaticPokemon{}={Species=[0x242AA7, 0x242BC4], Level=[0x242BC9]} // Latias on Southern Island
+StaticPokemon{}={Species=[0x267A89, 0x267A99, 0x267AE3, 0x267AEE], Level=[0x267A9E]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x2678A1, 0x2678DB, 0x267930, 0x26793B], Level=[0x2678E0]} // Mew on Faraway Island
+StaticPokemon{}={Species=[0x268C5D, 0x268C8C, 0x268CDB, 0x268CE6], Level=[0x268C91]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x268DA5, 0x268DB0, 0x268DFA, 0x268E05], Level=[0x268DB5]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x1EA261]} // Wynaut Egg
+StaticPokemon{}={Species=[0x222657, 0x22265A, 0x2226DC, 0x2226ED], Level=[0x22265C]} // Beldum
+StaticPokemon{}={Species=[0x26FC1D, 0x26FC20, 0x26FCAC], Level=[0x26FC22]} // Castform
[Fire Red (F)]
Game=BPRF
@@ -1290,31 +1291,31 @@ TextSpeedValuesOffset=0x4178FC
CatchingTutorialOpponentMonOffset=0x7F8B0
PCPotionOffset=0x3FAC28
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C49A, 0x16C49D, 0x16C4DD, 0x16C511]
-StaticPokemon[]=[0x16EC34, 0x16EC3B]
-StaticPokemon[]=[0x16EC7A, 0x16EC81]
-StaticPokemon[]=[0x163862, 0x163869]
-StaticPokemon[]=[0x1638C0, 0x1638C7]
-StaticPokemon[]=[0x1637EE, 0x1637F5, 0x163849]
-StaticPokemon[]=[0x1631E2, 0x1631E9, 0x16323D]
-StaticPokemon[]=[0x163B69, 0x163B70, 0x163BC4]
-StaticPokemon[]=[0x16252C, 0x162540, 0x162586]
-StaticPokemon[]=[0x16806D, 0x168073]
-StaticPokemon[]=[0x168179, 0x16817F]
-StaticPokemon[]=[0x163CDE, 0x163CE4]
-StaticPokemon[]=[0x16530A, 0x16531A, 0x165364, 0x16536F]
-StaticPokemon[]=[0x165060, 0x16508F, 0x1650DE, 0x1650E9]
-StaticPokemon[]=[0x1651AE, 0x1651B9, 0x165203, 0x16520E]
-StaticPokemon[]=[0x16E80D, 0x16E811, 0x16E81C, 0x16E70E]
-StaticPokemon[]=[0x16E783, 0x16E787, 0x16E792, 0x16E692]
-StaticPokemon[]=[0x16E7C8, 0x16E7CC, 0x16E7D7, 0x16E6D0]
-StaticPokemon[]=[0x161AFD, 0x161B3F, 0x161B75]
-StaticPokemon[]=[0x16F7EE, 0x16F8B0]
-StaticPokemon[]=[0x16CC40, 0x16CCBC]
-StaticPokemon[]=[0x16CC50, 0x16CCC7]
-StaticPokemon[]=[0x16CC70, 0x16CCDD]
-StaticPokemon[]=[0x16CC60, 0x16CCD2]
-StaticPokemon[]=[0x16CC80, 0x16CCE8]
+StaticPokemon{}={Species=[0x16C49A, 0x16C49D, 0x16C4DD, 0x16C511], Level=[0x16C49F]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EC34, 0x16EC3B], Level=[0x16ECAE]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16EC7A, 0x16EC81], Level=[0x16ECAE]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x163862, 0x163869], Level=[0x163864]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x1638C0, 0x1638C7], Level=[0x1638C2]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x1637EE, 0x1637F5, 0x163849], Level=[0x1637F0]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x1631E2, 0x1631E9, 0x16323D, 0x1700C8, 0x1700D4], Level=[0x1631E4]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163B69, 0x163B70, 0x163BC4], Level=[0x163B6B]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x16252C, 0x162540, 0x162586], Level=[0x162542]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x16806D, 0x168073, 0x160CBE, 0x160CC4], Level=[0x16806F]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x168179, 0x16817F], Level=[0x16817B]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163CDE, 0x163CE4], Level=[0x163CE6]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16530A, 0x16531A, 0x165364, 0x16536F], Level=[0x16531F]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x165060, 0x16508F, 0x1650DE, 0x1650E9], Level=[0x165094]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x1651AE, 0x1651B9, 0x165203, 0x16520E], Level=[0x1651BE]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E80D, 0x16E811, 0x16E81C, 0x16E70E], Level=[0x16E81E]} // Old Amber
+StaticPokemon{}={Species=[0x16E783, 0x16E787, 0x16E792, 0x16E692], Level=[0x16E794]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E7C8, 0x16E7CC, 0x16E7D7, 0x16E6D0], Level=[0x16E7D9]} // Dome Fossil
+StaticPokemon{}={Species=[0x161AFA, 0x161AFD, 0x161B3F, 0x161B75], Level=[0x161AFF]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F7EB, 0x16F7EE, 0x16F8B0], Level=[0x16F7F0]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CC40, 0x16CCBC], Level=[0x16CCFF]} // Abra
+StaticPokemon{}={Species=[0x16CC50, 0x16CCC7], Level=[0x16CD14]} // Clefairy
+StaticPokemon{}={Species=[0x16CC70, 0x16CCDD], Level=[0x16CD3E]} // Scyther
+StaticPokemon{}={Species=[0x16CC60, 0x16CCD2], Level=[0x16CD29]} // Dratini
+StaticPokemon{}={Species=[0x16CC80, 0x16CCE8], Level=[0x16CD53]} // Porygon
[Leaf Green (F)]
Game=BPGF
@@ -1342,31 +1343,31 @@ TextSpeedValuesOffset=0x417738
CatchingTutorialOpponentMonOffset=0x7F884
PCPotionOffset=0x3FAA64
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C476, 0x16C479, 0x16C4B9, 0x16C4ED] // Eevee in Celadon Mansion
-StaticPokemon[]=[0x16EC10, 0x16EC17] // Hitmonlee in Fighting Dojo
-StaticPokemon[]=[0x16EC56, 0x16EC5D] // Hitmonchan in Fighting Dojo
-StaticPokemon[]=[0x16383E, 0x163845] // Electrode in The Power Plant
-StaticPokemon[]=[0x16389C, 0x1638A3] // Electrode in The Power Plant
-StaticPokemon[]=[0x1637CA, 0x1637D1, 0x163825] // Zapdos in the Power Plant
-StaticPokemon[]=[0x1631BE, 0x1631C5, 0x163219] // Articuno in the Seafoams
-StaticPokemon[]=[0x163B45, 0x163B4C, 0x163BA0] // Moltres in Mt.Ember
-StaticPokemon[]=[0x162508, 0x16251C, 0x162562] // Mewtwo in Unk. Dungeon
-StaticPokemon[]=[0x168049, 0x16804F] // Sleeping Snorlax (12)
-StaticPokemon[]=[0x168155, 0x16815B] // Sleeping Snorlax (16)
-StaticPokemon[]=[0x163CBA, 0x163CC0] // Hypno in Berry Forest
-StaticPokemon[]=[0x1652E6, 0x1652F6, 0x165340, 0x16534B] // Deoxys on Birth Island
-StaticPokemon[]=[0x16503C, 0x16506B, 0x1650BA, 0x1650C5] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x16518A, 0x165195, 0x1651DF, 0x1651EA] // Lugia on Navel Rock
-StaticPokemon[]=[0x16E7E9, 0x16E7ED, 0x16E7F8, 0x16E6EA] // Old Amber
-StaticPokemon[]=[0x16E75F, 0x16E763, 0x16E76E, 0x16E66E] // Helix Fossil
-StaticPokemon[]=[0x16E7A4, 0x16E7A8, 0x16E7B3, 0x16E6AC] // Dome Fossil
-StaticPokemon[]=[0x161AD9, 0x161B1B, 0x161B51] // Lapras in Silph. Co
-StaticPokemon[]=[0x16F7CA, 0x16F88C] // Magikarp in Mt.Moon Center
-StaticPokemon[]=[0x16CC1C, 0x16CC98] // Abra
-StaticPokemon[]=[0x16CC2C, 0x16CCA3] // Clefairy
-StaticPokemon[]=[0x16CC3C, 0x16CCCF] // Pinsir
-StaticPokemon[]=[0x16CC4C, 0x16CCAE] // Dratini
-StaticPokemon[]=[0x16CC5C, 0x16CCC4] // Porygon
+StaticPokemon{}={Species=[0x16C476, 0x16C479, 0x16C4B9, 0x16C4ED], Level=[0x16C47B]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EC10, 0x16EC17], Level=[0x16EC8A]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16EC56, 0x16EC5D], Level=[0x16EC8A]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x16383E, 0x163845], Level=[0x163840]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16389C, 0x1638A3], Level=[0x16389E]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x1637CA, 0x1637D1, 0x163825], Level=[0x1637CC]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x1631BE, 0x1631C5, 0x163219, 0x1700A4, 0x1700B0], Level=[0x1631C0]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163B45, 0x163B4C, 0x163BA0], Level=[0x163B47]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x162508, 0x16251C, 0x162562], Level=[0x16251E]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x168049, 0x16804F, 0x160C9A, 0x160CA0], Level=[0x16804B]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x168155, 0x16815B], Level=[0x168157]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163CBA, 0x163CC0], Level=[0x163CC2]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x1652E6, 0x1652F6, 0x165340, 0x16534B], Level=[0x1652FB]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x16503C, 0x16506B, 0x1650BA, 0x1650C5], Level=[0x165070]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x16518A, 0x165195, 0x1651DF, 0x1651EA], Level=[0x16519A]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E7E9, 0x16E7ED, 0x16E7F8, 0x16E6EA], Level=[0x16E7FA]} // Old Amber
+StaticPokemon{}={Species=[0x16E75F, 0x16E763, 0x16E76E, 0x16E66E], Level=[0x16E770]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E7A4, 0x16E7A8, 0x16E7B3, 0x16E6AC], Level=[0x16E7B5]} // Dome Fossil
+StaticPokemon{}={Species=[0x161AD6, 0x161AD9, 0x161B1B, 0x161B51], Level=[0x161ADB]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F7C7, 0x16F7CA, 0x16F88C], Level=[0x16F7CC]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CC1C, 0x16CC98], Level=[0x16CCDB]} // Abra
+StaticPokemon{}={Species=[0x16CC2C, 0x16CCA3], Level=[0x16CCF0]} // Clefairy
+StaticPokemon{}={Species=[0x16CC3C, 0x16CCCF], Level=[0x16CD44]} // Pinsir
+StaticPokemon{}={Species=[0x16CC4C, 0x16CCAE], Level=[0x16CD05]} // Dratini
+StaticPokemon{}={Species=[0x16CC5C, 0x16CCC4], Level=[0x16CD2F]} // Porygon
[Fire Red (G)]
Game=BPRD
@@ -1394,31 +1395,31 @@ TextSpeedValuesOffset=0x41F764
CatchingTutorialOpponentMonOffset=0x7F7F0
PCPotionOffset=0x402224
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C3DE, 0x16C3E1, 0x16C421, 0x16C455]
-StaticPokemon[]=[0x16EB78, 0x16EB7F]
-StaticPokemon[]=[0x16EBBE, 0x16EBC5]
-StaticPokemon[]=[0x1637A6, 0x1637AD]
-StaticPokemon[]=[0x163804, 0x16380B]
-StaticPokemon[]=[0x163732, 0x163739, 0x16378D]
-StaticPokemon[]=[0x163126, 0x16312D, 0x163181]
-StaticPokemon[]=[0x163AAD, 0x163AB4, 0x163B08]
-StaticPokemon[]=[0x162470, 0x162484, 0x1624CA]
-StaticPokemon[]=[0x167FB1, 0x167FB7]
-StaticPokemon[]=[0x1680BD, 0x1680C3]
-StaticPokemon[]=[0x163C22, 0x163C28]
-StaticPokemon[]=[0x16524E, 0x16525E, 0x1652A8, 0x1652B3]
-StaticPokemon[]=[0x164FA4, 0x164FD3, 0x165022, 0x16502D]
-StaticPokemon[]=[0x1650F2, 0x1650FD, 0x165147, 0x165152]
-StaticPokemon[]=[0x16E751, 0x16E755, 0x16E760, 0x16E652]
-StaticPokemon[]=[0x16E6C7, 0x16E6CB, 0x16E6D6, 0x16E5D6]
-StaticPokemon[]=[0x16E70C, 0x16E710, 0x16E71B, 0x16E614]
-StaticPokemon[]=[0x161A41, 0x161A83, 0x161AB9]
-StaticPokemon[]=[0x16F732, 0x16F7F4]
-StaticPokemon[]=[0x16CB84, 0x16CC00]
-StaticPokemon[]=[0x16CB94, 0x16CC0B]
-StaticPokemon[]=[0x16CBB4, 0x16CC21]
-StaticPokemon[]=[0x16CBA4, 0x16CC16]
-StaticPokemon[]=[0x16CBC4, 0x16CC2C]
+StaticPokemon{}={Species=[0x16C3DE, 0x16C3E1, 0x16C421, 0x16C455], Level=[0x16C3E3]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EB78, 0x16EB7F], Level=[0x16EBF2]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16EBBE, 0x16EBC5], Level=[0x16EBF2]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x1637A6, 0x1637AD], Level=[0x1637A8]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x163804, 0x16380B], Level=[0x163806]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x163732, 0x163739, 0x16378D], Level=[0x163734]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x163126, 0x16312D, 0x163181, 0x17000C, 0x170018], Level=[0x163128]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163AAD, 0x163AB4, 0x163B08], Level=[0x163AAF]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x162470, 0x162484, 0x1624CA], Level=[0x162486]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x167FB1, 0x167FB7, 0x160C02, 0x160C08], Level=[0x167FB3]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x1680BD, 0x1680C3], Level=[0x1680BF]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163C22, 0x163C28], Level=[0x163C2A]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16524E, 0x16525E, 0x1652A8, 0x1652B3], Level=[0x165263]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x164FA4, 0x164FD3, 0x165022, 0x16502D], Level=[0x164FD8]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x1650F2, 0x1650FD, 0x165147, 0x165152], Level=[0x165102]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E751, 0x16E755, 0x16E760, 0x16E652], Level=[0x16E762]} // Old Amber
+StaticPokemon{}={Species=[0x16E6C7, 0x16E6CB, 0x16E6D6, 0x16E5D6], Level=[0x16E6D8]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E70C, 0x16E710, 0x16E71B, 0x16E614], Level=[0x16E71D]} // Dome Fossil
+StaticPokemon{}={Species=[0x161A3E, 0x161A41, 0x161A83, 0x161AB9], Level=[0x161A43]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F72F, 0x16F732, 0x16F7F4], Level=[0x16F734]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CB84, 0x16CC00], Level=[0x16CC43]} // Abra
+StaticPokemon{}={Species=[0x16CB94, 0x16CC0B], Level=[0x16CC58]} // Clefairy
+StaticPokemon{}={Species=[0x16CBB4, 0x16CC21], Level=[0x16CC82]} // Scyther
+StaticPokemon{}={Species=[0x16CBA4, 0x16CC16], Level=[0x16CC6D]} // Dratini
+StaticPokemon{}={Species=[0x16CBC4, 0x16CC2C], Level=[0x16CC97]} // Porygon
[Leaf Green (G)]
Game=BPGD
@@ -1446,31 +1447,31 @@ TextSpeedValuesOffset=0x41F5A0
CatchingTutorialOpponentMonOffset=0x7F7C4
PCPotionOffset=0x402060
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C3BA, 0x16C3BD, 0x16C3FD, 0x16C431] // Eevee in Celadon Mansion
-StaticPokemon[]=[0x16EB54, 0x16EB5B] // Hitmonlee in Fighting Dojo
-StaticPokemon[]=[0x16EB9A, 0x16EBA1] // Hitmonchan in Fighting Dojo
-StaticPokemon[]=[0x163782, 0x163789] // Electrode in The Power Plant
-StaticPokemon[]=[0x1637E0, 0x1637E7] // Electrode in The Power Plant
-StaticPokemon[]=[0x16370E, 0x163715, 0x163769] // Zapdos in the Power Plant
-StaticPokemon[]=[0x163102, 0x163109, 0x16315D] // Articuno in the Seafoams
-StaticPokemon[]=[0x163A89, 0x163A90, 0x163AE4] // Moltres in Mt.Ember
-StaticPokemon[]=[0x16244C, 0x162460, 0x1624A6] // Mewtwo in Unk. Dungeon
-StaticPokemon[]=[0x167F8D, 0x167F93] // Sleeping Snorlax (12)
-StaticPokemon[]=[0x168099, 0x16809F] // Sleeping Snorlax (16)
-StaticPokemon[]=[0x163BFE, 0x163C04] // Hypno in Berry Forest
-StaticPokemon[]=[0x16522A, 0x16523A, 0x165284, 0x16528F] // Deoxys on Birth Island
-StaticPokemon[]=[0x164F80, 0x164FAF, 0x164FFE, 0x165009] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x1650CE, 0x1650D9, 0x165123, 0x16512E] // Lugia on Navel Rock
-StaticPokemon[]=[0x16E72D, 0x16E731, 0x16E73C, 0x16E62E] // Old Amber
-StaticPokemon[]=[0x16E6A3, 0x16E6A7, 0x16E6B2, 0x16E5B2] // Helix Fossil
-StaticPokemon[]=[0x16E6E8, 0x16E6EC, 0x16E6F7, 0x16E5F0] // Dome Fossil
-StaticPokemon[]=[0x161A1D, 0x161A5F, 0x161A95] // Lapras in Silph. Co
-StaticPokemon[]=[0x16F70E, 0x16F7D0] // Magikarp in Mt.Moon Center
-StaticPokemon[]=[0x16CB60, 0x16CBDC] // Abra
-StaticPokemon[]=[0x16CB70, 0x16CBE7] // Clefairy
-StaticPokemon[]=[0x16CB80, 0x16CC13] // Pinsir
-StaticPokemon[]=[0x16CB90, 0x16CBF2] // Dratini
-StaticPokemon[]=[0x16CBA0, 0x16CC08] // Porygon
+StaticPokemon{}={Species=[0x16C3BA, 0x16C3BD, 0x16C3FD, 0x16C431], Level=[0x16C3BF]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EB54, 0x16EB5B], Level=[0x16EBCE]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16EB9A, 0x16EBA1], Level=[0x16EBCE]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x163782, 0x163789], Level=[0x163784]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x1637E0, 0x1637E7], Level=[0x1637E2]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16370E, 0x163715, 0x163769], Level=[0x163710]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x163102, 0x163109, 0x16315D, 0x16FFE8, 0x16FFF4], Level=[0x163104]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163A89, 0x163A90, 0x163AE4], Level=[0x163A8B]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x16244C, 0x162460, 0x1624A6], Level=[0x162462]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x167F8D, 0x167F93, 0x160BDE, 0x160BE4], Level=[0x167F8F]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x168099, 0x16809F], Level=[0x16809B]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163BFE, 0x163C04], Level=[0x163C06]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16522A, 0x16523A, 0x165284, 0x16528F], Level=[0x16523F]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x164F80, 0x164FAF, 0x164FFE, 0x165009], Level=[0x164FB4]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x1650CE, 0x1650D9, 0x165123, 0x16512E], Level=[0x1650DE]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E72D, 0x16E731, 0x16E73C, 0x16E62E], Level=[0x16E73E]} // Old Amber
+StaticPokemon{}={Species=[0x16E6A3, 0x16E6A7, 0x16E6B2, 0x16E5B2], Level=[0x16E6B4]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E6E8, 0x16E6EC, 0x16E6F7, 0x16E5F0], Level=[0x16E6F9]} // Dome Fossil
+StaticPokemon{}={Species=[0x161A1A, 0x161A1D, 0x161A5F, 0x161A95], Level=[0x161A1F]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F70B, 0x16F70E, 0x16F7D0], Level=[0x16F710]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CB60, 0x16CBDC], Level=[0x16CC1F]} // Abra
+StaticPokemon{}={Species=[0x16CB70, 0x16CBE7], Level=[0x16CC34]} // Clefairy
+StaticPokemon{}={Species=[0x16CB80, 0x16CC13], Level=[0x16CC88]} // Pinsir
+StaticPokemon{}={Species=[0x16CB90, 0x16CBF2], Level=[0x16CC49]} // Dratini
+StaticPokemon{}={Species=[0x16CBA0, 0x16CC08], Level=[0x16CC73]} // Porygon
[Fire Red (S)]
Game=BPRS
@@ -1498,31 +1499,31 @@ TextSpeedValuesOffset=0x41A090
CatchingTutorialOpponentMonOffset=0x7F8C4
PCPotionOffset=0x3FCB9C
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C50A, 0x16C50D, 0x16C54D, 0x16C581]
-StaticPokemon[]=[0x16ECA4, 0x16ECAB]
-StaticPokemon[]=[0x16ECEA, 0x16ECF1]
-StaticPokemon[]=[0x1638D2, 0x1638D9]
-StaticPokemon[]=[0x163930, 0x163937]
-StaticPokemon[]=[0x16385E, 0x163865, 0x1638B9]
-StaticPokemon[]=[0x163252, 0x163259, 0x1632AD]
-StaticPokemon[]=[0x163BD9, 0x163BE0, 0x163C34]
-StaticPokemon[]=[0x16259C, 0x1625B0, 0x1625F6]
-StaticPokemon[]=[0x1680DD, 0x1680E3]
-StaticPokemon[]=[0x1681E9, 0x1681EF]
-StaticPokemon[]=[0x163D4E, 0x163D54]
-StaticPokemon[]=[0x16537A, 0x16538A, 0x1653D4, 0x1653DF]
-StaticPokemon[]=[0x1650D0, 0x1650FF, 0x16514E, 0x165159]
-StaticPokemon[]=[0x16521E, 0x165229, 0x165273, 0x16527E]
-StaticPokemon[]=[0x16E87D, 0x16E881, 0x16E88C, 0x16E77E]
-StaticPokemon[]=[0x16E7F3, 0x16E7F7, 0x16E802, 0x16E702]
-StaticPokemon[]=[0x16E838, 0x16E83C, 0x16E847, 0x16E740]
-StaticPokemon[]=[0x161B6D, 0x161BAF, 0x161BE5]
-StaticPokemon[]=[0x16F85E, 0x16F920]
-StaticPokemon[]=[0x16CCB0, 0x16CD2C]
-StaticPokemon[]=[0x16CCC0, 0x16CD37]
-StaticPokemon[]=[0x16CCE0, 0x16CD4D]
-StaticPokemon[]=[0x16CCD0, 0x16CD42]
-StaticPokemon[]=[0x16CCF0, 0x16CD58]
+StaticPokemon{}={Species=[0x16C50A, 0x16C50D, 0x16C54D, 0x16C581], Level=[0x16C50F]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16ECA4, 0x16ECAB], Level=[0x16ED1E]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16ECEA, 0x16ECF1], Level=[0x16ED1E]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x1638D2, 0x1638D9], Level=[0x1638D4]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x163930, 0x163937], Level=[0x163932]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16385E, 0x163865, 0x1638B9], Level=[0x163860]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x163252, 0x163259, 0x1632AD, 0x170138, 0x170144], Level=[0x163254]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163BD9, 0x163BE0, 0x163C34], Level=[0x163BDB]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x16259C, 0x1625B0, 0x1625F6], Level=[0x1625B2]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x1680DD, 0x1680E3, 0x160D2E, 0x160D34], Level=[0x1680DF]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x1681E9, 0x1681EF], Level=[0x1681EB]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163D4E, 0x163D54], Level=[0x163D56]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16537A, 0x16538A, 0x1653D4, 0x1653DF], Level=[0x16538F]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x1650D0, 0x1650FF, 0x16514E, 0x165159], Level=[0x165104]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x16521E, 0x165229, 0x165273, 0x16527E], Level=[0x16522E]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E87D, 0x16E881, 0x16E88C, 0x16E77E], Level=[0x16E88E]} // Old Amber
+StaticPokemon{}={Species=[0x16E7F3, 0x16E7F7, 0x16E802, 0x16E702], Level=[0x16E804]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E838, 0x16E83C, 0x16E847, 0x16E740], Level=[0x16E849]} // Dome Fossil
+StaticPokemon{}={Species=[0x161B6A, 0x161B6D, 0x161BAF, 0x161BE5], Level=[0x161B6F]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F85B, 0x16F85E, 0x16F920], Level=[0x16F860]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CCB0, 0x16CD2C], Level=[0x16CD6F]} // Abra
+StaticPokemon{}={Species=[0x16CCC0, 0x16CD37], Level=[0x16CD84]} // Clefairy
+StaticPokemon{}={Species=[0x16CCE0, 0x16CD4D], Level=[0x16CDAE]} // Scyther
+StaticPokemon{}={Species=[0x16CCD0, 0x16CD42], Level=[0x16CD99]} // Dratini
+StaticPokemon{}={Species=[0x16CCF0, 0x16CD58], Level=[0x16CDC3]} // Porygon
[Leaf Green (S)]
Game=BPGS
@@ -1550,31 +1551,31 @@ TextSpeedValuesOffset=0x419ECC
CatchingTutorialOpponentMonOffset=0x7F898
PCPotionOffset=0x3FC9D8
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C4E6, 0x16C4E9, 0x16C529, 0x16C55D] // Eevee in Celadon Mansion
-StaticPokemon[]=[0x16EC80, 0x16EC87] // Hitmonlee in Fighting Dojo
-StaticPokemon[]=[0x16ECC6, 0x16ECCD] // Hitmonchan in Fighting Dojo
-StaticPokemon[]=[0x1638AE, 0x1638B5] // Electrode in The Power Plant
-StaticPokemon[]=[0x16390C, 0x163913] // Electrode in The Power Plant
-StaticPokemon[]=[0x16383A, 0x163841, 0x163895] // Zapdos in the Power Plant
-StaticPokemon[]=[0x16322E, 0x163235, 0x163289] // Articuno in the Seafoams
-StaticPokemon[]=[0x163BB5, 0x163BBC, 0x163C10] // Moltres in Mt.Ember
-StaticPokemon[]=[0x162578, 0x16258C, 0x1625D2] // Mewtwo in Unk. Dungeon
-StaticPokemon[]=[0x1680B9, 0x1680BF] // Sleeping Snorlax (12)
-StaticPokemon[]=[0x1681C5, 0x1681CB] // Sleeping Snorlax (16)
-StaticPokemon[]=[0x163D2A, 0x163D30] // Hypno in Berry Forest
-StaticPokemon[]=[0x165356, 0x165366, 0x1653B0, 0x1653BB] // Deoxys on Birth Island
-StaticPokemon[]=[0x1650AC, 0x1650DB, 0x16512A, 0x165135] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x1651FA, 0x165205, 0x16524F, 0x16525A] // Lugia on Navel Rock
-StaticPokemon[]=[0x16E859, 0x16E85D, 0x16E868, 0x16E75A] // Old Amber
-StaticPokemon[]=[0x16E7CF, 0x16E7D3, 0x16E7DE, 0x16E6DE] // Helix Fossil
-StaticPokemon[]=[0x16E814, 0x16E818, 0x16E823, 0x16E71C] // Dome Fossil
-StaticPokemon[]=[0x161B49, 0x161B8B, 0x161BC1] // Lapras in Silph. Co
-StaticPokemon[]=[0x16F83A, 0x16F8FC] // Magikarp in Mt.Moon Center
-StaticPokemon[]=[0x16CC8C, 0x16CD08] // Abra
-StaticPokemon[]=[0x16CC9C, 0x16CD13] // Clefairy
-StaticPokemon[]=[0x16CCAC, 0x16CD3F] // Pinsir
-StaticPokemon[]=[0x16CCBC, 0x16CD1E] // Dratini
-StaticPokemon[]=[0x16CCCC, 0x16CD34] // Porygon
+StaticPokemon{}={Species=[0x16C4E6, 0x16C4E9, 0x16C529, 0x16C55D], Level=[0x16C4EB]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EC80, 0x16EC87], Level=[0x16ECFA]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16ECC6, 0x16ECCD], Level=[0x16ECFA]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x1638AE, 0x1638B5], Level=[0x1638B0]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16390C, 0x163913], Level=[0x16390E]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16383A, 0x163841, 0x163895], Level=[0x16383C]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x16322E, 0x163235, 0x163289, 0x170114, 0x170120], Level=[0x163230]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163BB5, 0x163BBC, 0x163C10], Level=[0x163BB7]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x162578, 0x16258C, 0x1625D2], Level=[0x16258E]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x1680B9, 0x1680BF, 0x160D0A, 0x160D10], Level=[0x1680BB]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x1681C5, 0x1681CB], Level=[0x1681C7]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163D2A, 0x163D30], Level=[0x163D32]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x165356, 0x165366, 0x1653B0, 0x1653BB], Level=[0x16536B]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x1650AC, 0x1650DB, 0x16512A, 0x165135], Level=[0x1650E0]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x1651FA, 0x165205, 0x16524F, 0x16525A], Level=[0x16520A]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E859, 0x16E85D, 0x16E868, 0x16E75A], Level=[0x16E86A]} // Old Amber
+StaticPokemon{}={Species=[0x16E7CF, 0x16E7D3, 0x16E7DE, 0x16E6DE], Level=[0x16E7E0]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E814, 0x16E818, 0x16E823, 0x16E71C], Level=[0x16E825]} // Dome Fossil
+StaticPokemon{}={Species=[0x161B46, 0x161B49, 0x161B8B, 0x161BC1], Level=[0x161B4B]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F837, 0x16F83A, 0x16F8FC], Level=[0x16F83C]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CC8C, 0x16CD08], Level=[0x16CD4B]} // Abra
+StaticPokemon{}={Species=[0x16CC9C, 0x16CD13], Level=[0x16CD60]} // Clefairy
+StaticPokemon{}={Species=[0x16CCAC, 0x16CD3F], Level=[0x16CDB4]} // Pinsir
+StaticPokemon{}={Species=[0x16CCBC, 0x16CD1E], Level=[0x16CD75]} // Dratini
+StaticPokemon{}={Species=[0x16CCCC, 0x16CD34], Level=[0x16CD9F]} // Porygon
[Fire Red (I)]
Game=BPRI
@@ -1602,31 +1603,31 @@ TextSpeedValuesOffset=0x4169E8
CatchingTutorialOpponentMonOffset=0x7F7DC
PCPotionOffset=0x3F99B0
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C41E, 0x16C421, 0x16C461, 0x16C495]
-StaticPokemon[]=[0x16EBB8, 0x16EBBF]
-StaticPokemon[]=[0x16EBFE, 0x16EC05]
-StaticPokemon[]=[0x1637E6, 0x1637ED]
-StaticPokemon[]=[0x163844, 0x16384B]
-StaticPokemon[]=[0x163772, 0x163779, 0x1637CD]
-StaticPokemon[]=[0x163166, 0x16316D, 0x1631C1]
-StaticPokemon[]=[0x163AED, 0x163AF4, 0x163B48]
-StaticPokemon[]=[0x1624B0, 0x1624C4, 0x16250A]
-StaticPokemon[]=[0x167FF1, 0x167FF7]
-StaticPokemon[]=[0x1680FD, 0x168103]
-StaticPokemon[]=[0x163C62, 0x163C68]
-StaticPokemon[]=[0x16528E, 0x16529E, 0x1652E8, 0x1652F3]
-StaticPokemon[]=[0x164FE4, 0x165013, 0x165062, 0x16506D]
-StaticPokemon[]=[0x165132, 0x16513D, 0x165187, 0x165192]
-StaticPokemon[]=[0x16E791, 0x16E795, 0x16E7A0, 0x16E692]
-StaticPokemon[]=[0x16E707, 0x16E70B, 0x16E716, 0x16E616]
-StaticPokemon[]=[0x16E74C, 0x16E750, 0x16E75B, 0x16E654]
-StaticPokemon[]=[0x161A81, 0x161AC3, 0x161AF9]
-StaticPokemon[]=[0x16F772, 0x16F834]
-StaticPokemon[]=[0x16CBC4, 0x16CC40]
-StaticPokemon[]=[0x16CBD4, 0x16CC4B]
-StaticPokemon[]=[0x16CBF4, 0x16CC61]
-StaticPokemon[]=[0x16CBE4, 0x16CC56]
-StaticPokemon[]=[0x16CC04, 0x16CC6C]
+StaticPokemon{}={Species=[0x16C41E, 0x16C421, 0x16C461, 0x16C495], Level=[0x16C423]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EBB8, 0x16EBBF], Level=[0x16EC32]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16EBFE, 0x16EC05], Level=[0x16EC32]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x1637E6, 0x1637ED], Level=[0x1637E8]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x163844, 0x16384B], Level=[0x163846]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x163772, 0x163779, 0x1637CD], Level=[0x163774]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x163166, 0x16316D, 0x1631C1, 0x17004C, 0x170058], Level=[0x163168]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163AED, 0x163AF4, 0x163B48], Level=[0x163AEF]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x1624B0, 0x1624C4, 0x16250A], Level=[0x1624C6]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x167FF1, 0x167FF7, 0x160C42, 0x160C48], Level=[0x167FF3]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x1680FD, 0x168103], Level=[0x1680FF]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163C62, 0x163C68], Level=[0x163C6A]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16528E, 0x16529E, 0x1652E8, 0x1652F3], Level=[0x1652A3]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x164FE4, 0x165013, 0x165062, 0x16506D], Level=[0x165018]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x165132, 0x16513D, 0x165187, 0x165192], Level=[0x165142]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E791, 0x16E795, 0x16E7A0, 0x16E692], Level=[0x16E7A2]} // Old Amber
+StaticPokemon{}={Species=[0x16E707, 0x16E70B, 0x16E716, 0x16E616], Level=[0x16E718]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E74C, 0x16E750, 0x16E75B, 0x16E654], Level=[0x16E75D]} // Dome Fossil
+StaticPokemon{}={Species=[0x161A7E, 0x161A81, 0x161AC3, 0x161AF9], Level=[0x161A83]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F76F, 0x16F772, 0x16F834], Level=[0x16F774]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CBC4, 0x16CC40], Level=[0x16CC83]} // Abra
+StaticPokemon{}={Species=[0x16CBD4, 0x16CC4B], Level=[0x16CC98]} // Clefairy
+StaticPokemon{}={Species=[0x16CBF4, 0x16CC61], Level=[0x16CCC2]} // Scyther
+StaticPokemon{}={Species=[0x16CBE4, 0x16CC56], Level=[0x16CCAD]} // Dratini
+StaticPokemon{}={Species=[0x16CC04, 0x16CC6C], Level=[0x16CCD7]} // Porygon
[Leaf Green (I)]
Game=BPGI
@@ -1654,31 +1655,31 @@ TextSpeedValuesOffset=0x416824
CatchingTutorialOpponentMonOffset=0x7F7B0
PCPotionOffset=0x3F97EC
StaticPokemonSupport=1
-StaticPokemon[]=[0x16C3FA, 0x16C3FD, 0x16C43D, 0x16C471] // Eevee in Celadon Mansion
-StaticPokemon[]=[0x16EB94, 0x16EB9B] // Hitmonlee in Fighting Dojo
-StaticPokemon[]=[0x16EBDA, 0x16EBE1] // Hitmonchan in Fighting Dojo
-StaticPokemon[]=[0x1637C2, 0x1637C9] // Electrode in The Power Plant
-StaticPokemon[]=[0x163820, 0x163827] // Electrode in The Power Plant
-StaticPokemon[]=[0x16374E, 0x163755, 0x1637A9] // Zapdos in the Power Plant
-StaticPokemon[]=[0x163142, 0x163149, 0x16319D] // Articuno in the Seafoams
-StaticPokemon[]=[0x163AC9, 0x163AD0, 0x163B24] // Moltres in Mt.Ember
-StaticPokemon[]=[0x16248C, 0x1624A0, 0x1624E6] // Mewtwo in Unk. Dungeon
-StaticPokemon[]=[0x167FCD, 0x167FD3] // Sleeping Snorlax (12)
-StaticPokemon[]=[0x1680D9, 0x1680DF] // Sleeping Snorlax (16)
-StaticPokemon[]=[0x163C3E, 0x163C44] // Hypno in Berry Forest
-StaticPokemon[]=[0x16526A, 0x16527A, 0x1652C4, 0x1652CF] // Deoxys on Birth Island
-StaticPokemon[]=[0x164FC0, 0x164FEF, 0x16503E, 0x165049] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x16510E, 0x165119, 0x165163, 0x16516E] // Lugia on Navel Rock
-StaticPokemon[]=[0x16E76D, 0x16E771, 0x16E77C, 0x16E66E] // Old Amber
-StaticPokemon[]=[0x16E6E3, 0x16E6E7, 0x16E6F2, 0x16E5F2] // Helix Fossil
-StaticPokemon[]=[0x16E728, 0x16E72C, 0x16E737, 0x16E630] // Dome Fossil
-StaticPokemon[]=[0x161A5D, 0x161A9F, 0x161AD5] // Lapras in Silph. Co
-StaticPokemon[]=[0x16F74E, 0x16F810] // Magikarp in Mt.Moon Center
-StaticPokemon[]=[0x16CBA0, 0x16CC1C] // Abra
-StaticPokemon[]=[0x16CBB0, 0x16CC27] // Clefairy
-StaticPokemon[]=[0x16CBC0, 0x16CC53] // Pinsir
-StaticPokemon[]=[0x16CBD0, 0x16CC32] // Dratini
-StaticPokemon[]=[0x16CBE0, 0x16CC48] // Porygon
+StaticPokemon{}={Species=[0x16C3FA, 0x16C3FD, 0x16C43D, 0x16C471], Level=[0x16C3FF]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x16EB94, 0x16EB9B], Level=[0x16EC0E]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x16EBDA, 0x16EBE1], Level=[0x16EC0E]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x1637C2, 0x1637C9], Level=[0x1637C4]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x163820, 0x163827], Level=[0x163822]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16374E, 0x163755, 0x1637A9], Level=[0x163750]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x163142, 0x163149, 0x16319D, 0x170028, 0x170034], Level=[0x163144]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x163AC9, 0x163AD0, 0x163B24], Level=[0x163ACB]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x16248C, 0x1624A0, 0x1624E6], Level=[0x1624A2]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x167FCD, 0x167FD3, 0x160C1E, 0x160C24], Level=[0x167FCF]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x1680D9, 0x1680DF], Level=[0x1680DB]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x163C3E, 0x163C44], Level=[0x163C46]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16526A, 0x16527A, 0x1652C4, 0x1652CF], Level=[0x16527F]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x164FC0, 0x164FEF, 0x16503E, 0x165049], Level=[0x164FF4]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x16510E, 0x165119, 0x165163, 0x16516E], Level=[0x16511E]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x16E76D, 0x16E771, 0x16E77C, 0x16E66E], Level=[0x16E77E]} // Old Amber
+StaticPokemon{}={Species=[0x16E6E3, 0x16E6E7, 0x16E6F2, 0x16E5F2], Level=[0x16E6F4]} // Helix Fossil
+StaticPokemon{}={Species=[0x16E728, 0x16E72C, 0x16E737, 0x16E630], Level=[0x16E739]} // Dome Fossil
+StaticPokemon{}={Species=[0x161A5A, 0x161A5D, 0x161A9F, 0x161AD5], Level=[0x161A5F]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x16F74B, 0x16F74E, 0x16F810], Level=[0x16F750]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x16CBA0, 0x16CC1C], Level=[0x16CC5F]} // Abra
+StaticPokemon{}={Species=[0x16CBB0, 0x16CC27], Level=[0x16CC74]} // Clefairy
+StaticPokemon{}={Species=[0x16CBC0, 0x16CC53], Level=[0x16CCC8]} // Pinsir
+StaticPokemon{}={Species=[0x16CBD0, 0x16CC32], Level=[0x16CC89]} // Dratini
+StaticPokemon{}={Species=[0x16CBE0, 0x16CC48], Level=[0x16CCB3]} // Porygon
[Ruby (J)]
Game=AXVJ
@@ -1727,24 +1728,25 @@ CatchingTutorialOpponentMonOffset=0x7E9D8
CatchingTutorialPlayerMonOffset=0x10A606
PCPotionOffset=0x3E177C
StaticPokemonSupport=1
-StaticPokemon[]=[0x162B23, 0x162B50] // Lileep
-StaticPokemon[]=[0x162B75, 0x162BA2] // Anorith
-StaticPokemon[]=[0x174A01, 0x1800AD, 0x1749FA] // Groudon
-StaticPokemon[]=[0x171D3A, 0x171D43] // Regirock
-StaticPokemon[]=[0x1767CC, 0x1767D5] // Regice
-StaticPokemon[]=[0x17687F, 0x176888] // Registeel
-StaticPokemon[]=[0x179434, 0x17945A] // Latias (Southern Island)
-StaticPokemon[]=[0x176B44, 0x176B4B] // Rayquaza
-StaticPokemon[]=[0x1801EC, 0x1801F5] // Kecleons on OW (7)
-StaticPokemon[]=[0x153337, 0x153340] // Kecleon w/ Steven
-StaticPokemon[]=[0x175ADB, 0x175AE2] // Voltorb 1
-StaticPokemon[]=[0x175AF9, 0x175B00] // Voltorb 2
-StaticPokemon[]=[0x175B17, 0x175B1E] // Voltorb 3
-StaticPokemon[]=[0x18010A, 0x180111] // Electrode 1
-StaticPokemon[]=[0x180128, 0x18012F] // Electrode 2
-StaticPokemon[]=[0x14CF1E] // Wynaut Egg
-StaticPokemon[]=[0x16C023, 0x16C033] // Beldum
-StaticPokemon[]=[0x17E914] // Castform
+StaticPokemon{}={Species=[0x162B23, 0x162B50], Level=[0x162B52]} // Lileep
+StaticPokemon{}={Species=[0x162B75, 0x162BA2], Level=[0x162BA4]} // Anorith
+StaticPokemon{}={Species=[0x174A01, 0x1800AD, 0x1749FA], Level=[0x1749FC]} // Groudon
+StaticPokemon{}={Species=[0x171D3A, 0x171D43], Level=[0x171D45]} // Regirock
+StaticPokemon{}={Species=[0x1767CC, 0x1767D5], Level=[0x1767D7]} // Regice
+StaticPokemon{}={Species=[0x17687F, 0x176888], Level=[0x17688A]} // Registeel
+StaticPokemon{}={Species=[0x179434, 0x17945A], Level=[0x17945C]} // Latias (Southern Island)
+StaticPokemon{}={Species=[0x176B44, 0x176B4B], Level=[0x176B46]} // Rayquaza
+StaticPokemon{}={Species=[0x1801EC, 0x1801F5], Level=[0x1801F7]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x153337, 0x153340], Level=[0x153342]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x175ADB, 0x175AE2], Level=[0x175ADD]} // Voltorb 1
+StaticPokemon{}={Species=[0x175AF9, 0x175B00], Level=[0x175AFB]} // Voltorb 2
+StaticPokemon{}={Species=[0x175B17, 0x175B1E], Level=[0x175B19]} // Voltorb 3
+StaticPokemon{}={Species=[0x18010A, 0x180111], Level=[0x18010C]} // Electrode 1
+StaticPokemon{}={Species=[0x180128, 0x18012F], Level=[0x18012A]} // Electrode 2
+StaticPokemon{}={Species=[0x14CF1E]} // Wynaut Egg
+StaticPokemon{}={Species=[0x16C023, 0x16C033], Level=[0x16C025]} // Beldum
+StaticPokemon{}={Species=[0x17E914], Level=[0x17E916]} // Castform
+StaticEggPokemonOffsets=[15]
[Sapphire (J)]
Game=AXPJ
@@ -1769,24 +1771,24 @@ TradeTableOffset=0x1E9BD8
RunIndoorsTweakOffset=0xE0D88
PCPotionOffset=0x3E1760
StaticPokemonSupport=1
-StaticPokemon[]=[0x162AB3, 0x162AE0] // Lileep
-StaticPokemon[]=[0x162B05, 0x162B32] // Anorith
-StaticPokemon[]=[0x174991, 0x18003D, 0x17498A] // Groudon
-StaticPokemon[]=[0x171CCA, 0x171CD3] // Regirock
-StaticPokemon[]=[0x17675C, 0x176765] // Regice
-StaticPokemon[]=[0x17680F, 0x176818] // Registeel
-StaticPokemon[]=[0x1793C4, 0x1793EA] // Latias (Southern Island)
-StaticPokemon[]=[0x176AD4, 0x176ADB] // Rayquaza
-StaticPokemon[]=[0x18017C, 0x180185] // Kecleons on OW (7)
-StaticPokemon[]=[0x1532CB, 0x1532D4] // Kecleon w/ Steven
-StaticPokemon[]=[0x175A6B, 0x175A72] // Voltorb 1
-StaticPokemon[]=[0x175A89, 0x175A90] // Voltorb 2
-StaticPokemon[]=[0x175AA7, 0x175AAE] // Voltorb 3
-StaticPokemon[]=[0x18009A, 0x1800A1] // Electrode 1
-StaticPokemon[]=[0x1800B8, 0x1800BF] // Electrode 2
-StaticPokemon[]=[0x14CEB2] // Wynaut Egg
-StaticPokemon[]=[0x16BFB3, 0x16BFC3] // Beldum
-StaticPokemon[]=[0x17E8A4] // Castform
+StaticPokemon{}={Species=[0x162AB3, 0x162AE0], Level=[0x162AE2]} // Lileep
+StaticPokemon{}={Species=[0x162B05, 0x162B32], Level=[0x162B34]} // Anorith
+StaticPokemon{}={Species=[0x174991, 0x18003D, 0x17498A], Level=[0x17498C]} // Kyogre
+StaticPokemon{}={Species=[0x171CCA, 0x171CD3], Level=[0x171CD5]} // Regirock
+StaticPokemon{}={Species=[0x17675C, 0x176765], Level=[0x176767]} // Regice
+StaticPokemon{}={Species=[0x17680F, 0x176818], Level=[0x17681A]} // Registeel
+StaticPokemon{}={Species=[0x1793C4, 0x1793EA], Level=[0x1793EC]} // Latios (Southern Island)
+StaticPokemon{}={Species=[0x176AD4, 0x176ADB], Level=[0x176AD6]} // Rayquaza
+StaticPokemon{}={Species=[0x18017C, 0x180185], Level=[0x180187]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x1532CB, 0x1532D4], Level=[0x1532D6]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x175A6B, 0x175A72], Level=[0x175A6D]} // Voltorb 1
+StaticPokemon{}={Species=[0x175A89, 0x175A90], Level=[0x175A8B]} // Voltorb 2
+StaticPokemon{}={Species=[0x175AA7, 0x175AAE], Level=[0x175AA9]} // Voltorb 3
+StaticPokemon{}={Species=[0x18009A, 0x1800A1], Level=[0x18009C]} // Electrode 1
+StaticPokemon{}={Species=[0x1800B8, 0x1800BF], Level=[0x1800BA]} // Electrode 2
+StaticPokemon{}={Species=[0x14CEB2]} // Wynaut Egg
+StaticPokemon{}={Species=[0x16BFB3, 0x16BFC3], Level=[0x16BFB5]} // Beldum
+StaticPokemon{}={Species=[0x17E8A4], Level=[0x17E8A6]} // Castform
[Emerald (J)]
Game=BPEJ
@@ -1832,31 +1834,32 @@ CatchingTutorialOpponentMonOffset=0xB016C
CatchingTutorialPlayerMonOffset=0x1394E2
PCPotionOffset=0x5C0BE0
StaticPokemonSupport=1
-StaticPokemon[]=[0x2015EE, 0x201613, 0x201616, 0x201698, 0x2016A6] // Lileep
-StaticPokemon[]=[0x201600, 0x2016B6, 0x2016B9, 0x20173B, 0x201749] // Anorith
-StaticPokemon[]=[0x21D057, 0x21D065, 0x21D0BA] // Kyogre
-StaticPokemon[]=[0x21D128, 0x21D136, 0x21D18B] // Groudon
-StaticPokemon[]=[0x213E8A, 0x213E93, 0x213ED9] // Regirock
-StaticPokemon[]=[0x21B8A1, 0x21B8AA, 0x21B8F0] // Regice
-StaticPokemon[]=[0x21B9A3, 0x21B9AC, 0x21B9F2] // Registeel
-StaticPokemon[]=[0x21BF95, 0x21BF9E, 0x21BFE4] // Rayquaza
-StaticPokemon[]=[0x243407, 0x243410] // Kecleons on OW (7)
-StaticPokemon[]=[0x1EDB4E, 0x1EDB57] // Kecleon w/ Steven
-StaticPokemon[]=[0x21A80D, 0x21A814] // Voltorb 1
-StaticPokemon[]=[0x21A85A, 0x21A861] // Voltorb 2
-StaticPokemon[]=[0x21A8A7, 0x21A8AE] // Voltorb 3
-StaticPokemon[]=[0x217CF7, 0x217CFE] // Electrode 1
-StaticPokemon[]=[0x217D44, 0x217D4B] // Electrode 2
-StaticPokemon[]=[0x222AB7, 0x222AC5] // Sudowoodo in Battle Frontier
-StaticPokemon[]=[0x222944]
-StaticPokemon[]=[0x222957] // Latias/Latios on Southern Island
-StaticPokemon[]=[0x23B6A0, 0x23B6B0, 0x23B6FA, 0x23B705] // Deoxys on Birth Island
-StaticPokemon[]=[0x23B4DB, 0x23B515, 0x23B56A, 0x23B575] // Mew on Faraway Island
-StaticPokemon[]=[0x23C1AE, 0x23C1DD, 0x23C22C, 0x23C237] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x23C2F6, 0x23C301, 0x23C34B, 0x23C356] // Lugia on Navel Rock
-StaticPokemon[]=[0x1E5912] // Wynaut Egg
-StaticPokemon[]=[0x20C8FA, 0x20C8FD, 0x20C97F, 0x20C990] // Beldum
-StaticPokemon[]=[0x24161F, 0x241622] // Castform
+StaticPokemon{}={Species=[0x2015EE, 0x201613, 0x201616, 0x201698, 0x2016A6], Level=[0x201618]} // Lileep
+StaticPokemon{}={Species=[0x201600, 0x2016B6, 0x2016B9, 0x20173B, 0x201749], Level=[0x2016BB]} // Anorith
+StaticPokemon{}={Species=[0x21D057, 0x21D065, 0x21D0BA, 0x1E201C, 0x1E209C, 0x1E2158, 0x1E21D8], Level=[0x21D067]} // Kyogre
+StaticPokemon{}={Species=[0x21D128, 0x21D136, 0x21D18B, 0x1E205C, 0x1E2198], Level=[0x21D138]} // Groudon
+StaticPokemon{}={Species=[0x213E8A, 0x213E93, 0x213ED9], Level=[0x213E95]} // Regirock
+StaticPokemon{}={Species=[0x21B8A1, 0x21B8AA, 0x21B8F0], Level=[0x21B8AC]} // Regice
+StaticPokemon{}={Species=[0x21B9A3, 0x21B9AC, 0x21B9F2], Level=[0x21B9AE]} // Registeel
+StaticPokemon{}={Species=[0x21BF95, 0x21BF9E, 0x21BFE4, 0x21C033, 0x21C051, 0x1E22FA, 0x1E2318, 0x1E23AE, 0x1E23CC], Level=[0x21BFA0]} // Rayquaza
+StaticPokemon{}={Species=[0x243407, 0x243410], Level=[0x243412]} // Kecleons on OW (7)
+StaticPokemon{}={Species=[0x1EDB4E, 0x1EDB57], Level=[0x1EDB59]} // Kecleon w/ Steven
+StaticPokemon{}={Species=[0x21A80D, 0x21A814], Level=[0x21A80F]} // Voltorb 1
+StaticPokemon{}={Species=[0x21A85A, 0x21A861], Level=[0x21A85C]} // Voltorb 2
+StaticPokemon{}={Species=[0x21A8A7, 0x21A8AE], Level=[0x21A8A9]} // Voltorb 3
+StaticPokemon{}={Species=[0x217CF7, 0x217CFE], Level=[0x217CF9]} // Electrode 1
+StaticPokemon{}={Species=[0x217D44, 0x217D4B], Level=[0x217D46]} // Electrode 2
+StaticPokemon{}={Species=[0x222AB7, 0x222AC5], Level=[0x222AC7]} // Sudowoodo in Battle Frontier
+StaticPokemon{}={Species=[0x22282F, 0x222944], Level=[0x222949]} // Latios on Southern Island
+StaticPokemon{}={Species=[0x22283A, 0x222957], Level=[0x22295C]} // Latias on Southern Island
+StaticPokemon{}={Species=[0x23B6A0, 0x23B6B0, 0x23B6FA, 0x23B705], Level=[0x23B6B5]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x23B4DB, 0x23B515, 0x23B56A, 0x23B575], Level=[0x23B51A]} // Mew on Faraway Island
+StaticPokemon{}={Species=[0x23C1AE, 0x23C1DD, 0x23C22C, 0x23C237], Level=[0x23C1E2]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x23C2F6, 0x23C301, 0x23C34B, 0x23C356], Level=[0x23C306]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x1E5912]} // Wynaut Egg
+StaticPokemon{}={Species=[0x20C8FA, 0x20C8FD, 0x20C97F, 0x20C990], Level=[0x20C8FF]} // Beldum
+StaticPokemon{}={Species=[0x24161F, 0x241622, 0x2416AE], Level=[0x241624]} // Castform
+StaticEggPokemonOffsets=[22]
[Emerald (T-Eng)]
Game=BPET
@@ -1909,31 +1912,31 @@ TextSpeedValuesOffset=0x3E30CC
CatchingTutorialOpponentMonOffset=0x7EFB4
PCPotionOffset=0x3C83F8
StaticPokemonSupport=1
-StaticPokemon[]=[0x184BB8, 0x184BBB, 0x184BFB, 0x184C2F] // Eevee in Celadon Mansion
-StaticPokemon[]=[0x18A2E0, 0x18A2E7] // Hitmonlee in Fighting Dojo
-StaticPokemon[]=[0x18A326, 0x18A32D] // Hitmonchan in Fighting Dojo
-StaticPokemon[]=[0x16C18B, 0x16C192] // Electrode in The Power Plant
-StaticPokemon[]=[0x16C1E9, 0x16C1F0] // Electrode in The Power Plant
-StaticPokemon[]=[0x16C117, 0x16C11E, 0x16C172] // Zapdos in the Power Plant
-StaticPokemon[]=[0x16B2B8, 0x16B2BF, 0x16B313] // Articuno in the Seafoams
-StaticPokemon[]=[0x16C846, 0x16C84D, 0x16C8A1] // Moltres in Mt.Ember
-StaticPokemon[]=[0x1693E1, 0x1693F5, 0x16943B] // Mewtwo in Unk. Dungeon
-StaticPokemon[]=[0x1769F0, 0x1769F7] // Sleeping Snorlax (12)
-StaticPokemon[]=[0x177A5E, 0x177A65] // Sleeping Snorlax (16)
-StaticPokemon[]=[0x16C9CA, 0x16C9D0] // Hypno in Berry Forest
-StaticPokemon[]=[0x16F243, 0x16F253, 0x16F29D, 0x16F2A8] // Deoxys on Birth Island
-StaticPokemon[]=[0x16EF99, 0x16EFC8, 0x16F017, 0x16F022] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x16F0E7, 0x16F0F2, 0x16F13C, 0x16F147] // Lugia on Navel Rock
-StaticPokemon[]=[0x18959C, 0x1895A0, 0x1895AB, 0x18949D] // Old Amber
-StaticPokemon[]=[0x189512, 0x189516, 0x189521, 0x189421] // Helix Fossil
-StaticPokemon[]=[0x189557, 0x18955B, 0x189566, 0x18945F] // Dome Fossil
-StaticPokemon[]=[0x1675D8, 0x167617, 0x16764A] // Lapras in Silph. Co
-StaticPokemon[]=[0x18C668, 0x18C727] // Magikarp in Mt.Moon Center
-StaticPokemon[]=[0x185A8A, 0x185B06] // Abra
-StaticPokemon[]=[0x185A9A, 0x185B11] // Clefairy
-StaticPokemon[]=[0x185ABA, 0x185B27] // Scyther
-StaticPokemon[]=[0x185AAA, 0x185B1C] // Dratini
-StaticPokemon[]=[0x185ACA, 0x185B32] // Porygon
+StaticPokemon{}={Species=[0x184BB8, 0x184BBB, 0x184BFB, 0x184C2F], Level=[0x184BBD]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x18A2E0, 0x18A2E7], Level=[0x18A35A]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x18A326, 0x18A32D], Level=[0x18A35A]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x16C18B, 0x16C192], Level=[0x16C18D]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16C1E9, 0x16C1F0], Level=[0x16C1EB]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16C117, 0x16C11E, 0x16C172], Level=[0x16C119]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x16B2B8, 0x16B2BF, 0x16B313, 0x18DE82, 0x18DE8E], Level=[0x16B2BA]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x16C846, 0x16C84D, 0x16C8A1], Level=[0x16C848]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x1693E1, 0x1693F5, 0x16943B], Level=[0x1693F7]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x1769F0, 0x1769F7, 0x16505E, 0x165064], Level=[0x1769F2]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x177A5E, 0x177A65], Level=[0x177A60]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x16C9CA, 0x16C9D0], Level=[0x16C9D2]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16F243, 0x16F253, 0x16F29D, 0x16F2A8], Level=[0x16F258]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x16EF99, 0x16EFC8, 0x16F017, 0x16F022], Level=[0x16EFCD]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x16F0E7, 0x16F0F2, 0x16F13C, 0x16F147], Level=[0x16F0F7]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x18959C, 0x1895A0, 0x1895AB, 0x18949D], Level=[0x1895AD]} // Old Amber
+StaticPokemon{}={Species=[0x189512, 0x189516, 0x189521, 0x189421], Level=[0x189523]} // Helix Fossil
+StaticPokemon{}={Species=[0x189557, 0x18955B, 0x189566, 0x18945F], Level=[0x189568]} // Dome Fossil
+StaticPokemon{}={Species=[0x1675D5, 0x1675D8, 0x167617, 0x16764A], Level=[0x1675DA]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x18C665, 0x18C668, 0x18C727], Level=[0x18C66A]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x185A8A, 0x185B06], Level=[0x185B49]} // Abra
+StaticPokemon{}={Species=[0x185A9A, 0x185B11], Level=[0x185B5E]} // Clefairy
+StaticPokemon{}={Species=[0x185ABA, 0x185B27], Level=[0x185B88]} // Scyther
+StaticPokemon{}={Species=[0x185AAA, 0x185B1C], Level=[0x185B73]} // Dratini
+StaticPokemon{}={Species=[0x185ACA, 0x185B32], Level=[0x185B9D]} // Porygon
[Fire Red (J) 1.1]
Game=BPRJ
@@ -1959,31 +1962,31 @@ TextSpeedValuesOffset=0x3DEA24
CatchingTutorialOpponentMonOffset=0x7EF44
PCPotionOffset=0x3C3D50
StaticPokemonSupport=1
-StaticPokemon[]=[0x184774, 0x184777, 0x1847B7, 0x1847EB] // Eevee in Celadon Mansion
-StaticPokemon[]=[0x189E9C, 0x189EA3] // Hitmonlee in Fighting Dojo
-StaticPokemon[]=[0x189EE2, 0x189EE9] // Hitmonchan in Fighting Dojo
-StaticPokemon[]=[0x16BD20, 0x16BD27] // Electrode in The Power Plant
-StaticPokemon[]=[0x16BD7E, 0x16BD85] // Electrode in The Power Plant
-StaticPokemon[]=[0x16BCAC, 0x16BCB3, 0x16BD07] // Zapdos in the Power Plant
-StaticPokemon[]=[0x16AE48, 0x16AE4F, 0x16AEA3] // Articuno in the Seafoams
-StaticPokemon[]=[0x16C3DB, 0x16C3E2, 0x16C436] // Moltres in Mt.Ember
-StaticPokemon[]=[0x168F71, 0x168F85, 0x168FCB] // Mewtwo in Unk. Dungeon
-StaticPokemon[]=[0x1765A4, 0x1765AB] // Sleeping Snorlax (12)
-StaticPokemon[]=[0x177612, 0x177619] // Sleeping Snorlax (16)
-StaticPokemon[]=[0x16C55F, 0x16C565] // Hypno in Berry Forest
-StaticPokemon[]=[0x16EDDB, 0x16EDEB, 0x16EE35, 0x16EE40] // Deoxys on Birth Island
-StaticPokemon[]=[0x16EB31, 0x16EB60, 0x16EBAF, 0x16EBBA] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x16EC7F, 0x16EC8A, 0x16ECD4, 0x16ECDF] // Lugia on Navel Rock
-StaticPokemon[]=[0x189158, 0x18915C, 0x189167, 0x189059] // Old Amber
-StaticPokemon[]=[0x1890CE, 0x1890D2, 0x1890DD, 0x188FDD] // Helix Fossil
-StaticPokemon[]=[0x189113, 0x189117, 0x189122, 0x18901B] // Dome Fossil
-StaticPokemon[]=[0x167163, 0x1671A2, 0x1671D5] // Lapras in Silph. Co
-StaticPokemon[]=[0x18C224, 0x18C2E3] // Magikarp in Mt.Moon Center
-StaticPokemon[]=[0x185646, 0x1856C2] // Abra
-StaticPokemon[]=[0x185656, 0x1856CD] // Clefairy
-StaticPokemon[]=[0x185676, 0x1856E3] // Scyther
-StaticPokemon[]=[0x185666, 0x1856D8] // Dratini
-StaticPokemon[]=[0x185686, 0x1856EE] // Porygon
+StaticPokemon{}={Species=[0x184774, 0x184777, 0x1847B7, 0x1847EB], Level=[0x184779]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x189E9C, 0x189EA3], Level=[0x189F16]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x189EE2, 0x189EE9], Level=[0x189F16]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x16BD20, 0x16BD27], Level=[0x16BD22]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16BD7E, 0x16BD85], Level=[0x16BD80]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16BCAC, 0x16BCB3, 0x16BD07], Level=[0x16BCAE]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x16AE48, 0x16AE4F, 0x16AEA3, 0x18DA3E, 0x18DA4A], Level=[0x16AE4A]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x16C3DB, 0x16C3E2, 0x16C436], Level=[0x16C3DD]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x168F71, 0x168F85, 0x168FCB], Level=[0x168F87]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x1765A4, 0x1765AB, 0x164BE4, 0x164BEA], Level=[0x1765A6]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x177612, 0x177619], Level=[0x177614]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x16C55F, 0x16C565], Level=[0x16C567]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16EDDB, 0x16EDEB, 0x16EE35, 0x16EE40], Level=[0x16EDF0]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x16EB31, 0x16EB60, 0x16EBAF, 0x16EBBA], Level=[0x16EB65]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x16EC7F, 0x16EC8A, 0x16ECD4, 0x16ECDF], Level=[0x16EC8F]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x189158, 0x18915C, 0x189167, 0x189059], Level=[0x189169]} // Old Amber
+StaticPokemon{}={Species=[0x1890CE, 0x1890D2, 0x1890DD, 0x188FDD], Level=[0x1890DF]} // Helix Fossil
+StaticPokemon{}={Species=[0x189113, 0x189117, 0x189122, 0x18901B], Level=[0x189124]} // Dome Fossil
+StaticPokemon{}={Species=[0x167160, 0x167163, 0x1671A2, 0x1671D5], Level=[0x167165]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x18C221, 0x18C224, 0x18C2E3], Level=[0x18C226]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x185646, 0x1856C2], Level=[0x185705]} // Abra
+StaticPokemon{}={Species=[0x185656, 0x1856CD], Level=[0x18571A]} // Clefairy
+StaticPokemon{}={Species=[0x185676, 0x1856E3], Level=[0x185744]} // Scyther
+StaticPokemon{}={Species=[0x185666, 0x1856D8], Level=[0x18572F]} // Dratini
+StaticPokemon{}={Species=[0x185686, 0x1856EE], Level=[0x185759]} // Porygon
[Leaf Green (J)]
Game=BPGJ
@@ -2010,28 +2013,28 @@ TextSpeedValuesOffset=0x3E2F3C
CatchingTutorialOpponentMonOffset=0x7EF88
PCPotionOffset=0x3C8268
StaticPokemonSupport=1
-StaticPokemon[]=[0x184B94, 0x184B97, 0x184BD7, 0x184C0B] // Eevee in Celadon Mansion
-StaticPokemon[]=[0x18A2BC, 0x18A2C3] // Hitmonlee in Fighting Dojo
-StaticPokemon[]=[0x18A302, 0x18A309] // Hitmonchan in Fighting Dojo
-StaticPokemon[]=[0x16C167, 0x16C16E] // Electrode in The Power Plant
-StaticPokemon[]=[0x16C1C5, 0x16C1CC] // Electrode in The Power Plant
-StaticPokemon[]=[0x16C0F3, 0x16C0FA, 0x16C14E] // Zapdos in the Power Plant
-StaticPokemon[]=[0x16B294, 0x16B29B, 0x16B2EF] // Articuno in the Seafoams
-StaticPokemon[]=[0x16C822, 0x16C829, 0x16C87D] // Moltres in Mt.Ember
-StaticPokemon[]=[0x1693BD, 0x1693D1, 0x169417] // Mewtwo in Unk. Dungeon
-StaticPokemon[]=[0x1769CC, 0x1769D3] // Sleeping Snorlax (12)
-StaticPokemon[]=[0x177A3A, 0x177A41] // Sleeping Snorlax (16)
-StaticPokemon[]=[0x16C9A6, 0x16C9AC] // Hypno in Berry Forest
-StaticPokemon[]=[0x16F21F, 0x16F22F, 0x16F279, 0x16F284] // Deoxys on Birth Island
-StaticPokemon[]=[0x16EF75, 0x16EFA4, 0x16EFF3, 0x16EFFE] // Ho-Oh on Navel Rock
-StaticPokemon[]=[0x16F0C3, 0x16F0CE, 0x16F118, 0x16F123] // Lugia on Navel Rock
-StaticPokemon[]=[0x189578, 0x18957C, 0x189587, 0x189479] // Old Amber
-StaticPokemon[]=[0x1894EE, 0x1894F2, 0x1894FD, 0x1893FD] // Helix Fossil
-StaticPokemon[]=[0x189533, 0x189537, 0x189542, 0x18943B] // Dome Fossil
-StaticPokemon[]=[0x1675B4, 0x1675F3, 0x167626] // Lapras in Silph. Co
-StaticPokemon[]=[0x18C644, 0x18C703] // Magikarp in Mt.Moon Center
-StaticPokemon[]=[0x185A66, 0x185AE2]
-StaticPokemon[]=[0x185A76, 0x185AED]
-StaticPokemon[]=[0x185A86, 0x185B19]
-StaticPokemon[]=[0x185A96, 0x185AF8]
-StaticPokemon[]=[0x185AA6, 0x185B0E]
+StaticPokemon{}={Species=[0x184B94, 0x184B97, 0x184BD7, 0x184C0B], Level=[0x184B99]} // Eevee in Celadon Condominiums
+StaticPokemon{}={Species=[0x18A2BC, 0x18A2C3], Level=[0x18A336]} // Hitmonlee in Fighting Dojo
+StaticPokemon{}={Species=[0x18A302, 0x18A309], Level=[0x18A336]} // Hitmonchan in Fighting Dojo
+StaticPokemon{}={Species=[0x16C167, 0x16C16E], Level=[0x16C169]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16C1C5, 0x16C1CC], Level=[0x16C1C7]} // Electrode in The Power Plant
+StaticPokemon{}={Species=[0x16C0F3, 0x16C0FA, 0x16C14E], Level=[0x16C0F5]} // Zapdos in The Power Plant
+StaticPokemon{}={Species=[0x16B294, 0x16B29B, 0x16B2EF, 0x18DE5E, 0x18DE6A], Level=[0x16B296]} // Articuno (Seafoam and Route 15 Gatehouse)
+StaticPokemon{}={Species=[0x16C822, 0x16C829, 0x16C87D], Level=[0x16C824]} // Moltres in Mt.Ember
+StaticPokemon{}={Species=[0x1693BD, 0x1693D1, 0x169417], Level=[0x1693D3]} // Mewtwo in Unk. Dungeon
+StaticPokemon{}={Species=[0x1769CC, 0x1769D3, 0x16503A, 0x165040], Level=[0x1769CE]} // Snorlax (Route 12 and S.S. Anne)
+StaticPokemon{}={Species=[0x177A3A, 0x177A41], Level=[0x177A3C]} // Snorlax (Route 16)
+StaticPokemon{}={Species=[0x16C9A6, 0x16C9AC], Level=[0x16C9AE]} // Hypno in Berry Forest
+StaticPokemon{}={Species=[0x16F21F, 0x16F22F, 0x16F279, 0x16F284], Level=[0x16F234]} // Deoxys on Birth Island
+StaticPokemon{}={Species=[0x16EF75, 0x16EFA4, 0x16EFF3, 0x16EFFE], Level=[0x16EFA9]} // Ho-Oh on Navel Rock
+StaticPokemon{}={Species=[0x16F0C3, 0x16F0CE, 0x16F118, 0x16F123], Level=[0x16F0D3]} // Lugia on Navel Rock
+StaticPokemon{}={Species=[0x189578, 0x18957C, 0x189587, 0x189479], Level=[0x189589]} // Old Amber
+StaticPokemon{}={Species=[0x1894EE, 0x1894F2, 0x1894FD, 0x1893FD], Level=[0x1894FF]} // Helix Fossil
+StaticPokemon{}={Species=[0x189533, 0x189537, 0x189542, 0x18943B], Level=[0x189544]} // Dome Fossil
+StaticPokemon{}={Species=[0x1675B1, 0x1675B4, 0x1675F3, 0x167626], Level=[0x1675B6]} // Lapras in Silph. Co
+StaticPokemon{}={Species=[0x18C641, 0x18C644, 0x18C703], Level=[0x18C646]} // Magikarp in Mt.Moon Center
+StaticPokemon{}={Species=[0x185A66, 0x185AE2], Level=[0x185B25]} // Abra
+StaticPokemon{}={Species=[0x185A76, 0x185AED], Level=[0x185B3A]} // Clefairy
+StaticPokemon{}={Species=[0x185A86, 0x185B19], Level=[0x185B8E]} // Pinsir
+StaticPokemon{}={Species=[0x185A96, 0x185AF8], Level=[0x185B4F]} // Dratini
+StaticPokemon{}={Species=[0x185AA6, 0x185B0E], Level=[0x185B79]} // Porygon
diff --git a/src/com/dabomstew/pkrandom/config/gen4_offsets.ini b/src/com/dabomstew/pkrandom/config/gen4_offsets.ini
index 4d69de4..a0e0a06 100755
--- a/src/com/dabomstew/pkrandom/config/gen4_offsets.ini
+++ b/src/com/dabomstew/pkrandom/config/gen4_offsets.ini
@@ -48,6 +48,8 @@ PokemonGraphics=poketool/pokegra/pokegra.narc
StaticPokemonSupport=1
HoneyTreeOffsets=[2, 3, 4]
FossilTableOffset=0xF450C
+FossilLevelScriptNumber=63
+FossilLevelOffset=0x41A
PokedexAreaData=application/zukanlist/zkn_data/zukan_enc_diamond.narc
PokedexAreaDataDungeonIndex=4
PokedexAreaDataDungeonSpecialPreNationalIndex=1489
@@ -55,26 +57,26 @@ PokedexAreaDataDungeonSpecialPostNationalIndex=1984
PokedexAreaDataOverworldIndex=2479
PokedexAreaDataOverworldSpecialPreNationalIndex=3964
PokedexAreaDataOverworldSpecialPostNationalIndex=4459
-StaticPokemon[]=[230:0x4AE, 230:0xE9A, 230:0xECE, 230:0x1201, 230:0x1235] // Dialga
-StaticPokemon[]=[230:0x4B4, 230:0xEA0, 230:0xED4, 230:0x1207, 230:0x123B] // Palkia
-StaticPokemon[]=[352:0x39, 352:0x48] // Uxie
-StaticPokemon[]=[348:0x81, 348:0x90] // Azelf
-StaticPokemon[]=[278:0x16F, 278:0x17E] // Heatran
-StaticPokemon[]=[309:0x88, 309:0x94] // Regigigas
-StaticPokemon[]=[283:0x50, 283:0x5F] // Giratina
-StaticPokemon[]=[354:0x40] // Darkrai
-StaticPokemon[]=[302:0x39, 302:0x48] // Shaymin
-StaticPokemon[]=[232:0x45, 232:0x53, 232:0x62] // Arceus
-StaticPokemon[]=[112:0xB5] // Eevee
-StaticPokemon[]=[90:0x568] // Happiny
-StaticPokemon[]=[321:0x332] // Riolu
-StaticPokemon[]=[210:0x1C5, 210:0x1D6] // Drifloon
-StaticPokemon[]=[329:0x74, 329:0x80] // Rotom
-StaticPokemon[]=[406:0x153, 406:0x160] // Spiritomb
+StaticPokemon{}={Species=[230:0x4AE, 230:0xE9A, 230:0xECE, 230:0x1201, 230:0x1235], Level=[230:0xEE4, 230:0x124B]} // Dialga
+StaticPokemon{}={Species=[230:0x4B4, 230:0xEA0, 230:0xED4, 230:0x1207, 230:0x123B], Level=[230:0xEE4, 230:0x124B]} // Palkia
+StaticPokemon{}={Species=[352:0x39, 352:0x48], Level=[352:0x4A]} // Uxie
+StaticPokemon{}={Species=[348:0x81, 348:0x90], Level=[348:0x92]} // Azelf
+StaticPokemon{}={Species=[278:0x16F, 278:0x17E], Level=[278:0x180]} // Heatran
+StaticPokemon{}={Species=[309:0x88, 309:0x94], Level=[309:0x96]} // Regigigas
+StaticPokemon{}={Species=[283:0x50, 283:0x5F], Level=[283:0x61]} // Giratina
+StaticPokemon{}={Species=[354:0x40], Level=[354:0x42]} // Darkrai
+StaticPokemon{}={Species=[302:0x39, 302:0x48], Level=[302:0x4A]} // Shaymin
+StaticPokemon{}={Species=[232:0x45, 232:0x53, 232:0x62], Level=[232:0x64]} // Arceus
+StaticPokemon{}={Species=[112:0xB5], Level=[112:0xB7]} // Eevee
+StaticPokemon{}={Species=[90:0x568]} // Happiny (egg)
+StaticPokemon{}={Species=[321:0x332]} // Riolu (egg)
+StaticPokemon{}={Species=[210:0x1C5, 210:0x1D6], Level=[210:0x1D8]} // Drifloon
+StaticPokemon{}={Species=[329:0x74, 329:0x80], Level=[329:0x82]} // Rotom
+StaticPokemon{}={Species=[406:0x153, 406:0x160], Level=[406:0x162]} // Spiritomb
ShopCount=28
SkipShops=[12,13,15,16,17,18,19,20,21,22,23]
MainGameShops=[0,1,2,3,4,5,6,7,8,9,10,11,14,24,25,26,27]
-
+StaticEggPokemonOffsets=[11, 12]
[Pearl (U)]
Game=APAE
@@ -131,35 +133,38 @@ MapNamesTextOffset=433
CatchingTutorialOpponentMonOffset=0x520A0
HoneyTreeOffsets=[2, 3, 4]
FossilTableOffset=0xEBFFC
+FossilLevelScriptNumber=65
+FossilLevelOffset=0x426
FastestTextTweak=plat_instant_text
NationalDexAtStartTweak=plat_national_dex
NationalDexScriptOffset=1064
PokemonGraphics=poketool/pokegra/pl_pokegra.narc
PokedexAreaData=application/zukanlist/zkn_data/zukan_enc_platinum.narc
StaticPokemonSupport=1
-StaticPokemon[]=[291:0x43, 291:0x52, 389:0xCC, 389:0xDD] // Giratina
-StaticPokemon[]=[361:0x39, 361:0x48] // Uxie
-StaticPokemon[]=[357:0x81, 357:0x90] // Azelf
-StaticPokemon[]=[239:0xAB, 239:0xB8] // Dialga
-StaticPokemon[]=[240:0xAB, 240:0xB8] // Palkia
-StaticPokemon[]=[286:0x103, 286:0x112] // Heatran
-StaticPokemon[]=[317:0x88, 317:0x94] // Regigigas
-StaticPokemon[]=[392:0xB0, 392:0xBD] // Registeel
-StaticPokemon[]=[394:0xB0, 394:0xBD] // Regice
-StaticPokemon[]=[396:0xB0, 396:0xBD] // Regirock
-StaticPokemon[]=[363:0x8E] // Darkrai
-StaticPokemon[]=[310:0x87, 310:0x96] // Shaymin
-StaticPokemon[]=[238:0x6C, 238:0x7A, 238:0x89] // Arceus
-StaticPokemon[]=[71:0xE5B] // Togepi
-StaticPokemon[]=[117:0x79] // Eevee
-StaticPokemon[]=[153:0x7D] // Porygon
-StaticPokemon[]=[329:0x338] // Riolu
-StaticPokemon[]=[216:0x1C9, 216:0x1DA] // Drifloon
-StaticPokemon[]=[337:0x51, 337:0x5D] // Rotom
-StaticPokemon[]=[441:0x153, 441:0x160] // Spiritomb
+StaticPokemon{}={Species=[291:0x43, 291:0x52, 389:0xCC, 389:0xDD], Level=[291:0x54, 389:0xDF]} // Giratina
+StaticPokemon{}={Species=[361:0x39, 361:0x48], Level=[361:0x4A]} // Uxie
+StaticPokemon{}={Species=[357:0x81, 357:0x90], Level=[357:0x92]} // Azelf
+StaticPokemon{}={Species=[239:0xAB, 239:0xB8], Level=[239:0xBA]} // Dialga
+StaticPokemon{}={Species=[240:0xAB, 240:0xB8], Level=[240:0xBA]} // Palkia
+StaticPokemon{}={Species=[286:0x103, 286:0x112], Level=[286:0x114]} // Heatran
+StaticPokemon{}={Species=[317:0x88, 317:0x94], Level=[317:0x96]} // Regigigas
+StaticPokemon{}={Species=[392:0xB0, 392:0xBD], Level=[392:0xBF]} // Registeel
+StaticPokemon{}={Species=[394:0xB0, 394:0xBD], Level=[394:0xBF]} // Regice
+StaticPokemon{}={Species=[396:0xB0, 396:0xBD], Level=[396:0xBF]} // Regirock
+StaticPokemon{}={Species=[363:0x8E], Level=[363:0x90]} // Darkrai
+StaticPokemon{}={Species=[310:0x87, 310:0x96], Level=[310:0x98]} // Shaymin
+StaticPokemon{}={Species=[238:0x6C, 238:0x7A, 238:0x89], Level=[238:0x8B]} // Arceus
+StaticPokemon{}={Species=[71:0xE5B]} // Togepi (egg)
+StaticPokemon{}={Species=[117:0x79], Level=[117:0x7B]} // Eevee
+StaticPokemon{}={Species=[153:0x7D], Level=[153:0x7F]} // Porygon
+StaticPokemon{}={Species=[329:0x338]} // Riolu (egg)
+StaticPokemon{}={Species=[216:0x1C9, 216:0x1DA], Level=[216:0x1DC]} // Drifloon
+StaticPokemon{}={Species=[337:0x51, 337:0x5D], Level=[337:0x5F]} // Rotom
+StaticPokemon{}={Species=[441:0x153, 441:0x160], Level=[441:0x162]} // Spiritomb
ShopCount=29
SkipShops=[13,15,16,17,18,19,20,21,22,23,24]
MainGameShops=[0,1,2,3,4,5,6,7,8,9,10,11,12,14,25,26,27,28]
+StaticEggPokemonOffsets=[13, 16]
[HeartGold (U)]
Game=IPKE
@@ -208,6 +213,8 @@ MapTableNameIndexSize=1
MapNamesTextOffset=279
FossilTableOvlNumber=21
FossilTableOffset=0x130
+FossilLevelScriptNumber=755
+FossilLevelOffset=0x58D
CatchingTutorialPlayerMonOffset=0x51B78
CatchingTutorialOpponentMonOffset=0x51B9A
FastestTextTweak=hgss_instant_text
@@ -221,49 +228,52 @@ PokedexAreaDataOverworldIndex=1487
PokedexAreaDataDungeonSpecialIndex=2972
PokedexAreaDataOverworldSpecialIndex=3467
StaticPokemonSupport=1
-StaticPokemon[]=[104:0x108] // Lugia
-StaticPokemon[]=[21:0xD1] // Ho-oh
-StaticPokemon[]=[216:0x58F, 216:0x6E8, 216:0x708, 24:0x67, 24:0xB4, 24:0x314, 24:0x320, 24:0xD4] // Suicune
-StaticPokemon[]=[14:0x2F, 14:0x3B] // Articuno
-StaticPokemon[]=[191:0x26B, 191:0x277] // Zapdos
-StaticPokemon[]=[106:0x2F, 106:0x3B] // Moltres
-StaticPokemon[]=[11:0x2F, 11:0x3B] // Mewtwo
-StaticPokemon[]=[134:0xA3, 134:0xB4] // Kyogre
-StaticPokemon[]=[133:0xA3, 133:0xB4] // Groudon
-StaticPokemon[]=[135:0xDA, 135:0xEB, 135:0x62, 135:0x98] // Rayquaza
-StaticPokemon[]=[131:0x43A, 131:0x67C, 131:0x872, 131:0x8E4] // Dialga
-StaticPokemon[]=[131:0x4A2, 131:0x695, 131:0x88D, 131:0x8FA] // Palkia
-StaticPokemon[]=[131:0x50A] // Giratina
-StaticPokemon[]=[750:0x4CC] // Latias
-StaticPokemon[]=[750:0x4B7] // Latios
-StaticPokemon[]=[243:0x2FD, 243:0x14B] // Sudowoodo
-StaticPokemon[]=[58:0x61, 58:0x6D] // Lapras
-StaticPokemon[]=[938:0x3CD, 938:0x3DE] // Red Gyarados
-StaticPokemon[]=[197:0x6C, 197:0x7D] // Snorlax
-StaticPokemon[]=[89:0xF3D, 89:0x1078, 89:0x10A5, 89:0x112C, 89:0x11B1] // Koffing @ Rocket Base
-StaticPokemon[]=[89:0xF6A, 89:0xFC4, 89:0x101E, 89:0x104B, 89:0x1159, 89:0x1186] // Voltorb @ Rocket Base
-StaticPokemon[]=[89:0xF97, 89:0xFF1, 89:0x10D2, 89:0x10FF, 89:0x11E0] // Geodude @ Rocket Base
-StaticPokemon[]=[90:0x784] // Electrode @ Rocket Base (1)
-StaticPokemon[]=[90:0x7E8] // Electrode @ Rocket Base (2)
-StaticPokemon[]=[90:0x84C] // Electrode @ Rocket Base (3)
-StaticPokemon[]=[892:0x61] // Eevee
-StaticPokemon[]=[98:0x71] // Tyrogue
-StaticPokemon[]=[112:0x4D1] // Dratini
-StaticPokemon[]=[740:0x66F, 740:0x675, 740:0x695, 740:0x818, 740:0x8BC] // Bulbasaur
-StaticPokemon[]=[740:0x71D, 740:0x723, 740:0x743, 740:0x833, 740:0x8D7] // Squirtle
-StaticPokemon[]=[740:0x7CB, 740:0x7D1, 740:0x7F1] // Charmander
-StaticPokemon[]=[837:0x28F] // Treecko
-StaticPokemon[]=[837:0x2A8] // Torchic
-StaticPokemon[]=[837:0x2B4] // Mudkipz
-StaticPokemon[]=[860:0x146, 860:0x14D] // Primo's Mareep Egg
-StaticPokemon[]=[860:0x180, 860:0x187] // Primo's Wooper Egg
-StaticPokemon[]=[860:0x1BA, 860:0x1C1] // Primo's Slugma Egg
-StaticPokemon[]=[878:0x90] // Secret Tentacool
+StaticPokemon{}={Species=[104:0x108], Level=[104:0x138, 104:0x12C]} // Lugia
+StaticPokemon{}={Species=[21:0xD1], Level=[21:0xF5, 21:0x101]} // Ho-oh
+StaticPokemon{}={Species=[216:0x58F, 216:0x6E8, 216:0x708, 24:0x67, 24:0xB4, 24:0x314, 24:0x320, 24:0xD4], Level=[216:0x70A, 24:0x322]} // Suicune
+StaticPokemon{}={Species=[14:0x2F, 14:0x3B], Level=[14:0x3D]} // Articuno
+StaticPokemon{}={Species=[191:0x26B, 191:0x277], Level=[191:0x279]} // Zapdos
+StaticPokemon{}={Species=[106:0x2F, 106:0x3B], Level=[106:0x3D]} // Moltres
+StaticPokemon{}={Species=[11:0x2F, 11:0x3B], Level=[11:0x3D]} // Mewtwo
+StaticPokemon{}={Species=[134:0xA3, 134:0xB4], Level=[134:0xB6]} // Kyogre
+StaticPokemon{}={Species=[133:0xA3, 133:0xB4], Level=[133:0xB6]} // Groudon
+StaticPokemon{}={Species=[135:0xDA, 135:0xEB, 135:0x62, 135:0x98], Level=[135:0xED]} // Rayquaza
+StaticPokemon{}={Species=[131:0x43A, 131:0x67C, 131:0x872, 131:0x8E4, 131:0x958, 131:0x963], Level=[131:0x965]} // Dialga
+StaticPokemon{}={Species=[131:0x4A2, 131:0x695, 131:0x88D, 131:0x8FA, 131:0x97F, 131:0x98A], Level=[131:0x98C]} // Palkia
+StaticPokemon{}={Species=[131:0x50A, 131:0x9A4], Level=[131:0x9A6], Forme=[131:0x9AA]} // Giratina-O
+StaticPokemon{}={Species=[750:0x4CC], Level=[750:0x4E3]} // Latias
+StaticPokemon{}={Species=[750:0x4B7], Level=[750:0x4E3]} // Latios
+StaticPokemon{}={Species=[243:0x2FD, 243:0x14B], Level=[243:0x2FF, 243:0x14D]} // Sudowoodo
+StaticPokemon{}={Species=[58:0x61, 58:0x6D], Level=[58:0x6F]} // Lapras
+StaticPokemon{}={Species=[938:0x3CD, 938:0x3DE], Level=[938:0x3E0]} // Red Gyarados
+StaticPokemon{}={Species=[197:0x6C, 197:0x7D, 199:0x26A, 199:0x27B], Level=[197:0x7F, 199:0x27D]} // Snorlax
+StaticPokemon{}={Species=[89:0xF3D, 89:0x1078, 89:0x10A5, 89:0x112C, 89:0x11B3], Level=[89:0xF3F, 89:0x107A, 89:0x10A7, 89:0x112E, 89:0x11B5]} // Koffing @ Rocket Base
+StaticPokemon{}={Species=[89:0xF6A, 89:0xFC4, 89:0x101E, 89:0x104B, 89:0x1159, 89:0x1186], Level=[89:0xF6C, 89:0xFC6, 89:0x1020, 89:0x104D, 89:0x115B, 89:0x1188]} // Voltorb @ Rocket Base
+StaticPokemon{}={Species=[89:0xF97, 89:0xFF1, 89:0x10D2, 89:0x10FF, 89:0x11E0], Level=[89:0xF99, 89:0xFF3, 89:0x10D4, 89:0x1101, 89:0x11E2]} // Geodude @ Rocket Base
+StaticPokemon{}={Species=[90:0x784], Level=[90:0x786]} // Electrode @ Rocket Base (1)
+StaticPokemon{}={Species=[90:0x7E8], Level=[90:0x7EA]} // Electrode @ Rocket Base (2)
+StaticPokemon{}={Species=[90:0x84C], Level=[90:0x84E]} // Electrode @ Rocket Base (3)
+StaticPokemon{}={Species=[892:0x61], Level=[892:0x63]} // Eevee
+StaticPokemon{}={Species=[98:0x71], Level=[98:0x73]} // Tyrogue
+StaticPokemon{}={Species=[112:0x4D1], Level=[112:0x4D3]} // Dratini
+StaticPokemon{}={Species=[740:0x66F, 740:0x675, 740:0x695, 740:0x818, 740:0x8BC], Level=[740:0x86D]} // Bulbasaur
+StaticPokemon{}={Species=[740:0x71D, 740:0x723, 740:0x743, 740:0x833, 740:0x8D7], Level=[740:0x86D]} // Squirtle
+StaticPokemon{}={Species=[740:0x7CB, 740:0x7D1, 740:0x7F1], Level=[740:0x86D]} // Charmander
+StaticPokemon{}={Species=[837:0x28F], Level=[837:0x2D1]} // Treecko
+StaticPokemon{}={Species=[837:0x2A8], Level=[837:0x2D1]} // Torchic
+StaticPokemon{}={Species=[837:0x2B4], Level=[837:0x2D1]} // Mudkip
+StaticPokemon{}={Species=[860:0x146, 860:0x14D]]} // Primo's Mareep Egg
+StaticPokemon{}={Species=[860:0x180, 860:0x187]]} // Primo's Wooper Egg
+StaticPokemon{}={Species=[860:0x1BA, 860:0x1C1]]} // Primo's Slugma Egg
+StaticPokemon{}={Species=[878:0x90], Level=[878:0x92]} // Secret Tentacool
StaticPokemonTrades=[6,7] // Shuckie & Kenya
+StaticPokemonTradeScripts=[880,241]
+StaticPokemonTradeLevelOffsets=[0x80,0xA7]
MysteryEggOffset=0x1C80E // Togepi Mystery Egg
ShopCount=40
SkipShops=[17,18,22,23,24,25,26,27,28,29,30,37,39]
MainGameShops=[0,2,5,6,7,12,14,16,19,31,33,34,36]
+StaticEggPokemonOffsets=[34, 35, 36]
[SoulSilver (U)]
Game=IPGE
@@ -300,7 +310,7 @@ IngameTradePersonTextOffsets=[66,88,170,571]
MapTableARM9Offset=0xF0C2C
MapNamesTextOffset=374
CatchingTutorialOpponentMonOffset=0x4AB34
-FossilTableOffset=0xF6330
+FossilTableOffset=0xF6334
[Diamond (J)]
Game=ADAJ
@@ -616,29 +626,58 @@ MapNamesTextOffset=272
CatchingTutorialPlayerMonOffset=0x51610
CatchingTutorialOpponentMonOffset=0x51632
NationalDexAtStartTweak=hgss_national_dex
+FossilLevelScriptNumber=753
+StaticPokemonSupport=1
+StaticPokemon{}={Species=[104:0x108], Level=[104:0x138, 104:0x12C]} // Lugia
+StaticPokemon{}={Species=[21:0xD1], Level=[21:0xF5, 21:0x101]} // Ho-oh
+StaticPokemon{}={Species=[216:0x58F, 216:0x6E8, 216:0x708, 24:0x67, 24:0xB4, 24:0x314, 24:0x320, 24:0xD4], Level=[216:0x70A, 24:0x322]} // Suicune
+StaticPokemon{}={Species=[14:0x2F, 14:0x3B], Level=[14:0x3D]} // Articuno
+StaticPokemon{}={Species=[191:0x26B, 191:0x277], Level=[191:0x279]} // Zapdos
+StaticPokemon{}={Species=[106:0x2F, 106:0x3B], Level=[106:0x3D]} // Moltres
+StaticPokemon{}={Species=[11:0x2F, 11:0x3B], Level=[11:0x3D]} // Mewtwo
+StaticPokemon{}={Species=[134:0xA3, 134:0xB4], Level=[134:0xB6]} // Kyogre
+StaticPokemon{}={Species=[133:0xA3, 133:0xB4], Level=[133:0xB6]} // Groudon
+StaticPokemon{}={Species=[135:0xDA, 135:0xEB, 135:0x62, 135:0x98], Level=[135:0xED]} // Rayquaza
+StaticPokemon{}={Species=[131:0x43A, 131:0x67C, 131:0x872, 131:0x8E4, 131:0x958, 131:0x963], Level=[131:0x965]} // Dialga
+StaticPokemon{}={Species=[131:0x4A2, 131:0x695, 131:0x88D, 131:0x8FA, 131:0x97F, 131:0x98A], Level=[131:0x98C]} // Palkia
+StaticPokemon{}={Species=[131:0x50A, 131:0x9A4], Level=[131:0x9A6], Forme=[131:0x9AA]} // Giratina-O
+StaticPokemon{}={Species=[748:0x4CC], Level=[748:0x4E3]} // Latias
+StaticPokemon{}={Species=[748:0x4B7], Level=[748:0x4E3]} // Latios
+StaticPokemon{}={Species=[243:0x310, 243:0x14B], Level=[243:0x312, 243:0x14D]} // Sudowoodo
+StaticPokemon{}={Species=[58:0x61, 58:0x6D], Level=[58:0x6F]} // Lapras
+StaticPokemon{}={Species=[934:0x3CD, 934:0x3DE], Level=[934:0x3E0]} // Red Gyarados
+StaticPokemon{}={Species=[197:0x6C, 197:0x7D, 199:0x26A, 199:0x27B], Level=[197:0x7F, 199:0x27D]} // Snorlax
+StaticPokemon{}={Species=[89:0xF3D, 89:0x1078, 89:0x10A5, 89:0x112C, 89:0x11B3], Level=[89:0xF3F, 89:0x107A, 89:0x10A7, 89:0x112E, 89:0x11B5]} // Koffing @ Rocket Base
+StaticPokemon{}={Species=[89:0xF6A, 89:0xFC4, 89:0x101E, 89:0x104B, 89:0x1159, 89:0x1186], Level=[89:0xF6C, 89:0xFC6, 89:0x1020, 89:0x104D, 89:0x115B, 89:0x1188]} // Voltorb @ Rocket Base
+StaticPokemon{}={Species=[89:0xF97, 89:0xFF1, 89:0x10D2, 89:0x10FF, 89:0x11E0], Level=[89:0xF99, 89:0xFF3, 89:0x10D4, 89:0x1101, 89:0x11E2]} // Geodude @ Rocket Base
+StaticPokemon{}={Species=[90:0x770], Level=[90:0x772]} // Electrode @ Rocket Base (1)
+StaticPokemon{}={Species=[90:0x7D4], Level=[90:0x7D6]} // Electrode @ Rocket Base (2)
+StaticPokemon{}={Species=[90:0x838], Level=[90:0x83A]} // Electrode @ Rocket Base (3)
+StaticPokemon{}={Species=[889:0x61], Level=[889:0x63]} // Eevee
+StaticPokemon{}={Species=[98:0x71], Level=[98:0x73]} // Tyrogue
+StaticPokemon{}={Species=[112:0x4D1], Level=[112:0x4D3]} // Dratini
+StaticPokemon{}={Species=[738:0x66F, 738:0x675, 738:0x695, 738:0x818, 738:0x8BC], Level=[738:0x86D]} // Bulbasaur
+StaticPokemon{}={Species=[738:0x71D, 738:0x723, 738:0x743, 738:0x833, 738:0x8D7], Level=[738:0x86D]} // Squirtle
+StaticPokemon{}={Species=[738:0x7CB, 738:0x7D1, 738:0x7F1], Level=[738:0x86D]} // Charmander
+StaticPokemon{}={Species=[834:0x272], Level=[834:0x2B4]} // Treecko
+StaticPokemon{}={Species=[834:0x28B], Level=[834:0x2B4]} // Torchic
+StaticPokemon{}={Species=[834:0x297], Level=[834:0x2B4]} // Mudkip
+StaticPokemon{}={Species=[857:0x146, 857:0x14D]]} // Primo's Mareep Egg
+StaticPokemon{}={Species=[857:0x180, 857:0x187]]} // Primo's Wooper Egg
+StaticPokemon{}={Species=[857:0x1BA, 857:0x1C1]]} // Primo's Slugma Egg
+StaticPokemon{}={Species=[875:0x90], Level=[875:0x92]} // Secret Tentacool
+StaticPokemonTrades=[6,7] // Shuckie & Kenya
+StaticPokemonTradeScripts=[877,241]
+StaticPokemonTradeLevelOffsets=[0x80,0xA7]
+MysteryEggOffset=0x1C692 // Togepi Mystery Egg
+StaticEggPokemonOffsets=[34, 35, 36]
[SoulSilver (J)]
Game=IPGJ
Type=HGSS
-CopyFrom=IPGE
-HiddenItemTableOffset=0xF9D08
-MoveTutorMovesOffset=0x23954
-HasExtraPokemonNames=No
-PokemonNamesTextOffset=232
-TrainerNamesTextOffset=719
-TrainerClassesTextOffset=720
-MoveDescriptionsTextOffset=738
-MoveNamesTextOffset=739
-AbilityNamesTextOffset=711
-ItemDescriptionsTextOffset=218
-ItemNamesTextOffset=219
-StarterScreenTextOffset=188
-IngameTradesTextOffset=198
-IngameTradePersonTextOffsets=[554,588,599,625,0,0,337,456,527,45,529]
-MapTableARM9Offset=0xF6390
-MapNamesTextOffset=272
-CatchingTutorialPlayerMonOffset=0x51610
-CatchingTutorialOpponentMonOffset=0x51632
+CopyStaticPokemon=1
+CopyFrom=IPKJ
+WildPokemon=a/1/3/6
NationalDexAtStartTweak=hgss_national_dex
[HeartGold (K)]
diff --git a/src/com/dabomstew/pkrandom/config/gen5_offsets.ini b/src/com/dabomstew/pkrandom/config/gen5_offsets.ini
index 8893539..76f5a4f 100755
--- a/src/com/dabomstew/pkrandom/config/gen5_offsets.ini
+++ b/src/com/dabomstew/pkrandom/config/gen5_offsets.ini
@@ -53,39 +53,39 @@ FastestTextTweak=b1_instant_text
NationalDexAtStartTweak=bw1_national_dex
NationalDexScriptOffset=792
StaticPokemonSupport=1
-StaticPokemon[]=[304:0x121, 304:0x1C9, 304:0x299] // Grass Monkey
-StaticPokemon[]=[304:0x131, 304:0x1DE, 304:0x2B7] // Fire Monkey
-StaticPokemon[]=[304:0xFE, 304:0x1A1, 304:0x268] // Water Monkey
-StaticPokemon[]=[526:0x758] // Magikarp
-StaticPokemon[]=[94:0x810, 94:0x64, 94:0xB4, 94:0x44B, 94:0x7AB, 94:0x7D0, 94:0x7DC] // Zorua
-StaticPokemon[]=[776:0x85, 776:0xB2] // Larvesta
-StaticPokemon[]=[316:0x369] // Darmanitan 1
-StaticPokemon[]=[316:0x437] // Darmanitan 2
-StaticPokemon[]=[316:0x505] // Darmanitan 3
-StaticPokemon[]=[316:0x5D3] // Darmanitan 4
-StaticPokemon[]=[316:0x6A1] // Darmanitan 5
-StaticPokemon[]=[306:0x65, 306:0x8F] // Musharna
-StaticPokemon[]=[770:0x2F8, 770:0x353] // Zoroark
-StaticPokemon[]=[364:0xE, 364:0x1F] // Volcarona
-StaticPokemon[]=[474:0x1CE, 474:0x20A] // Victini
-StaticPokemon[]=[426:0x133, 426:0x15B, 556:0x1841, 556:0xCFC, 556:0x1878, 556:0x18EA] // Reshiram
-StaticPokemon[]=[426:0x127, 426:0x174, 556:0x184D, 556:0x186C, 556:0xD15, 556:0x18DE] // Zekrom
-StaticPokemon[]=[670:0x415, 670:0x426, 692:0x1E2] // Cobalion
-StaticPokemon[]=[458:0x10, 458:0x21, 692:0x203] // Terrakion
-StaticPokemon[]=[312:0x10, 312:0x21, 692:0x224] // Virizion
-StaticPokemon[]=[752:0x66D, 752:0x6CC, 752:0x6DD] // Landorus
-StaticPokemon[]=[464:0x10, 468:0x4F, 468:0x60] // Kyurem
-StaticPokemon[]=[877:0x601] // Cranidos
-StaticPokemon[]=[877:0x620] // Shieldon
-StaticPokemon[]=[877:0x63F] // Omanyte
-StaticPokemon[]=[877:0x65E] // Kabuto
-StaticPokemon[]=[877:0x67D] // Aerodactyl
-StaticPokemon[]=[877:0x69C] // Anorith
-StaticPokemon[]=[877:0x6BB] // Lileep
-StaticPokemon[]=[877:0x6DA] // Tirtouga
-StaticPokemon[]=[877:0x6F9] // Archen
-StaticPokemon[]=[897:0x45] // Foongus
-StaticPokemon[]=[897:0xC1] // Amoonguss
+StaticPokemon{}={Species=[304:0x121, 304:0x1C9, 304:0x299], Level=[304:0x29D]} // Pansage
+StaticPokemon{}={Species=[304:0x131, 304:0x1DE, 304:0x2B7], Level=[304:0x2BB]} // Pansear
+StaticPokemon{}={Species=[304:0xFE, 304:0x1A1, 304:0x268], Level=[304:0x26C]} // Panpour
+StaticPokemon{}={Species=[526:0x758], Level=[526:0x75C]} // Magikarp
+StaticPokemon{}={Species=[94:0x810, 94:0x64, 94:0xB4, 94:0x44B, 94:0x7AB, 94:0x7D0, 94:0x7DC], Level=[94:0x44F]} // Zorua
+StaticPokemon{}={Species=[776:0x85, 776:0xB2]} // Larvesta (egg)
+StaticPokemon{}={Species=[316:0x369], Level=[316:0x36B]} // Darmanitan 1
+StaticPokemon{}={Species=[316:0x437], Level=[316:0x439]} // Darmanitan 2
+StaticPokemon{}={Species=[316:0x505], Level=[316:0x507]} // Darmanitan 3
+StaticPokemon{}={Species=[316:0x5D3], Level=[316:0x5D5]} // Darmanitan 4
+StaticPokemon{}={Species=[316:0x6A1], Level=[316:0x6A3]} // Darmanitan 5
+StaticPokemon{}={Species=[306:0x65, 306:0x8F], Level=[306:0x91]} // Musharna
+StaticPokemon{}={Species=[770:0x2F8, 770:0x353], Level=[770:0x355]} // Zoroark
+StaticPokemon{}={Species=[364:0xE, 364:0x1F], Level=[364:0x21]} // Volcarona
+StaticPokemon{}={Species=[474:0x1CE, 474:0x20A], Level=[474:0x20C]} // Victini
+StaticPokemon{}={Species=[426:0x133, 426:0x15B, 556:0x1841, 556:0xCFC, 556:0x1878, 556:0x18EA], Level=[426:0x15D, 556:0xCFE]} // Reshiram
+StaticPokemon{}={Species=[426:0x127, 426:0x174, 556:0x184D, 556:0x186C, 556:0xD15, 556:0x18DE], Level=[426:0x176, 556:0xD17]} // Zekrom
+StaticPokemon{}={Species=[670:0x415, 670:0x426, 692:0x1E2], Level=[670:0x428]} // Cobalion
+StaticPokemon{}={Species=[458:0x10, 458:0x21, 692:0x203], Level=[458:0x23]} // Terrakion
+StaticPokemon{}={Species=[312:0x10, 312:0x21, 692:0x224], Level=[312:0x23]} // Virizion
+StaticPokemon{}={Species=[752:0x66D, 752:0x6CC, 752:0x6DD], Level=[752:0x6DF]} // Landorus
+StaticPokemon{}={Species=[464:0x10, 468:0x4F, 468:0x60], Level=[468:0x62]} // Kyurem
+StaticPokemon{}={Species=[877:0x601], Level=[877:0x3F7]} // Cranidos
+StaticPokemon{}={Species=[877:0x620], Level=[877:0x3F7]} // Shieldon
+StaticPokemon{}={Species=[877:0x63F], Level=[877:0x3F7]} // Omanyte
+StaticPokemon{}={Species=[877:0x65E], Level=[877:0x3F7]} // Kabuto
+StaticPokemon{}={Species=[877:0x67D], Level=[877:0x3F7]} // Aerodactyl
+StaticPokemon{}={Species=[877:0x69C], Level=[877:0x3F7]} // Anorith
+StaticPokemon{}={Species=[877:0x6BB], Level=[877:0x3F7]} // Lileep
+StaticPokemon{}={Species=[877:0x6DA], Level=[877:0x3F7]} // Tirtouga
+StaticPokemon{}={Species=[877:0x6F9], Level=[877:0x3F7]} // Archen
+StaticPokemon{}={Species=[897:0x45]} // Foongus
+StaticPokemon{}={Species=[897:0xC1]} // Amoonguss
BoxLegendaryOffset=15
BoxLegendaryOvlNumber=21
IsBlack=1
@@ -94,6 +94,7 @@ TradeScript[]=[202:0x224:0x21F] // Minccino/Basculin
TradeScript[]=[686:0x76:0x71] // Boldore/Emolga
TradeScript[]=[830:0xB3:0xAE, 830:0xEA:0xE5, 830:0x114:0x10F] // Cinccino/Munchlax
TradeScript[]=[764:0x43:0x3E] // Ditto/Rotom
+StaticEggPokemonOffsets=[5]
[White (U)]
Game=IRAO
@@ -157,49 +158,51 @@ FastestTextTweak=b2_instant_text
NationalDexAtStartTweak=bw2_national_dex
NationalDexScriptOffset=854
StaticPokemonSupport=1
-StaticPokemon[]=[662:0x1DE, 662:0x240, 740:0xCD, 740:0xFC, 740:0x12C, 740:0x14C] // Cobalion
-StaticPokemon[]=[730:0x13A, 730:0x15F, 730:0x19B, 730:0x1BB] // Virizion
-StaticPokemon[]=[948:0x45D, 948:0x48D, 948:0x4AD] // Terrakion
-StaticPokemon[]=[426:0x38A, 426:0x39B, 556:0x367, 556:0x568, 556:0x5E6, 556:0x6E1, 1208:0x3A4, 1208:0xA6A, 1208:0x717] // Reshiram
-StaticPokemon[]=[426:0x36B, 426:0x37C, 556:0x350, 556:0x551, 556:0x5C7, 556:0x6C3, 1208:0x38D, 1208:0xA53, 1208:0x706] // Zekrom
-StaticPokemon[]=[1112:0x133, 1122:0x2BA, 1122:0x311, 1128:0x37A, 1128:0x3D1, 1208:0x1B7, 1208:0x1F8, 1208:0xD8B, 1208:0xD97, 1208:0xDB6, 1208:0xDC2, 1208:0x723, 1208:0xF3D, 1208:0xF4E] // Kyurem
-StaticPokemon[]=[304:0xCC, 304:0x14B, 304:0x1BC, 304:0x237, 304:0x327, 304:0x3E6, 304:0x4A1, 304:0x54A, 304:0x5BD, 304:0x5CE] // Latias
-StaticPokemon[]=[304:0xB5, 304:0x134, 304:0x1A5, 304:0x220, 304:0x310, 304:0x3CF, 304:0x48A, 304:0x533, 304:0x59E, 304:0x5AF] // Latios
-StaticPokemon[]=[32:0x247, 32:0x2B0, 32:0x2C1, 1034:0x12A] // Uxie
-StaticPokemon[]=[684:0x136, 684:0x1C2, 684:0x1D3, 1034:0x169] // Mesprit
-StaticPokemon[]=[950:0xA1, 950:0x10A, 950:0x11B, 1034:0x1BE] // Azelf
-StaticPokemon[]=[1222:0x134, 1222:0x145, 1018:0x32] // Regirock
-StaticPokemon[]=[1224:0x134, 1224:0x145, 1018:0x2C] // Regice
-StaticPokemon[]=[1226:0x134, 1226:0x145, 1018:0x38] // Registeel
-StaticPokemon[]=[1018:0x97, 1018:0xA8] // Regigigas
-StaticPokemon[]=[526:0x48D, 526:0x512, 526:0x523] // Cresselia
-StaticPokemon[]=[1068:0x193, 1068:0x1D6, 1068:0x1E7, 1080:0x193, 1080:0x1D6, 1080:0x1E7] // Heatran
-StaticPokemon[]=[652:0x5C6, 652:0x5E9] // Mandibuzz
-StaticPokemon[]=[1102:0x592, 1102:0x5B5] // Braviary
-StaticPokemon[]=[364:0xE, 364:0x32, 364:0x40] // Volcarona
-StaticPokemon[]=[1030:0x290, 1030:0x2A1] // Crustle
-StaticPokemon[]=[480:0xE1, 480:0x10A, 480:0x131, 480:0x15A] // Jellicent
-StaticPokemon[]=[1168:0x2C, 1168:0x4F] // Shiny Haxorus
-StaticPokemon[]=[988:0x382] // Eevee
-StaticPokemon[]=[664:0x3B5, 664:0x3E2, 664:0x40F, 664:0x43C] // Deerling
-StaticPokemon[]=[880:0xAB4, 880:0xAC7] // Shiny Gible
-StaticPokemon[]=[880:0xAD3, 880:0xAE6] // Shiny Dratini
-StaticPokemon[]=[54:0xDD] // Happiny Egg
-StaticPokemon[]=[526:0x27E] // Magikarp
-StaticPokemon[]=[1253:0x5E0] // Cranidos
-StaticPokemon[]=[1253:0x5FF] // Shieldon
-StaticPokemon[]=[1253:0x61E] // Omanyte
-StaticPokemon[]=[1253:0x63D] // Kabuto
-StaticPokemon[]=[1253:0x65C] // Aerodactyl
-StaticPokemon[]=[1253:0x67B] // Anorith
-StaticPokemon[]=[1253:0x69A] // Lileep
-StaticPokemon[]=[1253:0x6B9] // Tirtouga
-StaticPokemon[]=[1253:0x6D8] // Archen
-StaticPokemon[]=[1273:0x45] // Foongus
-StaticPokemon[]=[1273:0xC7] // Amoonguss
-StaticPokemon[]=[208:0x5A6] // Zorua
-StaticPokemonFormValues=[1208:0xD8D, 1208:0xD9B, 1208:0xDB8, 1208:0xDC6, 664:0x3B7, 664:0x3E4, 664:0x411, 664:0x43E] // Kyurem, Deerling
+StaticPokemon{}={Species=[662:0x1DE, 662:0x240, 740:0xCD, 740:0xFC, 740:0x12C, 740:0x14C], Level=[740:0x12E, 740:0x14E]} // Cobalion
+StaticPokemon{}={Species=[730:0x13A, 730:0x15F, 730:0x19B, 730:0x1BB], Level=[730:0x19D, 730:0x1BD]} // Virizion
+StaticPokemon{}={Species=[948:0x45D, 948:0x48D, 948:0x4AD], Level=[948:0x48F, 948:0x4AF]} // Terrakion
+StaticPokemon{}={Species=[426:0x38A, 426:0x39B, 556:0x367, 556:0x568, 556:0x5E6, 556:0x6E1, 1208:0x3A4, 1208:0xA6A, 1208:0x717], Level=[426:0x39D]} // Reshiram
+StaticPokemon{}={Species=[426:0x36B, 426:0x37C, 556:0x350, 556:0x551, 556:0x5C7, 556:0x6C3, 1208:0x38D, 1208:0xA53, 1208:0x706], Level=[426:0x37E]} // Zekrom
+StaticPokemon{}={Species=[1112:0x133, 1122:0x2BA, 1122:0x311, 1128:0x37A, 1128:0x3D1, 1208:0x1B7, 1208:0x1F8, 1208:0x723, 1208:0xF3D, 1208:0xF4E], Level=[1208:0xF50]} // Kyurem
+StaticPokemon{}={Species=[1208:0xD8B, 1208:0xD97], Level=[1208:0xD99], Forme=[1208:0xD8D, 1208:0xD9B]} // Kyurem-Black
+StaticPokemon{}={Species=[1208:0xDB6, 1208:0xDC2], Level=[1208:0xDC4], Forme=[1208:0xDB8, 1208:0xDC6]} // Kyurem-White
+StaticPokemon{}={Species=[304:0xCC, 304:0x14B, 304:0x1BC, 304:0x237, 304:0x327, 304:0x3E6, 304:0x4A1, 304:0x54A, 304:0x5BD, 304:0x5CE], Level=[304:0x5D0]} // Latias
+StaticPokemon{}={Species=[304:0xB5, 304:0x134, 304:0x1A5, 304:0x220, 304:0x310, 304:0x3CF, 304:0x48A, 304:0x533, 304:0x59E, 304:0x5AF], Level=[304:0x5B1]} // Latios
+StaticPokemon{}={Species=[32:0x247, 32:0x2B0, 32:0x2C1, 1034:0x12A], Level=[32:0x2C3]} // Uxie
+StaticPokemon{}={Species=[684:0x136, 684:0x1C2, 684:0x1D3, 1034:0x169], Level=[684:0x1D5]} // Mesprit
+StaticPokemon{}={Species=[950:0xA1, 950:0x10A, 950:0x11B, 1034:0x1BE], Level=[950:0x11D]} // Azelf
+StaticPokemon{}={Species=[1222:0x134, 1222:0x145, 1018:0x32], Level=[1222:0x147]} // Regirock
+StaticPokemon{}={Species=[1224:0x134, 1224:0x145, 1018:0x2C], Level=[1224:0x147]} // Regice
+StaticPokemon{}={Species=[1226:0x134, 1226:0x145, 1018:0x38], Level=[1226:0x147]} // Registeel
+StaticPokemon{}={Species=[1018:0x97, 1018:0xA8], Level=[1018:0xAA]} // Regigigas
+StaticPokemon{}={Species=[526:0x48D, 526:0x512, 526:0x523], Level=[526:0x525]} // Cresselia
+StaticPokemon{}={Species=[1068:0x193, 1068:0x1D6, 1068:0x1E7, 1080:0x193, 1080:0x1D6, 1080:0x1E7], Level=[1068:0x1E9, 1080:0x1E9]} // Heatran
+StaticPokemon{}={Species=[652:0x5C6, 652:0x5E9], Level=[652:0x5EB]} // Mandibuzz
+StaticPokemon{}={Species=[1102:0x592, 1102:0x5B5], Level=[1102:0x5B7]} // Braviary
+StaticPokemon{}={Species=[364:0xE, 364:0x32, 364:0x40], Level=[364:0x34, 364:0x42]} // Volcarona
+StaticPokemon{}={Species=[1030:0x290, 1030:0x2A1], Level=[1030:0x2A3]} // Crustle
+StaticPokemon{}={Species=[480:0xE1, 480:0x10A, 480:0x131, 480:0x15A], Level=[480:0x10C, 480:0x15C]} // Jellicent
+StaticPokemon{}={Species=[1168:0x2C, 1168:0x4F], Level=[1168:0x51]} // Shiny Haxorus
+StaticPokemon{}={Species=[988:0x382], Level=[988:0x386]} // Eevee
+StaticPokemon{}={Species=[664:0x3B5, 664:0x3E2, 664:0x40F, 664:0x43C], Level=[664:0x3B9, 664:0x3E6, 664:0x413, 664:0x440], Forme=[664:0x3B7, 664:0x3E4, 664:0x411, 664:0x43E]} // Deerling
+StaticPokemon{}={Species=[880:0xAB4, 880:0xAC7], Level=[880:0xAB8]} // Shiny Gible
+StaticPokemon{}={Species=[880:0xAD3, 880:0xAE6], Level=[880:0xAD7]} // Shiny Dratini
+StaticPokemon{}={Species=[54:0xDD]} // Happiny (egg)
+StaticPokemon{}={Species=[526:0x27E], Level=[526:0x282]} // Magikarp
+StaticPokemon{}={Species=[1253:0x5E0], Level=[1253:0x3D6]} // Cranidos
+StaticPokemon{}={Species=[1253:0x5FF], Level=[1253:0x3D6]} // Shieldon
+StaticPokemon{}={Species=[1253:0x61E], Level=[1253:0x3D6]} // Omanyte
+StaticPokemon{}={Species=[1253:0x63D], Level=[1253:0x3D6]} // Kabuto
+StaticPokemon{}={Species=[1253:0x65C], Level=[1253:0x3D6]} // Aerodactyl
+StaticPokemon{}={Species=[1253:0x67B], Level=[1253:0x3D6]} // Anorith
+StaticPokemon{}={Species=[1253:0x69A], Level=[1253:0x3D6]} // Lileep
+StaticPokemon{}={Species=[1253:0x6B9], Level=[1253:0x3D6]} // Tirtouga
+StaticPokemon{}={Species=[1253:0x6D8], Level=[1253:0x3D6]} // Archen
+StaticPokemon{}={Species=[1273:0x45]} // Foongus
+StaticPokemon{}={Species=[1273:0xC7]} // Amoonguss
+StaticPokemon{}={Species=[208:0x5A6], Level=[208:0x5A8]} // Zorua
IngameTradePersonTextOffsets=[529, 555, 193, 594, 628, 628]
+StaticEggPokemonOffsets=[29]
[White 2 (U)]
Game=IRDO
@@ -380,45 +383,50 @@ Type=BW2
CopyFrom=IREO
MoveTutorDataOffset=0x512DC
StaticPokemonSupport=1
-StaticPokemon[]=[662:0x1DE, 662:0x240, 740:0xCD, 740:0xFC, 740:0x12C, 740:0x14C] // Cobalion
-StaticPokemon[]=[730:0x13A, 730:0x15F, 730:0x19B, 730:0x1BB] // Virizion
-StaticPokemon[]=[948:0x45D, 948:0x48D, 948:0x4AD] // Terrakion
-StaticPokemon[]=[426:0x38A, 426:0x39B, 556:0x367, 556:0x568, 556:0x5E6, 556:0x6E1, 1208:0x3A4, 1208:0xA6A, 1208:0x717] // Reshiram
-StaticPokemon[]=[426:0x36B, 426:0x37C, 556:0x350, 556:0x551, 556:0x5C7, 556:0x6C3, 1208:0x38D, 1208:0xA53, 1208:0x706] // Zekrom
-StaticPokemon[]=[1112:0x133, 1122:0x2BA, 1122:0x311, 1128:0x37A, 1128:0x3D1, 1208:0x1B7, 1208:0x1F8, 1208:0xD8B, 1208:0xD97, 1208:0xDB6, 1208:0xDC2, 1208:0x723, 1208:0xF3D, 1208:0xF4E] // Kyurem
-StaticPokemon[]=[304:0xCC, 304:0x14B, 304:0x1B8, 304:0x22F, 304:0x31B, 304:0x3D6, 304:0x491, 304:0x536, 304:0x5A9, 304:0x5BA] // Latias
-StaticPokemon[]=[304:0xB5, 304:0x134, 304:0x1A1, 304:0x218, 304:0x304, 304:0x3BF, 304:0x47A, 304:0x51F, 304:0x58A, 304:0x59B] // Latios
-StaticPokemon[]=[32:0x247, 32:0x2B0, 32:0x2C1, 1034:0x12A] // Uxie
-StaticPokemon[]=[684:0x136, 684:0x1C2, 684:0x1D3, 1034:0x169] // Mesprit
-StaticPokemon[]=[950:0xA1, 950:0x10A, 950:0x11B, 1034:0x1BE] // Azelf
-StaticPokemon[]=[1222:0x134, 1222:0x145, 1018:0x32] // Regirock
-StaticPokemon[]=[1224:0x134, 1224:0x145, 1018:0x2C] // Regice
-StaticPokemon[]=[1226:0x134, 1226:0x145, 1018:0x38] // Registeel
-StaticPokemon[]=[1018:0x97, 1018:0xA8] // Regigigas
-StaticPokemon[]=[526:0x48D, 526:0x512, 526:0x523] // Cresselia
-StaticPokemon[]=[1068:0x171, 1068:0x1B4, 1068:0x1C5, 1080:0x171, 1080:0x1B4, 1080:0x1C5] // Heatran
-StaticPokemon[]=[652:0x5C6, 652:0x5E9] // Mandibuzz
-StaticPokemon[]=[1102:0x592, 1102:0x5B5] // Braviary
-StaticPokemon[]=[364:0xE, 364:0x32, 364:0x40] // Volcarona
-StaticPokemon[]=[1030:0x290, 1030:0x2A1] // Crustle
-StaticPokemon[]=[480:0xE1, 480:0x10A, 480:0x131, 480:0x15A] // Jellicent
-StaticPokemon[]=[1168:0x2C, 1168:0x4F] // Shiny Haxorus
-StaticPokemon[]=[988:0x382] // Eevee
-StaticPokemon[]=[664:0x3B5, 664:0x3E2, 664:0x40F, 664:0x43C] // Deerling
-StaticPokemon[]=[880:0xAB4, 880:0xAC7] // Shiny Gible
-StaticPokemon[]=[880:0xAD3, 880:0xAE6] // Shiny Dratini
-StaticPokemon[]=[54:0xDD] // Happiny Egg
-StaticPokemon[]=[526:0x27E] // Magikarp
-StaticPokemon[]=[1253:0x5E0] // Cranidos
-StaticPokemon[]=[1253:0x5FF] // Shieldon
-StaticPokemon[]=[1253:0x61E] // Omanyte
-StaticPokemon[]=[1253:0x63D] // Kabuto
-StaticPokemon[]=[1253:0x65C] // Aerodactyl
-StaticPokemon[]=[1253:0x67B] // Anorith
-StaticPokemon[]=[1253:0x69A] // Lileep
-StaticPokemon[]=[1253:0x6B9] // Tirtouga
-StaticPokemon[]=[1253:0x6D8] // Archen
-StaticPokemonFormValues=[1208:0xD8D, 1208:0xD9B, 1208:0xDB8, 1208:0xDC6, 664:0x3B7, 664:0x3E4, 664:0x411, 664:0x43E] // Kyurem, Deerling
+StaticPokemon{}={Species=[662:0x1DE, 662:0x240, 740:0xCD, 740:0xFC, 740:0x12C, 740:0x14C], Level=[740:0x12E, 740:0x14E]} // Cobalion
+StaticPokemon{}={Species=[730:0x13A, 730:0x15F, 730:0x19B, 730:0x1BB], Level=[730:0x19D, 730:0x1BD]} // Virizion
+StaticPokemon{}={Species=[948:0x45D, 948:0x48D, 948:0x4AD], Level=[948:0x48F, 948:0x4AF]} // Terrakion
+StaticPokemon{}={Species=[426:0x38A, 426:0x39B, 556:0x367, 556:0x568, 556:0x5E6, 556:0x6E1, 1208:0x3A4, 1208:0xA6A, 1208:0x717], Level=[426:0x39D]} // Reshiram
+StaticPokemon{}={Species=[426:0x36B, 426:0x37C, 556:0x350, 556:0x551, 556:0x5C7, 556:0x6C3, 1208:0x38D, 1208:0xA53, 1208:0x706], Level=[426:0x37E]} // Zekrom
+StaticPokemon{}={Species=[1112:0x133, 1122:0x2BA, 1122:0x311, 1128:0x37A, 1128:0x3D1, 1208:0x1B7, 1208:0x1F8, 1208:0x723, 1208:0xF3D, 1208:0xF4E], Level=[1208:0xF50]} // Kyurem
+StaticPokemon{}={Species=[1208:0xD8B, 1208:0xD97], Level=[1208:0xD99], Forme=[1208:0xD8D, 1208:0xD9B]} // Kyurem-Black
+StaticPokemon{}={Species=[1208:0xDB6, 1208:0xDC2], Level=[1208:0xDC4], Forme=[1208:0xDB8, 1208:0xDC6]} // Kyurem-White
+StaticPokemon{}={Species=[304:0xCC, 304:0x14B, 304:0x1B8, 304:0x22F, 304:0x31B, 304:0x3D6, 304:0x491, 304:0x536, 304:0x5A9, 304:0x5BA], Level=[304:0x5BC]} // Latias
+StaticPokemon{}={Species=[304:0xB5, 304:0x134, 304:0x1A1, 304:0x218, 304:0x304, 304:0x3BF, 304:0x47A, 304:0x51F, 304:0x58A, 304:0x59B], Level=[304:0x59D]} // Latios
+StaticPokemon{}={Species=[32:0x247, 32:0x2B0, 32:0x2C1, 1034:0x12A], Level=[32:0x2C3]} // Uxie
+StaticPokemon{}={Species=[684:0x136, 684:0x1C2, 684:0x1D3, 1034:0x169], Level=[684:0x1D5]} // Mesprit
+StaticPokemon{}={Species=[950:0xA1, 950:0x10A, 950:0x11B, 1034:0x1BE], Level=[950:0x11D]} // Azelf
+StaticPokemon{}={Species=[1222:0x134, 1222:0x145, 1018:0x32], Level=[1222:0x147]} // Regirock
+StaticPokemon{}={Species=[1224:0x134, 1224:0x145, 1018:0x2C], Level=[1224:0x147]} // Regice
+StaticPokemon{}={Species=[1226:0x134, 1226:0x145, 1018:0x38], Level=[1226:0x147]} // Registeel
+StaticPokemon{}={Species=[1018:0x97, 1018:0xA8], Level=[1018:0xAA]} // Regigigas
+StaticPokemon{}={Species=[526:0x48D, 526:0x512, 526:0x523], Level=[526:0x525]} // Cresselia
+StaticPokemon{}={Species=[1068:0x171, 1068:0x1B4, 1068:0x1C5, 1080:0x171, 1080:0x1B4, 1080:0x1C5], Level=[1068:0x1C7, 1080:0x1C7]} // Heatran
+StaticPokemon{}={Species=[652:0x5C6, 652:0x5E9], Level=[652:0x5EB]} // Mandibuzz
+StaticPokemon{}={Species=[1102:0x592, 1102:0x5B5], Level=[1102:0x5B7]} // Braviary
+StaticPokemon{}={Species=[364:0xE, 364:0x32, 364:0x40], Level=[364:0x34, 364:0x42]} // Volcarona
+StaticPokemon{}={Species=[1030:0x290, 1030:0x2A1], Level=[1030:0x2A3]} // Crustle
+StaticPokemon{}={Species=[480:0xE1, 480:0x10A, 480:0x131, 480:0x15A], Level=[480:0x10C, 480:0x15C]} // Jellicent
+StaticPokemon{}={Species=[1168:0x2C, 1168:0x4F], Level=[1168:0x51]} // Shiny Haxorus
+StaticPokemon{}={Species=[988:0x382], Level=[988:0x386]} // Eevee
+StaticPokemon{}={Species=[664:0x3B5, 664:0x3E2, 664:0x40F, 664:0x43C], Level=[664:0x3B9, 664:0x3E6, 664:0x413, 664:0x440], Forme=[664:0x3B7, 664:0x3E4, 664:0x411, 664:0x43E]} // Deerling
+StaticPokemon{}={Species=[880:0xAB4, 880:0xAC7], Level=[880:0xAB8]} // Shiny Gible
+StaticPokemon{}={Species=[880:0xAD3, 880:0xAE6], Level=[880:0xAD7]} // Shiny Dratini
+StaticPokemon{}={Species=[54:0xDD]} // Happiny (egg)
+StaticPokemon{}={Species=[526:0x27E], Level=[526:0x282]} // Magikarp
+StaticPokemon{}={Species=[1253:0x5E0], Level=[1253:0x3D6]} // Cranidos
+StaticPokemon{}={Species=[1253:0x5FF], Level=[1253:0x3D6]} // Shieldon
+StaticPokemon{}={Species=[1253:0x61E], Level=[1253:0x3D6]} // Omanyte
+StaticPokemon{}={Species=[1253:0x63D], Level=[1253:0x3D6]} // Kabuto
+StaticPokemon{}={Species=[1253:0x65C], Level=[1253:0x3D6]} // Aerodactyl
+StaticPokemon{}={Species=[1253:0x67B], Level=[1253:0x3D6]} // Anorith
+StaticPokemon{}={Species=[1253:0x69A], Level=[1253:0x3D6]} // Lileep
+StaticPokemon{}={Species=[1253:0x6B9], Level=[1253:0x3D6]} // Tirtouga
+StaticPokemon{}={Species=[1253:0x6D8], Level=[1253:0x3D6]} // Archen
+StaticPokemon{}={Species=[1273:0x45]} // Foongus
+StaticPokemon{}={Species=[1273:0xC7]} // Amoonguss
+StaticPokemon{}={Species=[208:0x5A6], Level=[208:0x5A8]} // Zorua
+StaticEggPokemonOffsets=[29]
[White 2 (J)]
Game=IRDJ
diff --git a/src/com/dabomstew/pkrandom/config/gen6_offsets.ini b/src/com/dabomstew/pkrandom/config/gen6_offsets.ini
index 3be127c..9aa4a66 100644
--- a/src/com/dabomstew/pkrandom/config/gen6_offsets.ini
+++ b/src/com/dabomstew/pkrandom/config/gen6_offsets.ini
@@ -61,6 +61,7 @@ TitleScreenTextOffset=85
UpdateStringOffset=25
BoxLegendaryOffsets=[2, 12]
BoxLegendaryScriptOffsets=[4658, 5430, 16798]
+LinkedStaticEncounterOffsets=[1:3, 2:12]
[Y]
Game=CTR-P-EK2A
@@ -132,6 +133,7 @@ TitleScreenTextOffset=38
UpdateStringOffset=22
RayquazaEncounterNumber=28
RayquazaEncounterScriptNumber=31
+LinkedStaticEncounterOffsets=[26:49, 27:50, 29:58, 80:56, 81:57, 75:76]
[Alpha Sapphire]
Game=CTR-P-ECLA
diff --git a/src/com/dabomstew/pkrandom/config/gen7_offsets.ini b/src/com/dabomstew/pkrandom/config/gen7_offsets.ini
index 2f9712c..4a7cc7d 100644
--- a/src/com/dabomstew/pkrandom/config/gen7_offsets.ini
+++ b/src/com/dabomstew/pkrandom/config/gen7_offsets.ini
@@ -52,6 +52,7 @@ TMShops=[12,13,16,18,19]
RegularShops=[0,1,2,3,4,5,6,7]
DoublesTrainerClasses=[172, 173, 174, 174, 175, 176, 177, 178, 179, 181, 182]
CosmoemEvolutionNumber=791
+LinkedStaticEncounterOffsets=[112:113, 120:131, 124:130] // UBs probably need to be added to this too
[Moon]
Game=CTR-P-BNEA
@@ -116,6 +117,7 @@ TMShops=[12,13,16,18,19]
RegularShops=[0,1,2,3,4,5,6,7]
DoublesTrainerClasses=[172, 173, 174, 174, 175, 176, 177, 178, 179, 181, 182, 211, 212, 213, 214, 215]
CosmoemEvolutionNumber=791
+LinkedStaticEncounterOffsets=[127:128, 135:146, 139:145] // Unused SM UBs need to be added to this, probably other stuff too
[Ultra Moon]
Game=CTR-P-A2BA
diff --git a/src/com/dabomstew/pkrandom/newgui/Bundle.properties b/src/com/dabomstew/pkrandom/newgui/Bundle.properties
index 27ebccf..b463395 100644
--- a/src/com/dabomstew/pkrandom/newgui/Bundle.properties
+++ b/src/com/dabomstew/pkrandom/newgui/Bundle.properties
@@ -510,6 +510,8 @@ GUI.stpAllowAltFormesCheckBox.text=Allow Alternate Formes
GUI.stpAllowAltFormesCheckBox.toolTipText=<html>Allow alternate formes of Pokemon, such as the various formes of Rotom or Deoxys, to appear as Static Pokemon.<br />Note that their traits are randomized/shuffled separately from their base formes.
GUI.stpSwapMegaEvosCheckBox.text=Swap Mega Evolvables
GUI.stpSwapMegaEvosCheckBox.toolTipText=<html>Swap Statics capable of Mega Evolution with another Pokemon capable of Mega Evolution.<br />This affects Lucario in X/Y and Latios/Latias in OR/AS.
+GUI.stpPercentageLevelModifierCheckBox.text=Percentage Level Modifier:
+GUI.stpPercentageLevelModifierCheckBox.tooltipText=Checking this will enable a percentage-based level modifier for every Static Pokemon.
GUI.tpSwapMegaEvosCheckBox.text=Swap Mega Evolvables
GUI.tpSwapMegaEvosCheckBox.toolTipText=<html>Swap Trainer Pokemon capable of Mega Evolution with another Pokemon capable of Mega Evolution.<br />This only affects Trainer Pokemon that actually hold a Mega Stone (so, for example, it will affect Diantha's Gardevoir but not every Gardevoir)<br />If the "Limit Pokemon" general option is used to remove all Mega Evolutions from the game, this setting will be disabled.
GUI.wpAllowAltFormesCheckBox.text=Allow Alternate Formes
diff --git a/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.form b/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.form
index e35434d..3b88991 100644
--- a/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.form
+++ b/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.form
@@ -2,7 +2,7 @@
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.dabomstew.pkrandom.newgui.NewRandomizerGUI">
<grid id="27dc6" binding="mainPanel" layout-manager="GridBagLayout">
<constraints>
- <xy x="7" y="20" width="1042" height="816"/>
+ <xy x="7" y="20" width="1084" height="816"/>
</constraints>
<properties/>
<border type="none">
@@ -902,13 +902,13 @@
</component>
<hspacer id="c4003">
<constraints>
- <grid row="1" column="3" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- <gridbag weightx="0.0" weighty="0.0"/>
+ <grid row="1" column="4" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+ <gridbag weightx="6.0" weighty="0.0"/>
</constraints>
</hspacer>
<vspacer id="ec4fb">
<constraints>
- <grid row="5" column="1" row-span="1" col-span="2" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+ <grid row="5" column="1" row-span="1" col-span="3" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.0" weighty="0.0"/>
</constraints>
</vspacer>
@@ -960,7 +960,7 @@
<component id="cde9e" class="javax.swing.JCheckBox" binding="stpLimitMusketeersCheckBox">
<constraints>
<grid row="1" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
- <gridbag weightx="0.0" weighty="0.0"/>
+ <gridbag weightx="1.0" weighty="0.0"/>
</constraints>
<properties>
<enabled value="false"/>
@@ -1001,6 +1001,34 @@
<toolTipText resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.stpSwapMegaEvosCheckBox.toolTipText"/>
</properties>
</component>
+ <component id="84b86" class="javax.swing.JCheckBox" binding="stpPercentageLevelModifierCheckBox">
+ <constraints>
+ <grid row="1" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <gridbag weightx="6.0" weighty="0.0"/>
+ </constraints>
+ <properties>
+ <enabled value="false"/>
+ <text resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.stpPercentageLevelModifierCheckBox.text"/>
+ <toolTipText resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.stpPercentageLevelModifierCheckBox.tooltipText"/>
+ </properties>
+ </component>
+ <component id="f3518" class="javax.swing.JSlider" binding="stpPercentageLevelModifierSlider">
+ <constraints>
+ <grid row="2" column="3" row-span="2" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
+ <gridbag weightx="0.0" weighty="0.0"/>
+ </constraints>
+ <properties>
+ <enabled value="false"/>
+ <majorTickSpacing value="10"/>
+ <maximum value="50"/>
+ <minimum value="-50"/>
+ <minorTickSpacing value="2"/>
+ <paintLabels value="true"/>
+ <paintTicks value="true"/>
+ <snapToTicks value="true"/>
+ <value value="0"/>
+ </properties>
+ </component>
</children>
</grid>
<grid id="f2cab" layout-manager="GridBagLayout">
diff --git a/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.java b/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.java
index 6a7960e..a7acb02 100644
--- a/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.java
+++ b/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.java
@@ -280,6 +280,8 @@ public class NewRandomizerGUI {
private JComboBox pbsEXPCurveComboBox;
private JCheckBox miscRunWithoutRunningShoesCheckBox;
private JCheckBox peRemoveTimeBasedEvolutionsCheckBox;
+ private JCheckBox stpPercentageLevelModifierCheckBox;
+ private JSlider stpPercentageLevelModifierSlider;
private static JFrame frame;
@@ -397,6 +399,7 @@ public class NewRandomizerGUI {
stpSwapLegendariesSwapStandardsRadioButton.addActionListener(e -> enableOrDisableSubControls());
stpRandomCompletelyRadioButton.addActionListener(e -> enableOrDisableSubControls());
stpRandomSimilarStrengthRadioButton.addActionListener(e -> enableOrDisableSubControls());
+ stpPercentageLevelModifierCheckBox.addActionListener(e -> enableOrDisableSubControls());
igtUnchangedRadioButton.addActionListener(e -> enableOrDisableSubControls());
igtRandomizeGivenPokemonOnlyRadioButton.addActionListener(e -> enableOrDisableSubControls());
igtRandomizeBothRequestedGivenRadioButton.addActionListener(e -> enableOrDisableSubControls());
@@ -1390,6 +1393,8 @@ public class NewRandomizerGUI {
stpRandomize600BSTCheckBox.setSelected(settings.isLimit600());
stpAllowAltFormesCheckBox.setSelected(settings.isAllowStaticAltFormes());
stpSwapMegaEvosCheckBox.setSelected(settings.isSwapStaticMegaEvos());
+ stpPercentageLevelModifierCheckBox.setSelected(settings.isStaticLevelModified());
+ stpPercentageLevelModifierSlider.setValue(settings.getStaticLevelModifier());
thcRandomCompletelyRadioButton
.setSelected(settings.getTmsHmsCompatibilityMod() == Settings.TMsHMsCompatibilityMod.COMPLETELY_RANDOM);
@@ -1585,6 +1590,8 @@ public class NewRandomizerGUI {
settings.setLimit600(stpRandomize600BSTCheckBox.isSelected());
settings.setAllowStaticAltFormes(stpAllowAltFormesCheckBox.isSelected() && stpAllowAltFormesCheckBox.isVisible());
settings.setSwapStaticMegaEvos(stpSwapMegaEvosCheckBox.isSelected() && stpSwapMegaEvosCheckBox.isVisible());
+ settings.setStaticLevelModified(stpPercentageLevelModifierCheckBox.isSelected());
+ settings.setStaticLevelModifier(stpPercentageLevelModifierSlider.getValue());
settings.setTmsMod(tmUnchangedRadioButton.isSelected(), tmRandomRadioButton.isSelected());
@@ -1912,6 +1919,12 @@ public class NewRandomizerGUI {
stpRandomSimilarStrengthRadioButton.setVisible(true);
stpRandomSimilarStrengthRadioButton.setEnabled(false);
stpRandomSimilarStrengthRadioButton.setSelected(false);
+ stpPercentageLevelModifierCheckBox.setVisible(true);
+ stpPercentageLevelModifierCheckBox.setEnabled(false);
+ stpPercentageLevelModifierCheckBox.setSelected(false);
+ stpPercentageLevelModifierSlider.setVisible(true);
+ stpPercentageLevelModifierSlider.setEnabled(false);
+ stpPercentageLevelModifierSlider.setValue(0);
stpLimitMusketeersCheckBox.setVisible(true);
stpLimitMusketeersCheckBox.setEnabled(false);
stpLimitMusketeersCheckBox.setSelected(false);
@@ -2451,12 +2464,18 @@ public class NewRandomizerGUI {
stpLimitMusketeersCheckBox.setVisible(pokemonGeneration == 5);
stpAllowAltFormesCheckBox.setVisible(romHandler.hasStaticAltFormes());
stpSwapMegaEvosCheckBox.setVisible(pokemonGeneration == 6 && !romHandler.forceSwapStaticMegaEvos());
+ stpPercentageLevelModifierCheckBox.setVisible(pokemonGeneration >= 3);
+ stpPercentageLevelModifierCheckBox.setEnabled(pokemonGeneration >= 3);
+ stpPercentageLevelModifierSlider.setVisible(pokemonGeneration >= 3);
+ stpPercentageLevelModifierSlider.setEnabled(false);
} else {
stpSwapLegendariesSwapStandardsRadioButton.setVisible(false);
stpRandomCompletelyRadioButton.setVisible(false);
stpRandomSimilarStrengthRadioButton.setVisible(false);
stpRandomize600BSTCheckBox.setVisible(false);
stpLimitMusketeersCheckBox.setVisible(false);
+ stpPercentageLevelModifierCheckBox.setVisible(false);
+ stpPercentageLevelModifierSlider.setVisible(false);
}
igtUnchangedRadioButton.setEnabled(true);
@@ -2808,6 +2827,13 @@ public class NewRandomizerGUI {
stpSwapMegaEvosCheckBox.setEnabled(true);
}
+ if (stpPercentageLevelModifierCheckBox.isSelected()) {
+ stpPercentageLevelModifierSlider.setEnabled(true);
+ } else {
+ stpPercentageLevelModifierSlider.setEnabled(false);
+ stpPercentageLevelModifierSlider.setValue(0);
+ }
+
if (igtUnchangedRadioButton.isSelected()) {
igtRandomizeItemsCheckBox.setEnabled(false);
igtRandomizeItemsCheckBox.setSelected(false);
diff --git a/src/com/dabomstew/pkrandom/pokemon/StaticEncounter.java b/src/com/dabomstew/pkrandom/pokemon/StaticEncounter.java
index 51bc3a9..566a5e4 100644
--- a/src/com/dabomstew/pkrandom/pokemon/StaticEncounter.java
+++ b/src/com/dabomstew/pkrandom/pokemon/StaticEncounter.java
@@ -23,25 +23,60 @@ package com.dabomstew.pkrandom.pokemon;
/*-- along with this program. If not, see <http://www.gnu.org/licenses/>. --*/
/*----------------------------------------------------------------------------*/
+import java.util.ArrayList;
+import java.util.List;
+
public class StaticEncounter {
public Pokemon pkmn;
public int forme = 0;
- public String formeSuffix = "";
public int level;
public int heldItem;
+ public boolean isEgg = false;
public boolean resetMoves = false;
- public StaticEncounter() {
+ // In the games, sometimes what is logically an encounter or set of encounters with one specific Pokemon
+ // can actually consist of multiple encounters internally. This can happen because:
+ // - The same Pokemon appears in multiple locations (e.g., Reshiram/Zekrom in BW1, Giratina in Pt)
+ // - The same Pokemon appears at different levels depending on game progression (e.g., Volcarona in BW2)
+ // - Rebattling a Pokemon actually is different encounter entirely (e.g., Xerneas/Yveltal in XY)
+ // This list tracks encounters that should logically have the same species and forme, but *may* have
+ // differences in other properties like level.
+ public List<StaticEncounter> linkedEncounters;
+ public StaticEncounter() {
+ this.linkedEncounters = new ArrayList<>();
}
public StaticEncounter(Pokemon pkmn) {
this.pkmn = pkmn;
+ this.linkedEncounters = new ArrayList<>();
}
@Override
public String toString() {
- return pkmn.fullName();
+ return this.toString(true);
+ }
+
+ public String toString(boolean printLevel) {
+ if (isEgg) {
+ return pkmn.fullName() + " (egg)";
+ }
+ else if (!printLevel) {
+ return pkmn.fullName();
+ }
+ StringBuilder levelStringBuilder = new StringBuilder("Lv" + level);
+ boolean needToDisplayLinkedLevels = false;
+ for (int i = 0; i < linkedEncounters.size(); i++) {
+ if (level != linkedEncounters.get(i).level) {
+ needToDisplayLinkedLevels = true;
+ }
+ }
+ if (needToDisplayLinkedLevels) {
+ for (int i = 0; i < linkedEncounters.size(); i++) {
+ levelStringBuilder.append(" / ").append("Lv").append(linkedEncounters.get(i).level);
+ }
+ }
+ return pkmn.fullName() + ", " + levelStringBuilder.toString();
}
public boolean canMegaEvolve() {
diff --git a/src/com/dabomstew/pkrandom/romhandlers/AbstractRomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/AbstractRomHandler.java
index 57255da..0dde09b 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/AbstractRomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/AbstractRomHandler.java
@@ -2900,7 +2900,8 @@ public abstract class AbstractRomHandler implements RomHandler {
@Override
public void randomizeStaticPokemon(boolean swapLegendaries, boolean similarStrength, boolean limitMusketeers,
- boolean limit600, boolean allowAltFormes, boolean swapMegaEvos, boolean abilitiesAreRandomized) {
+ boolean limit600, boolean allowAltFormes, boolean swapMegaEvos,
+ boolean abilitiesAreRandomized, int levelModifier) {
// Load
checkPokemonRestrictions();
List<StaticEncounter> currentStaticPokemon = this.getStaticPokemon();
@@ -2936,12 +2937,11 @@ public abstract class AbstractRomHandler implements RomHandler {
nonlegsLeft.removeAll(banned);
ultraBeastsLeft.removeAll(banned);
for (StaticEncounter old : currentStaticPokemon) {
- StaticEncounter newStatic = new StaticEncounter();
- newStatic.heldItem = old.heldItem;
+ StaticEncounter newStatic = cloneStaticEncounter(old);
Pokemon newPK;
if (old.pkmn.number == 487 && ptGiratina) {
newPK = giratinaPicks.remove(this.random.nextInt(giratinaPicks.size()));
- newStatic.pkmn = newPK;
+ setPokemonAndFormeForStaticEncounter(newStatic, newPK);
legendariesLeft.remove(newPK);
if (legendariesLeft.size() == 0) {
legendariesLeft.addAll(onlyLegendaryList);
@@ -2957,10 +2957,7 @@ public abstract class AbstractRomHandler implements RomHandler {
newPK = legendariesLeft.remove(this.random.nextInt(legendariesLeft.size()));
}
- newStatic.pkmn = newPK;
- setFormeForStaticEncounter(newStatic, newPK);
- newStatic.level = old.level;
- newStatic.resetMoves = true;
+ setPokemonAndFormeForStaticEncounter(newStatic, newPK);
if (legendariesLeft.size() == 0) {
legendariesLeft.addAll(onlyLegendaryList);
@@ -2977,10 +2974,7 @@ public abstract class AbstractRomHandler implements RomHandler {
} else if (ultraBeastList.contains(old.pkmn)) {
newPK = ultraBeastsLeft.remove(this.random.nextInt(ultraBeastsLeft.size()));
- newStatic.pkmn = newPK;
- setFormeForStaticEncounter(newStatic, newPK);
- newStatic.level = old.level;
- newStatic.resetMoves = true;
+ setPokemonAndFormeForStaticEncounter(newStatic, newPK);
if (ultraBeastsLeft.size() == 0) {
ultraBeastsLeft.addAll(ultraBeastList);
@@ -2991,10 +2985,7 @@ public abstract class AbstractRomHandler implements RomHandler {
} else {
newPK = nonlegsLeft.remove(this.random.nextInt(nonlegsLeft.size()));
}
- newStatic.pkmn = newPK;
- setFormeForStaticEncounter(newStatic, newPK);
- newStatic.level = old.level;
- newStatic.resetMoves = true;
+ setPokemonAndFormeForStaticEncounter(newStatic, newPK);
if (nonlegsLeft.size() == 0) {
nonlegsLeft.addAll(noLegendaryList);
@@ -3020,8 +3011,7 @@ public abstract class AbstractRomHandler implements RomHandler {
List<Pokemon> pokemonLeft = new ArrayList<>(!allowAltFormes ? mainPokemonList : listInclFormesExclCosmetics);
pokemonLeft.removeAll(banned);
for (StaticEncounter old : currentStaticPokemon) {
- StaticEncounter newStatic = new StaticEncounter();
- newStatic.heldItem = old.heldItem;
+ StaticEncounter newStatic = cloneStaticEncounter(old);
Pokemon newPK;
Pokemon oldPK = old.pkmn;
if (old.forme > 0) {
@@ -3031,19 +3021,15 @@ public abstract class AbstractRomHandler implements RomHandler {
if (oldPK.number == 487 && ptGiratina) {
newPK = giratinaPicks.remove(this.random.nextInt(giratinaPicks.size()));
pokemonLeft.remove(newPK);
- newStatic.pkmn = newPK;
+ setPokemonAndFormeForStaticEncounter(newStatic, newPK);
} else if (oldBST >= 600 && limit600) {
if (reallySwapMegaEvos && old.canMegaEvolve()) {
newPK = getMegaEvoPokemon(mainPokemonList, pokemonLeft, newStatic);
} else {
newPK = pokemonLeft.remove(this.random.nextInt(pokemonLeft.size()));
}
- newStatic.pkmn = newPK;
- setFormeForStaticEncounter(newStatic, newPK);
- newStatic.level = old.level;
- newStatic.resetMoves = true;
+ setPokemonAndFormeForStaticEncounter(newStatic, newPK);
} else {
-
if ((oldPK.number == 638 || oldPK.number == 639 || oldPK.number == 640) && limitMusketeers) {
newPK = pickStaticPowerLvlReplacement(
pokemonLeft,
@@ -3092,10 +3078,7 @@ public abstract class AbstractRomHandler implements RomHandler {
}
}
pokemonLeft.remove(newPK);
- newStatic.pkmn = newPK;
- setFormeForStaticEncounter(newStatic, newPK);
- newStatic.level = old.level;
- newStatic.resetMoves = true;
+ setPokemonAndFormeForStaticEncounter(newStatic, newPK);
}
if (pokemonLeft.size() == 0) {
@@ -3113,13 +3096,12 @@ public abstract class AbstractRomHandler implements RomHandler {
List<Pokemon> pokemonLeft = new ArrayList<>(!allowAltFormes ? mainPokemonList : listInclFormesExclCosmetics);
pokemonLeft.removeAll(banned);
for (StaticEncounter old : currentStaticPokemon) {
- StaticEncounter newStatic = new StaticEncounter();
- newStatic.heldItem = old.heldItem;
+ StaticEncounter newStatic = cloneStaticEncounter(old);
Pokemon newPK;
if (old.pkmn.number == 487 && ptGiratina) {
newPK = giratinaPicks.remove(this.random.nextInt(giratinaPicks.size()));
pokemonLeft.remove(newPK);
- newStatic.pkmn = newPK;
+ setPokemonAndFormeForStaticEncounter(newStatic, newPK);
} else {
if (reallySwapMegaEvos && old.canMegaEvolve()) {
newPK = getMegaEvoPokemon(mainPokemonList, pokemonLeft, newStatic);
@@ -3127,10 +3109,7 @@ public abstract class AbstractRomHandler implements RomHandler {
newPK = pokemonLeft.remove(this.random.nextInt(pokemonLeft.size()));
}
pokemonLeft.remove(newPK);
- newStatic.pkmn = newPK;
- setFormeForStaticEncounter(newStatic, newPK);
- newStatic.level = old.level;
- newStatic.resetMoves = true;
+ setPokemonAndFormeForStaticEncounter(newStatic, newPK);
}
if (pokemonLeft.size() == 0) {
pokemonLeft.addAll(!allowAltFormes ? mainPokemonList : listInclFormesExclCosmetics);
@@ -3140,16 +3119,85 @@ public abstract class AbstractRomHandler implements RomHandler {
}
}
+ if (levelModifier != 0) {
+ for (StaticEncounter se : replacements) {
+ if (!se.isEgg) {
+ se.level = Math.min(100, (int) Math.round(se.level * (1 + levelModifier / 100.0)));
+ for (StaticEncounter linkedStatic : se.linkedEncounters) {
+ if (!linkedStatic.isEgg) {
+ linkedStatic.level = Math.min(100, (int) Math.round(linkedStatic.level * (1 + levelModifier / 100.0)));
+ }
+ }
+ }
+ }
+ }
+
// Save
this.setStaticPokemon(replacements);
}
+ @Override
+ public void onlyChangeStaticLevels(int levelModifier) {
+ List<StaticEncounter> currentStaticPokemon = this.getStaticPokemon();
+ for (StaticEncounter se : currentStaticPokemon) {
+ if (!se.isEgg) {
+ se.level = Math.min(100, (int) Math.round(se.level * (1 + levelModifier / 100.0)));
+ for (StaticEncounter linkedStatic : se.linkedEncounters) {
+ if (!linkedStatic.isEgg) {
+ linkedStatic.level = Math.min(100, (int) Math.round(linkedStatic.level * (1 + levelModifier / 100.0)));
+ }
+ }
+ }
+ }
+ this.setStaticPokemon(currentStaticPokemon);
+ }
+
+ private StaticEncounter cloneStaticEncounter(StaticEncounter old) {
+ StaticEncounter newStatic = new StaticEncounter();
+ newStatic.pkmn = old.pkmn;
+ newStatic.level = old.level;
+ newStatic.heldItem = old.heldItem;
+ newStatic.isEgg = old.isEgg;
+ newStatic.resetMoves = true;
+ for (StaticEncounter oldLinked : old.linkedEncounters) {
+ StaticEncounter newLinked = new StaticEncounter();
+ newLinked.pkmn = oldLinked.pkmn;
+ newLinked.level = oldLinked.level;
+ newLinked.heldItem = oldLinked.heldItem;
+ newLinked.isEgg = oldLinked.isEgg;
+ newLinked.resetMoves = true;
+ newStatic.linkedEncounters.add(newLinked);
+ }
+ return newStatic;
+ }
+
+ private void setPokemonAndFormeForStaticEncounter(StaticEncounter newStatic, Pokemon pk) {
+ boolean checkCosmetics = true;
+ Pokemon newPK = pk;
+ int newForme = 0;
+ if (pk.formeNumber > 0) {
+ newForme = pk.formeNumber;
+ newPK = pk.baseForme;
+ checkCosmetics = false;
+ }
+ if (checkCosmetics && pk.cosmeticForms > 0) {
+ newForme = pk.getCosmeticFormNumber(this.random.nextInt(pk.cosmeticForms));
+ } else if (!checkCosmetics && pk.cosmeticForms > 0) {
+ newForme += pk.getCosmeticFormNumber(this.random.nextInt(pk.cosmeticForms));
+ }
+ newStatic.pkmn = newPK;
+ newStatic.forme = newForme;
+ for (StaticEncounter linked : newStatic.linkedEncounters) {
+ linked.pkmn = newPK;
+ linked.forme = newForme;
+ }
+ }
+
private void setFormeForStaticEncounter(StaticEncounter newStatic, Pokemon pk) {
boolean checkCosmetics = true;
newStatic.forme = 0;
if (pk.formeNumber > 0) {
newStatic.forme = pk.formeNumber;
- newStatic.formeSuffix = pk.formeSuffix;
newStatic.pkmn = pk.baseForme;
checkCosmetics = false;
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java
index 4f79baa..ec25bec 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java
@@ -27,6 +27,9 @@ package com.dabomstew.pkrandom.romhandlers;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.IntStream;
import java.util.zip.CRC32;
import com.dabomstew.pkrandom.FileFunctions;
@@ -37,6 +40,7 @@ import com.dabomstew.pkrandom.constants.Gen3Constants;
import com.dabomstew.pkrandom.constants.GlobalConstants;
import com.dabomstew.pkrandom.exceptions.RandomizationException;
import com.dabomstew.pkrandom.exceptions.RandomizerIOException;
+import com.dabomstew.pkrandom.newnds.NARCArchive;
import com.dabomstew.pkrandom.pokemon.*;
import compressors.DSDecmp;
@@ -150,19 +154,8 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
}
r[1] = r[1].trim();
// Static Pokemon?
- if (r[0].equals("StaticPokemon[]")) {
- if (r[1].startsWith("[") && r[1].endsWith("]")) {
- String[] offsets = r[1].substring(1, r[1].length() - 1).split(",");
- int[] offs = new int[offsets.length];
- int c = 0;
- for (String off : offsets) {
- offs[c++] = parseRIInt(off);
- }
- current.staticPokemon.add(new StaticPokemon(offs));
- } else {
- int offs = parseRIInt(r[1]);
- current.staticPokemon.add(new StaticPokemon(offs));
- }
+ if (r[0].equals("StaticPokemon{}")) {
+ current.staticPokemon.add(parseStaticPokemon(r[1]));
} else if (r[0].equals("TMText[]")) {
if (r[1].startsWith("[") && r[1].endsWith("]")) {
String[] parts = r[1].substring(1, r[1].length() - 1).split(",", 6);
@@ -274,6 +267,30 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
}
}
+ private static StaticPokemon parseStaticPokemon(String staticPokemonString) {
+ StaticPokemon sp = new StaticPokemon();
+ String pattern = "[A-z]+=\\[(0x[0-9a-fA-F]+,?\\s?)+]";
+ Pattern r = Pattern.compile(pattern);
+ Matcher m = r.matcher(staticPokemonString);
+ while (m.find()) {
+ String[] segments = m.group().split("=");
+ String[] romOffsets = segments[1].substring(1, segments[1].length() - 1).split(",");
+ int[] offsets = new int [romOffsets.length];
+ for (int i = 0; i < offsets.length; i++) {
+ offsets[i] = parseRIInt(romOffsets[i]);
+ }
+ switch (segments[0]) {
+ case "Species":
+ sp.speciesOffsets = offsets;
+ break;
+ case "Level":
+ sp.levelOffsets = offsets;
+ break;
+ }
+ }
+ return sp;
+ }
+
private void loadTextTable(String filename) {
try {
Scanner sc = new Scanner(FileFunctions.openConfig(filename + ".tbl"), "UTF-8");
@@ -1694,30 +1711,55 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
}
private static class StaticPokemon {
- private int[] offsets;
+ private int[] speciesOffsets;
+ private int[] levelOffsets;
- public StaticPokemon(int... offsets) {
- this.offsets = offsets;
+ public StaticPokemon() {
+ this.speciesOffsets = new int[0];
+ this.levelOffsets = new int[0];
}
public Pokemon getPokemon(Gen3RomHandler parent) {
- return parent.pokesInternal[parent.readWord(offsets[0])];
+ return parent.pokesInternal[parent.readWord(speciesOffsets[0])];
}
public void setPokemon(Gen3RomHandler parent, Pokemon pkmn) {
int value = parent.pokedexToInternal[pkmn.number];
- for (int offset : offsets) {
+ for (int offset : speciesOffsets) {
parent.writeWord(offset, value);
}
}
+
+ public int getLevel(byte[] rom, int i) {
+ if (levelOffsets.length <= i) {
+ return 1;
+ }
+ return rom[levelOffsets[i]];
+ }
+
+ public void setLevel(byte[] rom, int level, int i) {
+ if (levelOffsets.length > i) { // Might not have a level entry e.g., it's an egg
+ rom[levelOffsets[i]] = (byte) level;
+ }
+ }
}
@Override
public List<StaticEncounter> getStaticPokemon() {
List<StaticEncounter> statics = new ArrayList<>();
List<StaticPokemon> staticsHere = romEntry.staticPokemon;
- for (StaticPokemon staticPK : staticsHere) {
- statics.add(new StaticEncounter(staticPK.getPokemon(this)));
+ int[] staticEggOffsets = new int[0];
+ if (romEntry.arrayEntries.containsKey("StaticEggPokemonOffsets")) {
+ staticEggOffsets = romEntry.arrayEntries.get("StaticEggPokemonOffsets");
+ }
+ for (int i = 0; i < staticsHere.size(); i++) {
+ int currentOffset = i;
+ StaticPokemon staticPK = staticsHere.get(i);
+ StaticEncounter se = new StaticEncounter();
+ se.pkmn = staticPK.getPokemon(this);
+ se.level = staticPK.getLevel(rom, 0);
+ se.isEgg = Arrays.stream(staticEggOffsets).anyMatch(x-> x == currentOffset);
+ statics.add(se);
}
return statics;
}
@@ -1734,6 +1776,7 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
for (int i = 0; i < staticsHere.size(); i++) {
staticsHere.get(i).setPokemon(this, staticPokemon.get(i).pkmn);
+ staticsHere.get(i).setLevel(rom, staticPokemon.get(i).level, 0);
}
return true;
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen4RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen4RomHandler.java
index b0919bd..db3b612 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen4RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen4RomHandler.java
@@ -29,7 +29,10 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
+import java.util.stream.IntStream;
import com.dabomstew.pkrandom.pokemon.*;
import thenewpoketext.PokeTextData;
@@ -152,29 +155,8 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
}
}
}
- } else if (r[0].equals("StaticPokemon[]")) {
- if (r[1].startsWith("[") && r[1].endsWith("]")) {
- String[] offsets = r[1].substring(1, r[1].length() - 1).split(",");
- int[] offs = new int[offsets.length];
- int[] files = new int[offsets.length];
- int c = 0;
- for (String off : offsets) {
- String[] parts = off.split(":");
- files[c] = parseRIInt(parts[0]);
- offs[c++] = parseRIInt(parts[1]);
- }
- StaticPokemon sp = new StaticPokemon();
- sp.files = files;
- sp.offsets = offs;
- current.staticPokemon.add(sp);
- } else {
- String[] parts = r[1].split(":");
- int files = parseRIInt(parts[0]);
- int offs = parseRIInt(parts[1]);
- StaticPokemon sp = new StaticPokemon();
- sp.files = new int[] { files };
- sp.offsets = new int[] { offs };
- }
+ } else if (r[0].equals("StaticPokemon{}")) {
+ current.staticPokemon.add(parseStaticPokemon(r[1]));
} else if (r[0].equals("StaticPokemonSupport")) {
int spsupport = parseRIInt(r[1]);
current.staticPokemonSupport = (spsupport > 0);
@@ -229,6 +211,34 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
}
}
+ private static StaticPokemon parseStaticPokemon(String staticPokemonString) {
+ StaticPokemon sp = new StaticPokemon();
+ String pattern = "[A-z]+=\\[([0-9]+:0x[0-9a-fA-F]+,?\\s?)+]";
+ Pattern r = Pattern.compile(pattern);
+ Matcher m = r.matcher(staticPokemonString);
+ while (m.find()) {
+ String[] segments = m.group().split("=");
+ String[] offsets = segments[1].substring(1, segments[1].length() - 1).split(",");
+ ScriptEntry[] entries = new ScriptEntry[offsets.length];
+ for (int i = 0; i < entries.length; i++) {
+ String[] parts = offsets[i].split(":");
+ entries[i] = new ScriptEntry(parseRIInt(parts[0]), parseRIInt(parts[1]));
+ }
+ switch (segments[0]) {
+ case "Species":
+ sp.speciesEntries = entries;
+ break;
+ case "Level":
+ sp.levelEntries = entries;
+ break;
+ case "Forme":
+ sp.formeEntries = entries;
+ break;
+ }
+ }
+ return sp;
+ }
+
// This rom
private Pokemon[] pokes;
private List<Pokemon> pokemonListInclFormes;
@@ -2290,19 +2300,70 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
}
+ private static class ScriptEntry {
+ private int scriptFile;
+ private int scriptOffset;
+
+ public ScriptEntry(int scriptFile, int scriptOffset) {
+ this.scriptFile = scriptFile;
+ this.scriptOffset = scriptOffset;
+ }
+ }
+
private static class StaticPokemon {
- private int[] files;
- private int[] offsets;
+ private ScriptEntry[] speciesEntries;
+ private ScriptEntry[] formeEntries;
+ private ScriptEntry[] levelEntries;
+
+ public StaticPokemon() {
+ this.speciesEntries = new ScriptEntry[0];
+ this.formeEntries = new ScriptEntry[0];
+ this.levelEntries = new ScriptEntry[0];
+ }
public Pokemon getPokemon(Gen4RomHandler parent, NARCArchive scriptNARC) {
- return parent.pokes[parent.readWord(scriptNARC.files.get(files[0]), offsets[0])];
+ return parent.pokes[parent.readWord(scriptNARC.files.get(speciesEntries[0].scriptFile), speciesEntries[0].scriptOffset)];
}
public void setPokemon(Gen4RomHandler parent, NARCArchive scriptNARC, Pokemon pkmn) {
int value = pkmn.number;
- for (int i = 0; i < offsets.length; i++) {
- byte[] file = scriptNARC.files.get(files[i]);
- parent.writeWord(file, offsets[i], value);
+ for (int i = 0; i < speciesEntries.length; i++) {
+ byte[] file = scriptNARC.files.get(speciesEntries[i].scriptFile);
+ parent.writeWord(file, speciesEntries[i].scriptOffset, value);
+ }
+ }
+
+ public int getForme(NARCArchive scriptNARC) {
+ if (formeEntries.length == 0) {
+ return 0;
+ }
+ byte[] file = scriptNARC.files.get(formeEntries[0].scriptFile);
+ return file[formeEntries[0].scriptOffset];
+ }
+
+ public void setForme(NARCArchive scriptNARC, int forme) {
+ for (int i = 0; i < formeEntries.length; i++) {
+ byte[] file = scriptNARC.files.get(formeEntries[i].scriptFile);
+ file[formeEntries[i].scriptOffset] = (byte) forme;
+ }
+ }
+
+ public int getLevelCount() {
+ return levelEntries.length;
+ }
+
+ public int getLevel(NARCArchive scriptNARC, int i) {
+ if (levelEntries.length <= i) {
+ return 1;
+ }
+ byte[] file = scriptNARC.files.get(levelEntries[i].scriptFile);
+ return file[levelEntries[i].scriptOffset];
+ }
+
+ public void setLevel(NARCArchive scriptNARC, int level, int i) {
+ if (levelEntries.length > i) { // Might not have a level entry e.g., it's an egg
+ byte[] file = scriptNARC.files.get(levelEntries[i].scriptFile);
+ file[levelEntries[i].scriptOffset] = (byte) level;
}
}
}
@@ -2314,30 +2375,62 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
return sp;
}
try {
+ int[] staticEggOffsets = new int[0];
+ if (romEntry.arrayEntries.containsKey("StaticEggPokemonOffsets")) {
+ staticEggOffsets = romEntry.arrayEntries.get("StaticEggPokemonOffsets");
+ }
NARCArchive scriptNARC = scriptNarc;
- for (StaticPokemon statP : romEntry.staticPokemon) {
- sp.add(new StaticEncounter(statP.getPokemon(this, scriptNARC)));
+ for (int i = 0; i < romEntry.staticPokemon.size(); i++) {
+ int currentOffset = i;
+ StaticPokemon statP = romEntry.staticPokemon.get(i);
+ StaticEncounter se = new StaticEncounter();
+ Pokemon newPK = statP.getPokemon(this, scriptNARC);
+ newPK = getAltFormeOfPokemon(newPK, statP.getForme(scriptNARC));
+ se.pkmn = newPK;
+ se.level = statP.getLevel(scriptNARC, 0);
+ se.isEgg = Arrays.stream(staticEggOffsets).anyMatch(x-> x == currentOffset);
+ for (int levelEntry = 1; levelEntry < statP.getLevelCount(); levelEntry++) {
+ StaticEncounter linkedStatic = new StaticEncounter();
+ linkedStatic.pkmn = newPK;
+ linkedStatic.level = statP.getLevel(scriptNARC, levelEntry);
+ se.linkedEncounters.add(linkedStatic);
+ }
+ sp.add(se);
}
if (romEntry.arrayEntries.containsKey("StaticPokemonTrades")) {
NARCArchive tradeNARC = this.readNARC(romEntry.getString("InGameTrades"));
int[] trades = romEntry.arrayEntries.get("StaticPokemonTrades");
- for (int tradeNum : trades) {
- sp.add(new StaticEncounter(pokes[readLong(tradeNARC.files.get(tradeNum), 0)]));
+ int[] scripts = romEntry.arrayEntries.get("StaticPokemonTradeScripts");
+ int[] scriptOffsets = romEntry.arrayEntries.get("StaticPokemonTradeLevelOffsets");
+ for (int i = 0; i < trades.length; i++) {
+ int tradeNum = trades[i];
+ byte[] scriptFile = scriptNARC.files.get(scripts[i]);
+ int level = scriptFile[scriptOffsets[i]];
+ StaticEncounter se = new StaticEncounter(pokes[readLong(tradeNARC.files.get(tradeNum), 0)]);
+ se.level = level;
+ sp.add(se);
}
}
if (romEntry.getInt("MysteryEggOffset") > 0) {
byte[] ovOverlay = readOverlay(romEntry.getInt("MoveTutorMovesOvlNumber"));
- sp.add(new StaticEncounter(pokes[ovOverlay[romEntry.getInt("MysteryEggOffset")] & 0xFF]));
+ StaticEncounter se = new StaticEncounter(pokes[ovOverlay[romEntry.getInt("MysteryEggOffset")] & 0xFF]);
+ se.isEgg = true;
+ sp.add(se);
}
if (romEntry.getInt("FossilTableOffset") > 0) {
byte[] ftData = arm9;
int baseOffset = romEntry.getInt("FossilTableOffset");
+ int fossilLevelScriptNum = romEntry.getInt("FossilLevelScriptNumber");
+ byte[] fossilLevelScript = scriptNARC.files.get(fossilLevelScriptNum);
+ int level = fossilLevelScript[romEntry.getInt("FossilLevelOffset")];
if (romEntry.romType == Gen4Constants.Type_HGSS) {
ftData = readOverlay(romEntry.getInt("FossilTableOvlNumber"));
}
// read the 7 Fossil Pokemon
for (int f = 0; f < Gen4Constants.fossilCount; f++) {
- sp.add(new StaticEncounter(pokes[readWord(ftData, baseOffset + 2 + f * 4)]));
+ StaticEncounter se = new StaticEncounter(pokes[readWord(ftData, baseOffset + 2 + f * 4)]);
+ se.level = level;
+ sp.add(se);
}
}
} catch (IOException e) {
@@ -2362,13 +2455,24 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
Iterator<StaticEncounter> statics = staticPokemon.iterator();
NARCArchive scriptNARC = scriptNarc;
for (StaticPokemon statP : romEntry.staticPokemon) {
- statP.setPokemon(this, scriptNARC, statics.next().pkmn);
+ StaticEncounter se = statics.next();
+ statP.setPokemon(this, scriptNARC, se.pkmn);
+ statP.setForme(scriptNARC, se.pkmn.formeNumber);
+ statP.setLevel(scriptNARC, se.level, 0);
+ for (int i = 0; i < se.linkedEncounters.size(); i++) {
+ StaticEncounter linkedStatic = se.linkedEncounters.get(i);
+ statP.setLevel(scriptNARC, linkedStatic.level, i + 1);
+ }
}
if (romEntry.arrayEntries.containsKey("StaticPokemonTrades")) {
NARCArchive tradeNARC = this.readNARC(romEntry.getString("InGameTrades"));
int[] trades = romEntry.arrayEntries.get("StaticPokemonTrades");
- for (int tradeNum : trades) {
- Pokemon thisTrade = statics.next().pkmn;
+ int[] scripts = romEntry.arrayEntries.get("StaticPokemonTradeScripts");
+ int[] scriptOffsets = romEntry.arrayEntries.get("StaticPokemonTradeLevelOffsets");
+ for (int i = 0; i < trades.length; i++) {
+ int tradeNum = trades[i];
+ StaticEncounter se = statics.next();
+ Pokemon thisTrade = se.pkmn;
List<Integer> possibleAbilities = new ArrayList<>();
possibleAbilities.add(thisTrade.ability1);
if (thisTrade.ability2 > 0) {
@@ -2381,6 +2485,9 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
writeLong(tradeNARC.files.get(tradeNum), 0, thisTrade.number);
writeLong(tradeNARC.files.get(tradeNum), 0x1C,
possibleAbilities.get(this.random.nextInt(possibleAbilities.size())));
+ // Write level to script file
+ byte[] scriptFile = scriptNARC.files.get(scripts[i]);
+ scriptFile[scriptOffsets[i]] = (byte) se.level;
}
writeNARC(romEntry.getString("InGameTrades"), tradeNARC);
}
@@ -2397,18 +2504,24 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
}
if (romEntry.getInt("FossilTableOffset") > 0) {
int baseOffset = romEntry.getInt("FossilTableOffset");
+ int fossilLevelScriptNum = romEntry.getInt("FossilLevelScriptNumber");
+ byte[] fossilLevelScript = scriptNARC.files.get(fossilLevelScriptNum);
if (romEntry.romType == Gen4Constants.Type_HGSS) {
byte[] ftData = readOverlay(romEntry.getInt("FossilTableOvlNumber"));
for (int f = 0; f < Gen4Constants.fossilCount; f++) {
- int pokenum = statics.next().pkmn.number;
+ StaticEncounter se = statics.next();
+ int pokenum = se.pkmn.number;
writeWord(ftData, baseOffset + 2 + f * 4, pokenum);
+ fossilLevelScript[romEntry.getInt("FossilLevelOffset")] = (byte) se.level;
}
writeOverlay(romEntry.getInt("FossilTableOvlNumber"), ftData);
} else {
// write to arm9
for (int f = 0; f < Gen4Constants.fossilCount; f++) {
- int pokenum = statics.next().pkmn.number;
+ StaticEncounter se = statics.next();
+ int pokenum = se.pkmn.number;
writeWord(arm9, baseOffset + 2 + f * 4, pokenum);
+ fossilLevelScript[romEntry.getInt("FossilLevelOffset")] = (byte) se.level;
}
}
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen5RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen5RomHandler.java
index 04de11f..fca26db 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen5RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen5RomHandler.java
@@ -30,6 +30,8 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.IntStream;
import com.dabomstew.pkrandom.pokemon.*;
@@ -160,29 +162,8 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
}
}
}
- } else if (r[0].equals("StaticPokemon[]")) {
- if (r[1].startsWith("[") && r[1].endsWith("]")) {
- String[] offsets = r[1].substring(1, r[1].length() - 1).split(",");
- int[] offs = new int[offsets.length];
- int[] files = new int[offsets.length];
- int c = 0;
- for (String off : offsets) {
- String[] parts = off.split(":");
- files[c] = parseRIInt(parts[0]);
- offs[c++] = parseRIInt(parts[1]);
- }
- StaticPokemon sp = new StaticPokemon();
- sp.files = files;
- sp.offsets = offs;
- current.staticPokemon.add(sp);
- } else {
- String[] parts = r[1].split(":");
- int files = parseRIInt(parts[0]);
- int offs = parseRIInt(parts[1]);
- StaticPokemon sp = new StaticPokemon();
- sp.files = new int[] { files };
- sp.offsets = new int[] { offs };
- }
+ } else if (r[0].equals("StaticPokemon{}")) {
+ current.staticPokemon.add(parseStaticPokemon(r[1]));
} else if (r[0].equals("TradeScript[]")) {
String[] offsets = r[1].substring(1, r[1].length() - 1).split(",");
int[] reqOffs = new int[offsets.length];
@@ -209,7 +190,7 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
} else if (r[0].equals("CopyTradeScripts")) {
int cts = parseRIInt(r[1]);
current.copyTradeScripts = (cts > 0);
- } else if (r[0].startsWith("StarterOffsets") || r[0].equals("StaticPokemonFormValues")) {
+ } else if (r[0].startsWith("StarterOffsets")) {
String[] offsets = r[1].substring(1, r[1].length() - 1).split(",");
OffsetWithinEntry[] offs = new OffsetWithinEntry[offsets.length];
int c = 0;
@@ -270,6 +251,34 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
}
}
+ private static StaticPokemon parseStaticPokemon(String staticPokemonString) {
+ StaticPokemon sp = new StaticPokemon();
+ String pattern = "[A-z]+=\\[([0-9]+:0x[0-9a-fA-F]+,?\\s?)+]";
+ Pattern r = Pattern.compile(pattern);
+ Matcher m = r.matcher(staticPokemonString);
+ while (m.find()) {
+ String[] segments = m.group().split("=");
+ String[] offsets = segments[1].substring(1, segments[1].length() - 1).split(",");
+ ScriptEntry[] entries = new ScriptEntry[offsets.length];
+ for (int i = 0; i < entries.length; i++) {
+ String[] parts = offsets[i].split(":");
+ entries[i] = new ScriptEntry(parseRIInt(parts[0]), parseRIInt(parts[1]));
+ }
+ switch (segments[0]) {
+ case "Species":
+ sp.speciesEntries = entries;
+ break;
+ case "Level":
+ sp.levelEntries = entries;
+ break;
+ case "Forme":
+ sp.formeEntries = entries;
+ break;
+ }
+ }
+ return sp;
+ }
+
// This ROM
private Pokemon[] pokes;
private Map<Integer,FormeInfo> formeMappings = new TreeMap<>();
@@ -1438,19 +1447,70 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
}
+ private static class ScriptEntry {
+ private int scriptFile;
+ private int scriptOffset;
+
+ public ScriptEntry(int scriptFile, int scriptOffset) {
+ this.scriptFile = scriptFile;
+ this.scriptOffset = scriptOffset;
+ }
+ }
+
private static class StaticPokemon {
- private int[] files;
- private int[] offsets;
+ private ScriptEntry[] speciesEntries;
+ private ScriptEntry[] formeEntries;
+ private ScriptEntry[] levelEntries;
+
+ public StaticPokemon() {
+ this.speciesEntries = new ScriptEntry[0];
+ this.formeEntries = new ScriptEntry[0];
+ this.levelEntries = new ScriptEntry[0];
+ }
public Pokemon getPokemon(Gen5RomHandler parent, NARCArchive scriptNARC) {
- return parent.pokes[parent.readWord(scriptNARC.files.get(files[0]), offsets[0])];
+ return parent.pokes[parent.readWord(scriptNARC.files.get(speciesEntries[0].scriptFile), speciesEntries[0].scriptOffset)];
}
public void setPokemon(Gen5RomHandler parent, NARCArchive scriptNARC, Pokemon pkmn) {
int value = pkmn.number;
- for (int i = 0; i < offsets.length; i++) {
- byte[] file = scriptNARC.files.get(files[i]);
- parent.writeWord(file, offsets[i], value);
+ for (int i = 0; i < speciesEntries.length; i++) {
+ byte[] file = scriptNARC.files.get(speciesEntries[i].scriptFile);
+ parent.writeWord(file, speciesEntries[i].scriptOffset, value);
+ }
+ }
+
+ public int getForme(NARCArchive scriptNARC) {
+ if (formeEntries.length == 0) {
+ return 0;
+ }
+ byte[] file = scriptNARC.files.get(formeEntries[0].scriptFile);
+ return file[formeEntries[0].scriptOffset];
+ }
+
+ public void setForme(NARCArchive scriptNARC, int forme) {
+ for (int i = 0; i < formeEntries.length; i++) {
+ byte[] file = scriptNARC.files.get(formeEntries[i].scriptFile);
+ file[formeEntries[i].scriptOffset] = (byte) forme;
+ }
+ }
+
+ public int getLevelCount() {
+ return levelEntries.length;
+ }
+
+ public int getLevel(NARCArchive scriptNARC, int i) {
+ if (levelEntries.length <= i) {
+ return 1;
+ }
+ byte[] file = scriptNARC.files.get(levelEntries[i].scriptFile);
+ return file[levelEntries[i].scriptOffset];
+ }
+
+ public void setLevel(NARCArchive scriptNARC, int level, int i) {
+ if (levelEntries.length > i) { // Might not have a level entry e.g., it's an egg
+ byte[] file = scriptNARC.files.get(levelEntries[i].scriptFile);
+ file[levelEntries[i].scriptOffset] = (byte) level;
}
}
}
@@ -1497,9 +1557,27 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
if (!romEntry.staticPokemonSupport) {
return sp;
}
+ int[] staticEggOffsets = new int[0];
+ if (romEntry.arrayEntries.containsKey("StaticEggPokemonOffsets")) {
+ staticEggOffsets = romEntry.arrayEntries.get("StaticEggPokemonOffsets");
+ }
NARCArchive scriptNARC = scriptNarc;
- for (StaticPokemon statP : romEntry.staticPokemon) {
- sp.add(new StaticEncounter(statP.getPokemon(this, scriptNARC)));
+ for (int i = 0; i < romEntry.staticPokemon.size(); i++) {
+ int currentOffset = i;
+ StaticPokemon statP = romEntry.staticPokemon.get(i);
+ StaticEncounter se = new StaticEncounter();
+ Pokemon newPK = statP.getPokemon(this, scriptNARC);
+ newPK = getAltFormeOfPokemon(newPK, statP.getForme(scriptNARC));
+ se.pkmn = newPK;
+ se.level = statP.getLevel(scriptNARC, 0);
+ se.isEgg = Arrays.stream(staticEggOffsets).anyMatch(x-> x == currentOffset);
+ for (int levelEntry = 1; levelEntry < statP.getLevelCount(); levelEntry++) {
+ StaticEncounter linkedStatic = new StaticEncounter();
+ linkedStatic.pkmn = newPK;
+ linkedStatic.level = statP.getLevel(scriptNARC, levelEntry);
+ se.linkedEncounters.add(linkedStatic);
+ }
+ sp.add(se);
}
return sp;
}
@@ -1515,12 +1593,13 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
Iterator<StaticEncounter> statics = staticPokemon.iterator();
NARCArchive scriptNARC = scriptNarc;
for (StaticPokemon statP : romEntry.staticPokemon) {
- statP.setPokemon(this, scriptNARC, statics.next().pkmn);
- }
- if (romEntry.offsetArrayEntries.containsKey("StaticPokemonFormValues")) {
- OffsetWithinEntry[] formValues = romEntry.offsetArrayEntries.get("StaticPokemonFormValues");
- for (OffsetWithinEntry owe : formValues) {
- writeWord(scriptNARC.files.get(owe.entry), owe.offset, 0);
+ StaticEncounter se = statics.next();
+ statP.setPokemon(this, scriptNARC, se.pkmn);
+ statP.setForme(scriptNARC, se.pkmn.formeNumber);
+ statP.setLevel(scriptNARC, se.level, 0);
+ for (int i = 0; i < se.linkedEncounters.size(); i++) {
+ StaticEncounter linkedStatic = se.linkedEncounters.get(i);
+ statP.setLevel(scriptNARC, linkedStatic.level, i + 1);
}
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java
index c38da7c..4adca8e 100644
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java
@@ -78,6 +78,7 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
private String acronym;
private int romType;
private boolean staticPokemonSupport = true, copyStaticPokemon = true;
+ private Map<Integer, Integer> linkedStaticOffsets = new HashMap<>();
private Map<String, String> strings = new HashMap<>();
private Map<String, Integer> numbers = new HashMap<>();
private Map<String, int[]> arrayEntries = new HashMap<>();
@@ -146,18 +147,19 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
for (RomEntry otherEntry : roms) {
if (r[1].equalsIgnoreCase(otherEntry.romCode)) {
// copy from here
+ current.linkedStaticOffsets.putAll(otherEntry.linkedStaticOffsets);
current.arrayEntries.putAll(otherEntry.arrayEntries);
current.numbers.putAll(otherEntry.numbers);
current.strings.putAll(otherEntry.strings);
current.offsetArrayEntries.putAll(otherEntry.offsetArrayEntries);
-// if (current.copyStaticPokemon) {
-// current.staticPokemon.addAll(otherEntry.staticPokemon);
-// current.staticPokemonSupport = true;
-// } else {
-// current.staticPokemonSupport = false;
-// }
}
}
+ } else if (r[0].equals("LinkedStaticEncounterOffsets")) {
+ String[] offsets = r[1].substring(1, r[1].length() - 1).split(",");
+ for (int i = 0; i < offsets.length; i++) {
+ String[] parts = offsets[i].split(":");
+ current.linkedStaticOffsets.put(Integer.parseInt(parts[0].trim()), Integer.parseInt(parts[1].trim()));
+ }
} else if (r[1].startsWith("[") && r[1].endsWith("]")) {
String[] offsets = r[1].substring(1, r[1].length() - 1).split(",");
if (offsets.length == 1 && offsets[0].trim().isEmpty()) {
@@ -941,7 +943,6 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
Pokemon starter = starterIter.next();
if (starter.formeNumber > 0) {
newStatic.forme = starter.formeNumber;
- newStatic.formeSuffix = starter.formeSuffix;
starter = starter.baseForme;
}
newStatic.pkmn = starter;
@@ -1824,7 +1825,6 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
heldItem = 0;
}
se.heldItem = heldItem;
- se.formeSuffix = Gen6Constants.getFormeSuffixByBaseForme(se.pkmn.number,se.forme);
statics.add(se);
}
@@ -1855,36 +1855,42 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
heldItem = 0;
}
se.heldItem = heldItem;
+ if (romEntry.romType == Gen6Constants.Type_ORAS) {
+ int metLocation = FileFunctions.read2ByteInt(staticCRO, offset + i * size + 18);
+ if (metLocation == 0xEA64) {
+ se.isEgg = true;
+ }
+ }
statics.add(se);
}
} catch (IOException e) {
throw new RandomizerIOException(e);
}
- // In XY, there are two Xerneas/Yveltal encounters; one for when you
- // first encounter them, and another for every time after that. For
- // multiple reasons, we don't want these to be different, so delete
- // the second one.
- if (romEntry.romType == Gen6Constants.Type_XY) {
- int[] boxLegendaryOffsets = romEntry.arrayEntries.get("BoxLegendaryOffsets");
- statics.remove(boxLegendaryOffsets[1]);
- }
+ consolidateLinkedEncounters(statics);
return statics;
}
+ private void consolidateLinkedEncounters(List<StaticEncounter> statics) {
+ List<StaticEncounter> encountersToRemove = new ArrayList<>();
+ for (Map.Entry<Integer, Integer> entry : romEntry.linkedStaticOffsets.entrySet()) {
+ StaticEncounter baseEncounter = statics.get(entry.getKey());
+ StaticEncounter linkedEncounter = statics.get(entry.getValue());
+ baseEncounter.linkedEncounters.add(linkedEncounter);
+ encountersToRemove.add(linkedEncounter);
+ }
+ for (StaticEncounter encounter : encountersToRemove) {
+ statics.remove(encounter);
+ }
+ }
+
@Override
public boolean setStaticPokemon(List<StaticEncounter> staticPokemon) {
// Static Pokemon
try {
byte[] staticCRO = readFile(romEntry.getString("StaticPokemon"));
- // To match what we did in getStaticPokemon, we have to add the
- // second Xerneas/Yveltal encounter back into the list of statics.
- if (romEntry.romType == Gen6Constants.Type_XY) {
- int[] boxLegendaryOffsets = romEntry.arrayEntries.get("BoxLegendaryOffsets");
- staticPokemon.add(boxLegendaryOffsets[1], staticPokemon.get(boxLegendaryOffsets[0]));
- }
-
+ unlinkStaticEncounters(staticPokemon);
Iterator<StaticEncounter> staticIter = staticPokemon.iterator();
int staticCount = Gen6Constants.getStaticPokemonCount(romEntry.romType);
@@ -1938,6 +1944,21 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
}
}
+ private void unlinkStaticEncounters(List<StaticEncounter> statics) {
+ List<Integer> offsetsToInsert = new ArrayList<>();
+ for (Map.Entry<Integer, Integer> entry : romEntry.linkedStaticOffsets.entrySet()) {
+ offsetsToInsert.add(entry.getValue());
+ }
+ Collections.sort(offsetsToInsert);
+ for (Integer offsetToInsert : offsetsToInsert) {
+ statics.add(offsetToInsert, new StaticEncounter());
+ }
+ for (Map.Entry<Integer, Integer> entry : romEntry.linkedStaticOffsets.entrySet()) {
+ StaticEncounter baseEncounter = statics.get(entry.getKey());
+ statics.set(entry.getValue(), baseEncounter.linkedEncounters.get(0));
+ }
+ }
+
private void fixBoxLegendariesXY(int boxLegendarySpecies) throws IOException {
// We need to edit the script file or otherwise the text will still say "Xerneas" or "Yveltal"
GARCArchive encounterGarc = readGARC(romEntry.getString("WildPokemon"), false);
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen7RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen7RomHandler.java
index 6cda6b1..71b2ca1 100644
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen7RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen7RomHandler.java
@@ -75,6 +75,7 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
private String titleId;
private String acronym;
private int romType;
+ private Map<Integer, Integer> linkedStaticOffsets = new HashMap<>();
private Map<String, String> strings = new HashMap<>();
private Map<String, Integer> numbers = new HashMap<>();
private Map<String, int[]> arrayEntries = new HashMap<>();
@@ -139,6 +140,12 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
current.titleId = r[1];
} else if (r[0].equals("Acronym")) {
current.acronym = r[1];
+ } else if (r[0].equals("LinkedStaticEncounterOffsets")) {
+ String[] offsets = r[1].substring(1, r[1].length() - 1).split(",");
+ for (int i = 0; i < offsets.length; i++) {
+ String[] parts = offsets[i].split(":");
+ current.linkedStaticOffsets.put(Integer.parseInt(parts[0].trim()), Integer.parseInt(parts[1].trim()));
+ }
} else if (r[0].endsWith("Offset") || r[0].endsWith("Count") || r[0].endsWith("Number")) {
int offs = parseRIInt(r[1]);
current.numbers.put(r[0], offs);
@@ -158,6 +165,7 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
for (RomEntry otherEntry : roms) {
if (r[1].equalsIgnoreCase(otherEntry.romCode)) {
// copy from here
+ current.linkedStaticOffsets.putAll(otherEntry.linkedStaticOffsets);
current.arrayEntries.putAll(otherEntry.arrayEntries);
current.numbers.putAll(otherEntry.numbers);
current.strings.putAll(otherEntry.strings);
@@ -955,7 +963,6 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
}
se.pkmn = pokemon;
se.forme = forme;
- se.formeSuffix = Gen7Constants.getFormeSuffixByBaseForme(species, forme);
se.level = giftsFile[offset + 3];
se.heldItem = FileFunctions.read2ByteInt(giftsFile, offset + 8);
starters.add(se);
@@ -1728,7 +1735,6 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
}
totem.pkmn = pokemon;
totem.forme = forme;
- totem.formeSuffix = Gen7Constants.getFormeSuffixByBaseForme(species, forme);
totem.level = staticEncountersFile[offset + 3];
int heldItem = FileFunctions.read2ByteInt(staticEncountersFile, offset + 4);
if (heldItem == 0xFFFF) {
@@ -1838,9 +1844,9 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
}
se.pkmn = pokemon;
se.forme = forme;
- se.formeSuffix = Gen7Constants.getFormeSuffixByBaseForme(species, forme);
se.level = giftsFile[offset + 3];
se.heldItem = FileFunctions.read2ByteInt(giftsFile, offset + 8);
+ se.isEgg = giftsFile[offset + 10] == 1;
statics.add(se);
}
@@ -1856,6 +1862,7 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
} catch (IOException e) {
throw new RandomizerIOException(e);
}
+ consolidateLinkedEncounters(statics);
return statics;
}
@@ -1872,7 +1879,6 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
}
se.pkmn = pokemon;
se.forme = forme;
- se.formeSuffix = Gen7Constants.getFormeSuffixByBaseForme(species, forme);
se.level = staticEncountersFile[offset + 3];
int heldItem = FileFunctions.read2ByteInt(staticEncountersFile, offset + 4);
if (heldItem == 0xFFFF) {
@@ -1882,9 +1888,23 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
return se;
}
+ private void consolidateLinkedEncounters(List<StaticEncounter> statics) {
+ List<StaticEncounter> encountersToRemove = new ArrayList<>();
+ for (Map.Entry<Integer, Integer> entry : romEntry.linkedStaticOffsets.entrySet()) {
+ StaticEncounter baseEncounter = statics.get(entry.getKey());
+ StaticEncounter linkedEncounter = statics.get(entry.getValue());
+ baseEncounter.linkedEncounters.add(linkedEncounter);
+ encountersToRemove.add(linkedEncounter);
+ }
+ for (StaticEncounter encounter : encountersToRemove) {
+ statics.remove(encounter);
+ }
+ }
+
@Override
public boolean setStaticPokemon(List<StaticEncounter> staticPokemon) {
try {
+ unlinkStaticEncounters(staticPokemon);
GARCArchive staticGarc = readGARC(romEntry.getString("StaticPokemon"), true);
List<Integer> skipIndices =
Arrays.stream(romEntry.arrayEntries.get("TotemPokemonIndices")).boxed().collect(Collectors.toList());
@@ -1931,7 +1951,21 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
} catch (IOException e) {
throw new RandomizerIOException(e);
}
+ }
+ private void unlinkStaticEncounters(List<StaticEncounter> statics) {
+ List<Integer> offsetsToInsert = new ArrayList<>();
+ for (Map.Entry<Integer, Integer> entry : romEntry.linkedStaticOffsets.entrySet()) {
+ offsetsToInsert.add(entry.getValue());
+ }
+ Collections.sort(offsetsToInsert);
+ for (Integer offsetToInsert : offsetsToInsert) {
+ statics.add(offsetToInsert, new StaticEncounter());
+ }
+ for (Map.Entry<Integer, Integer> entry : romEntry.linkedStaticOffsets.entrySet()) {
+ StaticEncounter baseEncounter = statics.get(entry.getKey());
+ statics.set(entry.getValue(), baseEncounter.linkedEncounters.get(0));
+ }
}
@Override
diff --git a/src/com/dabomstew/pkrandom/romhandlers/RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/RomHandler.java
index d901631..5e5bb55 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/RomHandler.java
@@ -267,7 +267,8 @@ public interface RomHandler {
boolean setStaticPokemon(List<StaticEncounter> staticPokemon);
void randomizeStaticPokemon(boolean swapLegendaries, boolean similarStrength, boolean limitMusketeers,
- boolean limit600, boolean allowAltFormes, boolean swapMegaEvos1, boolean abilitiesAreRandomized);
+ boolean limit600, boolean allowAltFormes, boolean swapMegaEvos1,
+ boolean abilitiesAreRandomized, int levelModifier);
boolean canChangeStaticPokemon();
@@ -277,6 +278,8 @@ public interface RomHandler {
boolean forceSwapStaticMegaEvos();
+ void onlyChangeStaticLevels(int levelModifier);
+
// Randomizer: Totem Pokemon
List<TotemPokemon> getTotemPokemon();