// Path: src/com/dabomstew/pkrandom/pokemon/ItemList.java
// public class ItemList {
// 
//     private boolean[] items;
//     private boolean[] tms;
// 
//     public ItemList(int highestIndex) {
//         items = new boolean[highestIndex + 1];
//         tms = new boolean[highestIndex + 1];
//         for (int i = 1; i <= highestIndex; i++) {
//             items[i] = true;
//         }
//     }
// 
//     public boolean isTM(int index) {
//         if (index < 0 || index >= tms.length) {
//             return false;
//         }
//         return tms[index];
//     }
// 
//     public boolean isAllowed(int index) {
//         if (index < 0 || index >= tms.length) {
//             return false;
//         }
//         return items[index];
//     }
// 
//     public void banSingles(int... indexes) {
//         for (int index : indexes) {
//             items[index] = false;
//         }
//     }
// 
//     public void banRange(int startIndex, int length) {
//         for (int i = 0; i < length; i++) {
//             items[i + startIndex] = false;
//         }
//     }
// 
//     public void tmRange(int startIndex, int length) {
//         for (int i = 0; i < length; i++) {
//             tms[i + startIndex] = true;
//         }
//     }
// 
//     public int randomItem(Random random) {
//         int chosen = 0;
//         while (!items[chosen]) {
//             chosen = random.nextInt(items.length);
//         }
//         return chosen;
//     }
// 
//     public int randomNonTM(Random random) {
//         int chosen = 0;
//         while (!items[chosen] || tms[chosen]) {
//             chosen = random.nextInt(items.length);
//         }
//         return chosen;
//     }
// 
//     public int randomTM(Random random) {
//         int chosen = 0;
//         while (!tms[chosen]) {
//             chosen = random.nextInt(items.length);
//         }
//         return chosen;
//     }
// 
//     public ItemList copy() {
//         ItemList other = new ItemList(items.length - 1);
//         System.arraycopy(items, 0, other.items, 0, items.length);
//         System.arraycopy(tms, 0, other.tms, 0, tms.length);
//         return other;
//     }
// 
// }
// 
// Path: src/com/dabomstew/pkrandom/pokemon/Type.java
// public enum Type {
// 
//     NORMAL, FIGHTING, FLYING, GRASS, WATER, FIRE, ROCK, GROUND, PSYCHIC, BUG, DRAGON, ELECTRIC, GHOST, POISON, ICE, STEEL, DARK, GAS(
//             true), FAIRY(true), WOOD(true), ABNORMAL(true), WIND(true), SOUND(true), LIGHT(true), TRI(true);
// 
//     public boolean isHackOnly;
// 
//     private Type() {
//         this.isHackOnly = false;
//     }
// 
//     private Type(boolean isHackOnly) {
//         this.isHackOnly = isHackOnly;
//     }
// 
//     private static final List<Type> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
//     private static final int SIZE = VALUES.size();
// 
//     public static Type randomType(Random random) {
//         return VALUES.get(random.nextInt(SIZE));
//     }
// 
//     public String camelCase() {
//         return RomFunctions.camelCase(this.toString());
//     }
// 
// }


import java.util.Arrays;
import java.util.List;
import com.dabomstew.pkrandom.pokemon.ItemList;
import com.dabomstew.pkrandom.pokemon.Trainer;
import com.dabomstew.pkrandom.pokemon.Type;
package com.dabomstew.pkrandom.constants;



public class Gen1Constants {

    public static final int baseStatsEntrySize = 0x1C;

    public static final int bsHPOffset = 1, bsAttackOffset = 2, bsDefenseOffset = 3, bsSpeedOffset = 4,
            bsSpecialOffset = 5, bsPrimaryTypeOffset = 6, bsSecondaryTypeOffset = 7, bsCatchRateOffset = 8,
            bsExpYieldOffset = 9, bsFrontSpriteOffset = 11, bsLevel1MovesOffset = 15, bsGrowthCurveOffset = 19,
            bsTMHMCompatOffset = 20;

    public static final int mewIndex = 151, marowakIndex = 105;

    public static final int encounterTableEnd = 0xFFFF, encounterTableSize = 10, yellowSuperRodTableSize = 4;

    public static final int trainerClassCount = 47;

    public static final int champRivalOffsetFromGymLeaderMoves = 0x44;

    public static final int tmCount = 50, hmCount = 5;

    public static final int[] gymLeaderTMs = new int[] { 34, 11, 24, 21, 6, 46, 38, 27 };

    public static final int[] tclassesCounts = new int[] { 21, 47 };

    public static final List<Integer> singularTrainers = Arrays.asList(28, 32, 33, 34, 35, 36, 37, 38, 39, 43, 45, 46);

    public static final List<Integer> bannedMovesWithXAccBanned = Arrays.asList(49, 82, 147);

    public static final List<Integer> bannedMovesWithoutXAccBanned = Arrays.asList(49, 82, 32, 90, 12, 147);

    public static final List<Integer> fieldMoves = Arrays.asList(15, 19, 57, 70, 148, 91, 100);

    public static final List<Integer> earlyRequiredHMs = Arrays.asList(15);

    public static final int hmsStartIndex = 0xC4, tmsStartIndex = 0xC9;

    public static final List<Integer> requiredFieldTMs = Arrays.asList(new Integer[] { 3, 4, 8, 10, 12, 14, 16, 19, 20,
            22, 25, 26, 30, 40, 43, 44, 45, 47 });

