summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x.gitignore5
-rw-r--r--src/com/dabomstew/pkrandom/Randomizer.java10
-rw-r--r--src/com/dabomstew/pkrandom/Settings.java81
-rw-r--r--src/com/dabomstew/pkrandom/constants/Gen3Constants.java38
-rw-r--r--src/com/dabomstew/pkrandom/constants/Gen4Constants.java66
-rw-r--r--src/com/dabomstew/pkrandom/constants/Gen5Constants.java36
-rw-r--r--src/com/dabomstew/pkrandom/constants/Gen6Constants.java35
-rw-r--r--src/com/dabomstew/pkrandom/constants/Gen7Constants.java79
-rw-r--r--src/com/dabomstew/pkrandom/newgui/Bundle.properties16
-rw-r--r--src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.form145
-rw-r--r--src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.java83
-rw-r--r--src/com/dabomstew/pkrandom/pokemon/TotemPokemon.java1
-rwxr-xr-xsrc/com/dabomstew/pkrandom/pokemon/Trainer.java20
-rwxr-xr-xsrc/com/dabomstew/pkrandom/pokemon/TrainerPokemon.java10
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/AbstractRomHandler.java82
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/Gen1RomHandler.java5
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/Gen2RomHandler.java9
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java21
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/Gen4RomHandler.java29
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/Gen5RomHandler.java29
-rw-r--r--src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java28
-rw-r--r--src/com/dabomstew/pkrandom/romhandlers/Gen7RomHandler.java18
-rwxr-xr-xsrc/com/dabomstew/pkrandom/romhandlers/RomHandler.java10
23 files changed, 703 insertions, 153 deletions
diff --git a/.gitignore b/.gitignore
index f3de0e2..d403573 100755
--- a/.gitignore
+++ b/.gitignore
@@ -38,4 +38,7 @@ gen5r_race.rnqs
.classpath
.settings/org.eclipse.jdt.core.prefs
util/files
-util/log \ No newline at end of file
+util/log
+out/
+.idea/
+*.iml \ No newline at end of file
diff --git a/src/com/dabomstew/pkrandom/Randomizer.java b/src/com/dabomstew/pkrandom/Randomizer.java
index 8a5ff68..42de09d 100644
--- a/src/com/dabomstew/pkrandom/Randomizer.java
+++ b/src/com/dabomstew/pkrandom/Randomizer.java
@@ -348,6 +348,13 @@ public class Randomizer {
trainersChanged = true;
}
+ if (settings.isRandomizeHeldItemsForBossTrainerPokemon()
+ || settings.isRandomizeHeldItemsForImportantTrainerPokemon()
+ || settings.isRandomizeHeldItemsForRegularTrainerPokemon()) {
+ romHandler.randomizeTrainerHeldItems(settings);
+ trainersChanged = true;
+ }
+
if (trainersChanged) {
maybeLogTrainerChanges(log);
} else {
@@ -1081,11 +1088,12 @@ public class Randomizer {
}
log.print(" - ");
boolean first = true;
+ String[] itemNames = romHandler.getItemNames();
for (TrainerPokemon tpk : t.pokemon) {
if (!first) {
log.print(", ");
}
- log.print(tpk.toString());
+ log.printf(tpk.toString(), itemNames[tpk.heldItem]);
first = false;
}
log.println();
diff --git a/src/com/dabomstew/pkrandom/Settings.java b/src/com/dabomstew/pkrandom/Settings.java
index 6afc009..cfe926a 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 = 48;
+ public static final int LENGTH_OF_SETTINGS_DATA = 49;
private CustomNamesSet customNames;
@@ -176,6 +176,12 @@ public class Settings {
private int additionalBossTrainerPokemon = 0;
private int additionalImportantTrainerPokemon = 0;
private int additionalRegularTrainerPokemon = 0;
+ private boolean randomizeHeldItemsForBossTrainerPokemon;
+ private boolean randomizeHeldItemsForImportantTrainerPokemon;
+ private boolean randomizeHeldItemsForRegularTrainerPokemon;
+ private boolean consumableItemsOnlyForTrainerPokemon;
+ private boolean sensibleItemsOnlyForTrainerPokemon;
+ private boolean highestLevelOnlyGetsItemsForTrainerPokemon;
private boolean doubleBattleMode;
private boolean shinyChance;
@@ -473,8 +479,6 @@ public class Settings {
swapTrainerMegaEvos,
shinyChance));
-
-
// @ 28 pokemon restrictions
try {
if (currentRestrictions != null) {
@@ -485,17 +489,15 @@ public class Settings {
} catch (IOException e) {
e.printStackTrace(); // better than nothing
}
-
-
- // @ 31 misc tweaks
+ // @ 32 misc tweaks
try {
writeFullInt(out, currentMiscTweaks);
} catch (IOException e) {
e.printStackTrace(); // better than nothing
}
- // @ 35 trainer pokemon level modifier
+ // @ 36 trainer pokemon level modifier
out.write((trainersLevelModified ? 0x80 : 0) | (trainersLevelModifier+50));
out.write(makeByteSelected(shopItemsMod == ShopItemsMod.RANDOM, shopItemsMod == ShopItemsMod.SHUFFLE,
@@ -513,6 +515,7 @@ public class Settings {
allowTrainerAlternateFormes,
allowWildAltFormes));
+ // 40
out.write((doubleBattleMode ? 0x1 : 0) |
(additionalBossTrainerPokemon << 1) |
(additionalImportantTrainerPokemon << 4) |
@@ -547,6 +550,14 @@ public class Settings {
out.write((staticLevelModified ? 0x80 : 0) | (staticLevelModifier+50));
+ // 48 trainer pokemon held items.
+ out.write(makeByteSelected(randomizeHeldItemsForBossTrainerPokemon,
+ randomizeHeldItemsForImportantTrainerPokemon,
+ randomizeHeldItemsForRegularTrainerPokemon,
+ consumableItemsOnlyForTrainerPokemon,
+ sensibleItemsOnlyForTrainerPokemon,
+ highestLevelOnlyGetsItemsForTrainerPokemon));
+
try {
byte[] romName = this.romName.getBytes("US-ASCII");
out.write(romName.length);
@@ -754,7 +765,6 @@ public class Settings {
settings.setSwapTrainerMegaEvos(restoreState(data[27], 5));
settings.setShinyChance(restoreState(data[27], 6));
-
// gen restrictions
int genLimit = FileFunctions.readFullInt(data, 28);
GenRestrictions restrictions = null;
@@ -818,6 +828,13 @@ public class Settings {
settings.setStaticLevelModified(restoreState(data[47],7));
settings.setStaticLevelModifier((data[47] & 0x7F) - 50);
+ settings.setRandomizeHeldItemsForBossTrainerPokemon(restoreState(data[48], 0));
+ settings.setRandomizeHeldItemsForImportantTrainerPokemon(restoreState(data[48], 1));
+ settings.setRandomizeHeldItemsForRegularTrainerPokemon(restoreState(data[48], 2));
+ settings.setConsumableItemsOnlyForTrainers(restoreState(data[48], 3));
+ settings.setSensibleItemsOnlyForTrainers(restoreState(data[48], 4));
+ settings.setHighestLevelGetsItemsForTrainers(restoreState(data[48], 5));
+
int romNameLength = data[LENGTH_OF_SETTINGS_DATA] & 0xFF;
String romName = new String(data, LENGTH_OF_SETTINGS_DATA + 1, romNameLength, "US-ASCII");
settings.setRomName(romName);
@@ -1596,6 +1613,54 @@ public class Settings {
this.additionalRegularTrainerPokemon = additional;
}
+ public boolean isRandomizeHeldItemsForBossTrainerPokemon() {
+ return randomizeHeldItemsForBossTrainerPokemon;
+ }
+
+ public void setRandomizeHeldItemsForBossTrainerPokemon(boolean bossTrainers) {
+ this.randomizeHeldItemsForBossTrainerPokemon = bossTrainers;
+ }
+
+ public boolean isRandomizeHeldItemsForImportantTrainerPokemon() {
+ return randomizeHeldItemsForImportantTrainerPokemon;
+ }
+
+ public void setRandomizeHeldItemsForImportantTrainerPokemon(boolean importantTrainers) {
+ this.randomizeHeldItemsForImportantTrainerPokemon = importantTrainers;
+ }
+
+ public boolean isRandomizeHeldItemsForRegularTrainerPokemon() {
+ return randomizeHeldItemsForRegularTrainerPokemon;
+ }
+
+ public void setRandomizeHeldItemsForRegularTrainerPokemon(boolean regularTrainers) {
+ this.randomizeHeldItemsForRegularTrainerPokemon = regularTrainers;
+ }
+
+ public boolean isConsumableItemsOnlyForTrainers() {
+ return consumableItemsOnlyForTrainerPokemon;
+ }
+
+ public void setConsumableItemsOnlyForTrainers(boolean consumableOnly) {
+ this.consumableItemsOnlyForTrainerPokemon = consumableOnly;
+ }
+
+ public boolean isSensibleItemsOnlyForTrainers() {
+ return sensibleItemsOnlyForTrainerPokemon;
+ }
+
+ public void setSensibleItemsOnlyForTrainers(boolean sensibleOnly) {
+ this.sensibleItemsOnlyForTrainerPokemon = sensibleOnly;
+ }
+
+ public boolean isHighestLevelGetsItemsForTrainers() {
+ return highestLevelOnlyGetsItemsForTrainerPokemon;
+ }
+
+ public void setHighestLevelGetsItemsForTrainers(boolean highestOnly) {
+ this.highestLevelOnlyGetsItemsForTrainerPokemon = highestOnly;
+ }
+
public boolean isDoubleBattleMode() {
return doubleBattleMode;
}
diff --git a/src/com/dabomstew/pkrandom/constants/Gen3Constants.java b/src/com/dabomstew/pkrandom/constants/Gen3Constants.java
index c4ce76f..d96c689 100644
--- a/src/com/dabomstew/pkrandom/constants/Gen3Constants.java
+++ b/src/com/dabomstew/pkrandom/constants/Gen3Constants.java
@@ -200,6 +200,44 @@ public class Gen3Constants {
public static final int luckyEggIndex = 0xC5;
+ // https://bulbapedia.bulbagarden.net/wiki/List_of_items_by_index_number_(Generation_III)
+ // Berries that can be eaten in battle listed. They are in numeric order and roughly categorized.
+ public static final int
+ // status effect berries
+ cheriBerry = 0x85, chestoBerry = 0x86, pechaBerry = 0x87, rawstBerry = 0x88, aspearBerry = 0x89,
+ leppaBerry = 0x8a, oranBerry = 0x8b, persimBerry = 0x8c, lumBerry = 0x8d, sitrusBerry = 0x8e,
+ // Restore 1/8 HP when below 50% but may cause confusion
+ figyBerry = 0x8f, wikiBerry = 0x90, magoBerry = 0x91, aguavBerry = 0x92, iapapaBerry = 0x93,
+ // Increase stat (or other buff) when below 25%
+ liechiBerry = 0xa8, ganlonBerry = 0xa9, salacBerry = 0xaa, petayaBerry = 0xab, apicotBerry = 0xac,
+ lansatBerry = 0xad, starfBerry = 0xae;
+ // Other consumable held items
+ public static final int berryJuice = 0x2c, whiteHerb = 0xb4, mentalHerb = 0xb9;
+ // non-consumable held items with in-battle NPC effect (not specific to one pokemon family)
+ public static final int brightPowder = 0x0b3, quickClaw = 0x0b7, choiceBand = 0x0ba, kingsRock = 0x0bb,
+ silverPowder = 0x0bc, focusBand = 0x0c4, scopeLens = 0x0c6, metalCoat = 0x0c7, leftovers = 0x0c8,
+ softSand = 0x0cb, hardStone = 0x0cc, miracleSeed = 0x0cd, blackGlasses = 0x0ce, blackBelt = 0x0cf,
+ magnet = 0x0d0, mysticWater = 0x0d1, sharpBeak = 0x0d2, poisonBarb = 0x0d3, neverMeltIce = 0x0d4,
+ spellTag = 0x0d5, twistedSpoon = 0x0d6, charcoal = 0x0d7, dragonFang = 0x0d8, silkScarf = 0x0d9,
+ shellBell = 0x0db, seaIncense = 0x0dc, laxIncense = 0x0de;
+
+ public static final List<Integer> consumableHeldItems = Arrays.asList(
+ cheriBerry, chestoBerry, pechaBerry, rawstBerry, aspearBerry, leppaBerry, oranBerry, persimBerry,
+ lumBerry, sitrusBerry, figyBerry, wikiBerry, magoBerry, aguavBerry, iapapaBerry, liechiBerry,
+ ganlonBerry, salacBerry, petayaBerry, apicotBerry, lansatBerry, starfBerry, berryJuice, whiteHerb,
+ mentalHerb);
+
+ public static final List<Integer> allHeldItems = setupAllHeldItems();
+
+ private static List<Integer> setupAllHeldItems() {
+ List<Integer> list = new ArrayList<>();
+ list.addAll(Arrays.asList(brightPowder, quickClaw, choiceBand, kingsRock, silverPowder, focusBand,
+ scopeLens, metalCoat, leftovers, softSand, hardStone, miracleSeed, blackGlasses, blackBelt, magnet,
+ mysticWater, sharpBeak, poisonBarb, neverMeltIce, spellTag, twistedSpoon, charcoal, dragonFang,
+ silkScarf, shellBell, seaIncense, laxIncense));
+ list.addAll(consumableHeldItems);
+ return list;
+ }
private static Type[] constructTypeTable() {
Type[] table = new Type[256];
diff --git a/src/com/dabomstew/pkrandom/constants/Gen4Constants.java b/src/com/dabomstew/pkrandom/constants/Gen4Constants.java
index 643cf84..705f644 100644
--- a/src/com/dabomstew/pkrandom/constants/Gen4Constants.java
+++ b/src/com/dabomstew/pkrandom/constants/Gen4Constants.java
@@ -95,8 +95,74 @@ public class Gen4Constants {
public static final int highestAbilityIndex = 123;
+ // https://projectpokemon.org/home/docs/gen-4/list-of-items-by-index-number-r23/
+ // Berries that can be eaten in battle listed. They are in numeric order and roughly categorized.
+ public static final int
+ // status effect berries
+ cheriBerry = 0x95, chestoBerry = 0x96, pechaBerry = 0x97, rawstBerry = 0x98, aspearBerry = 0x99,
+ leppaBerry = 0x9a, oranBerry = 0x9b, persimBerry = 0x9c, lumBerry = 0x9d, sitrusBerry = 0x9e,
+ // Restore 1/8 HP when below 50% but may cause confusion
+ figyBerry = 0x9f, wikiBerry = 0xa0, magoBerry = 0xa1, aguavBerry = 0xa2, iapapaBerry = 0xa3,
+ // Reduce damage from supereffective damage
+ occaBerry = 0xb8, passhoBerry = 0xb9, wacanBerry = 0xba, rindoBerry = 0xbb, yacheBerry = 0xbc,
+ chopleBerry = 0xbd, kebiaBerry = 0xbe, shucaBerry = 0xbf, cobaBerry = 0xc0, payapaBerry = 0xc1,
+ tangaBerry = 0xc2, chartiBerry = 0xc3, kasibBerry = 0xc4, habanBerry = 0xc5, colburBerry = 0xc6,
+ babiriBerry = 0xc7, chilanBerry = 0xc8,
+ // Increase stat (or other buff) when below 25%
+ liechiBerry = 0xc9, ganlonBerry = 0xca, salacBerry = 0xcb, petayaBerry = 0xcc, apicotBerry = 0xcd,
+ lansatBerry = 0xce, starfBerry = 0xcf, enigmaBerry = 0xd0, micleBerry = 0xd1, custapBerry = 0xd2,
+ // retaliate berries
+ jabocaBerry = 0xd3, rowapBerry = 0xd4;
+ // Other consumable held items
+ public static final int berryJuice = 0x2b, whiteHerb = 0xd6, mentalHerb = 0xdb, powerHerb = 0x10f,
+ focusSash = 0x113;
+ // non-consumable held items with in-battle NPC effect (not specific to one pokemon family)
+ public static final int brightPowder = 0x0d5, quickClaw = 0x0d9, choiceBand = 0x0dc, kingsRock = 0x0dd,
+ silverPowder = 0x0de, focusBand = 0x0e6, scopeLens = 0x0e8, metalCoat = 0x0e9, leftovers = 0x0ea,
+ softSand = 0x0ed, hardStone = 0x0ee, miracleSeed = 0x0ef, blackGlasses = 0x0f0, blackBelt = 0x0f1,
+ magnet = 0x0f2, mysticWater = 0x0f3, sharpBeak = 0x0f4, poisonBarb = 0x0f5, neverMeltIce = 0x0f6,
+ spellTag = 0x0f7, twistedSpoon = 0x0f8, charcoal = 0x0f9, dragonFang = 0x0fa, silkScarf = 0x0fb,
+ shellBell = 0x0fd, seaIncense = 0x0fe, laxIncense = 0x0ff, wideLens = 0x109, muscleBand = 0x10a,
+ wiseGlasses = 0x10b, expertBelt = 0x10c, lightClay = 0x10d, lifeOrb = 0x10e, toxicOrb = 0x110,
+ flameOrb = 0x111, quickPowder = 0x112, zoomLens = 0x114, metronome = 0x115, ironBall = 0x116,
+ laggingTail = 0x117, destinyKnot = 0x118, blackSludge = 0x119, icyRock = 0x11a, smoothRock = 0x11b,
+ heatRock = 0x11c, dampRock = 0x11d, gripClaw = 0x11e, choiceScarf = 0x11f, stickyBarb = 0x120,
+ shedShell = 0x127, bigRoot = 0x128, choiceSpecs = 0x129, flamePlate = 0x12a, splashPlate = 0x12b,
+ zapPlate = 0x12c, meadowPlate = 0x12d, iciclePlate = 0x12e, fistPlate = 0x12f, toxicPlate = 0x130,
+ earthPlate = 0x131, skyPlate = 0x132, mindPlate = 0x133, insectPlate = 0x134, stonePlate = 0x135,
+ spookyPlate = 0x136, dracoPlate = 0x137, dreadPlate = 0x138, ironPlate = 0x139, oddIncense = 0x13a,
+ rockIncense = 0x13b, fullIncense = 0x13c, waveIncense = 0x13d, roseIncense = 0x13e, pureIncense = 0x140,
+ razorClaw = 0x146, razorFang = 0x147;
+
+ public static final List<Integer> consumableHeldItems = Arrays.asList(
+ cheriBerry, chestoBerry, pechaBerry, rawstBerry, aspearBerry, leppaBerry, oranBerry, persimBerry,
+ lumBerry, sitrusBerry, figyBerry, wikiBerry, magoBerry, aguavBerry, iapapaBerry, occaBerry, passhoBerry,
+ wacanBerry, rindoBerry, yacheBerry, chopleBerry, kebiaBerry, shucaBerry, cobaBerry, payapaBerry,
+ tangaBerry, chartiBerry, kasibBerry, habanBerry, colburBerry, babiriBerry, chilanBerry, liechiBerry,
+ ganlonBerry, salacBerry, petayaBerry, apicotBerry, lansatBerry, starfBerry, enigmaBerry, micleBerry,
+ custapBerry, jabocaBerry, rowapBerry, berryJuice, whiteHerb, mentalHerb, powerHerb, focusSash);
+
+ public static final List<Integer> allHeldItems = setupAllHeldItems();
+
+ private static List<Integer> setupAllHeldItems() {
+ List<Integer> list = new ArrayList<>();
+ list.addAll(Arrays.asList(brightPowder, quickClaw, choiceBand, kingsRock, silverPowder, focusBand,
+ scopeLens, metalCoat, leftovers, softSand, hardStone, miracleSeed, blackGlasses, blackBelt, magnet,
+ mysticWater, sharpBeak, poisonBarb, neverMeltIce, spellTag, twistedSpoon, charcoal, dragonFang,
+ silkScarf, shellBell, seaIncense, laxIncense, wideLens, muscleBand, wiseGlasses, expertBelt, lightClay,
+ lifeOrb, toxicOrb, flameOrb, quickPowder, zoomLens, metronome, ironBall, laggingTail, destinyKnot,
+ blackSludge, icyRock, smoothRock, heatRock, dampRock, gripClaw, choiceScarf, stickyBarb, shedShell,
+ bigRoot, choiceSpecs, flamePlate, splashPlate, zapPlate, meadowPlate, iciclePlate, fistPlate,
+ toxicPlate, earthPlate, skyPlate, mindPlate, insectPlate, stonePlate, spookyPlate, dracoPlate,
+ dreadPlate, ironPlate, oddIncense, rockIncense, fullIncense, waveIncense, roseIncense, pureIncense,
+ razorClaw, razorFang));
+ list.addAll(consumableHeldItems);
+ return list;
+ }
+
public static final Map<Integer,List<Integer>> abilityVariations = setupAbilityVariations();
+
private static Map<Integer,List<Integer>> setupAbilityVariations() {
Map<Integer,List<Integer>> map = new HashMap<>();
map.put(15,Arrays.asList(15,72)); // Insomnia/Vital Spirit
diff --git a/src/com/dabomstew/pkrandom/constants/Gen5Constants.java b/src/com/dabomstew/pkrandom/constants/Gen5Constants.java
index b1f82e2..bc95519 100644
--- a/src/com/dabomstew/pkrandom/constants/Gen5Constants.java
+++ b/src/com/dabomstew/pkrandom/constants/Gen5Constants.java
@@ -339,6 +339,42 @@ public class Gen5Constants {
public static final String introGraphicPrefix = "5A0000010000001700000001000000", bw1IntroCryPrefix = "0021009101910291", bw2IntroCryLocator = "3D020000F8B51C1C";
+ // https://bulbapedia.bulbagarden.net/wiki/List_of_items_by_index_number_(Generation_V)
+ // Held items we randomize from Gen 5 are a superset of the held items from Gen 4. Thus, we list only the
+ // new ones here.
+ // New consumable held items.
+ public static final int airBalloon = 0x21d, redCard = 0x21e, absorbBulb = 0x221, cellBattery = 0x222,
+ ejectButton = 0x223, fireGem = 0x224, waterGem = 0x225, electricGem = 0x226, grassGem = 0x227,
+ iceGem = 0x228, fightingGem = 0x229, poisonGem = 0x22a, groundGem = 0x22b, flyingGem = 0x22c,
+ psychicGem = 0x22d, bugGem = 0x22e, rockGem = 0x22f, ghostGem = 0x230, dragonGem = 0x231,
+ darkGem = 0x232, steelGem = 0x233, normalGem = 0x234;
+ // New non-consumable held items with in-battle NPC effect (not specific to one pokemon family or one move)
+ public static final int eviolite = 0x21a, floatStone = 0x21b, rockyHelmet = 0x21c, ringTarget = 0x21f,
+ bindingBand = 0x220;
+
+ public static final List<Integer> consumableHeldItems = setupAllConsumableItems();
+
+ private static List<Integer> setupAllConsumableItems() {
+ List<Integer> list = new ArrayList<>();
+ list.addAll(Gen4Constants.consumableHeldItems);
+ list.addAll(Arrays.asList(airBalloon, redCard, absorbBulb, cellBattery, ejectButton, fireGem, waterGem,
+ electricGem, grassGem, iceGem, fightingGem, poisonGem, groundGem, flyingGem, psychicGem, bugGem,
+ rockGem, ghostGem, dragonGem, darkGem, steelGem, normalGem));
+ return list;
+ }
+
+ public static final List<Integer> allHeldItems = setupAllHeldItems();
+
+ private static List<Integer> setupAllHeldItems() {
+ List<Integer> list = new ArrayList<>();
+ list.addAll(Gen4Constants.allHeldItems);
+ list.addAll(Arrays.asList(airBalloon, redCard, absorbBulb, cellBattery, ejectButton, fireGem, waterGem,
+ electricGem, grassGem, iceGem, fightingGem, poisonGem, groundGem, flyingGem, psychicGem, bugGem,
+ rockGem, ghostGem, dragonGem, darkGem, steelGem, normalGem));
+ list.addAll(Arrays.asList(eviolite, floatStone, rockyHelmet, ringTarget, bindingBand));
+ return list;
+ }
+
private static Type[] constructTypeTable() {
Type[] table = new Type[256];
table[0x00] = Type.NORMAL;
diff --git a/src/com/dabomstew/pkrandom/constants/Gen6Constants.java b/src/com/dabomstew/pkrandom/constants/Gen6Constants.java
index b9d7b12..05262f4 100644
--- a/src/com/dabomstew/pkrandom/constants/Gen6Constants.java
+++ b/src/com/dabomstew/pkrandom/constants/Gen6Constants.java
@@ -237,6 +237,34 @@ public class Gen6Constants {
public static final int[] rayquazaScriptOffsetsORAS = new int[]{ 3334, 14734 }, rayquazaCodeOffsetsORAS = new int[]{ 136, 292, 576 };
public static final String nationalDexFunctionLocator = "080094E5010000E21080BDE8170F122F", xyGetDexFlagFunctionLocator = "000055E30100A0030A00000A";
+ // https://bulbapedia.bulbagarden.net/wiki/List_of_items_by_index_number_(Generation_VI)
+ // Held items we randomize from Gen 6 are a superset of the held items from Gen 5. Thus, we list only the
+ // new ones here.
+ // New consumable held items.
+ public static final int weaknessPolicy = 0x27f, luminousMoss = 0x288, snowball = 0x289, roseliBerry = 0x2ae,
+ keeBerry = 0x2af, marangaBerry = 0x2b0, fairyGem = 0x02cb;
+ // New non-consumable held items with in-battle NPC effect (not specific to one pokemon family or one move)
+ public static final int assaultVest = 0x280, pixiePlate = 0x284, safetyGoggles = 0x28a;
+
+ public static final List<Integer> consumableHeldItems = setupAllConsumableItems();
+
+ private static List<Integer> setupAllConsumableItems() {
+ List<Integer> list = new ArrayList<>();
+ list.addAll(Gen5Constants.consumableHeldItems);
+ list.addAll(Arrays.asList(weaknessPolicy, luminousMoss, snowball, roseliBerry, keeBerry, marangaBerry, fairyGem));
+ return list;
+ }
+
+ public static final List<Integer> allHeldItems = setupAllHeldItems();
+
+ private static List<Integer> setupAllHeldItems() {
+ List<Integer> list = new ArrayList<>();
+ list.addAll(Gen5Constants.allHeldItems);
+ list.addAll(Arrays.asList(weaknessPolicy, snowball, roseliBerry, keeBerry, marangaBerry, fairyGem));
+ list.addAll(Arrays.asList(assaultVest, pixiePlate, safetyGoggles));
+ return list;
+ }
+
public static String getIngameTradesPrefix(int romType) {
if (romType == Type_XY) {
return ingameTradesPrefixXY;
@@ -367,6 +395,13 @@ public class Gen6Constants {
return shopItemsLocatorXY;
}
+ public static boolean isMegaStone(int itemIndex) {
+ // These values come from https://bulbapedia.bulbagarden.net/wiki/List_of_items_by_index_number_(Generation_VI)
+ return (itemIndex >= 0x0290 && itemIndex <= 0x02AD) ||
+ (itemIndex >= 0x02F0 && itemIndex <= 0x02FC) ||
+ (itemIndex >= 0x02FF && itemIndex <= 0x0302);
+ }
+
private static Type[] constructTypeTable() {
Type[] table = new Type[256];
table[0x00] = Type.NORMAL;
diff --git a/src/com/dabomstew/pkrandom/constants/Gen7Constants.java b/src/com/dabomstew/pkrandom/constants/Gen7Constants.java
index c7b7c6e..68b46ba 100644
--- a/src/com/dabomstew/pkrandom/constants/Gen7Constants.java
+++ b/src/com/dabomstew/pkrandom/constants/Gen7Constants.java
@@ -187,6 +187,44 @@ public class Gen7Constants {
}
}
+ // https://bulbapedia.bulbagarden.net/wiki/List_of_items_by_index_number_(Generation_VII)
+ // Held items we randomize from Gen 7 are a superset of the held items from Gen 6. Thus, we list only the
+ // new ones here.
+ // New consumable held items.
+ public static final int adrenalineOrb = 0x34e, electricSeed = 0x371, psychicSeed = 0x372,
+ mistySeed = 0x373, grassySeed = 0x374;
+ // New non-consumable held items with in-battle NPC effect (not specific to one pokemon family or one move)
+ public static final int terrainExtender = 0x36F, protectivePads = 0x370;
+
+ public static final List<Integer> consumableHeldItems = setupAllConsumableItems();
+
+ private static List<Integer> setupAllConsumableItems() {
+ List<Integer> list = new ArrayList<>();
+ list.addAll(Gen6Constants.consumableHeldItems);
+ list.addAll(Arrays.asList(adrenalineOrb, electricSeed, psychicSeed, mistySeed, grassySeed));
+ return list;
+ }
+
+ public static final List<Integer> allHeldItems = setupAllHeldItems();
+
+ private static List<Integer> setupAllHeldItems() {
+ // We intentionally do not include Z Crystals in this list. Adding Z-Crystals to random trainers should
+ // probably require its own setting if desired.
+ List<Integer> list = new ArrayList<>();
+ list.addAll(Gen6Constants.allHeldItems);
+ list.addAll(Arrays.asList(adrenalineOrb, electricSeed, psychicSeed, mistySeed, grassySeed));
+ list.addAll(Arrays.asList(terrainExtender, protectivePads));
+ return list;
+ }
+
+ public static boolean isZCrystal(int itemIndex) {
+ // From https://bulbapedia.bulbagarden.net/wiki/List_of_items_by_index_number_(Generation_VII)
+ return (itemIndex >= 0x308 && itemIndex <= 0x31A) ||
+ (itemIndex >= 0x31E && itemIndex <= 0x344) ||
+ (itemIndex >= 0x399 && itemIndex <= 0x3a4);
+
+ }
+
public static List<String> getShopNames(int romType) {
List<String> shopNames = new ArrayList<>();
shopNames.add("Primary 0 Trials");
@@ -745,47 +783,6 @@ public class Gen7Constants {
}
}
- public static List<Integer> validConsumableHeldItems = Arrays.asList(
- 0x95,
- 0x96,
- 0x97,
- 0x98,
- 0x99,
- 0x9A,
- 0x9B,
- 0x9C,
- 0x9D,
- 0x9E,
- 0x9F,
- 0xA0,
- 0xA1,
- 0xA2,
- 0xA3,
- 0xC8,
- 0xC9,
- 0xCA,
- 0xCB,
- 0xCC,
- 0xCD,
- 0xCE,
- 0xCF,
- 0xD0,
- 0xD1,
- 0xD2,
- 0xD3,
- 0xD4,
- 0xD6,
- 0x113,
- 0x21D,
- 0x221,
- 0x222,
- 0x27F,
- 0x288,
- 0x289,
- 0x2AF,
- 0x2B0
- );
-
private static final List<Integer> requiredFieldTMsSM = Arrays.asList(
80, 49, 5, 83, 64, 62, 100, 31, 46, 88, 57, 41, 59, 73, 53, 61, 28, 39, 55, 86, 30, 93, 81, 84, 74, 85, 72,
3, 3, 13, 36, 91, 79, 24, 97, 50, 99, 35, 2, 26, 6, 6
diff --git a/src/com/dabomstew/pkrandom/newgui/Bundle.properties b/src/com/dabomstew/pkrandom/newgui/Bundle.properties
index 53e0eda..c1a0d42 100644
--- a/src/com/dabomstew/pkrandom/newgui/Bundle.properties
+++ b/src/com/dabomstew/pkrandom/newgui/Bundle.properties
@@ -583,4 +583,18 @@ GUI.tmFollowEvolutionsCheckBox.toolTipText=<html>When this is selected and TM co
GUI.mtFollowEvolutionsCheckBox.text=Follow Evolutions
GUI.mtFollowEvolutionsCheckBox.toolTipText=<html>When this is selected and move tutor compatibility is randomized, evolutions of a Pokemon will inherit that Pokemon's move tutor compatibilities.<br />Additionally, when a Pokemon evolves, each move will have:<br /><b>Random (prefer same type)</b>: A 90% chance of becoming learnable if the Pokemon just gained its type through evolution, a 10% chance otherwise.<br/><b>Random (completely)</b>: A 25% chance of becoming learnable regardless of type.
GUI.stpFixMusicAllCheckBox.text=Fix Music
-GUI.stpFixMusicAllCheckBox.toolTipText=<html>Fixes the music for all Static Pokemon encounters so that even when randomized, encounters that should have special music will play the correct song.<br />Note that in Gen 4/5, if special music is assigned to a Pokemon then it will <b>always</b> play when battling that Pokemon, even if you just find it normally in the wild. \ No newline at end of file
+GUI.stpFixMusicAllCheckBox.toolTipText=<html>Fixes the music for all Static Pokemon encounters so that even when randomized, encounters that should have special music will play the correct song.<br />Note that in Gen 4/5, if special music is assigned to a Pokemon then it will <b>always</b> play when battling that Pokemon, even if you just find it normally in the wild.
+GUI.tpHeldItemsLabel.text=Add Held Items to...
+GUI.tpBossTrainersItemsCheckBox.text=Boss Trainers
+GUI.tpBossTrainersItemsCheckBox.toolTipText=<html>Check this to add or replace held items for the Pokemon of "Boss" Trainers.<br />Boss Trainers include Gym Leaders, Kahunas, Team Leaders, Elite Four, and Champions.
+GUI.tpImportantTrainersItemsCheckBox.text=Important Trainers
+GUI.tpImportantTrainersItemsCheckBox.toolTipText=<html>Check this to add or replace held items for the Pokemon of "Important" Trainers.<br />Important Trainers include Rivals/Friends, Team Admins, and other important story battles (such as Colress in BW2 and Sycamore in XY).
+GUI.tpRegularTrainersItemsCheckBox.text=Regular Trainers
+GUI.tpRegularTrainersItemsCheckBox.toolTipText=<html>Check this to add or replace held items for the Pokemon of regular Trainers.<br />Regular Trainers include all trainers that don't qualify as "Boss" or "Important" Trainers.
+GUI.tpConsumableItemsOnlyCheckBox.text=Consumable Only
+GUI.tpConsumableItemsOnlyCheckBox.tooltip=<html>Items will be chosen randomly from all single-use held items that a Pokemon can eat/use on its own.<br />This is mostly berries, with a few other items like Focus Sash and White Herb.</html>
+GUI.tpSensibleItemsCheckBox.text=Sensible Items
+GUI.tpSensibleItemsCheckBox.tooltip=<html><b>Not implemented yet.</b><br />Items will be chosen randomly from a subset of the held items that "make sense" for a given Pokemon.<br />For example, Silk Scarf won't be an option for a given Pokemon unless it knows at least one normal move.<br />Another example is that a Yache berry will only be an option on Pokemon that are weak or double weak to ice.</html>
+GUI.tpHighestLevelGetsItemCheckBox.text=Highest Level Only
+GUI.tpHighestLevelGetsItemCheckBox.tooltip=<html>If this option is selected, a held item will be given only to a trainer's highest level Pokemon (or one of them, if there are multiple at that level).<br />If this is unchecked, all of a Trainer's Pokemon will be given items.</html>
+
diff --git a/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.form b/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.form
index 84cd9ff..ad52750 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="1084" height="816"/>
+ <xy x="7" y="20" width="1084" height="831"/>
</constraints>
<properties/>
<border type="none">
@@ -1492,7 +1492,7 @@
<children>
<component id="ddab7" class="javax.swing.JRadioButton" binding="tpUnchangedRadioButton" default-binding="true">
<constraints>
- <grid row="1" column="1" row-span="1" col-span="3" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="1" column="1" row-span="1" col-span="4" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.1" weighty="0.0"/>
</constraints>
<properties>
@@ -1501,12 +1501,6 @@
<toolTipText resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpUnchangedRadioButton.toolTipText"/>
</properties>
</component>
- <vspacer id="2342a">
- <constraints>
- <grid row="11" 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>
<hspacer id="b875b">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
@@ -1521,7 +1515,7 @@
</vspacer>
<component id="2fe72" class="javax.swing.JRadioButton" binding="tpRandomRadioButton" default-binding="true">
<constraints>
- <grid row="2" column="1" row-span="1" col-span="3" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="2" column="1" row-span="1" col-span="4" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.0" weighty="0.0"/>
</constraints>
<properties>
@@ -1532,7 +1526,7 @@
</component>
<component id="cd865" class="javax.swing.JRadioButton" binding="tpRandomEvenDistributionRadioButton" default-binding="true">
<constraints>
- <grid row="4" column="1" row-span="1" col-span="3" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="4" column="1" row-span="1" col-span="4" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.0" weighty="0.0"/>
</constraints>
<properties>
@@ -1543,7 +1537,7 @@
</component>
<component id="bd6d2" class="javax.swing.JRadioButton" binding="tpRandomEvenDistributionMainRadioButton">
<constraints>
- <grid row="5" column="1" row-span="1" col-span="3" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="5" column="1" row-span="1" col-span="4" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.0" weighty="0.0"/>
</constraints>
<properties>
@@ -1554,7 +1548,7 @@
</component>
<component id="c6902" class="javax.swing.JCheckBox" binding="tpRivalCarriesStarterCheckBox">
<constraints>
- <grid row="1" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="1" column="5" 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.1" weighty="0.0"/>
</constraints>
<properties>
@@ -1565,7 +1559,7 @@
</component>
<component id="22cfb" class="javax.swing.JCheckBox" binding="tpSimilarStrengthCheckBox">
<constraints>
- <grid row="2" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="2" column="5" 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"/>
</constraints>
<properties>
@@ -1576,7 +1570,7 @@
</component>
<component id="e225c" class="javax.swing.JCheckBox" binding="tpRandomizeTrainerNamesCheckBox">
<constraints>
- <grid row="1" column="5" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="1" column="6" 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.1" weighty="0.0"/>
</constraints>
<properties>
@@ -1587,7 +1581,7 @@
</component>
<component id="16a2b" class="javax.swing.JCheckBox" binding="tpRandomizeTrainerClassNamesCheckBox">
<constraints>
- <grid row="2" column="5" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="2" column="6" 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"/>
</constraints>
<properties>
@@ -1598,7 +1592,7 @@
</component>
<component id="d6ea3" class="javax.swing.JCheckBox" binding="tpForceFullyEvolvedAtCheckBox">
<constraints>
- <grid row="4" column="5" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="4" column="6" 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"/>
</constraints>
<properties>
@@ -1609,7 +1603,7 @@
</component>
<component id="63823" class="javax.swing.JSlider" binding="tpForceFullyEvolvedAtSlider">
<constraints>
- <grid row="5" column="5" row-span="2" col-span="1" vsize-policy="0" hsize-policy="6" anchor="9" fill="1" indent="0" use-parent-layout="false"/>
+ <grid row="5" column="6" row-span="2" col-span="1" vsize-policy="0" hsize-policy="6" anchor="9" fill="1" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.0" weighty="0.0"/>
</constraints>
<properties>
@@ -1627,7 +1621,7 @@
</component>
<component id="670de" class="javax.swing.JSlider" binding="tpPercentageLevelModifierSlider" default-binding="true">
<constraints>
- <grid row="8" column="5" row-span="2" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
+ <grid row="8" column="6" 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>
@@ -1645,7 +1639,7 @@
</component>
<component id="8428b" class="javax.swing.JCheckBox" binding="tpPercentageLevelModifierCheckBox" default-binding="true">
<constraints>
- <grid row="7" column="5" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="7" column="6" 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"/>
</constraints>
<properties>
@@ -1656,13 +1650,13 @@
</component>
<hspacer id="41124">
<constraints>
- <grid row="0" column="6" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+ <grid row="0" column="7" 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"/>
</constraints>
</hspacer>
<component id="40ee1" class="javax.swing.JRadioButton" binding="tpTypeThemedRadioButton">
<constraints>
- <grid row="3" column="1" row-span="1" col-span="3" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="3" column="1" row-span="1" col-span="4" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.0" weighty="0.0"/>
</constraints>
<properties>
@@ -1673,7 +1667,7 @@
</component>
<component id="5ff08" class="javax.swing.JCheckBox" binding="tpWeightTypesCheckBox">
<constraints>
- <grid row="3" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="3" column="5" 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"/>
</constraints>
<properties>
@@ -1684,7 +1678,7 @@
</component>
<component id="acf1a" class="javax.swing.JCheckBox" binding="tpDontUseLegendariesCheckBox" default-binding="true">
<constraints>
- <grid row="4" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="4" column="5" 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"/>
</constraints>
<properties>
@@ -1694,7 +1688,7 @@
</component>
<component id="d0471" class="javax.swing.JCheckBox" binding="tpNoEarlyWonderGuardCheckBox">
<constraints>
- <grid row="5" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="5" column="5" 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"/>
</constraints>
<properties>
@@ -1705,7 +1699,7 @@
</component>
<component id="be65d" class="javax.swing.JCheckBox" binding="tpAllowAlternateFormesCheckBox">
<constraints>
- <grid row="6" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="6" column="5" 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"/>
</constraints>
<properties>
@@ -1716,7 +1710,7 @@
</component>
<component id="af4d1" class="javax.swing.JCheckBox" binding="tpSwapMegaEvosCheckBox">
<constraints>
- <grid row="7" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="7" column="5" 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"/>
</constraints>
<properties>
@@ -1727,7 +1721,7 @@
</component>
<component id="feec4" class="javax.swing.JCheckBox" binding="tpDoubleBattleModeCheckBox">
<constraints>
- <grid row="7" column="1" row-span="1" col-span="3" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="7" column="1" row-span="1" col-span="4" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.0" weighty="0.0"/>
</constraints>
<properties>
@@ -1738,7 +1732,7 @@
</component>
<component id="b62cd" class="javax.swing.JLabel" binding="tpAdditionalPokemonForLabel">
<constraints>
- <grid row="8" column="1" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="10" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="8" column="1" row-span="1" col-span="4" vsize-policy="0" hsize-policy="0" anchor="10" fill="0" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.0" weighty="0.0"/>
</constraints>
<properties>
@@ -1747,7 +1741,7 @@
</component>
<component id="8f956" class="javax.swing.JCheckBox" binding="tpBossTrainersCheckBox">
<constraints>
- <grid row="9" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="9" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.0" weighty="0.0"/>
</constraints>
<properties>
@@ -1758,7 +1752,7 @@
</component>
<component id="6d5aa" class="javax.swing.JCheckBox" binding="tpImportantTrainersCheckBox">
<constraints>
- <grid row="9" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="9" 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="0.0" weighty="0.0"/>
</constraints>
<properties>
@@ -1769,7 +1763,7 @@
</component>
<component id="39903" class="javax.swing.JCheckBox" binding="tpRegularTrainersCheckBox">
<constraints>
- <grid row="9" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="9" column="4" 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"/>
</constraints>
<properties>
@@ -1780,7 +1774,7 @@
</component>
<component id="181e" class="javax.swing.JSpinner" binding="tpBossTrainersSpinner">
<constraints>
- <grid row="10" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="10" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="6" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<gridbag top="0" left="4" bottom="0" right="0" weightx="0.0" weighty="0.0" ipadx="10"/>
</constraints>
<properties>
@@ -1789,7 +1783,7 @@
</component>
<component id="e7a99" class="javax.swing.JSpinner" binding="tpImportantTrainersSpinner">
<constraints>
- <grid row="10" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="10" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<gridbag top="0" left="4" bottom="0" right="0" weightx="0.0" weighty="0.0" ipadx="10"/>
</constraints>
<properties>
@@ -1798,7 +1792,7 @@
</component>
<component id="da8e4" class="javax.swing.JSpinner" binding="tpRegularTrainersSpinner">
<constraints>
- <grid row="10" column="3" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="10" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<gridbag top="0" left="4" bottom="0" right="0" weightx="0.0" weighty="0.0" ipadx="10"/>
</constraints>
<properties>
@@ -1807,7 +1801,7 @@
</component>
<component id="34a10" class="javax.swing.JCheckBox" binding="tpRandomShinyTrainerPokemonCheckBox">
<constraints>
- <grid row="8" column="4" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="9" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="8" column="5" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="9" fill="0" indent="0" use-parent-layout="false"/>
<gridbag weightx="0.0" weighty="0.0"/>
</constraints>
<properties>
@@ -1816,6 +1810,87 @@
<toolTipText resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpRandomShinyTrainerPokemonCheckBox.toolTipText"/>
</properties>
</component>
+ <component id="2918f" class="javax.swing.JLabel" binding="tpHeldItemsLabel">
+ <constraints>
+ <grid row="11" column="1" row-span="1" col-span="4" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <gridbag weightx="0.0" weighty="0.0"/>
+ </constraints>
+ <properties>
+ <text resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpHeldItemsLabel.text"/>
+ </properties>
+ </component>
+ <component id="dad16" class="javax.swing.JCheckBox" binding="tpBossTrainersItemsCheckBox">
+ <constraints>
+ <grid row="12" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <gridbag weightx="0.0" weighty="0.0"/>
+ </constraints>
+ <properties>
+ <enabled value="false"/>
+ <text resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpBossTrainersItemsCheckBox.text"/>
+ <toolTipText resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpBossTrainersItemsCheckBox.toolTipText"/>
+ </properties>
+ </component>
+ <component id="d7d93" class="javax.swing.JCheckBox" binding="tpImportantTrainersItemsCheckBox">
+ <constraints>
+ <grid row="12" 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="0.0" weighty="0.0"/>
+ </constraints>
+ <properties>
+ <enabled value="false"/>
+ <text resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpImportantTrainersItemsCheckBox.text"/>
+ <toolTipText resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpImportantTrainersItemsCheckBox.toolTipText"/>
+ </properties>
+ </component>
+ <component id="7fddd" class="javax.swing.JCheckBox" binding="tpRegularTrainersItemsCheckBox">
+ <constraints>
+ <grid row="12" column="4" 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"/>
+ </constraints>
+ <properties>
+ <enabled value="false"/>
+ <text resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpRegularTrainersItemsCheckBox.text"/>
+ <toolTipText resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpRegularTrainersItemsCheckBox.toolTipText"/>
+ </properties>
+ </component>
+ <component id="31e9a" class="javax.swing.JCheckBox" binding="tpConsumableItemsOnlyCheckBox">
+ <constraints>
+ <grid row="13" 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"/>
+ </constraints>
+ <properties>
+ <enabled value="false"/>
+ <text resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpConsumableItemsOnlyCheckBox.text"/>
+ <toolTipText resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpConsumableItemsOnlyCheckBox.tooltip"/>
+ </properties>
+ </component>
+ <component id="79d6a" class="javax.swing.JCheckBox" binding="tpSensibleItemsCheckBox">
+ <constraints>
+ <grid row="13" 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="0.0" weighty="0.0"/>
+ </constraints>
+ <properties>
+ <enabled value="false"/>
+ <text resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpSensibleItemsCheckBox.text"/>
+ <toolTipText resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpSensibleItemsCheckBox.tooltip"/>
+ </properties>
+ </component>
+ <component id="f3c52" class="javax.swing.JCheckBox" binding="tpHighestLevelGetsItemCheckBox">
+ <constraints>
+ <grid row="13" column="4" 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"/>
+ </constraints>
+ <properties>
+ <enabled value="false"/>
+ <text resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpHighestLevelGetsItemCheckBox.text"/>
+ <toolTipText resource-bundle="com/dabomstew/pkrandom/newgui/Bundle" key="GUI.tpHighestLevelGetsItemCheckBox.tooltip"/>
+ </properties>
+ </component>
+ <vspacer id="2342a">
+ <constraints>
+ <grid row="14" column="0" row-span="1" col-span="1" 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>
</children>
</grid>
<hspacer id="66d2">
diff --git a/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.java b/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.java
index 4e98604..f77d33f 100644
--- a/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.java
+++ b/src/com/dabomstew/pkrandom/newgui/NewRandomizerGUI.java
@@ -281,6 +281,13 @@ public class NewRandomizerGUI {
private JSlider stpPercentageLevelModifierSlider;
private JCheckBox stpFixMusicCheckBox;
private JCheckBox miscFasterHPAndEXPBarsCheckBox;
+ private JCheckBox tpBossTrainersItemsCheckBox;
+ private JCheckBox tpImportantTrainersItemsCheckBox;
+ private JCheckBox tpRegularTrainersItemsCheckBox;
+ private JLabel tpHeldItemsLabel;
+ private JCheckBox tpConsumableItemsOnlyCheckBox;
+ private JCheckBox tpSensibleItemsCheckBox;
+ private JCheckBox tpHighestLevelGetsItemCheckBox;
private static JFrame frame;
@@ -491,6 +498,9 @@ public class NewRandomizerGUI {
tpBossTrainersCheckBox.addActionListener(e -> enableOrDisableSubControls());
tpImportantTrainersCheckBox.addActionListener(e -> enableOrDisableSubControls());
tpRegularTrainersCheckBox.addActionListener(e -> enableOrDisableSubControls());
+ tpBossTrainersItemsCheckBox.addActionListener(e -> enableOrDisableSubControls());
+ tpImportantTrainersItemsCheckBox.addActionListener(e -> enableOrDisableSubControls());
+ tpRegularTrainersItemsCheckBox.addActionListener(e -> enableOrDisableSubControls());
totpUnchangedRadioButton.addActionListener(e -> enableOrDisableSubControls());
totpRandomRadioButton.addActionListener(e -> enableOrDisableSubControls());
totpRandomSimilarStrengthRadioButton.addActionListener(e -> enableOrDisableSubControls());
@@ -1362,6 +1372,13 @@ public class NewRandomizerGUI {
tpImportantTrainersSpinner.setValue(settings.getAdditionalImportantTrainerPokemon() > 0 ? settings.getAdditionalImportantTrainerPokemon() : 1);
tpRegularTrainersCheckBox.setSelected(settings.getAdditionalRegularTrainerPokemon() > 0);
tpRegularTrainersSpinner.setValue(settings.getAdditionalRegularTrainerPokemon() > 0 ? settings.getAdditionalRegularTrainerPokemon() : 1);
+ tpBossTrainersItemsCheckBox.setSelected(settings.isRandomizeHeldItemsForBossTrainerPokemon());
+ tpImportantTrainersItemsCheckBox.setSelected(settings.isRandomizeHeldItemsForImportantTrainerPokemon());
+ tpRegularTrainersItemsCheckBox.setSelected(settings.isRandomizeHeldItemsForRegularTrainerPokemon());
+ tpConsumableItemsOnlyCheckBox.setSelected(settings.isConsumableItemsOnlyForTrainers());
+ tpSensibleItemsCheckBox.setSelected(settings.isSensibleItemsOnlyForTrainers());
+ tpHighestLevelGetsItemCheckBox.setSelected(settings.isHighestLevelGetsItemsForTrainers());
+
tpRandomShinyTrainerPokemonCheckBox.setSelected(settings.isShinyChance());
totpUnchangedRadioButton.setSelected(settings.getTotemPokemonMod() == Settings.TotemPokemonMod.UNCHANGED);
@@ -1581,6 +1598,12 @@ public class NewRandomizerGUI {
settings.setAdditionalImportantTrainerPokemon(tpImportantTrainersCheckBox.isVisible() && tpImportantTrainersCheckBox.isSelected() ? (int)tpImportantTrainersSpinner.getValue() : 0);
settings.setAdditionalRegularTrainerPokemon(tpRegularTrainersCheckBox.isVisible() && tpRegularTrainersCheckBox.isSelected() ? (int)tpRegularTrainersSpinner.getValue() : 0);
settings.setShinyChance(tpRandomShinyTrainerPokemonCheckBox.isVisible() && tpRandomShinyTrainerPokemonCheckBox.isSelected());
+ settings.setRandomizeHeldItemsForBossTrainerPokemon(tpBossTrainersItemsCheckBox.isVisible() && tpBossTrainersItemsCheckBox.isSelected());
+ settings.setRandomizeHeldItemsForImportantTrainerPokemon(tpImportantTrainersItemsCheckBox.isVisible() && tpImportantTrainersItemsCheckBox.isSelected());
+ settings.setRandomizeHeldItemsForRegularTrainerPokemon(tpRegularTrainersItemsCheckBox.isVisible() && tpRegularTrainersItemsCheckBox.isSelected());
+ settings.setConsumableItemsOnlyForTrainers(tpConsumableItemsOnlyCheckBox.isVisible() && tpConsumableItemsOnlyCheckBox.isSelected());
+ settings.setSensibleItemsOnlyForTrainers(tpSensibleItemsCheckBox.isVisible() && tpSensibleItemsCheckBox.isSelected());
+ settings.setHighestLevelGetsItemsForTrainers(tpHighestLevelGetsItemCheckBox.isVisible() && tpHighestLevelGetsItemCheckBox.isSelected());
settings.setTotemPokemonMod(totpUnchangedRadioButton.isSelected(), totpRandomRadioButton.isSelected(), totpRandomSimilarStrengthRadioButton.isSelected());
settings.setAllyPokemonMod(totpAllyUnchangedRadioButton.isSelected(), totpAllyRandomRadioButton.isSelected(), totpAllyRandomSimilarStrengthRadioButton.isSelected());
@@ -2120,6 +2143,25 @@ public class NewRandomizerGUI {
tpRegularTrainersSpinner.setEnabled(false);
tpRegularTrainersSpinner.setValue(1);
tpAdditionalPokemonForLabel.setVisible(true);
+ tpHeldItemsLabel.setVisible(true);
+ tpBossTrainersItemsCheckBox.setVisible(true);
+ tpBossTrainersItemsCheckBox.setEnabled(false);
+ tpBossTrainersItemsCheckBox.setSelected(false);
+ tpImportantTrainersItemsCheckBox.setVisible(true);
+ tpImportantTrainersItemsCheckBox.setEnabled(false);
+ tpImportantTrainersItemsCheckBox.setSelected(false);
+ tpRegularTrainersItemsCheckBox.setVisible(true);
+ tpRegularTrainersItemsCheckBox.setEnabled(false);
+ tpRegularTrainersItemsCheckBox.setSelected(false);
+ tpConsumableItemsOnlyCheckBox.setVisible(true);
+ tpConsumableItemsOnlyCheckBox.setEnabled(false);
+ tpConsumableItemsOnlyCheckBox.setSelected(false);
+ tpSensibleItemsCheckBox.setVisible(true);
+ tpSensibleItemsCheckBox.setEnabled(false);
+ tpSensibleItemsCheckBox.setSelected(false);
+ tpHighestLevelGetsItemCheckBox.setVisible(true);
+ tpHighestLevelGetsItemCheckBox.setEnabled(false);
+ tpHighestLevelGetsItemCheckBox.setSelected(false);
tpRandomShinyTrainerPokemonCheckBox.setVisible(true);
tpRandomShinyTrainerPokemonCheckBox.setEnabled(false);
totpPanel.setVisible(true);
@@ -2584,6 +2626,21 @@ public class NewRandomizerGUI {
tpRegularTrainersCheckBox.setEnabled(false);
tpRegularTrainersSpinner.setVisible(additionalPokemonAvailable);
+ boolean trainersHeldItemSupport = pokemonGeneration >= 3;
+ tpHeldItemsLabel.setVisible(trainersHeldItemSupport);
+ tpBossTrainersItemsCheckBox.setVisible(trainersHeldItemSupport);
+ tpBossTrainersItemsCheckBox.setEnabled(false);
+ tpImportantTrainersItemsCheckBox.setVisible(trainersHeldItemSupport);
+ tpImportantTrainersItemsCheckBox.setEnabled(false);
+ tpRegularTrainersItemsCheckBox.setVisible(trainersHeldItemSupport);
+ tpRegularTrainersItemsCheckBox.setEnabled(false);
+ tpConsumableItemsOnlyCheckBox.setVisible(trainersHeldItemSupport);
+ tpConsumableItemsOnlyCheckBox.setEnabled(false);
+ tpSensibleItemsCheckBox.setVisible(trainersHeldItemSupport);
+ tpSensibleItemsCheckBox.setEnabled(false);
+ tpHighestLevelGetsItemCheckBox.setVisible(trainersHeldItemSupport);
+ tpHighestLevelGetsItemCheckBox.setEnabled(false);
+
tpRandomizeTrainerNamesCheckBox.setEnabled(true);
tpRandomizeTrainerClassNamesCheckBox.setEnabled(true);
tpNoEarlyWonderGuardCheckBox.setVisible(pokemonGeneration >= 3);
@@ -2956,6 +3013,18 @@ public class NewRandomizerGUI {
tpImportantTrainersCheckBox.setSelected(false);
tpRegularTrainersCheckBox.setEnabled(false);
tpRegularTrainersCheckBox.setSelected(false);
+ tpBossTrainersItemsCheckBox.setEnabled(false);
+ tpBossTrainersItemsCheckBox.setSelected(false);
+ tpImportantTrainersItemsCheckBox.setEnabled(false);
+ tpImportantTrainersItemsCheckBox.setSelected(false);
+ tpRegularTrainersItemsCheckBox.setEnabled(false);
+ tpRegularTrainersItemsCheckBox.setSelected(false);
+ tpConsumableItemsOnlyCheckBox.setEnabled(false);
+ tpConsumableItemsOnlyCheckBox.setSelected(false);
+ tpSensibleItemsCheckBox.setEnabled(false);
+ tpSensibleItemsCheckBox.setSelected(false);
+ tpHighestLevelGetsItemCheckBox.setEnabled(false);
+ tpHighestLevelGetsItemCheckBox.setSelected(false);
} else {
tpSimilarStrengthCheckBox.setEnabled(true);
tpDontUseLegendariesCheckBox.setEnabled(true);
@@ -2971,6 +3040,9 @@ public class NewRandomizerGUI {
tpBossTrainersCheckBox.setEnabled(tpBossTrainersCheckBox.isVisible());
tpImportantTrainersCheckBox.setEnabled(tpImportantTrainersCheckBox.isVisible());
tpRegularTrainersCheckBox.setEnabled(tpRegularTrainersCheckBox.isVisible());
+ tpBossTrainersItemsCheckBox.setEnabled(tpBossTrainersItemsCheckBox.isVisible());
+ tpImportantTrainersItemsCheckBox.setEnabled(tpImportantTrainersItemsCheckBox.isVisible());
+ tpRegularTrainersItemsCheckBox.setEnabled(tpRegularTrainersItemsCheckBox.isVisible());
}
if (tpForceFullyEvolvedAtCheckBox.isSelected()) {
@@ -3008,6 +3080,17 @@ public class NewRandomizerGUI {
tpRegularTrainersSpinner.setValue(1);
}
+ if (tpBossTrainersItemsCheckBox.isSelected() || tpImportantTrainersItemsCheckBox.isSelected() ||
+ tpRegularTrainersItemsCheckBox.isSelected()) {
+ tpConsumableItemsOnlyCheckBox.setEnabled(true);
+ tpSensibleItemsCheckBox.setEnabled(false); // not implemented yet
+ tpHighestLevelGetsItemCheckBox.setEnabled(true);
+ } else {
+ tpConsumableItemsOnlyCheckBox.setEnabled(false);
+ tpSensibleItemsCheckBox.setEnabled(false);
+ tpHighestLevelGetsItemCheckBox.setEnabled(false);
+ }
+
if (!spUnchangedRadioButton.isSelected() || !this.tpUnchangedRadioButton.isSelected()) {
tpRivalCarriesStarterCheckBox.setEnabled(true);
} else {
diff --git a/src/com/dabomstew/pkrandom/pokemon/TotemPokemon.java b/src/com/dabomstew/pkrandom/pokemon/TotemPokemon.java
index b3c5bd5..3b80b68 100644
--- a/src/com/dabomstew/pkrandom/pokemon/TotemPokemon.java
+++ b/src/com/dabomstew/pkrandom/pokemon/TotemPokemon.java
@@ -44,6 +44,7 @@ public class TotemPokemon extends StaticEncounter {
@Override
public String toString() {
+ // The %s will be formatted to include the held item.
String ret = pkmn.fullName() + "@%s Lv" + level + "\n Aura: " + aura.toString() + "\n";
int i = 1;
for (StaticEncounter ally: allies.values()) {
diff --git a/src/com/dabomstew/pkrandom/pokemon/Trainer.java b/src/com/dabomstew/pkrandom/pokemon/Trainer.java
index fb2b95b..93d05fe 100755
--- a/src/com/dabomstew/pkrandom/pokemon/Trainer.java
+++ b/src/com/dabomstew/pkrandom/pokemon/Trainer.java
@@ -32,6 +32,7 @@ public class Trainer implements Comparable<Trainer> {
public List<TrainerPokemon> pokemon = new ArrayList<>();
public String tag;
public boolean importantTrainer;
+ // This value has some flags about the trainer's pokemon (e.g. if they have items or custom moves)
public int poketype;
public String name;
public int trainerclass;
@@ -103,4 +104,23 @@ public class Trainer implements Comparable<Trainer> {
public boolean skipImportant() {
return ((tag != null) && (tag.startsWith("RIVAL1-") || tag.startsWith("FRIEND1-") || tag.endsWith("NOTSTRONG")));
}
+
+ public void setPokemonHaveItems(boolean haveItems) {
+ if (haveItems) {
+ this.poketype |= 2;
+ } else {
+ // https://stackoverflow.com/a/1073328
+ this.poketype = poketype & ~2;
+ }
+ }
+
+ public boolean pokemonHaveItems() {
+ // This flag seems consistent for all gens
+ return (this.poketype & 2) == 2;
+ }
+
+ public boolean pokemonHaveCustomMoves() {
+ // This flag seems consistent for all gens
+ return (this.poketype & 1) == 1;
+ }
}
diff --git a/src/com/dabomstew/pkrandom/pokemon/TrainerPokemon.java b/src/com/dabomstew/pkrandom/pokemon/TrainerPokemon.java
index 0b10c46..7ba3a4a 100755
--- a/src/com/dabomstew/pkrandom/pokemon/TrainerPokemon.java
+++ b/src/com/dabomstew/pkrandom/pokemon/TrainerPokemon.java
@@ -36,6 +36,8 @@ public class TrainerPokemon {
public int AILevel;
public int heldItem = 0;
+ public boolean hasMegaStone;
+ public boolean hasZCrystal;
public int ability;
public int forme;
public String formeSuffix = "";
@@ -54,7 +56,13 @@ public class TrainerPokemon {
public boolean resetMoves = false;
public String toString() {
- return pokemon.name + formeSuffix + " Lv" + level;
+ String s = pokemon.name + formeSuffix;
+ if (heldItem != 0) {
+ // This can be filled in with the actual name when written to the log.
+ s += "@%s";
+ }
+ s+= " Lv" + level;
+ return s;
}
public boolean canMegaEvolve() {
diff --git a/src/com/dabomstew/pkrandom/romhandlers/AbstractRomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/AbstractRomHandler.java
index 6c5dff9..d6ce8f0 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/AbstractRomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/AbstractRomHandler.java
@@ -31,7 +31,6 @@ package com.dabomstew.pkrandom.romhandlers;
import java.io.PrintStream;
import java.util.*;
import java.util.stream.Collectors;
-import java.util.stream.IntStream;
import com.dabomstew.pkrandom.*;
import com.dabomstew.pkrandom.constants.*;
@@ -1926,6 +1925,67 @@ public abstract class AbstractRomHandler implements RomHandler {
}
@Override
+ public void randomizeTrainerHeldItems(Settings settings) {
+ boolean giveToBossPokemon = settings.isRandomizeHeldItemsForBossTrainerPokemon();
+ boolean giveToImportantPokemon = settings.isRandomizeHeldItemsForBossTrainerPokemon();
+ boolean giveToRegularPokemon = settings.isRandomizeHeldItemsForBossTrainerPokemon();
+ boolean highestLevelOnly = settings.isHighestLevelGetsItemsForTrainers();
+ List<Trainer> currentTrainers = this.getTrainers();
+ for (Trainer t : currentTrainers) {
+ if (!giveToRegularPokemon && (!t.isImportant() && !t.isBoss())) {
+ continue;
+ }
+ if (!giveToImportantPokemon && t.isImportant()) {
+ continue;
+ }
+ if (!giveToBossPokemon && t.isBoss()) {
+ continue;
+ }
+ t.setPokemonHaveItems(true);
+ if (highestLevelOnly) {
+ int maxLevel = -1;
+ TrainerPokemon highestLevelPoke = null;
+ for (TrainerPokemon tp : t.pokemon) {
+ if (tp.level > maxLevel) {
+ highestLevelPoke = tp;
+ maxLevel = tp.level;
+ }
+ }
+ if (highestLevelPoke == null) {
+ continue; // should never happen - trainer had zero pokes
+ }
+ randomizeHeldItem(highestLevelPoke, settings);
+ } else {
+ for (TrainerPokemon tp : t.pokemon) {
+ randomizeHeldItem(tp, settings);
+ }
+ }
+ }
+ this.setTrainers(currentTrainers, false);
+ }
+
+ private void randomizeHeldItem(TrainerPokemon tp, Settings settings) {
+ boolean sensibleItemsOnly = settings.isSensibleItemsOnlyForTrainers();
+ boolean consumableItemsOnly = settings.isConsumableItemsOnlyForTrainers();
+ boolean swapMegaEvolutions = settings.isSwapTrainerMegaEvos()
+ if (tp.hasZCrystal) {
+ return; // Don't overwrite existing Z Crystals.
+ }
+ if (tp.hasMegaStone && swapMegaEvolutions) {
+ return; // Don't overwrite mega stones if another setting handled that.
+ }
+ List<Integer> toChooseFrom;
+ if (sensibleItemsOnly) {
+ toChooseFrom = getSensibleHeldItemsFor(tp, consumableItemsOnly);
+ } else if (consumableItemsOnly) {
+ toChooseFrom = getAllConsumableHeldItems();
+ } else {
+ toChooseFrom = getAllHeldItems();
+ }
+ tp.heldItem = toChooseFrom.get(random.nextInt(toChooseFrom.size()));
+ }
+
+ @Override
public void rivalCarriesStarter() {
checkPokemonRestrictions();
List<Trainer> currentTrainers = this.getTrainers();
@@ -5759,7 +5819,8 @@ public abstract class AbstractRomHandler implements RomHandler {
if (randomizeHeldItems) {
if (old.heldItem != 0) {
- newTotem.heldItem = randomHeldItem();
+ List<Integer> consumableList = getAllConsumableHeldItems();
+ newTotem.heldItem = consumableList.get(this.random.nextInt(consumableList.size()));
}
}
@@ -6002,7 +6063,7 @@ public abstract class AbstractRomHandler implements RomHandler {
@Override
public List<Integer> getGameBreakingMoves() {
- // Sonicboom & drage
+ // Sonicboom & Dragon Rage
return Arrays.asList(49, 82);
}
@@ -6054,4 +6115,19 @@ public abstract class AbstractRomHandler implements RomHandler {
public void applyMiscTweak(MiscTweak tweak) {
// default: do nothing
}
+
+ @Override
+ public List<Integer> getSensibleHeldItemsFor(TrainerPokemon tp, boolean consumableOnly) {
+ return Arrays.asList(0);
+ }
+
+ @Override
+ public List<Integer> getAllConsumableHeldItems() {
+ return Arrays.asList(0);
+ }
+
+ @Override
+ public List<Integer> getAllHeldItems() {
+ return Arrays.asList(0);
+ }
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen1RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen1RomHandler.java
index 964f1e5..8af0498 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen1RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen1RomHandler.java
@@ -1565,11 +1565,6 @@ public class Gen1RomHandler extends AbstractGBCRomHandler {
return new ArrayList<>();
}
- @Override
- public int randomHeldItem() {
- return 0;
- }
-
private List<String> getTrainerClassesForText() {
int[] offsets = romEntry.arrayEntries.get("TrainerClassNamesOffsets");
List<String> tcNames = new ArrayList<>();
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen2RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen2RomHandler.java
index f4f84d5..06f38f7 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen2RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen2RomHandler.java
@@ -935,11 +935,11 @@ public class Gen2RomHandler extends AbstractGBCRomHandler {
rom[offs] = (byte) tp.level;
rom[offs + 1] = (byte) tp.pokemon.number;
offs += 2;
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
rom[offs] = (byte) tp.heldItem;
offs++;
}
- if ((tr.poketype & 1) == 1) {
+ if (tr.pokemonHaveCustomMoves()) {
if (tp.resetMoves) {
int[] pokeMoves = RomFunctions.getMovesAtLevel(tp.pokemon.number, movesets, tp.level);
for (int m = 0; m < 4; m++) {
@@ -1547,11 +1547,6 @@ public class Gen2RomHandler extends AbstractGBCRomHandler {
}
@Override
- public int randomHeldItem() {
- return 0;
- }
-
- @Override
public boolean canChangeTrainerText() {
return romEntry.getValue("CanChangeTrainerText") > 0;
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java
index f58e6ea..9fd762b 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen3RomHandler.java
@@ -1501,7 +1501,7 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
Iterator<TrainerPokemon> pokes = tr.pokemon.iterator();
// Write out Pokemon data!
- if ((tr.poketype & 1) == 1) {
+ if (tr.pokemonHaveCustomMoves()) {
// custom moves, blocks of 16 bytes
for (int poke = 0; poke < newPokeCount; poke++) {
TrainerPokemon tp = pokes.next();
@@ -1509,7 +1509,7 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
writeWord(pointerToPokes + poke * 16 + 2, tp.level);
writeWord(pointerToPokes + poke * 16 + 4, pokedexToInternal[tp.pokemon.number]);
int movesStart;
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
writeWord(pointerToPokes + poke * 16 + 6, tp.heldItem);
movesStart = 8;
} else {
@@ -1535,7 +1535,7 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
writeWord(pointerToPokes + poke * 8, tp.AILevel);
writeWord(pointerToPokes + poke * 8 + 2, tp.level);
writeWord(pointerToPokes + poke * 8 + 4, pokedexToInternal[tp.pokemon.number]);
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
writeWord(pointerToPokes + poke * 8 + 6, tp.heldItem);
} else {
writeWord(pointerToPokes + poke * 8 + 6, 0);
@@ -2473,11 +2473,6 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
}
@Override
- public int randomHeldItem() {
- return 0;
- }
-
- @Override
public boolean canChangeTrainerText() {
return true;
}
@@ -3326,4 +3321,14 @@ public class Gen3RomHandler extends AbstractGBRomHandler {
// Make image, 4bpp
return GFXFunctions.drawTiledImage(trueFrontSprite, convPalette, 64, 64, 4);
}
+
+ @Override
+ public List<Integer> getAllHeldItems() {
+ return Gen3Constants.allHeldItems;
+ }
+
+ @Override
+ public List<Integer> getAllConsumableHeldItems() {
+ return Gen3Constants.consumableHeldItems;
+ }
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen4RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen4RomHandler.java
index 88488be..ca39813 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen4RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen4RomHandler.java
@@ -2104,11 +2104,11 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
tpk.formeSuffix = Gen4Constants.getFormeSuffixByBaseForme(species,formnum);
tpk.absolutePokeNumber = Gen4Constants.getAbsolutePokeNumByBaseForme(species,formnum);
pokeOffs += 6;
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
tpk.heldItem = readWord(trpoke, pokeOffs);
pokeOffs += 2;
}
- if ((tr.poketype & 1) == 1) {
+ if (tr.pokemonHaveCustomMoves()) {
int attack1 = readWord(trpoke, pokeOffs);
int attack2 = readWord(trpoke, pokeOffs + 2);
int attack3 = readWord(trpoke, pokeOffs + 4);
@@ -2194,10 +2194,10 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
if (romEntry.romType != Gen4Constants.Type_DP) {
bytesNeeded += 2 * numPokes;
}
- if ((tr.poketype & 1) == 1) {
- bytesNeeded += 8 * numPokes;
+ if (tr.pokemonHaveCustomMoves()) {
+ bytesNeeded += 8 * numPokes; // 2 bytes * 4 moves
}
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
bytesNeeded += 2 * numPokes;
}
byte[] trpoke = new byte[bytesNeeded];
@@ -2210,11 +2210,11 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
writeWord(trpoke, pokeOffs + 4, tp.pokemon.number);
trpoke[pokeOffs + 5] |= (tp.forme << 2);
pokeOffs += 6;
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
writeWord(trpoke, pokeOffs, tp.heldItem);
pokeOffs += 2;
}
- if ((tr.poketype & 1) == 1) {
+ if (tr.pokemonHaveCustomMoves()) {
if (tp.resetMoves) {
int[] pokeMoves = RomFunctions.getMovesAtLevel(tp.absolutePokeNumber, movesets, tp.level);
for (int m = 0; m < 4; m++) {
@@ -3402,11 +3402,6 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
}
@Override
- public int randomHeldItem() {
- return 0;
- }
-
- @Override
public boolean canChangeTrainerText() {
return true;
}
@@ -4243,4 +4238,14 @@ public class Gen4RomHandler extends AbstractDSRomHandler {
throw new RandomizerIOException(e);
}
}
+
+ @Override
+ public List<Integer> getAllConsumableHeldItems() {
+ return Gen4Constants.consumableHeldItems;
+ }
+
+ @Override
+ public List<Integer> getAllHeldItems() {
+ return Gen4Constants.allHeldItems;
+ }
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen5RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen5RomHandler.java
index e818a57..ad09135 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen5RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen5RomHandler.java
@@ -1228,11 +1228,11 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
tpk.formeSuffix = Gen5Constants.getFormeSuffixByBaseForme(species,formnum);
tpk.absolutePokeNumber = Gen5Constants.getAbsolutePokeNumByBaseForme(species,formnum);
pokeOffs += 8;
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
tpk.heldItem = readWord(trpoke, pokeOffs);
pokeOffs += 2;
}
- if ((tr.poketype & 1) == 1) {
+ if (tr.pokemonHaveCustomMoves()) {
int attack1 = readWord(trpoke, pokeOffs);
int attack2 = readWord(trpoke, pokeOffs + 2);
int attack3 = readWord(trpoke, pokeOffs + 4);
@@ -1256,7 +1256,7 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
int currentFile = 1;
for (int trno = 0; trno < 17; trno++) {
Trainer tr = new Trainer();
- tr.poketype = 3;
+ tr.poketype = 3; // have held items and custom moves
tr.offset = 0;
int pokemonNum = 6;
if (trno < 2) {
@@ -1340,10 +1340,10 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
}
int bytesNeeded = 8 * numPokes;
- if ((tr.poketype & 1) == 1) {
+ if (tr.pokemonHaveCustomMoves()) {
bytesNeeded += 8 * numPokes;
}
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
bytesNeeded += 2 * numPokes;
}
byte[] trpoke = new byte[bytesNeeded];
@@ -1358,11 +1358,11 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
writeWord(trpoke, pokeOffs + 6, tp.forme);
// no form info, so no byte 6/7
pokeOffs += 8;
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
writeWord(trpoke, pokeOffs, tp.heldItem);
pokeOffs += 2;
}
- if ((tr.poketype & 1) == 1) {
+ if (tr.pokemonHaveCustomMoves()) {
if (tp.resetMoves) {
int[] pokeMoves = RomFunctions.getMovesAtLevel(tp.absolutePokeNumber, movesets, tp.level);
for (int m = 0; m < 4; m++) {
@@ -3355,11 +3355,6 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
}
@Override
- public int randomHeldItem() {
- return 0;
- }
-
- @Override
public BufferedImage getMascotImage() {
try {
Pokemon pk = randomPokemonInclFormes();
@@ -3408,4 +3403,14 @@ public class Gen5RomHandler extends AbstractDSRomHandler {
throw new RandomizerIOException(e);
}
}
+
+ @Override
+ public List<Integer> getAllHeldItems() {
+ return Gen5Constants.allHeldItems;
+ }
+
+ @Override
+ public List<Integer> getAllConsumableHeldItems() {
+ return Gen5Constants.consumableHeldItems;
+ }
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java
index fecf168..48eac50 100644
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen6RomHandler.java
@@ -1733,11 +1733,12 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
.getOrDefault(species,dummyAbsolutePokeNums)
.getOrDefault(formnum,species);
pokeOffs += 8;
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
tpk.heldItem = readWord(trpoke, pokeOffs);
pokeOffs += 2;
+ tpk.hasMegaStone = Gen6Constants.isMegaStone(tpk.heldItem);
}
- if ((tr.poketype & 1) == 1) {
+ if (tr.pokemonHaveCustomMoves()) {
int attack1 = readWord(trpoke, pokeOffs);
int attack2 = readWord(trpoke, pokeOffs + 2);
int attack3 = readWord(trpoke, pokeOffs + 4);
@@ -1810,10 +1811,10 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
}
int bytesNeeded = 8 * numPokes;
- if ((tr.poketype & 1) == 1) {
+ if (tr.pokemonHaveCustomMoves()) {
bytesNeeded += 8 * numPokes;
}
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
bytesNeeded += 2 * numPokes;
}
byte[] trpoke = new byte[bytesNeeded];
@@ -1827,11 +1828,11 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
writeWord(trpoke, pokeOffs + 4, tp.pokemon.number);
writeWord(trpoke, pokeOffs + 6, tp.forme);
pokeOffs += 8;
- if ((tr.poketype & 2) == 2) {
+ if (tr.pokemonHaveItems()) {
writeWord(trpoke, pokeOffs, tp.heldItem);
pokeOffs += 2;
}
- if ((tr.poketype & 1) == 1) {
+ if (tr.pokemonHaveCustomMoves()) {
if (tp.resetMoves) {
int[] pokeMoves = RomFunctions.getMovesAtLevel(tp.absolutePokeNumber, movesets, tp.level);
for (int m = 0; m < 4; m++) {
@@ -3444,11 +3445,6 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
}
@Override
- public int randomHeldItem() {
- return 0;
- }
-
- @Override
public BufferedImage getMascotImage() {
try {
GARCArchive pokespritesGARC = this.readGARC(romEntry.getString("PokemonGraphics"),false);
@@ -3495,4 +3491,14 @@ public class Gen6RomHandler extends Abstract3DSRomHandler {
throw new RandomizerIOException(e);
}
}
+
+ @Override
+ public List<Integer> getAllHeldItems() {
+ return Gen6Constants.allHeldItems;
+ }
+
+ @Override
+ public List<Integer> getAllConsumableHeldItems() {
+ return Gen6Constants.consumableHeldItems;
+ }
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/Gen7RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/Gen7RomHandler.java
index 628ecb3..feb3296 100644
--- a/src/com/dabomstew/pkrandom/romhandlers/Gen7RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/Gen7RomHandler.java
@@ -27,6 +27,7 @@ import com.dabomstew.pkrandom.FileFunctions;
import com.dabomstew.pkrandom.MiscTweak;
import com.dabomstew.pkrandom.RomFunctions;
import com.dabomstew.pkrandom.Settings;
+import com.dabomstew.pkrandom.constants.Gen6Constants;
import com.dabomstew.pkrandom.constants.Gen7Constants;
import com.dabomstew.pkrandom.constants.GlobalConstants;
import com.dabomstew.pkrandom.constants.Species;
@@ -1497,6 +1498,8 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
.getOrDefault(formnum,species);
pokeOffs += 20;
tpk.heldItem = readWord(trpoke, pokeOffs);
+ tpk.hasMegaStone = Gen6Constants.isMegaStone(tpk.heldItem);
+ tpk.hasZCrystal = Gen7Constants.isZCrystal(tpk.heldItem);
pokeOffs += 4;
int attack1 = readWord(trpoke, pokeOffs);
int attack2 = readWord(trpoke, pokeOffs + 2);
@@ -3139,11 +3142,6 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
}
@Override
- public int randomHeldItem() {
- return Gen7Constants.validConsumableHeldItems.get(this.random.nextInt(Gen7Constants.validConsumableHeldItems.size()));
- }
-
- @Override
public BufferedImage getMascotImage() {
try {
GARCArchive pokespritesGARC = this.readGARC(romEntry.getString("PokemonGraphics"), false);
@@ -3188,4 +3186,14 @@ public class Gen7RomHandler extends Abstract3DSRomHandler {
encounterTables = new ArrayList<>();
}
}
+
+ @Override
+ public List<Integer> getAllConsumableHeldItems() {
+ return Gen7Constants.consumableHeldItems;
+ }
+
+ @Override
+ public List<Integer> getAllHeldItems() {
+ return Gen7Constants.allHeldItems;
+ }
}
diff --git a/src/com/dabomstew/pkrandom/romhandlers/RomHandler.java b/src/com/dabomstew/pkrandom/romhandlers/RomHandler.java
index 64da8df..9a4d12a 100755
--- a/src/com/dabomstew/pkrandom/romhandlers/RomHandler.java
+++ b/src/com/dabomstew/pkrandom/romhandlers/RomHandler.java
@@ -201,6 +201,14 @@ public interface RomHandler {
void typeThemeTrainerPokes(Settings settings);
+ void randomizeTrainerHeldItems(Settings settings);
+
+ List<Integer> getSensibleHeldItemsFor(TrainerPokemon tp, boolean consumableOnly);
+
+ List<Integer> getAllConsumableHeldItems();
+
+ List<Integer> getAllHeldItems();
+
void rivalCarriesStarter();
void forceFullyEvolvedTrainerPokes(Settings settings);
@@ -495,8 +503,6 @@ public interface RomHandler {
List<Integer> getMainGameShops();
- int randomHeldItem();
-
// stats stuff
void minimumCatchRate(int rateNonLegendary, int rateLegendary);