summaryrefslogtreecommitdiff
path: root/src/com/pkrandom/constants/Gen7Constants.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/pkrandom/constants/Gen7Constants.java')
-rw-r--r--src/com/pkrandom/constants/Gen7Constants.java2243
1 files changed, 2243 insertions, 0 deletions
diff --git a/src/com/pkrandom/constants/Gen7Constants.java b/src/com/pkrandom/constants/Gen7Constants.java
new file mode 100644
index 0000000..2c1d9a1
--- /dev/null
+++ b/src/com/pkrandom/constants/Gen7Constants.java
@@ -0,0 +1,2243 @@
+package com.pkrandom.constants;
+
+/*----------------------------------------------------------------------------*/
+/*-- Gen7Constants.java - Constants for Sun/Moon/Ultra Sun/Ultra Moon --*/
+/*-- --*/
+/*-- Part of "Universal Pokemon Randomizer ZX" by the UPR-ZX team --*/
+/*-- Pokemon and any associated names and the like are --*/
+/*-- trademark and (C) Nintendo 1996-2020. --*/
+/*-- --*/
+/*-- The custom code written here is licensed under the terms of the GPL: --*/
+/*-- --*/
+/*-- This program is free software: you can redistribute it and/or modify --*/
+/*-- it under the terms of the GNU General Public License as published by --*/
+/*-- the Free Software Foundation, either version 3 of the License, or --*/
+/*-- (at your option) any later version. --*/
+/*-- --*/
+/*-- This program is distributed in the hope that it will be useful, --*/
+/*-- but WITHOUT ANY WARRANTY; without even the implied warranty of --*/
+/*-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --*/
+/*-- GNU General Public License for more details. --*/
+/*-- --*/
+/*-- You should have received a copy of the GNU General Public License --*/
+/*-- along with this program. If not, see <http://www.gnu.org/licenses/>. --*/
+/*----------------------------------------------------------------------------*/
+
+import com.pkrandom.pokemon.ItemList;
+import com.pkrandom.pokemon.MoveCategory;
+import com.pkrandom.pokemon.Trainer;
+import com.pkrandom.pokemon.Type;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+public class Gen7Constants {
+
+ public static final int Type_SM = N3DSConstants.Type_SM;
+ public static final int Type_USUM = N3DSConstants.Type_USUM;
+
+ private static final int pokemonCountSM = 802, pokemonCountUSUM = 807;
+ private static final int formeCountSM = 158, formeCountUSUM = 168;
+ private static final int moveCountSM = 719, moveCountUSUM = 728;
+ private static final int highestAbilityIndexSM = Abilities.prismArmor, highestAbilityIndexUSUM = Abilities.neuroforce;
+
+ public static final int bsHPOffset = 0, bsAttackOffset = 1, bsDefenseOffset = 2, bsSpeedOffset = 3,
+ bsSpAtkOffset = 4, bsSpDefOffset = 5, bsPrimaryTypeOffset = 6, bsSecondaryTypeOffset = 7,
+ bsCatchRateOffset = 8, bsCommonHeldItemOffset = 12, bsRareHeldItemOffset = 14, bsDarkGrassHeldItemOffset = 16,
+ bsGenderOffset = 18, bsGrowthCurveOffset = 21, bsAbility1Offset = 24, bsAbility2Offset = 25,
+ bsAbility3Offset = 26, bsCallRateOffset = 27, bsFormeOffset = 28, bsFormeSpriteOffset = 30,
+ bsFormeCountOffset = 32, bsTMHMCompatOffset = 40, bsSpecialMTCompatOffset = 56, bsMTCompatOffset = 60;
+
+ public static final int bsSize = 0x54;
+
+ public static final int evolutionMethodCount = 42;
+
+ private static List<Integer> speciesWithAlolanForms = Arrays.asList(
+ Species.rattata, Species.raticate, Species.raichu, Species.sandshrew, Species.sandslash, Species.vulpix,
+ Species.ninetales, Species.diglett, Species.dugtrio, Species.meowth, Species.persian, Species.geodude,
+ Species.graveler, Species.golem, Species.grimer, Species.muk, Species.exeggutor, Species.marowak
+ );
+
+ private static final Map<Integer,String> dummyFormeSuffixes = setupDummyFormeSuffixes();
+ private static final Map<Integer,Map<Integer,String>> formeSuffixesByBaseForme = setupFormeSuffixesByBaseForme();
+
+ public static String getFormeSuffixByBaseForme(int baseForme, int formNum) {
+ return formeSuffixesByBaseForme.getOrDefault(baseForme,dummyFormeSuffixes).getOrDefault(formNum,"");
+ }
+
+ public static List<Integer> getIrregularFormes(int romType) {
+ if (romType == Type_SM) {
+ return irregularFormesSM;
+ } else if (romType == Type_USUM) {
+ return irregularFormesUSUM;
+ }
+ return irregularFormesSM;
+ }
+
+ public static final List<Integer> irregularFormesSM = Arrays.asList(
+ Species.SMFormes.castformF, Species.SMFormes.castformW, Species.SMFormes.castformI,
+ Species.SMFormes.darmanitanZ,
+ Species.SMFormes.meloettaP,
+ Species.SMFormes.kyuremW,
+ Species.SMFormes.kyuremB,
+ Species.SMFormes.gengarMega,
+ Species.SMFormes.gardevoirMega,
+ Species.SMFormes.ampharosMega,
+ Species.SMFormes.venusaurMega,
+ Species.SMFormes.charizardMegaX, Species.SMFormes.charizardMegaY,
+ Species.SMFormes.mewtwoMegaX, Species.SMFormes.mewtwoMegaY,
+ Species.SMFormes.blazikenMega,
+ Species.SMFormes.medichamMega,
+ Species.SMFormes.houndoomMega,
+ Species.SMFormes.aggronMega,
+ Species.SMFormes.banetteMega,
+ Species.SMFormes.tyranitarMega,
+ Species.SMFormes.scizorMega,
+ Species.SMFormes.pinsirMega,
+ Species.SMFormes.aerodactylMega,
+ Species.SMFormes.lucarioMega,
+ Species.SMFormes.abomasnowMega,
+ Species.SMFormes.aegislashB,
+ Species.SMFormes.blastoiseMega,
+ Species.SMFormes.kangaskhanMega,
+ Species.SMFormes.gyaradosMega,
+ Species.SMFormes.absolMega,
+ Species.SMFormes.alakazamMega,
+ Species.SMFormes.heracrossMega,
+ Species.SMFormes.mawileMega,
+ Species.SMFormes.manectricMega,
+ Species.SMFormes.garchompMega,
+ Species.SMFormes.latiosMega,
+ Species.SMFormes.latiasMega,
+ Species.SMFormes.swampertMega,
+ Species.SMFormes.sceptileMega,
+ Species.SMFormes.sableyeMega,
+ Species.SMFormes.altariaMega,
+ Species.SMFormes.galladeMega,
+ Species.SMFormes.audinoMega,
+ Species.SMFormes.sharpedoMega,
+ Species.SMFormes.slowbroMega,
+ Species.SMFormes.steelixMega,
+ Species.SMFormes.pidgeotMega,
+ Species.SMFormes.glalieMega,
+ Species.SMFormes.diancieMega,
+ Species.SMFormes.metagrossMega,
+ Species.SMFormes.kyogreP,
+ Species.SMFormes.groudonP,
+ Species.SMFormes.rayquazaMega,
+ Species.SMFormes.cameruptMega,
+ Species.SMFormes.lopunnyMega,
+ Species.SMFormes.salamenceMega,
+ Species.SMFormes.beedrillMega,
+ Species.SMFormes.wishiwashiS,
+ Species.SMFormes.greninjaA,
+ Species.SMFormes.zygardeC,
+ Species.SMFormes.miniorC
+ );
+
+ public static final List<Integer> irregularFormesUSUM = Arrays.asList(
+ Species.USUMFormes.castformF, Species.USUMFormes.castformW, Species.USUMFormes.castformI,
+ Species.USUMFormes.darmanitanZ,
+ Species.USUMFormes.meloettaP,
+ Species.USUMFormes.kyuremW,
+ Species.USUMFormes.kyuremB,
+ Species.USUMFormes.gengarMega,
+ Species.USUMFormes.gardevoirMega,
+ Species.USUMFormes.ampharosMega,
+ Species.USUMFormes.venusaurMega,
+ Species.USUMFormes.charizardMegaX, Species.USUMFormes.charizardMegaY,
+ Species.USUMFormes.mewtwoMegaX, Species.USUMFormes.mewtwoMegaY,
+ Species.USUMFormes.blazikenMega,
+ Species.USUMFormes.medichamMega,
+ Species.USUMFormes.houndoomMega,
+ Species.USUMFormes.aggronMega,
+ Species.USUMFormes.banetteMega,
+ Species.USUMFormes.tyranitarMega,
+ Species.USUMFormes.scizorMega,
+ Species.USUMFormes.pinsirMega,
+ Species.USUMFormes.aerodactylMega,
+ Species.USUMFormes.lucarioMega,
+ Species.USUMFormes.abomasnowMega,
+ Species.USUMFormes.aegislashB,
+ Species.USUMFormes.blastoiseMega,
+ Species.USUMFormes.kangaskhanMega,
+ Species.USUMFormes.gyaradosMega,
+ Species.USUMFormes.absolMega,
+ Species.USUMFormes.alakazamMega,
+ Species.USUMFormes.heracrossMega,
+ Species.USUMFormes.mawileMega,
+ Species.USUMFormes.manectricMega,
+ Species.USUMFormes.garchompMega,
+ Species.USUMFormes.latiosMega,
+ Species.USUMFormes.latiasMega,
+ Species.USUMFormes.swampertMega,
+ Species.USUMFormes.sceptileMega,
+ Species.USUMFormes.sableyeMega,
+ Species.USUMFormes.altariaMega,
+ Species.USUMFormes.galladeMega,
+ Species.USUMFormes.audinoMega,
+ Species.USUMFormes.sharpedoMega,
+ Species.USUMFormes.slowbroMega,
+ Species.USUMFormes.steelixMega,
+ Species.USUMFormes.pidgeotMega,
+ Species.USUMFormes.glalieMega,
+ Species.USUMFormes.diancieMega,
+ Species.USUMFormes.metagrossMega,
+ Species.USUMFormes.kyogreP,
+ Species.USUMFormes.groudonP,
+ Species.USUMFormes.rayquazaMega,
+ Species.USUMFormes.cameruptMega,
+ Species.USUMFormes.lopunnyMega,
+ Species.USUMFormes.salamenceMega,
+ Species.USUMFormes.beedrillMega,
+ Species.USUMFormes.wishiwashiS,
+ Species.USUMFormes.greninjaA,
+ Species.USUMFormes.zygardeC,
+ Species.USUMFormes.miniorC,
+ Species.USUMFormes.necrozmaDM,
+ Species.USUMFormes.necrozmaDW,
+ Species.USUMFormes.necrozmaU
+ );
+
+ public static final MoveCategory[] moveCategoryIndices = { MoveCategory.STATUS, MoveCategory.PHYSICAL,
+ MoveCategory.SPECIAL };
+
+ public static byte moveCategoryToByte(MoveCategory cat) {
+ switch (cat) {
+ case PHYSICAL:
+ return 1;
+ case SPECIAL:
+ return 2;
+ case STATUS:
+ default:
+ return 0;
+ }
+ }
+
+ public static final int noDamageTargetTrappingEffect = 106, noDamageFieldTrappingEffect = 354,
+ damageAdjacentFoesTrappingEffect = 373, damageTargetTrappingEffect = 384;
+
+ public static final int noDamageStatusQuality = 1, noDamageStatChangeQuality = 2, damageStatusQuality = 4,
+ noDamageStatusAndStatChangeQuality = 5, damageTargetDebuffQuality = 6, damageUserBuffQuality = 7,
+ damageAbsorbQuality = 8;
+
+ public static List<Integer> bannedMoves = Arrays.asList(Moves.darkVoid, Moves.hyperspaceFury);
+
+ public static final Type[] typeTable = constructTypeTable();
+
+ private static final String tmDataPrefixSM = "034003410342034303", tmDataPrefixUSUM = "03BC03BD03BE03BF03";
+ public static final int tmCount = 100, tmBlockOneCount = 92, tmBlockTwoCount = 3, tmBlockThreeCount = 5,
+ tmBlockOneOffset = Items.tm01, tmBlockTwoOffset = Items.tm93, tmBlockThreeOffset = Items.tm96;
+ public static final String itemPalettesPrefix = "070000000000000000010100";
+
+ public static final int shopItemsOffsetSM = 0x50A8;
+ public static final int shopItemsOffsetUSUM = 0x50BC;
+
+ public static final int tutorsOffset = 0x54DE;
+ public static final String tutorsPrefix = "5F6F6E5F6F6666FF";
+ public static final int tutorMoveCount = 67;
+
+ public static final String[] fastestTextPrefixes = new String[]{"1080BDE80E000500F0412DE9", "34019FE50060A0E3"};
+
+ private static final List<Integer> mainGameShopsSM = Arrays.asList(
+ 8, 9, 10, 11, 14, 15, 17, 20, 21, 22, 23
+ );
+
+ private static final List<Integer> mainGameShopsUSUM = Arrays.asList(
+ 8, 9, 10, 11, 14, 15, 17, 20, 21, 22, 23, 24, 25, 26, 27
+ );
+
+ public static final List<Integer> evolutionItems = Arrays.asList(Items.sunStone, Items.moonStone, Items.fireStone,
+ Items.thunderStone, Items.waterStone, Items.leafStone, Items.shinyStone, Items.duskStone, Items.dawnStone,
+ Items.ovalStone, Items.kingsRock, Items.deepSeaTooth, Items.deepSeaScale, Items.metalCoat, Items.dragonScale,
+ Items.upgrade, Items.protector, Items.electirizer, Items.magmarizer, Items.dubiousDisc, Items.reaperCloth,
+ Items.razorClaw, Items.razorFang, Items.prismScale, Items.whippedDream, Items.sachet, Items.iceStone);
+
+ private static final List<Boolean> relevantEncounterFilesSM = setupRelevantEncounterFiles(Type_SM);
+ private static final List<Boolean> relevantEncounterFilesUSUM = setupRelevantEncounterFiles(Type_USUM);
+
+ public static final List<Integer> heldZCrystals = Arrays.asList(
+ Items.normaliumZHeld, // Normal
+ Items.fightiniumZHeld, // Fighting
+ Items.flyiniumZHeld, // Flying
+ Items.poisoniumZHeld, // Poison
+ Items.groundiumZHeld, // Ground
+ Items.rockiumZHeld, // Rock
+ Items.buginiumZHeld, // Bug
+ Items.ghostiumZHeld, // Ghost
+ Items.steeliumZHeld, // Steel
+ Items.firiumZHeld, // Fire
+ Items.wateriumZHeld, // Water
+ Items.grassiumZHeld, // Grass
+ Items.electriumZHeld, // Electric
+ Items.psychiumZHeld, // Psychic
+ Items.iciumZHeld, // Ice
+ Items.dragoniumZHeld, // Dragon
+ Items.darkiniumZHeld, // Dark
+ Items.fairiumZHeld // Fairy
+ );
+
+ 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(Abilities.insomnia, Arrays.asList(Abilities.insomnia, Abilities.vitalSpirit));
+ map.put(Abilities.clearBody, Arrays.asList(Abilities.clearBody, Abilities.whiteSmoke, Abilities.fullMetalBody));
+ map.put(Abilities.hugePower, Arrays.asList(Abilities.hugePower, Abilities.purePower));
+ map.put(Abilities.battleArmor, Arrays.asList(Abilities.battleArmor, Abilities.shellArmor));
+ map.put(Abilities.cloudNine, Arrays.asList(Abilities.cloudNine, Abilities.airLock));
+ map.put(Abilities.filter, Arrays.asList(Abilities.filter, Abilities.solidRock, Abilities.prismArmor));
+ map.put(Abilities.roughSkin, Arrays.asList(Abilities.roughSkin, Abilities.ironBarbs));
+ map.put(Abilities.moldBreaker, Arrays.asList(Abilities.moldBreaker, Abilities.turboblaze, Abilities.teravolt));
+ map.put(Abilities.wimpOut, Arrays.asList(Abilities.wimpOut, Abilities.emergencyExit));
+ map.put(Abilities.queenlyMajesty, Arrays.asList(Abilities.queenlyMajesty, Abilities.dazzling));
+ map.put(Abilities.gooey, Arrays.asList(Abilities.gooey, Abilities.tanglingHair));
+ map.put(Abilities.receiver, Arrays.asList(Abilities.receiver, Abilities.powerOfAlchemy));
+ map.put(Abilities.multiscale, Arrays.asList(Abilities.multiscale, Abilities.shadowShield));
+
+ return map;
+ }
+
+ public static final List<Integer> uselessAbilities = Arrays.asList(Abilities.forecast, Abilities.multitype,
+ Abilities.flowerGift, Abilities.zenMode, Abilities.stanceChange, Abilities.shieldsDown, Abilities.schooling,
+ Abilities.disguise, Abilities.battleBond, Abilities.powerConstruct, Abilities.rksSystem);
+
+ private static final String saveLoadFormeReversionPrefixSM = "00EB040094E50C1094E5F70E80E2", saveLoadFormeReversionPrefixUSUM = "00EB040094E50C1094E5030B80E2EE0F80E2";
+ public static final String afterBattleFormeReversionPrefix = "0055E10B00001A0010A0E30700A0E1";
+
+ public static final String ninjaskSpeciesPrefix = "11FF2FE11CD08DE2F080BDE8", shedinjaPrefix = "A0E194FDFFEB0040A0E1";
+
+ public static final String beastLusaminePokemonBoostsPrefix = "1D14FFFF";
+ public static final int beastLusamineTrainerIndex = 157;
+
+ public static final String miniorWildEncounterPatchPrefix = "032C42E2062052E2";
+
+ public static final int zygardeAssemblyScriptFile = 45;
+ public static final String zygardeAssemblyFormePrefix = "BC21CDE1B801CDE1", zygardeAssemblySpeciesPrefix = "FBEB4CD08DE20400A0E1F08FBDE8";
+
+ public static final String friendshipValueForEvoLocator = "DC0050E3F700002A";
+
+ public static final String perfectOddsBranchLocator = "050000BA000050E3";
+
+ public static int getPokemonCount(int romType) {
+ if (romType == Type_SM) {
+ return pokemonCountSM;
+ } else if (romType == Type_USUM) {
+ return pokemonCountUSUM;
+ }
+ return pokemonCountSM;
+ }
+
+ public static List<Integer> getRegularShopItems(int romType) {
+ if (romType == Type_SM) {
+ return regularShopItemsSM;
+ } else {
+ return regularShopItemsUSUM;
+ }
+ }
+
+ public static final List<Integer> consumableHeldItems = setupAllConsumableItems();
+
+ private static List<Integer> setupAllConsumableItems() {
+ List<Integer> list = new ArrayList<>(Gen6Constants.consumableHeldItems);
+ list.addAll(Arrays.asList(Items.adrenalineOrb, Items.electricSeed, Items.psychicSeed, Items.mistySeed, Items.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<>(Gen6Constants.allHeldItems);
+ list.addAll(Arrays.asList(Items.adrenalineOrb, Items.electricSeed, Items.psychicSeed, Items.mistySeed, Items.grassySeed));
+ list.addAll(Arrays.asList(Items.terrainExtender, Items.protectivePads));
+ return list;
+ }
+
+ public static final List<Integer> generalPurposeConsumableItems = initializeGeneralPurposeConsumableItems();
+
+ private static List<Integer> initializeGeneralPurposeConsumableItems() {
+ List<Integer> list = new ArrayList<>(Gen6Constants.generalPurposeConsumableItems);
+ // These berries are worth the risk of causing confusion because they heal for half max HP.
+ list.addAll(Arrays.asList(Items.figyBerry, Items.wikiBerry, Items.magoBerry,
+ Items.aguavBerry, Items.iapapaBerry, Items.adrenalineOrb));
+ return Collections.unmodifiableList(list);
+ }
+
+ public static final List<Integer> generalPurposeItems = initializeGeneralPurposeItems();
+
+ private static List<Integer> initializeGeneralPurposeItems() {
+ List<Integer> list = new ArrayList<>(Gen6Constants.generalPurposeItems);
+ list.addAll(Arrays.asList(Items.protectivePads));
+ return Collections.unmodifiableList(list);
+ }
+
+ public static final Map<Integer, List<Integer>> moveBoostingItems = initializeMoveBoostingItems();
+
+ private static Map<Integer, List<Integer>> initializeMoveBoostingItems() {
+ Map<Integer, List<Integer>> map = new HashMap<>(Gen6Constants.moveBoostingItems);
+ map.put(Moves.electricTerrain, Arrays.asList(Items.terrainExtender));
+ map.put(Moves.grassyTerrain, Arrays.asList(Items.terrainExtender));
+ map.put(Moves.mistyTerrain, Arrays.asList(Items.terrainExtender));
+ map.put(Moves.psychicTerrain, Arrays.asList(Items.terrainExtender));
+ map.put(Moves.strengthSap, Arrays.asList(Items.bigRoot));
+ return Collections.unmodifiableMap(map);
+ }
+ public static final Map<Integer, List<Integer>> abilityBoostingItems = initializeAbilityBoostingItems();
+
+ private static Map<Integer, List<Integer>> initializeAbilityBoostingItems() {
+ Map<Integer, List<Integer>> map = new HashMap<>(Gen6Constants.abilityBoostingItems);
+ map.put(Abilities.electricSurge, Arrays.asList(Items.terrainExtender));
+ map.put(Abilities.grassySurge, Arrays.asList(Items.terrainExtender));
+ map.put(Abilities.mistySurge, Arrays.asList(Items.terrainExtender));
+ map.put(Abilities.psychicSurge, Arrays.asList(Items.terrainExtender));
+ return Collections.unmodifiableMap(map);
+ }
+
+ public static final Map<Integer, Integer> consumableAbilityBoostingItems = initializeConsumableAbilityBoostingItems();
+
+ private static Map<Integer, Integer> initializeConsumableAbilityBoostingItems() {
+ Map<Integer, Integer> map = new HashMap<>();
+ map.put(Abilities.electricSurge, Items.electricSeed);
+ map.put(Abilities.grassySurge, Items.grassySeed);
+ map.put(Abilities.mistySurge, Items.mistySeed);
+ map.put(Abilities.psychicSurge, Items.psychicSeed);
+ return Collections.unmodifiableMap(map);
+ }
+
+ // None of these have new entries in Gen VII.
+ public static final Map<Type, Integer> consumableTypeBoostingItems = Gen6Constants.consumableTypeBoostingItems;
+ public static final Map<Integer, List<Integer>> speciesBoostingItems = Gen6Constants.speciesBoostingItems;
+ public static final Map<Type, List<Integer>> typeBoostingItems = Gen6Constants.typeBoostingItems;
+ public static final Map<Type, Integer> weaknessReducingBerries = Gen6Constants.weaknessReducingBerries;
+
+ public static boolean isZCrystal(int itemIndex) {
+ // From https://bulbapedia.bulbagarden.net/wiki/List_of_items_by_index_number_(Generation_VII)
+ return (itemIndex >= Items.normaliumZHeld && itemIndex <= Items.pikaniumZHeld) ||
+ (itemIndex >= Items.decidiumZHeld && itemIndex <= Items.pikashuniumZBag) ||
+ (itemIndex >= Items.solganiumZBag && itemIndex <= Items.kommoniumZBag);
+
+ }
+
+ public static List<String> getShopNames(int romType) {
+ List<String> shopNames = new ArrayList<>();
+ shopNames.add("Primary 0 Trials");
+ shopNames.add("Primary 1 Trials");
+ shopNames.add("Primary 2 Trials");
+ shopNames.add("Primary 3 Trials");
+ shopNames.add("Primary 4 Trials");
+ shopNames.add("Primary 5 Trials");
+ shopNames.add("Primary 6 Trials");
+ shopNames.add("Primary 7 Trials");
+ shopNames.add("Konikoni City Incenses");
+ shopNames.add("Konikoni City Herbs");
+ shopNames.add("Hau'oli City Secondary");
+ shopNames.add("Route 2 Secondary");
+ shopNames.add("Heahea City Secondary (TMs)");
+ shopNames.add("Royal Avenue Secondary (TMs)");
+ shopNames.add("Route 8 Secondary");
+ shopNames.add("Paniola Town Secondary");
+ shopNames.add("Malie City Secondary (TMs)");
+ shopNames.add("Mount Hokulani Secondary");
+ shopNames.add("Seafolk Village Secondary (TMs)");
+ shopNames.add("Konikoni City TMs");
+ shopNames.add("Konikoni City Stones");
+ shopNames.add("Thrifty Megamart, Center-Left");
+ shopNames.add("Thrifty Megamart, Center-Right");
+ shopNames.add("Thrifty Megamart, Right");
+ if (romType == Type_USUM) {
+ shopNames.add("Route 5 Secondary");
+ shopNames.add("Konikoni City Secondary");
+ shopNames.add("Tapu Village Secondary");
+ shopNames.add("Mount Lanakila Secondary");
+ }
+ return shopNames;
+ }
+
+ public static List<Integer> getMainGameShops(int romType) {
+ if (romType == Type_SM) {
+ return mainGameShopsSM;
+ } else {
+ return mainGameShopsUSUM;
+ }
+ }
+
+ public static int getShopItemsOffset(int romType) {
+ if (romType == Type_SM) {
+ return shopItemsOffsetSM;
+ } else {
+ return shopItemsOffsetUSUM;
+ }
+ }
+
+ public static int getFormeCount(int romType) {
+ if (romType == Type_SM) {
+ return formeCountSM;
+ } else {
+ return formeCountUSUM;
+ }
+ }
+
+ public static int getMoveCount(int romType) {
+ if (romType == Type_SM) {
+ return moveCountSM;
+ } else if (romType == Type_USUM) {
+ return moveCountUSUM;
+ }
+ return moveCountSM;
+ }
+
+ public static String getTmDataPrefix(int romType) {
+ if (romType == Type_SM) {
+ return tmDataPrefixSM;
+ } else if (romType == Type_USUM) {
+ return tmDataPrefixUSUM;
+ }
+ return tmDataPrefixSM;
+ }
+
+ public static int getHighestAbilityIndex(int romType) {
+ if (romType == Type_SM) {
+ return highestAbilityIndexSM;
+ } else if (romType == Type_USUM) {
+ return highestAbilityIndexUSUM;
+ }
+ return highestAbilityIndexSM;
+ }
+
+ public static List<Boolean> getRelevantEncounterFiles(int romType) {
+ if (romType == Type_SM) {
+ return relevantEncounterFilesSM;
+ } else {
+ return relevantEncounterFilesUSUM;
+ }
+ }
+
+ public static String getSaveLoadFormeReversionPrefix(int romType) {
+ if (romType == Type_SM) {
+ return saveLoadFormeReversionPrefixSM;
+ } else {
+ return saveLoadFormeReversionPrefixUSUM;
+ }
+ }
+
+ private static Map<Integer,Map<Integer,String>> setupFormeSuffixesByBaseForme() {
+ Map<Integer,Map<Integer,String>> map = new HashMap<>();
+
+ Map<Integer,String> deoxysMap = new HashMap<>();
+ deoxysMap.put(1,"-A");
+ deoxysMap.put(2,"-D");
+ deoxysMap.put(3,"-S");
+ map.put(Species.deoxys, deoxysMap);
+
+ Map<Integer,String> wormadamMap = new HashMap<>();
+ wormadamMap.put(1,"-S");
+ wormadamMap.put(2,"-T");
+ map.put(Species.wormadam, wormadamMap);
+
+ Map<Integer,String> shayminMap = new HashMap<>();
+ shayminMap.put(1,"-S");
+ map.put(Species.shaymin, shayminMap);
+
+ Map<Integer,String> giratinaMap = new HashMap<>();
+ giratinaMap.put(1,"-O");
+ map.put(Species.giratina, giratinaMap);
+
+ Map<Integer,String> rotomMap = new HashMap<>();
+ rotomMap.put(1,"-H");
+ rotomMap.put(2,"-W");
+ rotomMap.put(3,"-Fr");
+ rotomMap.put(4,"-Fa");
+ rotomMap.put(5,"-M");
+ map.put(Species.rotom, rotomMap);
+
+ Map<Integer,String> castformMap = new HashMap<>();
+ castformMap.put(1,"-F");
+ castformMap.put(2,"-W");
+ castformMap.put(3,"-I");
+ map.put(Species.castform, castformMap);
+
+ Map<Integer,String> basculinMap = new HashMap<>();
+ basculinMap.put(1,"-B");
+ map.put(Species.basculin, basculinMap);
+
+ Map<Integer,String> darmanitanMap = new HashMap<>();
+ darmanitanMap.put(1,"-Z");
+ map.put(Species.darmanitan, darmanitanMap);
+
+ Map<Integer,String> meloettaMap = new HashMap<>();
+ meloettaMap.put(1,"-P");
+ map.put(Species.meloetta, meloettaMap);
+
+ Map<Integer,String> kyuremMap = new HashMap<>();
+ kyuremMap.put(1,"-W");
+ kyuremMap.put(2,"-B");
+ map.put(Species.kyurem, kyuremMap);
+
+ Map<Integer,String> tornadusMap = new HashMap<>();
+ tornadusMap.put(1,"-T");
+ map.put(Species.tornadus, tornadusMap);
+
+ Map<Integer,String> thundurusMap = new HashMap<>();
+ thundurusMap.put(1,"-T");
+ map.put(Species.thundurus, thundurusMap);
+
+ Map<Integer,String> landorusMap = new HashMap<>();
+ landorusMap.put(1,"-T");
+ map.put(Species.landorus, landorusMap);
+
+ Map<Integer,String> meowsticMap = new HashMap<>();
+ meowsticMap.put(1,"-F");
+ map.put(Species.meowstic, meowsticMap);
+
+ Map<Integer,String> aegislashMap = new HashMap<>();
+ aegislashMap.put(1,"-B");
+ map.put(Species.aegislash, aegislashMap);
+
+ Map<Integer,String> pumpkabooMap = new HashMap<>();
+ pumpkabooMap.put(1,"-M");
+ pumpkabooMap.put(2,"-L");
+ pumpkabooMap.put(3,"-XL");
+ map.put(Species.pumpkaboo, pumpkabooMap);
+
+ Map<Integer,String> gourgeistMap = new HashMap<>();
+ gourgeistMap.put(1,"-M");
+ gourgeistMap.put(2,"-L");
+ gourgeistMap.put(3,"-XL");
+ map.put(Species.gourgeist, gourgeistMap);
+
+ Map<Integer,String> floetteMap = new HashMap<>();
+ floetteMap.put(5,"-E");
+ map.put(Species.floette, floetteMap);
+
+ Map<Integer,String> kyogreMap = new HashMap<>();
+ kyogreMap.put(1,"-P");
+ map.put(Species.kyogre, kyogreMap);
+
+ Map<Integer,String> groudonMap = new HashMap<>();
+ groudonMap.put(1,"-P");
+ map.put(Species.groudon, groudonMap);
+
+ Map<Integer,String> rayquazaMap = new HashMap<>();
+ rayquazaMap.put(1,"-Mega");
+ map.put(Species.rayquaza, rayquazaMap);
+
+ Map<Integer,String> hoopaMap = new HashMap<>();
+ hoopaMap.put(1,"-U");
+ map.put(Species.hoopa, hoopaMap);
+
+ for (Integer species: Gen6Constants.speciesToMegaStoneORAS.keySet()) {
+ Map<Integer,String> megaMap = new HashMap<>();
+ if (species == Species.charizard || species == Species.mewtwo) {
+ megaMap.put(1,"-Mega-X");
+ megaMap.put(2,"-Mega-Y");
+ } else {
+ megaMap.put(1,"-Mega");
+ }
+ map.put(species,megaMap);
+ }
+
+ Map<Integer,String> wishiwashiMap = new HashMap<>();
+ wishiwashiMap.put(1,"-S");
+ map.put(Species.wishiwashi, wishiwashiMap);
+
+ Map<Integer,String> oricorioMap = new HashMap<>();
+ oricorioMap.put(1,"-E");
+ oricorioMap.put(2,"-P");
+ oricorioMap.put(3,"-G");
+ map.put(Species.oricorio, oricorioMap);
+
+ Map<Integer,String> lycanrocMap = new HashMap<>();
+ lycanrocMap.put(1,"-M");
+ lycanrocMap.put(2,"-D");
+ map.put(Species.lycanroc, lycanrocMap);
+
+ for (int species: speciesWithAlolanForms) {
+ Map<Integer,String> alolanMap = new HashMap<>();
+ alolanMap.put(1,"-A");
+ map.put(species, alolanMap);
+ }
+
+ Map<Integer,String> greninjaMap = new HashMap<>();
+ greninjaMap.put(2,"-A");
+ map.put(Species.greninja, greninjaMap);
+
+ Map<Integer,String> zygardeMap = new HashMap<>();
+ zygardeMap.put(1,"-10");
+ zygardeMap.put(4,"-C");
+ map.put(Species.zygarde, zygardeMap);
+
+ Map<Integer,String> miniorMap = new HashMap<>();
+ miniorMap.put(7,"-C");
+ map.put(Species.minior, miniorMap);
+
+ Map<Integer,String> necrozmaMap = new HashMap<>();
+ necrozmaMap.put(1,"-DM");
+ necrozmaMap.put(2,"-DW");
+ necrozmaMap.put(3,"-U");
+ map.put(Species.necrozma, necrozmaMap);
+
+ return map;
+ }
+
+ private static Map<Integer,String> setupDummyFormeSuffixes() {
+ Map<Integer,String> m = new HashMap<>();
+ m.put(0,"");
+ return m;
+ }
+
+ private static List<Integer> actuallyCosmeticFormsSM = Arrays.asList(
+ Species.SMFormes.cherrimCosmetic1,
+ Species.SMFormes.shellosCosmetic1,
+ Species.SMFormes.gastrodonCosmetic1,
+ Species.SMFormes.keldeoCosmetic1,
+ Species.SMFormes.furfrouCosmetic1, Species.SMFormes.furfrouCosmetic2,
+ Species.SMFormes.furfrouCosmetic3, Species.SMFormes.furfrouCosmetic4,
+ Species.SMFormes.furfrouCosmetic5, Species.SMFormes.furfrouCosmetic6,
+ Species.SMFormes.furfrouCosmetic7, Species.SMFormes.furfrouCosmetic8,
+ Species.SMFormes.furfrouCosmetic9,
+ Species.SMFormes.pumpkabooCosmetic1, Species.SMFormes.pumpkabooCosmetic2,
+ Species.SMFormes.pumpkabooCosmetic3,
+ Species.SMFormes.gourgeistCosmetic1, Species.SMFormes.gourgeistCosmetic2,
+ Species.SMFormes.gourgeistCosmetic3,
+ Species.SMFormes.floetteCosmetic1, Species.SMFormes.floetteCosmetic2,
+ Species.SMFormes.floetteCosmetic3, Species.SMFormes.floetteCosmetic4,
+ Species.SMFormes.raticateACosmetic1,
+ Species.SMFormes.mimikyuCosmetic1, Species.SMFormes.mimikyuCosmetic2, Species.SMFormes.mimikyuCosmetic3,
+ Species.SMFormes.gumshoosCosmetic1,
+ Species.SMFormes.vikavoltCosmetic1,
+ Species.SMFormes.lurantisCosmetic1,
+ Species.SMFormes.salazzleCosmetic1,
+ Species.SMFormes.kommoOCosmetic1,
+ Species.SMFormes.greninjaCosmetic1,
+ Species.SMFormes.zygarde10Cosmetic1, Species.SMFormes.zygardeCosmetic1,
+ Species.SMFormes.miniorCosmetic1, Species.SMFormes.miniorCosmetic2, Species.SMFormes.miniorCosmetic3,
+ Species.SMFormes.miniorCosmetic4, Species.SMFormes.miniorCosmetic5, Species.SMFormes.miniorCosmetic6,
+ Species.SMFormes.miniorCCosmetic1, Species.SMFormes.miniorCCosmetic2, Species.SMFormes.miniorCCosmetic3,
+ Species.SMFormes.miniorCCosmetic4, Species.SMFormes.miniorCCosmetic5, Species.SMFormes.miniorCCosmetic6,
+ Species.SMFormes.magearnaCosmetic1,
+ Species.SMFormes.pikachuCosmetic1, Species.SMFormes.pikachuCosmetic2, Species.SMFormes.pikachuCosmetic3,
+ Species.SMFormes.pikachuCosmetic4, Species.SMFormes.pikachuCosmetic5, Species.SMFormes.pikachuCosmetic6 // Pikachu With Funny Hats
+ );
+
+ private static List<Integer> actuallyCosmeticFormsUSUM = Arrays.asList(
+ Species.USUMFormes.cherrimCosmetic1,
+ Species.USUMFormes.shellosCosmetic1,
+ Species.USUMFormes.gastrodonCosmetic1,
+ Species.USUMFormes.keldeoCosmetic1,
+ Species.USUMFormes.furfrouCosmetic1, Species.USUMFormes.furfrouCosmetic2,
+ Species.USUMFormes.furfrouCosmetic3, Species.USUMFormes.furfrouCosmetic4,
+ Species.USUMFormes.furfrouCosmetic5, Species.USUMFormes.furfrouCosmetic6,
+ Species.USUMFormes.furfrouCosmetic7, Species.USUMFormes.furfrouCosmetic8,
+ Species.USUMFormes.furfrouCosmetic9,
+ Species.USUMFormes.pumpkabooCosmetic1, Species.USUMFormes.pumpkabooCosmetic2,
+ Species.USUMFormes.pumpkabooCosmetic3,
+ Species.USUMFormes.gourgeistCosmetic1, Species.USUMFormes.gourgeistCosmetic2,
+ Species.USUMFormes.gourgeistCosmetic3,
+ Species.USUMFormes.floetteCosmetic1, Species.USUMFormes.floetteCosmetic2,
+ Species.USUMFormes.floetteCosmetic3, Species.USUMFormes.floetteCosmetic4,
+ Species.USUMFormes.raticateACosmetic1,
+ Species.USUMFormes.marowakACosmetic1,
+ Species.USUMFormes.mimikyuCosmetic1, Species.USUMFormes.mimikyuCosmetic2, Species.USUMFormes.mimikyuCosmetic3,
+ Species.USUMFormes.gumshoosCosmetic1,
+ Species.USUMFormes.vikavoltCosmetic1,
+ Species.USUMFormes.lurantisCosmetic1,
+ Species.USUMFormes.salazzleCosmetic1,
+ Species.USUMFormes.kommoOCosmetic1,
+ Species.USUMFormes.araquanidCosmetic1,
+ Species.USUMFormes.togedemaruCosmetic1,
+ Species.USUMFormes.ribombeeCosmetic1,
+ Species.USUMFormes.greninjaCosmetic1,
+ Species.USUMFormes.zygarde10Cosmetic1, Species.USUMFormes.zygardeCosmetic1,
+ Species.USUMFormes.miniorCosmetic1, Species.USUMFormes.miniorCosmetic2, Species.USUMFormes.miniorCosmetic3,
+ Species.USUMFormes.miniorCosmetic4, Species.USUMFormes.miniorCosmetic5, Species.USUMFormes.miniorCosmetic6,
+ Species.USUMFormes.miniorCCosmetic1, Species.USUMFormes.miniorCCosmetic2, Species.USUMFormes.miniorCCosmetic3,
+ Species.USUMFormes.miniorCCosmetic4, Species.USUMFormes.miniorCCosmetic5, Species.USUMFormes.miniorCCosmetic6,
+ Species.USUMFormes.magearnaCosmetic1,
+ Species.USUMFormes.pikachuCosmetic1, Species.USUMFormes.pikachuCosmetic2, Species.USUMFormes.pikachuCosmetic3,
+ Species.USUMFormes.pikachuCosmetic4, Species.USUMFormes.pikachuCosmetic5, Species.USUMFormes.pikachuCosmetic6,
+ Species.USUMFormes.pikachuCosmetic7, // Pikachu With Funny Hats
+ Species.USUMFormes.rockruffCosmetic1
+ );
+
+ public static List<Integer> getActuallyCosmeticForms(int romType) {
+ if (romType == Type_SM) {
+ return actuallyCosmeticFormsSM;
+ } else {
+ return actuallyCosmeticFormsUSUM;
+ }
+ }
+
+ private static List<Integer> ignoreFormsSM = Arrays.asList(
+ Species.SMFormes.cherrimCosmetic1,
+ Species.SMFormes.greninjaCosmetic1,
+ Species.SMFormes.zygarde10Cosmetic1,
+ Species.SMFormes.zygardeCosmetic1,
+ Species.SMFormes.miniorCosmetic1,
+ Species.SMFormes.miniorCosmetic2,
+ Species.SMFormes.miniorCosmetic3,
+ Species.SMFormes.miniorCosmetic4,
+ Species.SMFormes.miniorCosmetic5,
+ Species.SMFormes.miniorCosmetic6,
+ Species.SMFormes.mimikyuCosmetic1,
+ Species.SMFormes.mimikyuCosmetic3
+ );
+
+ private static List<Integer> ignoreFormsUSUM = Arrays.asList(
+ Species.USUMFormes.cherrimCosmetic1,
+ Species.USUMFormes.greninjaCosmetic1,
+ Species.USUMFormes.zygarde10Cosmetic1,
+ Species.USUMFormes.zygardeCosmetic1,
+ Species.USUMFormes.miniorCosmetic1,
+ Species.USUMFormes.miniorCosmetic2,
+ Species.USUMFormes.miniorCosmetic3,
+ Species.USUMFormes.miniorCosmetic4,
+ Species.USUMFormes.miniorCosmetic5,
+ Species.USUMFormes.miniorCosmetic6,
+ Species.USUMFormes.mimikyuCosmetic1,
+ Species.USUMFormes.mimikyuCosmetic3,
+ Species.USUMFormes.rockruffCosmetic1
+ );
+
+ public static List<Integer> getIgnoreForms(int romType) {
+ if (romType == Type_SM) {
+ return ignoreFormsSM;
+ } else {
+ return ignoreFormsUSUM;
+ }
+ }
+
+ private static Map<Integer,Integer> altFormesWithCosmeticFormsSM = setupAltFormesWithCosmeticForms(Type_SM);
+ private static Map<Integer,Integer> altFormesWithCosmeticFormsUSUM = setupAltFormesWithCosmeticForms(Type_USUM);
+
+ public static Map<Integer,Integer> getAltFormesWithCosmeticForms(int romType) {
+ if (romType == Type_SM) {
+ return altFormesWithCosmeticFormsSM;
+ } else {
+ return altFormesWithCosmeticFormsUSUM;
+ }
+ }
+
+ private static Map<Integer,Integer> setupAltFormesWithCosmeticForms(int romType) {
+ Map<Integer,Integer> map = new HashMap<>();
+ if (romType == Type_SM) {
+ map.put(Species.SMFormes.raticateA,1); // 1 form (Totem)
+ map.put(Species.SMFormes.zygarde10,1); // 1 form (Power Construct)
+ map.put(Species.SMFormes.miniorC,6); // 6 forms (colors)
+ } else {
+ map.put(Species.USUMFormes.raticateA,1); // 1 form (Totem)
+ map.put(Species.USUMFormes.marowakA,1); // 1 form (Totem)
+ map.put(Species.USUMFormes.zygarde10,1); // 1 form (Power Construct)
+ map.put(Species.USUMFormes.miniorC,6); // 6 forms (colors)
+ }
+
+ return map;
+ }
+
+ private static Type[] constructTypeTable() {
+ Type[] table = new Type[256];
+ table[0x00] = Type.NORMAL;
+ table[0x01] = Type.FIGHTING;
+ table[0x02] = Type.FLYING;
+ table[0x03] = Type.POISON;
+ table[0x04] = Type.GROUND;
+ table[0x05] = Type.ROCK;
+ table[0x06] = Type.BUG;
+ table[0x07] = Type.GHOST;
+ table[0x08] = Type.STEEL;
+ table[0x09] = Type.FIRE;
+ table[0x0A] = Type.WATER;
+ table[0x0B] = Type.GRASS;
+ table[0x0C] = Type.ELECTRIC;
+ table[0x0D] = Type.PSYCHIC;
+ table[0x0E] = Type.ICE;
+ table[0x0F] = Type.DRAGON;
+ table[0x10] = Type.DARK;
+ table[0x11] = Type.FAIRY;
+ return table;
+ }
+
+ public static byte typeToByte(Type type) {
+ if (type == null) {
+ return 0x00; // normal?
+ }
+ switch (type) {
+ case NORMAL:
+ return 0x00;
+ case FIGHTING:
+ return 0x01;
+ case FLYING:
+ return 0x02;
+ case POISON:
+ return 0x03;
+ case GROUND:
+ return 0x04;
+ case ROCK:
+ return 0x05;
+ case BUG:
+ return 0x06;
+ case GHOST:
+ return 0x07;
+ case FIRE:
+ return 0x09;
+ case WATER:
+ return 0x0A;
+ case GRASS:
+ return 0x0B;
+ case ELECTRIC:
+ return 0x0C;
+ case PSYCHIC:
+ return 0x0D;
+ case ICE:
+ return 0x0E;
+ case DRAGON:
+ return 0x0F;
+ case STEEL:
+ return 0x08;
+ case DARK:
+ return 0x10;
+ case FAIRY:
+ return 0x11;
+ default:
+ return 0; // normal by default
+ }
+ }
+
+ private static List<Boolean> setupRelevantEncounterFiles(int romType) {
+ int fileCount = romType == Type_SM ? 2761 : 3696;
+ List<Boolean> list = new ArrayList<>();
+
+ for (int i = 0; i < fileCount; i++) {
+ if (((i - 9) % 11 == 0) || (i % 11 == 0)) {
+ list.add(true);
+ } else {
+ list.add(false);
+ }
+ }
+
+ return list;
+ }
+
+
+ public static Map<Integer, List<Integer>> getHardcodedTradeTextOffsets(int romType) {
+ Map<Integer, List<Integer>> hardcodedTradeTextOffsets = new HashMap<>();
+ if (romType == Gen7Constants.Type_USUM) {
+ // For some reason, the Route 2 trade is hardcoded in USUM but not in SM
+ hardcodedTradeTextOffsets.put(0, Arrays.asList(20, 21, 22));
+ }
+ hardcodedTradeTextOffsets.put(1, Arrays.asList(26, 28, 30));
+ hardcodedTradeTextOffsets.put(2, Arrays.asList(32, 33, 34, 36));
+ hardcodedTradeTextOffsets.put(3, Arrays.asList(38, 39, 40, 42));
+ hardcodedTradeTextOffsets.put(4, Arrays.asList(44, 45, 46, 48));
+ hardcodedTradeTextOffsets.put(5, Arrays.asList(50, 51, 52, 54));
+ hardcodedTradeTextOffsets.put(6, Arrays.asList(56, 57, 58, 60));
+ return hardcodedTradeTextOffsets;
+ }
+
+ public static ItemList allowedItemsSM, allowedItemsUSUM, nonBadItems;
+ public static List<Integer> regularShopItemsSM, regularShopItemsUSUM, opShopItems;
+
+ static {
+ setupAllowedItems();
+ }
+
+ private static void setupAllowedItems() {
+ allowedItemsSM = new ItemList(Items.fairyMemory);
+ // Key items + version exclusives
+ allowedItemsSM.banRange(Items.explorerKit, 76);
+ allowedItemsSM.banRange(Items.dataCard01, 32);
+ allowedItemsSM.banRange(Items.xtransceiverMale, 18);
+ allowedItemsSM.banSingles(Items.expShare, Items.libertyPass, Items.propCase, Items.dragonSkull,
+ Items.lightStone, Items.darkStone);
+ // Unknown blank items or version exclusives
+ allowedItemsSM.banRange(Items.tea, 3);
+ allowedItemsSM.banRange(Items.unused120, 14);
+ // TMs & HMs - tms cant be held in gen7
+ allowedItemsSM.tmRange(Items.tm01, 92);
+ allowedItemsSM.tmRange(Items.tm93, 3);
+ allowedItemsSM.banRange(Items.tm01, 100);
+ allowedItemsSM.banRange(Items.tm93, 3);
+ // Battle Launcher exclusives
+ allowedItemsSM.banRange(Items.direHit2, 24);
+
+ // Key items (Gen 6)
+ allowedItemsSM.banRange(Items.holoCasterMale,3);
+ allowedItemsSM.banSingles(Items.pokeFlute, Items.sprinklotad);
+ allowedItemsSM.banRange(Items.powerPlantPass,4);
+ allowedItemsSM.banRange(Items.elevatorKey,4);
+ allowedItemsSM.banRange(Items.lensCase,3);
+ allowedItemsSM.banRange(Items.lookerTicket,3);
+ allowedItemsSM.banRange(Items.megaCharm,2);
+
+ // TMs (Gen 6)
+ allowedItemsSM.tmRange(Items.tm96,5);
+ allowedItemsSM.banRange(Items.tm96,5);
+
+ // Key items and an HM
+ allowedItemsSM.banRange(Items.machBike,34);
+ allowedItemsSM.banRange(Items.prisonBottle,2);
+ allowedItemsSM.banRange(Items.meteoriteThirdForm,5);
+
+ // Z-Crystals
+ allowedItemsSM.banRange(Items.normaliumZHeld,19);
+ allowedItemsSM.banRange(Items.decidiumZHeld,39);
+
+ // Key Items (Gen 7)
+ allowedItemsSM.banSingles(Items.zRing, Items.sparklingStone, Items.zygardeCube, Items.ridePager,
+ Items.sunFlute, Items.moonFlute, Items.enigmaticCard);
+ allowedItemsSM.banRange(Items.forageBag,3);
+
+ // Unused
+ allowedItemsSM.banSingles(Items.unused848, Items.unused859);
+ allowedItemsSM.banRange(Items.unused837,4);
+ allowedItemsSM.banRange(Items.silverRazzBerry,18);
+ allowedItemsSM.banRange(Items.stretchySpring,19);
+
+ allowedItemsUSUM = allowedItemsSM.copy(Items.rotoCatch);
+
+ // Z-Crystals
+ allowedItemsUSUM.banRange(Items.solganiumZBag,12);
+
+ // Key Items
+ allowedItemsUSUM.banRange(Items.zPowerRing,16);
+
+ // ROTO LOTO
+ allowedItemsUSUM.banRange(Items.rotoHatch,11);
+
+ // non-bad items
+ // ban specific pokemon hold items, berries, apricorns, mail
+ nonBadItems = allowedItemsSM.copy();
+
+ nonBadItems.banSingles(Items.oddKeystone, Items.griseousOrb, Items.soulDew, Items.lightBall,
+ Items.oranBerry, Items.quickPowder, Items.passOrb, Items.discountCoupon, Items.strangeSouvenir,
+ Items.festivalTicket);
+ nonBadItems.banRange(Items.growthMulch, 4); // mulch
+ nonBadItems.banRange(Items.adamantOrb, 2); // orbs
+ nonBadItems.banRange(Items.mail1, 12); // mails
+ nonBadItems.banRange(Items.figyBerry, 25); // berries without useful battle effects
+ nonBadItems.banRange(Items.luckyPunch, 4); // pokemon specific
+ nonBadItems.banRange(Items.redScarf, 5); // contest scarves
+ nonBadItems.banRange(Items.richMulch,4); // more mulch
+ nonBadItems.banRange(Items.gengarite, 30); // Mega Stones, part 1
+ nonBadItems.banRange(Items.swampertite, 13); // Mega Stones, part 2
+ nonBadItems.banRange(Items.cameruptite, 4); // Mega Stones, part 3
+ nonBadItems.banRange(Items.fightingMemory,17); // Memories
+ nonBadItems.banRange(Items.relicCopper,7); // relic items
+ nonBadItems.banSingles(Items.shoalSalt, Items.shoalShell); // Shoal items; have no purpose and sell for $10.
+ nonBadItems.banRange(Items.blueFlute, 5); // Flutes; have no purpose and sell for $10.
+
+ regularShopItemsSM = new ArrayList<>();
+
+ regularShopItemsSM.addAll(IntStream.rangeClosed(Items.ultraBall, Items.pokeBall).boxed().collect(Collectors.toList()));
+ regularShopItemsSM.addAll(IntStream.rangeClosed(Items.potion, Items.revive).boxed().collect(Collectors.toList()));
+ regularShopItemsSM.addAll(IntStream.rangeClosed(Items.superRepel, Items.repel).boxed().collect(Collectors.toList()));
+ regularShopItemsSM.add(Items.honey);
+ regularShopItemsSM.add(Items.adrenalineOrb);
+
+ regularShopItemsUSUM = new ArrayList<>(regularShopItemsSM);
+ regularShopItemsUSUM.add(Items.pokeToy);
+
+ opShopItems = new ArrayList<>();
+
+ // "Money items" etc
+ opShopItems.add(Items.lavaCookie);
+ opShopItems.add(Items.berryJuice);
+ opShopItems.add(Items.rareCandy);
+ opShopItems.add(Items.oldGateau);
+ opShopItems.addAll(IntStream.rangeClosed(Items.tinyMushroom, Items.nugget).boxed().collect(Collectors.toList()));
+ opShopItems.add(Items.rareBone);
+ opShopItems.addAll(IntStream.rangeClosed(Items.lansatBerry, Items.rowapBerry).boxed().collect(Collectors.toList()));
+ opShopItems.add(Items.luckyEgg);
+ opShopItems.add(Items.prettyFeather);
+ opShopItems.addAll(IntStream.rangeClosed(Items.balmMushroom, Items.casteliacone).boxed().collect(Collectors.toList()));
+ }
+
+ public static ItemList getAllowedItems(int romType) {
+ if (romType == Type_SM) {
+ return allowedItemsSM;
+ } else {
+ return allowedItemsUSUM;
+ }
+ }
+
+ 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
+ );
+
+ private static final List<Integer> requiredFieldTMsUSUM = Arrays.asList(
+ 49, 5, 83, 64, 23, 100, 79, 24, 31, 46, 88, 41, 59, 32, 53, 61, 28, 39, 57, 86, 30, 62, 81, 80, 74, 85, 73,
+ 72, 3, 3, 84, 13, 36, 91, 55, 97, 50, 93, 93, 99, 35, 2, 26, 6, 6
+ );
+
+ public static List<Integer> getRequiredFieldTMs(int romType) {
+ if (romType == Type_SM) {
+ return requiredFieldTMsSM.stream().distinct().collect(Collectors.toList());
+ } else {
+ return requiredFieldTMsUSUM.stream().distinct().collect(Collectors.toList());
+ }
+ }
+
+ public static void tagTrainersSM(List<Trainer> trs) {
+
+ tag(trs,"ELITE1", 23, 152, 349); // Hala
+ tag(trs,"ELITE2",90, 153, 351); // Olivia
+ tag(trs,"ELITE3", 154, 403); // Nanu
+ tag(trs,"ELITE4", 155, 359); // Hapu
+ tag(trs,"ELITE5", 149, 350); // Acerola
+ tag(trs,"ELITE6", 156, 352); // Kahili
+
+ tag(trs,"RIVAL2-0", 129);
+ tag(trs,"RIVAL2-1", 413);
+ tag(trs,"RIVAL2-2", 414);
+ tagRival(trs,"RIVAL3",477);
+
+ tagRival(trs,"FRIEND1", 6);
+ tagRival(trs,"FRIEND2", 9);
+ tagRival(trs,"FRIEND3", 12);
+ tagRival(trs,"FRIEND4", 76);
+ tagRival(trs,"FRIEND5", 82);
+ tagRival(trs,"FRIEND6", 438);
+ tagRival(trs,"FRIEND7", 217);
+ tagRival(trs,"FRIEND8", 220);
+ tagRival(trs,"FRIEND9", 447);
+ tagRival(trs,"FRIEND10", 450);
+ tagRival(trs,"FRIEND11", 482);
+ tagRival(trs,"FRIEND12", 356);
+
+ tag(trs,"THEMED:GLADION-STRONG", 79, 185, 239, 240, 415, 416, 417, 418, 419, 441);
+ tag(trs,"THEMED:ILIMA-STRONG", 52, 215, 216, 396);
+ tag(trs,"THEMED:LANA-STRONG", 144);
+ tag(trs,"THEMED:KIAWE-STRONG", 398);
+ tag(trs,"THEMED:MALLOW-STRONG", 146);
+ tag(trs,"THEMED:SOPHOCLES-STRONG", 405);
+ tag(trs,"THEMED:MOLAYNE-STRONG", 167, 481);
+ tag(trs,"THEMED:MINA-STRONG", 435, 467);
+ tag(trs,"THEMED:PLUMERIA-STRONG", 89, 238, 401);
+ tag(trs,"THEMED:SINA-STRONG", 75);
+ tag(trs,"THEMED:DEXIO-STRONG", 74, 412);
+ tag(trs,"THEMED:FABA-STRONG",132, 241, 360, 410);
+ tag(trs,"THEMED:GUZMA-LEADER", 138, 235, 236, 400);
+ tag(trs,"THEMED:LUSAMINE-LEADER", 131, 158);
+ }
+
+ public static void tagTrainersUSUM(List<Trainer> trs) {
+
+ tag(trs,"ELITE1", 23, 650); // Hala
+ tag(trs,"ELITE2", 90, 153, 351); // Olivia
+ tag(trs,"ELITE3", 154, 508); // Nanu
+ tag(trs,"ELITE4", 359, 497); // Hapu
+ tag(trs,"ELITE5", 489, 490); // Big Mo
+ tag(trs,"ELITE6", 149, 350); // Acerola
+ tag(trs,"ELITE7", 156, 352); // Kahili
+
+ tagRival(trs,"RIVAL2", 477); // Kukui
+
+ // Hau
+ tagRival(trs,"FRIEND1", 491);
+ tagRival(trs,"FRIEND2", 9);
+ tagRival(trs,"FRIEND3", 12);
+ tagRival(trs,"FRIEND4", 76);
+ tagRival(trs,"FRIEND5", 82);
+ tagRival(trs,"FRIEND6", 438);
+ tagRival(trs,"FRIEND7", 217);
+ tagRival(trs,"FRIEND8", 220);
+ tagRival(trs,"FRIEND9", 447);
+ tagRival(trs,"FRIEND10", 450);
+ tagRival(trs,"FRIEND11", 494);
+ tagRival(trs,"FRIEND12", 356);
+
+ tag(trs,"THEMED:GLADION-STRONG", 79, 185, 239, 240, 415, 416, 417, 418, 419, 441);
+ tag(trs,"THEMED:ILIMA-STRONG", 52, 215, 216, 396, 502);
+ tag(trs,"THEMED:LANA-STRONG", 144, 503);
+ tag(trs,"THEMED:KIAWE-STRONG", 398, 504);
+ tag(trs,"THEMED:MALLOW-STRONG", 146, 505);
+ tag(trs,"THEMED:SOPHOCLES-STRONG", 405, 506);
+ tag(trs,"THEMED:MINA-STRONG", 507);
+ tag(trs,"THEMED:PLUMERIA-STRONG", 89, 238, 401);
+ tag(trs,"THEMED:SINA-STRONG", 75);
+ tag(trs,"THEMED:DEXIO-STRONG", 74, 412, 623);
+ tag(trs,"THEMED:FABA-STRONG", 132, 241, 410, 561);
+ tag(trs,"THEMED:SOLIERA-STRONG", 498, 499, 648, 651);
+ tag(trs,"THEMED:DULSE-STRONG", 500, 501, 649, 652);
+ tag(trs,"THEMED:GUZMA-LEADER", 138, 235, 236, 558, 647);
+ tag(trs,"THEMED:LUSAMINE-LEADER", 131, 644);
+
+ tag(trs,"UBER", 541, 542, 543, 580, 572, 573, 559, 560, 562, 645); // RR Episode
+ }
+
+ private static void tagRival(List<Trainer> allTrainers, String tag, int offset) {
+ allTrainers.get(offset - 1).tag = tag + "-0";
+ allTrainers.get(offset).tag = tag + "-1";
+ allTrainers.get(offset + 1).tag = tag + "-2";
+
+ }
+
+ private static void tag(List<Trainer> allTrainers, int number, String tag) {
+ if (allTrainers.size() > (number - 1)) {
+ allTrainers.get(number - 1).tag = tag;
+ }
+ }
+
+ private static void tag(List<Trainer> allTrainers, String tag, int... numbers) {
+ for (int num : numbers) {
+ if (allTrainers.size() > (num - 1)) {
+ allTrainers.get(num - 1).tag = tag;
+ }
+ }
+ }
+
+ public static void setMultiBattleStatusSM(List<Trainer> trs) {
+ // All Double Battles in Gen 7 are internally treated as a Multi Battle
+ // 92 + 93: Rising Star Duo Justin and Lauren
+ // 97 + 98: Twins Isa and Nico
+ // 134 + 136: Aether Foundation Employees in Secret Lab B w/ Hau
+ // 141 + 227: Team Skull Grunts on Route 17
+ // 241 + 442: Faba and Aether Foundation Employee w/ Hau
+ // 262 + 265: Ace Duo Aimee and Kent
+ // 270 + 299: Swimmers Jake and Yumi
+ // 278 + 280: Honeymooners Noriko and Devin
+ // 303 + 307: Veteran Duo Tsunekazu and Nobuko
+ // 315 + 316: Team Skull Grunts in Po Town
+ // 331 + 332: Karate Family Guy and Samuel
+ // 371 + 372: Twins Harper and Sarah
+ // 373 + 374: Swimmer Girls Ashlyn and Kylie
+ // 375 + 376: Golf Buddies Tara and Tina
+ // 421 + 422: Athletic Siblings Alyssa and Sho
+ // 425 + 426: Punk Pair Lane and Yoko
+ // 429 + 430: Punk Pair Troy and Marie
+ // 443 + 444: Team Skull Grunts in Diglett's Tunnel w/ Hau
+ // 453 + 454: Aether Foundation Employees w/ Hau
+ // 455 + 456: Aether Foundation Employees w/ Gladion
+ setMultiBattleStatus(trs, 92, 93, 97, 98, 134, 136, 141, 227, 241, 262, 265, 270, 278, 280, 299, 303,
+ 307, 315, 316, 331, 332, 371, 372, 373, 374, 375, 376, 421, 422, 425, 426, 429, 430, 442, 443, 444, 453,
+ 454, 455, 456
+ );
+ }
+
+ public static void setMultiBattleStatusUSUM(List<Trainer> trs) {
+ // All Double Battles in Gen 7 are internally treated as a Multi Battle
+ // 92 + 93: Rising Star Duo Justin and Lauren
+ // 97 + 98: Twins Isa and Nico
+ // 134 + 136: Aether Foundation Employees in Secret Lab B w/ Hau
+ // 141 + 227: Team Skull Grunts on Route 17
+ // 178 + 511: Capoeira Couple Cara and Douglas
+ // 241 + 442: Faba and Aether Foundation Employee w/ Hau
+ // 262 + 265: Ace Duo Aimee and Kent
+ // 270 + 299: Swimmers Jake and Yumi
+ // 278 + 280: Honeymooners Noriko and Devin
+ // 303 + 307: Veteran Duo Tsunekazu and Nobuko
+ // 315 + 316: Team Skull Grunts in Po Town
+ // 331 + 332: Karate Family Guy and Samuel
+ // 371 + 372: Twins Harper and Sarah
+ // 373 + 374: Swimmer Girls Ashlyn and Kylie
+ // 375 + 376: Golf Buddies Tara and Tina
+ // 421 + 422: Athletic Siblings Alyssa and Sho
+ // 425 + 426: Punk Pair Lane and Yoko
+ // 429 + 430: Punk Pair Troy and Marie
+ // 443 + 444: Team Skull Grunts in Diglett's Tunnel w/ Hau
+ // 453 + 454: Aether Foundation Employees w/ Hau
+ // 455 + 456: Aether Foundation Employees w/ Gladion
+ // 514 + 521: Tourist Couple Yuriko and Landon
+ // 515 + 534: Tourist Couple Steve and Reika
+ // 529 + 530: Dancing Family Jen and Fumiko
+ // 554 + 561: Aether Foundation Employee and Faba w/ Lillie
+ // 557 + 578: GAME FREAK Iwao and Morimoto
+ // 586 + 595: Team Rainbow Rocket Grunts w/ Guzma
+ // 613 + 626: Master & Apprentice Kaimana and Breon
+ // 617 + 618: Sparring Partners Allon and Eimar
+ // 619 + 620: Sparring Partners Craig and Jason
+ setMultiBattleStatus(trs, 92, 93, 97, 98, 134, 136, 141, 178, 227, 241, 262, 265, 270, 278, 280, 299,
+ 303, 307, 315, 316, 331, 332, 371, 372, 373, 374, 375, 376, 421, 422, 425, 426, 429, 430, 442, 443, 444,
+ 453, 454, 455, 456, 511, 514, 515, 521, 529, 530, 534, 544, 557, 561, 578, 586, 595, 613, 617, 618, 619,
+ 620, 626
+ );
+ }
+
+ private static void setMultiBattleStatus(List<Trainer> allTrainers, int... numbers) {
+ for (int num : numbers) {
+ if (allTrainers.size() > (num - 1)) {
+ allTrainers.get(num - 1).multiBattleStatus = Trainer.MultiBattleStatus.ALWAYS;
+ }
+ }
+ }
+
+ public static void setForcedRivalStarterPositionsUSUM(List<Trainer> allTrainers) {
+
+ // Hau 3
+ allTrainers.get(12 - 1).forceStarterPosition = 0;
+ allTrainers.get(13 - 1).forceStarterPosition = 0;
+ allTrainers.get(14 - 1).forceStarterPosition = 0;
+
+ // Hau 6
+ allTrainers.get(217 - 1).forceStarterPosition = 0;
+ allTrainers.get(218 - 1).forceStarterPosition = 0;
+ allTrainers.get(219 - 1).forceStarterPosition = 0;
+ }
+
+ public static final Map<Integer,Integer> balancedItemPrices = Stream.of(new Integer[][] {
+ // Skip item index 0. All prices divided by 10
+ {Items.masterBall, 300},
+ {Items.ultraBall, 80},
+ {Items.greatBall, 60},
+ {Items.pokeBall, 20},
+ {Items.safariBall, 50},
+ {Items.netBall, 100},
+ {Items.diveBall, 100},
+ {Items.nestBall, 100},
+ {Items.repeatBall, 100},
+ {Items.timerBall, 100},
+ {Items.luxuryBall, 100},
+ {Items.premierBall, 20},
+ {Items.duskBall, 100},
+ {Items.healBall, 30},
+ {Items.quickBall, 100},
+ {Items.cherishBall, 20},
+ {Items.potion, 20},
+ {Items.antidote, 20},
+ {Items.burnHeal, 30},
+ {Items.iceHeal, 10},
+ {Items.awakening, 10},
+ {Items.paralyzeHeal, 30},
+ {Items.fullRestore, 300},
+ {Items.maxPotion, 250},
+ {Items.hyperPotion, 150},
+ {Items.superPotion, 70},
+ {Items.fullHeal, 40},
+ {Items.revive, 200},
+ {Items.maxRevive, 400},
+ {Items.freshWater, 20},
+ {Items.sodaPop, 30},
+ {Items.lemonade, 40},
+ {Items.moomooMilk, 60},
+ {Items.energyPowder, 50},
+ {Items.energyRoot, 120},
+ {Items.healPowder, 30},
+ {Items.revivalHerb, 280},
+ {Items.ether, 300},
+ {Items.maxEther, 450},
+ {Items.elixir, 1500},
+ {Items.maxElixir, 1800},
+ {Items.lavaCookie, 35},
+ {Items.berryJuice, 20},
+ {Items.sacredAsh, 500},
+ {Items.hpUp, 1000},
+ {Items.protein, 1000},
+ {Items.iron, 1000},
+ {Items.carbos, 1000},
+ {Items.calcium, 1000},
+ {Items.rareCandy, 1000},
+ {Items.ppUp, 1000},
+ {Items.zinc, 1000},
+ {Items.ppMax, 2500},
+ {Items.oldGateau, 35},
+ {Items.guardSpec, 150},
+ {Items.direHit, 100},
+ {Items.xAttack, 100},
+ {Items.xDefense, 200},
+ {Items.xSpeed, 100},
+ {Items.xAccuracy, 100},
+ {Items.xSpAtk, 100},
+ {Items.xSpDef, 200},
+ {Items.pokeDoll, 10},
+ {Items.fluffyTail, 10},
+ {Items.blueFlute, 2},
+ {Items.yellowFlute, 2},
+ {Items.redFlute, 2},
+ {Items.blackFlute, 2},
+ {Items.whiteFlute, 2},
+ {Items.shoalSalt, 2},
+ {Items.shoalShell, 2},
+ {Items.redShard, 100},
+ {Items.blueShard, 100},
+ {Items.yellowShard, 100},
+ {Items.greenShard, 100},
+ {Items.superRepel, 70},
+ {Items.maxRepel, 90},
+ {Items.escapeRope, 100},
+ {Items.repel, 40},
+ {Items.sunStone, 300},
+ {Items.moonStone, 300},
+ {Items.fireStone, 300},
+ {Items.thunderStone, 300},
+ {Items.waterStone, 300},
+ {Items.leafStone, 300},
+ {Items.tinyMushroom, 50},
+ {Items.bigMushroom, 500},
+ {Items.pearl, 200},
+ {Items.bigPearl, 800},
+ {Items.stardust, 300},
+ {Items.starPiece, 1200},
+ {Items.nugget, 1000},
+ {Items.heartScale, 500},
+ {Items.honey, 30},
+ {Items.growthMulch, 20},
+ {Items.dampMulch, 20},
+ {Items.stableMulch, 20},
+ {Items.gooeyMulch, 20},
+ {Items.rootFossil, 700},
+ {Items.clawFossil, 700},
+ {Items.helixFossil, 700},
+ {Items.domeFossil, 700},
+ {Items.oldAmber, 1000},
+ {Items.armorFossil, 700},
+ {Items.skullFossil, 700},
+ {Items.rareBone, 500},
+ {Items.shinyStone, 300},
+ {Items.duskStone, 300},
+ {Items.dawnStone, 300},
+ {Items.ovalStone, 200},
+ {Items.oddKeystone, 210},
+ {Items.griseousOrb, 1000},
+ {Items.tea, 0}, // unused in Gen 7
+ {Items.unused114, 0},
+ {Items.autograph, 0},
+ {Items.douseDrive, 100},
+ {Items.shockDrive, 100},
+ {Items.burnDrive, 100},
+ {Items.chillDrive, 100},
+ {Items.unused120, 0},
+ {Items.pokemonBox, 0}, // unused in Gen 7
+ {Items.medicinePocket, 0}, // unused in Gen 7
+ {Items.tmCase, 0}, // unused in Gen 7
+ {Items.candyJar, 0}, // unused in Gen 7
+ {Items.powerUpPocket, 0}, // unused in Gen 7
+ {Items.clothingTrunk, 0}, // unused in Gen 7
+ {Items.catchingPocket, 0}, // unused in Gen 7
+ {Items.battlePocket, 0}, // unused in Gen 7
+ {Items.unused129, 0},
+ {Items.unused130, 0},
+ {Items.unused131, 0},
+ {Items.unused132, 0},
+ {Items.unused133, 0},
+ {Items.sweetHeart, 15},
+ {Items.adamantOrb, 1000},
+ {Items.lustrousOrb, 1000},
+ {Items.mail1, 5},
+ {Items.mail2, 5},
+ {Items.mail3, 5},
+ {Items.mail4, 5},
+ {Items.mail5, 5},
+ {Items.mail6, 5},
+ {Items.mail7, 5},
+ {Items.mail8, 5},
+ {Items.mail9, 5},
+ {Items.mail10, 5},
+ {Items.mail11, 5},
+ {Items.mail12, 5},
+ {Items.cheriBerry, 20},
+ {Items.chestoBerry, 25},
+ {Items.pechaBerry, 10},
+ {Items.rawstBerry, 25},
+ {Items.aspearBerry, 25},
+ {Items.leppaBerry, 300},
+ {Items.oranBerry, 5},
+ {Items.persimBerry, 20},
+ {Items.lumBerry, 50},
+ {Items.sitrusBerry, 50},
+ {Items.figyBerry, 10},
+ {Items.wikiBerry, 10},
+ {Items.magoBerry, 10},
+ {Items.aguavBerry, 10},
+ {Items.iapapaBerry, 10},
+ {Items.razzBerry, 50},
+ {Items.blukBerry, 50},
+ {Items.nanabBerry, 50},
+ {Items.wepearBerry, 50},
+ {Items.pinapBerry, 50},
+ {Items.pomegBerry, 50},
+ {Items.kelpsyBerry, 50},
+ {Items.qualotBerry, 50},
+ {Items.hondewBerry, 50},
+ {Items.grepaBerry, 50},
+ {Items.tamatoBerry, 50},
+ {Items.cornnBerry, 50},
+ {Items.magostBerry, 50},
+ {Items.rabutaBerry, 50},
+ {Items.nomelBerry, 50},
+ {Items.spelonBerry, 50},
+ {Items.pamtreBerry, 50},
+ {Items.watmelBerry, 50},
+ {Items.durinBerry, 50},
+ {Items.belueBerry, 50},
+ {Items.occaBerry, 100},
+ {Items.passhoBerry, 100},
+ {Items.wacanBerry, 100},
+ {Items.rindoBerry, 100},
+ {Items.yacheBerry, 100},
+ {Items.chopleBerry, 100},
+ {Items.kebiaBerry, 100},
+ {Items.shucaBerry, 100},
+ {Items.cobaBerry, 100},
+ {Items.payapaBerry, 100},
+ {Items.tangaBerry, 100},
+ {Items.chartiBerry, 100},
+ {Items.kasibBerry, 100},
+ {Items.habanBerry, 100},
+ {Items.colburBerry, 100},
+ {Items.babiriBerry, 100},
+ {Items.chilanBerry, 100},
+ {Items.liechiBerry, 100},
+ {Items.ganlonBerry, 100},
+ {Items.salacBerry, 100},
+ {Items.petayaBerry, 100},
+ {Items.apicotBerry, 100},
+ {Items.lansatBerry, 100},
+ {Items.starfBerry, 100},
+ {Items.enigmaBerry, 100},
+ {Items.micleBerry, 100},
+ {Items.custapBerry, 100},
+ {Items.jabocaBerry, 100},
+ {Items.rowapBerry, 100},
+ {Items.brightPowder, 400},
+ {Items.whiteHerb, 400},
+ {Items.machoBrace, 300},
+ {Items.expShare, 0},
+ {Items.quickClaw, 450},
+ {Items.sootheBell, 100},
+ {Items.mentalHerb, 100},
+ {Items.choiceBand, 1000},
+ {Items.kingsRock, 500},
+ {Items.silverPowder, 200},
+ {Items.amuletCoin, 1500},
+ {Items.cleanseTag, 100},
+ {Items.soulDew, 20},
+ {Items.deepSeaTooth, 300},
+ {Items.deepSeaScale, 300},
+ {Items.smokeBall, 400},
+ {Items.everstone, 300},
+ {Items.focusBand, 300},
+ {Items.luckyEgg, 1000},
+ {Items.scopeLens, 500},
+ {Items.metalCoat, 300},
+ {Items.leftovers, 1000},
+ {Items.dragonScale, 300},
+ {Items.lightBall, 100},
+ {Items.softSand, 200},
+ {Items.hardStone, 200},
+ {Items.miracleSeed, 200},
+ {Items.blackGlasses, 200},
+ {Items.blackBelt, 200},
+ {Items.magnet, 200},
+ {Items.mysticWater, 200},
+ {Items.sharpBeak, 200},
+ {Items.poisonBarb, 200},
+ {Items.neverMeltIce, 200},
+ {Items.spellTag, 200},
+ {Items.twistedSpoon, 200},
+ {Items.charcoal, 200},
+ {Items.dragonFang, 200},
+ {Items.silkScarf, 200},
+ {Items.upgrade, 300},
+ {Items.shellBell, 600},
+ {Items.seaIncense, 200},
+ {Items.laxIncense, 300},
+ {Items.luckyPunch, 100},
+ {Items.metalPowder, 100},
+ {Items.thickClub, 100},
+ {Items.leek, 100},
+ {Items.redScarf, 10},
+ {Items.blueScarf, 10},
+ {Items.pinkScarf, 10},
+ {Items.greenScarf, 10},
+ {Items.yellowScarf, 10},
+ {Items.wideLens, 150},
+ {Items.muscleBand, 200},
+ {Items.wiseGlasses, 200},
+ {Items.expertBelt, 600},
+ {Items.lightClay, 150},
+ {Items.lifeOrb, 1000},
+ {Items.powerHerb, 100},
+ {Items.toxicOrb, 150},
+ {Items.flameOrb, 150},
+ {Items.quickPowder, 100},
+ {Items.focusSash, 200},
+ {Items.zoomLens, 150},
+ {Items.metronome, 300},
+ {Items.ironBall, 100},
+ {Items.laggingTail, 100},
+ {Items.destinyKnot, 150},
+ {Items.blackSludge, 500},
+ {Items.icyRock, 20},
+ {Items.smoothRock, 20},
+ {Items.heatRock, 20},
+ {Items.dampRock, 20},
+ {Items.gripClaw, 150},
+ {Items.choiceScarf, 1000},
+ {Items.stickyBarb, 150},
+ {Items.powerBracer, 300},
+ {Items.powerBelt, 300},
+ {Items.powerLens, 300},
+ {Items.powerBand, 300},
+ {Items.powerAnklet, 300},
+ {Items.powerWeight, 300},
+ {Items.shedShell, 50},
+ {Items.bigRoot, 150},
+ {Items.choiceSpecs, 1000},
+ {Items.flamePlate, 200},
+ {Items.splashPlate, 200},
+ {Items.zapPlate, 200},
+ {Items.meadowPlate, 200},
+ {Items.iciclePlate, 200},
+ {Items.fistPlate, 200},
+ {Items.toxicPlate, 200},
+ {Items.earthPlate, 200},
+ {Items.skyPlate, 200},
+ {Items.mindPlate, 200},
+ {Items.insectPlate, 200},
+ {Items.stonePlate, 200},
+ {Items.spookyPlate, 200},
+ {Items.dracoPlate, 200},
+ {Items.dreadPlate, 200},
+ {Items.ironPlate, 200},
+ {Items.oddIncense, 200},
+ {Items.rockIncense, 200},
+ {Items.fullIncense, 100},
+ {Items.waveIncense, 200},
+ {Items.roseIncense, 200},
+ {Items.luckIncense, 1500},
+ {Items.pureIncense, 100},
+ {Items.protector, 300},
+ {Items.electirizer, 300},
+ {Items.magmarizer, 300},
+ {Items.dubiousDisc, 300},
+ {Items.reaperCloth, 300},
+ {Items.razorClaw, 500},
+ {Items.razorFang, 500},
+ {Items.tm01, 1000},
+ {Items.tm02, 1000},
+ {Items.tm03, 1000},
+ {Items.tm04, 1000},
+ {Items.tm05, 1000},
+ {Items.tm06, 1000},
+ {Items.tm07, 2000},
+ {Items.tm08, 1000},
+ {Items.tm09, 1000},
+ {Items.tm10, 1000},
+ {Items.tm11, 2000},
+ {Items.tm12, 1000},
+ {Items.tm13, 1000},
+ {Items.tm14, 2000},
+ {Items.tm15, 2000},
+ {Items.tm16, 1000},
+ {Items.tm17, 1000},
+ {Items.tm18, 2000},
+ {Items.tm19, 1000},
+ {Items.tm20, 1000},
+ {Items.tm21, 1000},
+ {Items.tm22, 1000},
+ {Items.tm23, 1000},
+ {Items.tm24, 1000},
+ {Items.tm25, 2000},
+ {Items.tm26, 1000},
+ {Items.tm27, 1000},
+ {Items.tm28, 2000},
+ {Items.tm29, 1000},
+ {Items.tm30, 1000},
+ {Items.tm31, 1000},
+ {Items.tm32, 1000},
+ {Items.tm33, 1000},
+ {Items.tm34, 1000},
+ {Items.tm35, 1000},
+ {Items.tm36, 1000},
+ {Items.tm37, 2000},
+ {Items.tm38, 2000},
+ {Items.tm39, 1000},
+ {Items.tm40, 1000},
+ {Items.tm41, 1000},
+ {Items.tm42, 1000},
+ {Items.tm43, 1000},
+ {Items.tm44, 1000},
+ {Items.tm45, 1000},
+ {Items.tm46, 1000},
+ {Items.tm47, 1000},
+ {Items.tm48, 1000},
+ {Items.tm49, 1000},
+ {Items.tm50, 2000},
+ {Items.tm51, 1000},
+ {Items.tm52, 2000},
+ {Items.tm53, 1000},
+ {Items.tm54, 1000},
+ {Items.tm55, 1000},
+ {Items.tm56, 1000},
+ {Items.tm57, 1000},
+ {Items.tm58, 1000},
+ {Items.tm59, 2000},
+ {Items.tm60, 1000},
+ {Items.tm61, 1000},
+ {Items.tm62, 1000},
+ {Items.tm63, 1000},
+ {Items.tm64, 1000},
+ {Items.tm65, 1000},
+ {Items.tm66, 1000},
+ {Items.tm67, 1000},
+ {Items.tm68, 2000},
+ {Items.tm69, 1000},
+ {Items.tm70, 2000},
+ {Items.tm71, 2000},
+ {Items.tm72, 1000},
+ {Items.tm73, 500},
+ {Items.tm74, 1000},
+ {Items.tm75, 1000},
+ {Items.tm76, 1000},
+ {Items.tm77, 1000},
+ {Items.tm78, 1000},
+ {Items.tm79, 1000},
+ {Items.tm80, 1000},
+ {Items.tm81, 1000},
+ {Items.tm82, 1000},
+ {Items.tm83, 1000},
+ {Items.tm84, 1000},
+ {Items.tm85, 1000},
+ {Items.tm86, 1000},
+ {Items.tm87, 1000},
+ {Items.tm88, 1000},
+ {Items.tm89, 1000},
+ {Items.tm90, 1000},
+ {Items.tm91, 1000},
+ {Items.tm92, 1000},
+ {Items.hm01, 0},
+ {Items.hm02, 0},
+ {Items.hm03, 0},
+ {Items.hm04, 0},
+ {Items.hm05, 0},
+ {Items.hm06, 0},
+ {Items.hm07, 0}, // unused in Gen 7
+ {Items.hm08, 0}, // unused in Gen 7
+ {Items.explorerKit, 0},
+ {Items.lootSack, 0},
+ {Items.ruleBook, 0},
+ {Items.pokeRadar, 0},
+ {Items.pointCard, 0},
+ {Items.journal, 0},
+ {Items.sealCase, 0},
+ {Items.fashionCase, 0},
+ {Items.sealBag, 0},
+ {Items.palPad, 0},
+ {Items.worksKey, 0},
+ {Items.oldCharm, 0},
+ {Items.galacticKey, 0},
+ {Items.redChain, 0},
+ {Items.townMap, 0},
+ {Items.vsSeeker, 0},
+ {Items.coinCase, 0},
+ {Items.oldRod, 0},
+ {Items.goodRod, 0},
+ {Items.superRod, 0},
+ {Items.sprayduck, 0},
+ {Items.poffinCase, 0},
+ {Items.bike, 0},
+ {Items.suiteKey, 0},
+ {Items.oaksLetter, 0},
+ {Items.lunarWing, 0},
+ {Items.memberCard, 0},
+ {Items.azureFlute, 0},
+ {Items.ssTicketJohto, 0},
+ {Items.contestPass, 0},
+ {Items.magmaStone, 0},
+ {Items.parcelSinnoh, 0},
+ {Items.coupon1, 0},
+ {Items.coupon2, 0},
+ {Items.coupon3, 0},
+ {Items.storageKeySinnoh, 0},
+ {Items.secretPotion, 0},
+ {Items.vsRecorder, 0},
+ {Items.gracidea, 0},
+ {Items.secretKeySinnoh, 0},
+ {Items.apricornBox, 0},
+ {Items.unownReport, 0},
+ {Items.berryPots, 0},
+ {Items.dowsingMachine, 0},
+ {Items.blueCard, 0},
+ {Items.slowpokeTail, 0},
+ {Items.clearBell, 0},
+ {Items.cardKeyJohto, 0},
+ {Items.basementKeyJohto, 0},
+ {Items.squirtBottle, 0},
+ {Items.redScale, 0},
+ {Items.lostItem, 0},
+ {Items.pass, 0},
+ {Items.machinePart, 0},
+ {Items.silverWing, 0},
+ {Items.rainbowWing, 0},
+ {Items.mysteryEgg, 0},
+ {Items.redApricorn, 2},
+ {Items.blueApricorn, 2},
+ {Items.yellowApricorn, 2},
+ {Items.greenApricorn, 2},
+ {Items.pinkApricorn, 2},
+ {Items.whiteApricorn, 2},
+ {Items.blackApricorn, 2},
+ {Items.fastBall, 30},
+ {Items.levelBall, 30},
+ {Items.lureBall, 30},
+ {Items.heavyBall, 30},
+ {Items.loveBall, 30},
+ {Items.friendBall, 30},
+ {Items.moonBall, 30},
+ {Items.sportBall, 30},
+ {Items.parkBall, 0},
+ {Items.photoAlbum, 0},
+ {Items.gbSounds, 0},
+ {Items.tidalBell, 0},
+ {Items.rageCandyBar, 35},
+ {Items.dataCard01, 0},
+ {Items.dataCard02, 0},
+ {Items.dataCard03, 0},
+ {Items.dataCard04, 0},
+ {Items.dataCard05, 0},
+ {Items.dataCard06, 0},
+ {Items.dataCard07, 0},
+ {Items.dataCard08, 0},
+ {Items.dataCard09, 0},
+ {Items.dataCard10, 0},
+ {Items.dataCard11, 0},
+ {Items.dataCard12, 0},
+ {Items.dataCard13, 0},
+ {Items.dataCard14, 0},
+ {Items.dataCard15, 0},
+ {Items.dataCard16, 0},
+ {Items.dataCard17, 0},
+ {Items.dataCard18, 0},
+ {Items.dataCard19, 0},
+ {Items.dataCard20, 0},
+ {Items.dataCard21, 0},
+ {Items.dataCard22, 0},
+ {Items.dataCard23, 0},
+ {Items.dataCard24, 0},
+ {Items.dataCard25, 0},
+ {Items.dataCard26, 0},
+ {Items.dataCard27, 0},
+ {Items.jadeOrb, 0},
+ {Items.lockCapsule, 0},
+ {Items.redOrb, 0},
+ {Items.blueOrb, 0},
+ {Items.enigmaStone, 0},
+ {Items.prismScale, 300},
+ {Items.eviolite, 1000},
+ {Items.floatStone, 100},
+ {Items.rockyHelmet, 600},
+ {Items.airBalloon, 100},
+ {Items.redCard, 100},
+ {Items.ringTarget, 100},
+ {Items.bindingBand, 200},
+ {Items.absorbBulb, 100},
+ {Items.cellBattery, 100},
+ {Items.ejectButton, 100},
+ {Items.fireGem, 100},
+ {Items.waterGem, 100},
+ {Items.electricGem, 100},
+ {Items.grassGem, 100},
+ {Items.iceGem, 100},
+ {Items.fightingGem, 100},
+ {Items.poisonGem, 100},
+ {Items.groundGem, 100},
+ {Items.flyingGem, 100},
+ {Items.psychicGem, 100},
+ {Items.bugGem, 100},
+ {Items.rockGem, 100},
+ {Items.ghostGem, 100},
+ {Items.dragonGem, 100},
+ {Items.darkGem, 100},
+ {Items.steelGem, 100},
+ {Items.normalGem, 100},
+ {Items.healthFeather, 30},
+ {Items.muscleFeather, 30},
+ {Items.resistFeather, 30},
+ {Items.geniusFeather, 30},
+ {Items.cleverFeather, 30},
+ {Items.swiftFeather, 30},
+ {Items.prettyFeather, 100},
+ {Items.coverFossil, 700},
+ {Items.plumeFossil, 700},
+ {Items.libertyPass, 0},
+ {Items.passOrb, 20},
+ {Items.dreamBall, 100},
+ {Items.pokeToy, 10},
+ {Items.propCase, 0},
+ {Items.dragonSkull, 0},
+ {Items.balmMushroom, 1500},
+ {Items.bigNugget, 4000},
+ {Items.pearlString, 3000},
+ {Items.cometShard, 6000},
+ {Items.relicCopper, 0},
+ {Items.relicSilver, 0},
+ {Items.relicGold, 0},
+ {Items.relicVase, 0},
+ {Items.relicBand, 0},
+ {Items.relicStatue, 0},
+ {Items.relicCrown, 0},
+ {Items.casteliacone, 35},
+ {Items.direHit2, 0},
+ {Items.xSpeed2, 0},
+ {Items.xSpAtk2, 0},
+ {Items.xSpDef2, 0},
+ {Items.xDefense2, 0},
+ {Items.xAttack2, 0},
+ {Items.xAccuracy2, 0},
+ {Items.xSpeed3, 0},
+ {Items.xSpAtk3, 0},
+ {Items.xSpDef3, 0},
+ {Items.xDefense3, 0},
+ {Items.xAttack3, 0},
+ {Items.xAccuracy3, 0},
+ {Items.xSpeed6, 0},
+ {Items.xSpAtk6, 0},
+ {Items.xSpDef6, 0},
+ {Items.xDefense6, 0},
+ {Items.xAttack6, 0},
+ {Items.xAccuracy6, 0},
+ {Items.abilityUrge, 0},
+ {Items.itemDrop, 0},
+ {Items.itemUrge, 0},
+ {Items.resetUrge, 0},
+ {Items.direHit3, 0},
+ {Items.lightStone, 0},
+ {Items.darkStone, 0},
+ {Items.tm93, 2000},
+ {Items.tm94, 2000},
+ {Items.tm95, 1000},
+ {Items.xtransceiverMale, 0},
+ {Items.unused622, 0},
+ {Items.gram1, 0},
+ {Items.gram2, 0},
+ {Items.gram3, 0},
+ {Items.xtransceiverFemale, 0},
+ {Items.medalBox, 0},
+ {Items.dNASplicersFuse, 0},
+ {Items.dNASplicersSeparate, 0},
+ {Items.permit, 0},
+ {Items.ovalCharm, 0},
+ {Items.shinyCharm, 0},
+ {Items.plasmaCard, 0},
+ {Items.grubbyHanky, 0},
+ {Items.colressMachine, 0},
+ {Items.droppedItemCurtis, 0},
+ {Items.droppedItemYancy, 0},
+ {Items.revealGlass, 0},
+ {Items.weaknessPolicy, 200},
+ {Items.assaultVest, 600},
+ {Items.holoCasterMale, 0},
+ {Items.profsLetter, 0},
+ {Items.rollerSkates, 0},
+ {Items.pixiePlate, 200},
+ {Items.abilityCapsule, 500},
+ {Items.whippedDream, 300},
+ {Items.sachet, 300},
+ {Items.luminousMoss, 20},
+ {Items.snowball, 20},
+ {Items.safetyGoggles, 300},
+ {Items.pokeFlute, 0},
+ {Items.richMulch, 20},
+ {Items.surpriseMulch, 20},
+ {Items.boostMulch, 20},
+ {Items.amazeMulch, 20},
+ {Items.gengarite, 1000},
+ {Items.gardevoirite, 1000},
+ {Items.ampharosite, 1000},
+ {Items.venusaurite, 1000},
+ {Items.charizarditeX, 1000},
+ {Items.blastoisinite, 1000},
+ {Items.mewtwoniteX, 2000},
+ {Items.mewtwoniteY, 2000},
+ {Items.blazikenite, 1000},
+ {Items.medichamite, 500},
+ {Items.houndoominite, 1000},
+ {Items.aggronite, 1000},
+ {Items.banettite, 500},
+ {Items.tyranitarite, 2000},
+ {Items.scizorite, 1000},
+ {Items.pinsirite, 1000},
+ {Items.aerodactylite, 1000},
+ {Items.lucarionite, 1000},
+ {Items.abomasite, 500},
+ {Items.kangaskhanite, 500},
+ {Items.gyaradosite, 1000},
+ {Items.absolite, 500},
+ {Items.charizarditeY, 1000},
+ {Items.alakazite, 1000},
+ {Items.heracronite, 1000},
+ {Items.mawilite, 300},
+ {Items.manectite, 500},
+ {Items.garchompite, 2000},
+ {Items.latiasite, 2000},
+ {Items.latiosite, 2000},
+ {Items.roseliBerry, 100},
+ {Items.keeBerry, 100},
+ {Items.marangaBerry, 100},
+ {Items.sprinklotad, 0},
+ {Items.tm96, 1000},
+ {Items.tm97, 1000},
+ {Items.tm98, 2000},
+ {Items.tm99, 1000},
+ {Items.tm100, 500},
+ {Items.powerPlantPass, 0},
+ {Items.megaRing, 0},
+ {Items.intriguingStone, 0},
+ {Items.commonStone, 0},
+ {Items.discountCoupon, 2},
+ {Items.elevatorKey, 0},
+ {Items.tmvPass, 0},
+ {Items.honorofKalos, 0},
+ {Items.adventureGuide, 0},
+ {Items.strangeSouvenir, 300},
+ {Items.lensCase, 0},
+ {Items.makeupBag, 0},
+ {Items.travelTrunk, 0},
+ {Items.lumioseGalette, 35},
+ {Items.shalourSable, 35},
+ {Items.jawFossil, 700},
+ {Items.sailFossil, 700},
+ {Items.lookerTicket, 0},
+ {Items.bikeYellow, 0},
+ {Items.holoCasterFemale, 0},
+ {Items.fairyGem, 100},
+ {Items.megaCharm, 0},
+ {Items.megaGlove, 0},
+ {Items.machBike, 0},
+ {Items.acroBike, 0},
+ {Items.wailmerPail, 0},
+ {Items.devonParts, 0},
+ {Items.sootSack, 0},
+ {Items.basementKeyHoenn, 0},
+ {Items.pokeblockKit, 0},
+ {Items.letter, 0},
+ {Items.eonTicket, 0},
+ {Items.scanner, 0},
+ {Items.goGoggles, 0},
+ {Items.meteoriteFirstForm, 0},
+ {Items.keytoRoom1, 0},
+ {Items.keytoRoom2, 0},
+ {Items.keytoRoom4, 0},
+ {Items.keytoRoom6, 0},
+ {Items.storageKeyHoenn, 0},
+ {Items.devonScope, 0},
+ {Items.ssTicketHoenn, 0},
+ {Items.hm07ORAS, 0},
+ {Items.devonScubaGear, 0},
+ {Items.contestCostumeMale, 0},
+ {Items.contestCostumeFemale, 0},
+ {Items.magmaSuit, 0},
+ {Items.aquaSuit, 0},
+ {Items.pairOfTickets, 0},
+ {Items.megaBracelet, 0},
+ {Items.megaPendant, 0},
+ {Items.megaGlasses, 0},
+ {Items.megaAnchor, 0},
+ {Items.megaStickpin, 0},
+ {Items.megaTiara, 0},
+ {Items.megaAnklet, 0},
+ {Items.meteoriteSecondForm, 0},
+ {Items.swampertite, 1000},
+ {Items.sceptilite, 1000},
+ {Items.sablenite, 300},
+ {Items.altarianite, 500},
+ {Items.galladite, 1000},
+ {Items.audinite, 500},
+ {Items.metagrossite, 2000},
+ {Items.sharpedonite, 500},
+ {Items.slowbronite, 500},
+ {Items.steelixite, 1000},
+ {Items.pidgeotite, 500},
+ {Items.glalitite, 500},
+ {Items.diancite, 2000},
+ {Items.prisonBottle, 0},
+ {Items.megaCuff, 0},
+ {Items.cameruptite, 500},
+ {Items.lopunnite, 500},
+ {Items.salamencite, 2000},
+ {Items.beedrillite, 300},
+ {Items.meteoriteThirdForm, 0},
+ {Items.meteoriteFinalForm, 0},
+ {Items.keyStone, 0},
+ {Items.meteoriteShard, 0},
+ {Items.eonFlute, 0},
+ {Items.normaliumZHeld, 0},
+ {Items.firiumZHeld, 0},
+ {Items.wateriumZHeld, 0},
+ {Items.electriumZHeld, 0},
+ {Items.grassiumZHeld, 0},
+ {Items.iciumZHeld, 0},
+ {Items.fightiniumZHeld, 0},
+ {Items.poisoniumZHeld, 0},
+ {Items.groundiumZHeld, 0},
+ {Items.flyiniumZHeld, 0},
+ {Items.psychiumZHeld, 0},
+ {Items.buginiumZHeld, 0},
+ {Items.rockiumZHeld, 0},
+ {Items.ghostiumZHeld, 0},
+ {Items.dragoniumZHeld, 0},
+ {Items.darkiniumZHeld, 0},
+ {Items.steeliumZHeld, 0},
+ {Items.fairiumZHeld, 0},
+ {Items.pikaniumZHeld, 0},
+ {Items.bottleCap, 500},
+ {Items.goldBottleCap, 1000},
+ {Items.zRing, 0},
+ {Items.decidiumZHeld, 0},
+ {Items.inciniumZHeld, 0},
+ {Items.primariumZHeld, 0},
+ {Items.tapuniumZHeld, 0},
+ {Items.marshadiumZHeld, 0},
+ {Items.aloraichiumZHeld, 0},
+ {Items.snorliumZHeld, 0},
+ {Items.eeviumZHeld, 0},
+ {Items.mewniumZHeld, 0},
+ {Items.normaliumZBag, 0},
+ {Items.firiumZBag, 0},
+ {Items.wateriumZBag, 0},
+ {Items.electriumZBag, 0},
+ {Items.grassiumZBag, 0},
+ {Items.iciumZBag, 0},
+ {Items.fightiniumZBag, 0},
+ {Items.poisoniumZBag, 0},
+ {Items.groundiumZBag, 0},
+ {Items.flyiniumZBag, 0},
+ {Items.psychiumZBag, 0},
+ {Items.buginiumZBag, 0},
+ {Items.rockiumZBag, 0},
+ {Items.ghostiumZBag, 0},
+ {Items.dragoniumZBag, 0},
+ {Items.darkiniumZBag, 0},
+ {Items.steeliumZBag, 0},
+ {Items.fairiumZBag, 0},
+ {Items.pikaniumZBag, 0},
+ {Items.decidiumZBag, 0},
+ {Items.inciniumZBag, 0},
+ {Items.primariumZBag, 0},
+ {Items.tapuniumZBag, 0},
+ {Items.marshadiumZBag, 0},
+ {Items.aloraichiumZBag, 0},
+ {Items.snorliumZBag, 0},
+ {Items.eeviumZBag, 0},
+ {Items.mewniumZBag, 0},
+ {Items.pikashuniumZHeld, 0},
+ {Items.pikashuniumZBag, 0},
+ {Items.unused837, 0},
+ {Items.unused838, 0},
+ {Items.unused839, 0},
+ {Items.unused840, 0},
+ {Items.forageBag, 0},
+ {Items.fishingRod, 0},
+ {Items.professorsMask, 0},
+ {Items.festivalTicket, 1},
+ {Items.sparklingStone, 0},
+ {Items.adrenalineOrb, 30},
+ {Items.zygardeCube, 0},
+ {Items.unused848, 0},
+ {Items.iceStone, 300},
+ {Items.ridePager, 0},
+ {Items.beastBall, 30},
+ {Items.bigMalasada, 35},
+ {Items.redNectar, 30},
+ {Items.yellowNectar, 30},
+ {Items.pinkNectar, 30},
+ {Items.purpleNectar, 30},
+ {Items.sunFlute, 0},
+ {Items.moonFlute, 0},
+ {Items.unused859, 0},
+ {Items.enigmaticCard, 0},
+ {Items.silverRazzBerry, 0}, // unused in Gen 7
+ {Items.goldenRazzBerry, 0}, // unused in Gen 7
+ {Items.silverNanabBerry, 0}, // unused in Gen 7
+ {Items.goldenNanabBerry, 0}, // unused in Gen 7
+ {Items.silverPinapBerry, 0}, // unused in Gen 7
+ {Items.goldenPinapBerry, 0}, // unused in Gen 7
+ {Items.unused867, 0},
+ {Items.unused868, 0},
+ {Items.unused869, 0},
+ {Items.unused870, 0},
+ {Items.unused871, 0},
+ {Items.secretKeyKanto, 0}, // unused in Gen 7
+ {Items.ssTicketKanto, 0}, // unused in Gen 7
+ {Items.silphScope, 0}, // unused in Gen 7
+ {Items.parcelKanto, 0}, // unused in Gen 7
+ {Items.cardKeyKanto, 0}, // unused in Gen 7
+ {Items.goldTeeth, 0}, // unused in Gen 7
+ {Items.liftKey, 0}, // unused in Gen 7
+ {Items.terrainExtender, 400},
+ {Items.protectivePads, 300},
+ {Items.electricSeed, 100},
+ {Items.psychicSeed, 100},
+ {Items.mistySeed, 100},
+ {Items.grassySeed, 100},
+ {Items.stretchySpring, 0}, // unused in Gen 7
+ {Items.chalkyStone, 0}, // unused in Gen 7
+ {Items.marble, 0}, // unused in Gen 7
+ {Items.loneEarring, 0}, // unused in Gen 7
+ {Items.beachGlass, 0}, // unused in Gen 7
+ {Items.goldLeaf, 0}, // unused in Gen 7
+ {Items.silverLeaf, 0}, // unused in Gen 7
+ {Items.polishedMudBall, 0}, // unused in Gen 7
+ {Items.tropicalShell, 0}, // unused in Gen 7
+ {Items.leafLetterPikachu, 0}, // unused in Gen 7
+ {Items.leafLetterEevee, 0}, // unused in Gen 7
+ {Items.smallBouquet, 0}, // unused in Gen 7
+ {Items.unused897, 0},
+ {Items.unused898, 0},
+ {Items.unused899, 0},
+ {Items.lure, 0}, // unused in Gen 7
+ {Items.superLure, 0}, // unused in Gen 7
+ {Items.maxLure, 0}, // unused in Gen 7
+ {Items.pewterCrunchies, 0}, // unused in Gen 7
+ {Items.fightingMemory, 100},
+ {Items.flyingMemory, 100},
+ {Items.poisonMemory, 100},
+ {Items.groundMemory, 100},
+ {Items.rockMemory, 100},
+ {Items.bugMemory, 100},
+ {Items.ghostMemory, 100},
+ {Items.steelMemory, 100},
+ {Items.fireMemory, 100},
+ {Items.waterMemory, 100},
+ {Items.grassMemory, 100},
+ {Items.electricMemory, 100},
+ {Items.psychicMemory, 100},
+ {Items.iceMemory, 100},
+ {Items.dragonMemory, 100},
+ {Items.darkMemory, 100},
+ {Items.fairyMemory, 100},
+ {Items.solganiumZBag, 0},
+ {Items.lunaliumZBag, 0},
+ {Items.ultranecroziumZBag, 0},
+ {Items.mimikiumZHeld, 0},
+ {Items.lycaniumZHeld, 0},
+ {Items.kommoniumZHeld, 0},
+ {Items.solganiumZHeld, 0},
+ {Items.lunaliumZHeld, 0},
+ {Items.ultranecroziumZHeld, 0},
+ {Items.mimikiumZBag, 0},
+ {Items.lycaniumZBag, 0},
+ {Items.kommoniumZBag, 0},
+ {Items.zPowerRing, 0},
+ {Items.pinkPetal, 0},
+ {Items.orangePetal, 0},
+ {Items.bluePetal, 0},
+ {Items.redPetal, 0},
+ {Items.greenPetal, 0},
+ {Items.yellowPetal, 0},
+ {Items.purplePetal, 0},
+ {Items.rainbowFlower, 0},
+ {Items.surgeBadge, 0},
+ {Items.nSolarizerFuse, 0},
+ {Items.nLunarizerFuse, 0},
+ {Items.nSolarizerSeparate, 0},
+ {Items.nLunarizerSeparate, 0},
+ {Items.ilimaNormaliumZ, 0},
+ {Items.leftPokeBall, 0},
+ {Items.rotoHatch, 0},
+ {Items.rotoBargain, 0},
+ {Items.rotoPrizeMoney, 0},
+ {Items.rotoExpPoints, 0},
+ {Items.rotoFriendship, 0},
+ {Items.rotoEncounter, 0},
+ {Items.rotoStealth, 0},
+ {Items.rotoHPRestore, 0},
+ {Items.rotoPPRestore, 0},
+ {Items.rotoBoost, 0},
+ {Items.rotoCatch, 0},
+ }).collect(Collectors.toMap(kv -> kv[0], kv -> kv[1]));
+}