    public static final int towerMapsStartIndex = 0x90, towerMapsEndIndex = 0x94;

// Path: src/com/dabomstew/pkrandom/pokemon/ItemList.java
// public class ItemList {
// 
//     private boolean[] items;
//     private boolean[] tms;
// 
//     public ItemList(int highestIndex) {
//         items = new boolean[highestIndex + 1];
//         tms = new boolean[highestIndex + 1];
//         for (int i = 1; i <= highestIndex; i++) {
//             items[i] = true;
//         }
//     }
// 
//     public boolean isTM(int index) {
//         if (index < 0 || index >= tms.length) {
//             return false;
//         }
//         return tms[index];
//     }
// 
//     public boolean isAllowed(int index) {
//         if (index < 0 || index >= tms.length) {
//             return false;
//         }
//         return items[index];
//     }
// 
//     public void banSingles(int... indexes) {
//         for (int index : indexes) {
//             items[index] = false;
//         }
//     }
// 
//     public void banRange(int startIndex, int length) {
//         for (int i = 0; i < length; i++) {
//             items[i + startIndex] = false;
//         }
//     }
// 
//     public void tmRange(int startIndex, int length) {
//         for (int i = 0; i < length; i++) {
//             tms[i + startIndex] = true;
//         }
//     }
// 
//     public int randomItem(Random random) {
//         int chosen = 0;
//         while (!items[chosen]) {
//             chosen = random.nextInt(items.length);
//         }
//         return chosen;
//     }
// 
//     public int randomNonTM(Random random) {
//         int chosen = 0;
//         while (!items[chosen] || tms[chosen]) {
//             chosen = random.nextInt(items.length);
//         }
//         return chosen;
//     }
// 
//     public int randomTM(Random random) {
//         int chosen = 0;
//         while (!tms[chosen]) {
//             chosen = random.nextInt(items.length);
//         }
//         return chosen;
//     }
// 
//     public ItemList copy() {
//         ItemList other = new ItemList(items.length - 1);
//         System.arraycopy(items, 0, other.items, 0, items.length);
//         System.arraycopy(tms, 0, other.tms, 0, tms.length);
//         return other;
//     }
// 
// }
// 
// Path: src/com/dabomstew/pkrandom/pokemon/Type.java
// public enum Type {
// 
//     NORMAL, FIGHTING, FLYING, GRASS, WATER, FIRE, ROCK, GROUND, PSYCHIC, BUG, DRAGON, ELECTRIC, GHOST, POISON, ICE, STEEL, DARK, GAS(
//             true), FAIRY(true), WOOD(true), ABNORMAL(true), WIND(true), SOUND(true), LIGHT(true), TRI(true);
// 
//     public boolean isHackOnly;
// 
//     private Type() {
//         this.isHackOnly = false;
//     }
// 
//     private Type(boolean isHackOnly) {
//         this.isHackOnly = isHackOnly;
//     }
// 
//     private static final List<Type> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
//     private static final int SIZE = VALUES.size();
// 
//     public static Type randomType(Random random) {
//         return VALUES.get(random.nextInt(SIZE));
//     }
// 
//     public String camelCase() {
//         return RomFunctions.camelCase(this.toString());
//     }
// 
// }


// Path: src/com/dabomstew/pkrandom/constants/Gen1Constants.java
import java.util.Arrays;
import java.util.List;
import com.dabomstew.pkrandom.pokemon.ItemList;
import com.dabomstew.pkrandom.pokemon.Trainer;
import com.dabomstew.pkrandom.pokemon.Type;

package com.dabomstew.pkrandom.constants;



public class Gen1Constants {

    public static final int baseStatsEntrySize = 0x1C;

    public static final int bsHPOffset = 1, bsAttackOffset = 2, bsDefenseOffset = 3, bsSpeedOffset = 4,
            bsSpecialOffset = 5, bsPrimaryTypeOffset = 6, bsSecondaryTypeOffset = 7, bsCatchRateOffset = 8,
            bsExpYieldOffset = 9, bsFrontSpriteOffset = 11, bsLevel1MovesOffset = 15, bsGrowthCurveOffset = 19,
            bsTMHMCompatOffset = 20;

    public static final int mewIndex = 151, marowakIndex = 105;

    public static final int encounterTableEnd = 0xFFFF, encounterTableSize = 10, yellowSuperRodTableSize = 4;

    public static final int trainerClassCount = 47;

    public static final int champRivalOffsetFromGymLeaderMoves = 0x44;

    public static final int tmCount = 50, hmCount = 5;

    public static final int[] gymLeaderTMs = new int[] { 34, 11, 24, 21, 6, 46, 38, 27 };

    public static final int[] tclassesCounts = new int[] { 21, 47 };

    public static final List<Integer> singularTrainers = Arrays.asList(28, 32, 33, 34, 35, 36, 37, 38, 39, 43, 45, 46);

    public static final List<Integer> bannedMovesWithXAccBanned = Arrays.asList(49, 82, 147);

    public static final List<Integer> bannedMovesWithoutXAccBanned = Arrays.asList(49, 82, 32, 90, 12, 147);

    public static final List<Integer> fieldMoves = Arrays.asList(15, 19, 57, 70, 148, 91, 100);

    public static final List<Integer> earlyRequiredHMs = Arrays.asList(15);

    public static final int hmsStartIndex = 0xC4, tmsStartIndex = 0xC9;

    public static final List<Integer> requiredFieldTMs = Arrays.asList(new Integer[] { 3, 4, 8, 10, 12, 14, 16, 19, 20,
            22, 25, 26, 30, 40, 43, 44, 45, 47 });

    public static final int towerMapsStartIndex = 0x90, towerMapsEndIndex = 0x94;

    public static final Type[] typeTable = constructTypeTable();