// 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;
        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[0x07] = Type.BUG;
        table[0x08] = Type.GHOST;
        table[0x09] = Type.STEEL;
        table[0x14] = Type.FIRE;
        table[0x15] = Type.WATER;
        table[0x16] = Type.GRASS;
        table[0x17] = Type.ELECTRIC;
        table[0x18] = Type.PSYCHIC;
        table[0x19] = Type.ICE;
        table[0x1A] = Type.DRAGON;
        table[0x1B] = Type.DARK;
        return table;
    }

    public static byte typeToByte(Type type) {
        if (type == null) {
            return 0x13; // ???-type
        }
        switch (type) {
        case NORMAL:
            return 0x00;
        case FIGHTING:
            return 0x01;
// 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/Gen2Constants.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;

        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[0x07] = Type.BUG;
        table[0x08] = Type.GHOST;
        table[0x09] = Type.STEEL;
        table[0x14] = Type.FIRE;
        table[0x15] = Type.WATER;
        table[0x16] = Type.GRASS;
        table[0x17] = Type.ELECTRIC;
        table[0x18] = Type.PSYCHIC;
        table[0x19] = Type.ICE;
        table[0x1A] = Type.DRAGON;
        table[0x1B] = Type.DARK;
        return table;
    }

    public static byte typeToByte(Type type) {
        if (type == null) {
            return 0x13; // ???-type
        }
        switch (type) {
        case NORMAL:
            return 0x00;
        case FIGHTING:
            return 0x01;
        case FLYING: