// 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/MoveCategory.java
// public enum MoveCategory {
//     PHYSICAL, SPECIAL, STATUS;
// }
// 
// 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.MoveCategory;
import com.dabomstew.pkrandom.pokemon.Trainer;
import com.dabomstew.pkrandom.pokemon.Type;
        switch (cat) {
        case PHYSICAL:
            return 0;
        case SPECIAL:
            return 1;
        case STATUS:
        default:
            return 2;
        }
    }

    public static final List<Integer> dpRequiredFieldTMs = Arrays.asList(new Integer[] { 2, 3, 5, 9, 12, 19, 23, 28,
            34, 39, 41, 43, 46, 47, 49, 50, 62, 69, 79, 80, 82, 84, 85, 87 });

    public static final List<Integer> ptRequiredFieldTMs = Arrays.asList(new Integer[] { 2, 3, 5, 7, 9, 11, 12, 18, 19,
            23, 28, 34, 37, 39, 41, 43, 46, 47, 49, 50, 62, 69, 79, 80, 82, 84, 85, 87 });

    // DPPt:
    // cut, fly, surf, strength, flash, dig, teleport, waterfall,
    // rock smash, sweet scent, defog, rock climb
    public static final List<Integer> dpptFieldMoves = Arrays.asList(15, 19, 57, 70, 148, 91, 100, 127, 249, 230, 432,
            431);

    public static final List<Integer> hgssFieldMoves = Arrays.asList(15, 19, 57, 70, 148, 91, 100, 250, 127, 249, 29,
            230, 431);
    // DPPt: rock smash, cut
    public static final List<Integer> dpptEarlyRequiredHMMoves = Arrays.asList(249, 15);
    // HGSS: just cut
    public static final List<Integer> hgssEarlyRequiredHMMoves = Arrays.asList(15);

// 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/MoveCategory.java
// public enum MoveCategory {
//     PHYSICAL, SPECIAL, STATUS;
// }
// 
// 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/Gen4Constants.java
import java.util.Arrays;
import java.util.List;
import com.dabomstew.pkrandom.pokemon.ItemList;
import com.dabomstew.pkrandom.pokemon.MoveCategory;
import com.dabomstew.pkrandom.pokemon.Trainer;
import com.dabomstew.pkrandom.pokemon.Type;

        switch (cat) {
        case PHYSICAL:
            return 0;
        case SPECIAL:
            return 1;
        case STATUS:
        default:
            return 2;
        }
    }

    public static final List<Integer> dpRequiredFieldTMs = Arrays.asList(new Integer[] { 2, 3, 5, 9, 12, 19, 23, 28,
            34, 39, 41, 43, 46, 47, 49, 50, 62, 69, 79, 80, 82, 84, 85, 87 });

    public static final List<Integer> ptRequiredFieldTMs = Arrays.asList(new Integer[] { 2, 3, 5, 7, 9, 11, 12, 18, 19,
            23, 28, 34, 37, 39, 41, 43, 46, 47, 49, 50, 62, 69, 79, 80, 82, 84, 85, 87 });

    // DPPt:
    // cut, fly, surf, strength, flash, dig, teleport, waterfall,
    // rock smash, sweet scent, defog, rock climb
    public static final List<Integer> dpptFieldMoves = Arrays.asList(15, 19, 57, 70, 148, 91, 100, 127, 249, 230, 432,
            431);

    public static final List<Integer> hgssFieldMoves = Arrays.asList(15, 19, 57, 70, 148, 91, 100, 250, 127, 249, 29,
            230, 431);
    // DPPt: rock smash, cut
    public static final List<Integer> dpptEarlyRequiredHMMoves = Arrays.asList(249, 15);
    // HGSS: just cut
    public static final List<Integer> hgssEarlyRequiredHMMoves = Arrays.asList(15);

    public static ItemList allowedItems, nonBadItems;