public void LoadXD()
        {
            this.checksum = new uint[4];
            this.substructureSizes = new ushort[16];
            this.substructureOffsets = new uint[16];
            this.flagDataSubSizes = new ushort[5];
            this.unhandledSubstructures = new byte[16][];
            this.randomBytes = new byte[40];

            ushort[] checksum_tmp = new ushort[8];
            for (int i = 0; i < 8; i++)
                checksum_tmp[8 - i - 1] = BigEndian.ToUInt16(raw, 0x10 + i * 2);
            for (int i = 0; i < 4; i++)
                checksum[i] = ((uint)checksum_tmp[i * 2] << 16) | (uint)checksum_tmp[i * 2 + 1];

            ushort[] substructureOffsetsTmp = new ushort[32];
            BigEndian.LoadArray(substructureSizes, raw, 0x20);
            BigEndian.LoadArray(substructureOffsetsTmp, raw, 0x40);
            BigEndian.LoadArray(flagDataSubSizes, raw, 0x80);
            flagDataSubSizes[4] = raw[0x8A];

            //int start = 8 + 0xA0;
            for (int i = 0; i < 16; i++)
                substructureOffsets[i] = (uint)(((uint)substructureOffsetsTmp[2 * i + 1] << 16) | (uint)substructureOffsetsTmp[2 * i]);

            otherCorruptionFlags = substructureSizes[0] != 0x88;
            for (int i = 0; i < 16; i++) {
                //if (i == 1 || i == 2)
                //	unhandledSubstructures[i] = null;
                //else
                    unhandledSubstructures[i] = LoadSubstructure(raw, substructureOffsets[i], substructureSizes[i], SubstructureMaxSizes[i]);
            }

            int id = 0;
            this.gameConfigData = new GameConfigData(gameSave, LoadSubstructure(raw, substructureOffsets[id], substructureSizes[id], SubstructureMaxSizes[id]), this);
            id = 1;
            this.playerData = new PlayerData(gameSave, LoadSubstructure(raw, substructureOffsets[id], substructureSizes[id], SubstructureMaxSizes[id]), this);
            id = 2;
            this.pcData = new PCData(gameSave, LoadSubstructure(raw, substructureOffsets[id], substructureSizes[id], SubstructureMaxSizes[id]), this);
            id = 4;
            this.daycareData = new DaycareData(gameSave, LoadSubstructure(raw, substructureOffsets[id], substructureSizes[id], SubstructureMaxSizes[id]), this);
            id = 5;
            this.memoData = new StrategyMemoData(gameSave, LoadSubstructure(raw, substructureOffsets[id], substructureSizes[id], SubstructureMaxSizes[id]), this);
            id = 7;
            this.shadowData = new ShadowPokemonData(gameSave, LoadSubstructure(raw, substructureOffsets[id], substructureSizes[id], SubstructureMaxSizes[id]), this);
            id = 14;
            this.purifierData = new PurifierData(gameSave, LoadSubstructure(raw, substructureOffsets[id], substructureSizes[id], SubstructureMaxSizes[id]), this);
            { // Flags
                ushort size = 0;
                for (int i = 0; i < 5; i++)
                    size += flagDataSubSizes[i];
                if (size <= SubstructureMaxSizes[8])
                    ByteHelper.ReplaceBytes(unhandledSubstructures[8], size, new byte[SubstructureMaxSizes[8] - size]);
            }
            for (int i = 0; i < 16; i++)
                substructureSizes[i] = SubstructureMaxSizes[i];

            ByteHelper.ReplaceBytes(randomBytes, 0, ByteHelper.SubByteArray(raw.Length - 40, raw, 40));
        }
 public void LoadColosseum()
 {
     this.gameConfigData = new GameConfigData(gameSave, ByteHelper.SubByteArray(8, raw, 112), this);
     this.playerData = new PlayerData(gameSave, ByteHelper.SubByteArray(120, raw, 2840), this);
     this.pcData = new PCData(gameSave, ByteHelper.SubByteArray(2960, raw, 29080), this);
     this.daycareData = new DaycareData(gameSave, ByteHelper.SubByteArray(33136, raw, 0x140), this);
     this.memoData = new StrategyMemoData(gameSave, ByteHelper.SubByteArray(33456, raw, 6004), this);
     //Mailbox 32040 + 1096 = 33136
     //BattleMode 58344
     //RibbonDescriptions 115804
     this.randomBytes = new byte[20];
     ByteHelper.ReplaceBytes(randomBytes, 0, ByteHelper.SubByteArray(0x1dfd8, raw, 20));
 }