Beispiel #1
0
        public static BACFile FromFilename(string name, BCMFile bcm)
        {
            using (var fs = File.OpenRead(name))
                using (var tracker = new TrackingStream(fs))
                    using (var inFile = new BinaryReader(tracker))
                    {
                        AELogger.Log(AELogger.O_SEPARATOR, false);
                        tracker.SetLabel("Header");

                        if (new String(inFile.ReadChars(4)) != "#BAC")
                        {
                            throw new IOException("Not a valid BAC file");
                        }
                        tracker.IgnoreBytes(8);
                        inFile.BaseStream.Seek(12);

                        ushort ScriptCount         = inFile.ReadUInt16();
                        ushort VFXScriptCount      = inFile.ReadUInt16();
                        uint   HitboxTableSize     = inFile.ReadUInt32();
                        int    ScriptOffset        = inFile.ReadInt32();
                        int    VFXScriptOffset     = inFile.ReadInt32();
                        int    ScriptNameOffset    = inFile.ReadInt32();
                        int    VFXScriptNameOffset = inFile.ReadInt32();
                        int    HitboxTableOffset   = inFile.ReadInt32();

                        AELogger.Log("Header done, reading floats");

                        var bac = new BACFile();
                        for (int i = 0; i < 0x1c; i++)
                        {
                            var list = new ObservableCollection <float>();
                            for (int j = 0; j < 6; j++)
                            {
                                list.Add(inFile.ReadSingle());
                            }
                            bac.UnknownFloatData.Add(list);
                        }
                        AELogger.Log("floats done, reading scripts");

                        for (int i = 0; i < ScriptCount; i++)
                        {
                            bac.Scripts.Add(new Script(i));
                        }
                        for (int i = 0; i < VFXScriptCount; i++)
                        {
                            bac.VFXScripts.Add(new Script(i));
                        }
                        for (int i = 0; i < HitboxTableSize; i++)
                        {
                            bac.HitboxTable.Add(new HitBoxDataset(i));
                        }

                        //Link BCM
                        if (bcm != null)
                        {
                            foreach (BCM.Move move in bcm.Moves)
                            {
                                if (move.ScriptIndex != -1)
                                {
                                    move.Script = bac.Scripts[move.ScriptIndex];
                                }
                            }
                        }
                        //Read Scripts
                        readScripts(inFile, bac.Scripts, bcm, ScriptCount, ScriptOffset, ScriptNameOffset, bac);
                        readScripts(inFile, bac.VFXScripts, bcm, VFXScriptCount, VFXScriptOffset, VFXScriptNameOffset, bac);
                        AELogger.Log("scripts done, reading hitboxtable");
                        //Read Hitbox Table
                        for (int i = 0; i < HitboxTableSize; i++)
                        {
                            tracker.SetLabel("HitboxTable#" + i.ToString());
                            inFile.BaseStream.Seek(HitboxTableOffset + i * 4);
                            inFile.BaseStream.Seek(inFile.ReadUInt32());
                            if (inFile.BaseStream.Position == 0)
                            {
                                continue;
                            }
                            var dataset = bac.HitboxTable[i];
                            LoadedHitBoxCount = i;
                            for (int j = 0; j < 12; j++)
                            {
                                HitBoxData data = new HitBoxData(j);
                                dataset.Data.Add(data);
                                data.Damage = inFile.ReadInt16();
                                data.Stun   = inFile.ReadInt16();
                                data.Effect = (HitBoxData.HitBoxEffect)inFile.ReadUInt16();
                                Util.LogUnkEnum(data.Effect, "Hitbox #" + dataset.Index, "hitboxdataset", j);

                                var index = inFile.ReadInt16() + HitBoxData.getIndexOffset(data.Effect);
                                if (index > -1)
                                {
                                    data.OnHit = bac.Scripts.Where(x => x.Index == index).First();
                                }
                                else
                                {
                                    data.OnHit = new Script(index);
                                    if (index <= -1)
                                    {
                                        AELogger.Log("negative index " + index + " in hitboxdata #" + i);
                                    }
                                }

                                data.SelfHitstop = inFile.ReadUInt16();
                                data.SelfShaking = inFile.ReadUInt16();
                                data.TgtHitstop  = inFile.ReadUInt16();
                                data.TgtShaking  = inFile.ReadUInt16();
                                data.HitGFX      = inFile.ReadInt16();
                                data.Unknown1    = inFile.ReadInt32();
                                data.Unused      = (Unused16)inFile.ReadInt16();
                                data.HitGFX2     = inFile.ReadInt16();
                                data.Unused2     = (Unused32)inFile.ReadInt32();
                                data.Unused3     = (Unused16)inFile.ReadInt16();
                                data.HitSFX      = inFile.ReadInt16();
                                data.HitSFX2     = inFile.ReadInt16();
                                data.TgtSFX      = inFile.ReadInt16();

                                data.ArcadeScore = inFile.ReadUInt16();
                                data.SelfMeter   = inFile.ReadInt16();
                                data.TgtMeter    = inFile.ReadInt16();
                                data.JuggleStart = inFile.ReadInt16();
                                data.TgtAnimTime = inFile.ReadInt16();
                                data.MiscFlag    = (HitBoxData.MiscFlags)inFile.ReadInt32();
                                data.VelX        = inFile.ReadSingle();
                                data.VelY        = inFile.ReadSingle();

                                data.VelZ         = inFile.ReadSingle();
                                data.PushbackDist = inFile.ReadSingle();
                                data.AccX         = inFile.ReadSingle();
                                data.AccY         = inFile.ReadSingle();
                                data.AccZ         = inFile.ReadSingle();
                            }
                        }
                        AELogger.Log("hitbox done");
                        List <HitBoxDataset> nullHitboxData = bac.HitboxTable.Where(x => x.Data.Count() == 0).ToList();
                        foreach (HitBoxDataset tmp in nullHitboxData)
                        {
                            bac.HitboxTable.Remove(tmp);
                        }
                        FilterScripts(bac.Scripts);
                        FilterScripts(bac.VFXScripts);
                        AELogger.Log(AELogger.O_SEPARATOR, false);

                        return(bac);
                    }
        }
Beispiel #2
0
        public static BACFile FromFilename(string name, BCMFile bcm)
        {
            using (var fs = File.OpenRead(name))
            using (var tracker = new TrackingStream(fs))
            using (var inFile = new BinaryReader(tracker))
            {
                AELogger.Log(AELogger.O_SEPARATOR, false);
                tracker.SetLabel("Header");

                if (new String(inFile.ReadChars(4)) != "#BAC")
                    throw new IOException("Not a valid BAC file");
                tracker.IgnoreBytes(8);
                inFile.BaseStream.Seek(12);

                ushort ScriptCount = inFile.ReadUInt16();
                ushort VFXScriptCount = inFile.ReadUInt16();
                uint HitboxTableSize = inFile.ReadUInt32();
                int ScriptOffset = inFile.ReadInt32();
                int VFXScriptOffset = inFile.ReadInt32();
                int ScriptNameOffset = inFile.ReadInt32();
                int VFXScriptNameOffset = inFile.ReadInt32();
                int HitboxTableOffset = inFile.ReadInt32();

                AELogger.Log("Header done, reading floats");

                var bac = new BACFile();
                for (int i = 0; i < 0x1c; i++)
                {
                    var list = new ObservableCollection<float>();
                    for (int j = 0; j < 6; j++)
                    {
                        list.Add(inFile.ReadSingle());
                    }
                    bac.UnknownFloatData.Add(list);
                }
                AELogger.Log("floats done, reading scripts");

                for (int i = 0; i < ScriptCount; i++)
                    bac.Scripts.Add(new Script(i));
                for (int i = 0; i < VFXScriptCount; i++)
                    bac.VFXScripts.Add(new Script(i));
                for (int i = 0; i < HitboxTableSize; i++)
                    bac.HitboxTable.Add(new HitBoxDataset(i));

                //Link BCM
                if (bcm != null)
                {
                    foreach (BCM.Move move in bcm.Moves)
                        if (move.ScriptIndex != -1)
                            move.Script = bac.Scripts[move.ScriptIndex];
                }
                //Read Scripts
                readScripts(inFile, bac.Scripts, bcm, ScriptCount, ScriptOffset, ScriptNameOffset, bac);
                readScripts(inFile, bac.VFXScripts, bcm, VFXScriptCount, VFXScriptOffset, VFXScriptNameOffset, bac);
                AELogger.Log("scripts done, reading hitboxtable");
                //Read Hitbox Table
                for (int i = 0; i < HitboxTableSize; i++)
                {
                    tracker.SetLabel("HitboxTable#" + i.ToString());
                    inFile.BaseStream.Seek(HitboxTableOffset + i*4);
                    inFile.BaseStream.Seek(inFile.ReadUInt32());
                    if (inFile.BaseStream.Position == 0)
                    {
                        continue;
                    }
                    var dataset = bac.HitboxTable[i];
                    LoadedHitBoxCount = i;
                    for (int j = 0; j < 12; j++)
                    {
                        HitBoxData data = new HitBoxData(j);
                        dataset.Data.Add(data);
                        data.Damage = inFile.ReadInt16();
                        data.Stun = inFile.ReadInt16();
                        data.Effect = (HitBoxData.HitBoxEffect)inFile.ReadUInt16();
                        Util.LogUnkEnum(data.Effect, "Hitbox #" + dataset.Index, "hitboxdataset", j);

                        var index = inFile.ReadInt16() + HitBoxData.getIndexOffset(data.Effect);
                        if (index > -1)
                            data.OnHit = bac.Scripts.Where(x => x.Index == index).First();
                        else
                        {
                            data.OnHit = new Script(index);
                            if (index <= -1)
                            {
                                AELogger.Log("negative index " + index + " in hitboxdata #" + i);
                            }
                        }

                        data.SelfHitstop = inFile.ReadUInt16();
                        data.SelfShaking = inFile.ReadUInt16();
                        data.TgtHitstop = inFile.ReadUInt16();
                        data.TgtShaking = inFile.ReadUInt16();
                        data.HitGFX = inFile.ReadInt16();
                        data.Unknown1 = inFile.ReadInt32();
                        data.Unused = (Unused16)inFile.ReadInt16();
                        data.HitGFX2 = inFile.ReadInt16();
                        data.Unused2 = (Unused32)inFile.ReadInt32();
                        data.Unused3 = (Unused16)inFile.ReadInt16();
                        data.HitSFX = inFile.ReadInt16();
                        data.HitSFX2 = inFile.ReadInt16();
                        data.TgtSFX = inFile.ReadInt16();

                        data.ArcadeScore = inFile.ReadUInt16();
                        data.SelfMeter = inFile.ReadInt16();
                        data.TgtMeter = inFile.ReadInt16();
                        data.JuggleStart = inFile.ReadInt16();
                        data.TgtAnimTime = inFile.ReadInt16();
                        data.MiscFlag = (HitBoxData.MiscFlags)inFile.ReadInt32();
                        data.VelX = inFile.ReadSingle();
                        data.VelY = inFile.ReadSingle();

                        data.VelZ = inFile.ReadSingle();
                        data.PushbackDist = inFile.ReadSingle();
                        data.AccX = inFile.ReadSingle();
                        data.AccY = inFile.ReadSingle();
                        data.AccZ = inFile.ReadSingle();
                    }
                }
                AELogger.Log("hitbox done");
                List<HitBoxDataset> nullHitboxData = bac.HitboxTable.Where(x => x.Data.Count() == 0).ToList();
                foreach (HitBoxDataset tmp in nullHitboxData)
                    bac.HitboxTable.Remove(tmp);
                FilterScripts(bac.Scripts);
                FilterScripts(bac.VFXScripts);
                AELogger.Log(AELogger.O_SEPARATOR, false);

                return bac;
            }
        }
Beispiel #3
0
        public static BCMFile FromFilename(string filename)
        {
            using (var fs = File.OpenRead(filename))
                using (var tracker = new TrackingStream(fs))
                    using (var inFile = new BinaryReader(tracker))
                    {
                        AELogger.Log(AELogger.O_SEPARATOR, false);
                        var bcm = new BCMFile();
                        tracker.SetLabel("Header");
                        var s = new string(inFile.ReadChars(4));
                        //Console.WriteLine("{0} - {1:X} bytes",s,inFile.BaseStream.Length);
                        if (s != "#BCM")
                        {
                            throw new Exception("This is not a valid BCM File!");
                        }
                        tracker.IgnoreBytes(12);
                        inFile.BaseStream.Seek(16);

                        var ChargeCount     = inFile.ReadUInt16();
                        var InputCount      = inFile.ReadUInt16();
                        var MoveCount       = inFile.ReadUInt16();
                        var CancelListCount = inFile.ReadUInt16();
                        for (int i = 0; i < CancelListCount; i++)
                        {
                            bcm.CancelLists.Add(new CancelList());
                        }
                        var ChargeOffset      = inFile.ReadUInt32();
                        var ChargeNamesOffset = inFile.ReadUInt32();

                        var InputOffset      = inFile.ReadUInt32();
                        var InputNamesOffset = inFile.ReadUInt32();

                        var MoveOffset      = inFile.ReadUInt32();
                        var MoveNamesOffset = inFile.ReadUInt32();

                        var CancelListOffset      = inFile.ReadUInt32();
                        var CancelListNamesOffset = inFile.ReadUInt32();

                        #region Read Charges
                        AELogger.Log("Header done, reading charges");
                        tracker.SetLabel("Charges");
                        for (int i = 0; i < ChargeCount; i++)
                        {
                            var charge = new Charge();
                            inFile.BaseStream.Seek(ChargeNamesOffset + i * 4);
                            inFile.BaseStream.Seek(inFile.ReadUInt32());
                            charge.Name = inFile.ReadCString();
                            inFile.BaseStream.Seek(ChargeOffset + i * 16);
                            charge.Input = (Input)inFile.ReadUInt16();
                            Util.LogUnkEnumFlags(charge.Input, "charge", charge.Name);
                            charge.Unknown1  = inFile.ReadUInt16();
                            charge.MoveFlags = (MoveFlags)inFile.ReadUInt16();
                            Util.LogUnkEnumFlags(charge.MoveFlags, "charge", charge.Name);
                            charge.Frames       = inFile.ReadUInt32();
                            charge.Unknown3     = inFile.ReadUInt16();
                            charge.StorageIndex = inFile.ReadUInt32();
                            //Console.WriteLine(charge);
                            bcm.Charges.Add(charge);
                        }

                        #endregion

                        #region Read Inputs
                        AELogger.Log("charges done, reading motions");
                        tracker.SetLabel("Inputs");
                        bcm.InputMotions.Add(InputMotion.NONE);
                        for (int i = 0; i < InputCount; i++)
                        {
                            var inputMotion = new InputMotion("tmp");
                            inFile.BaseStream.Seek(InputNamesOffset + i * 4);
                            inFile.BaseStream.Seek(inFile.ReadUInt32());
                            inputMotion.Name = inFile.ReadCString();
                            //Console.WriteLine(inputMotion.Name);

                            inFile.BaseStream.Seek(InputOffset + i * 0xC4);
                            var cnt = inFile.ReadUInt32();
                            for (int j = 0; j < cnt; j++)
                            {
                                var entry = new InputMotionEntry();
                                entry.Type = (InputType)inFile.ReadUInt16();
                                Util.LogUnkEnum(entry.Type, "motion", inputMotion.Name, j);

                                entry.Buffer = inFile.ReadUInt16();
                                System.UInt16 a = inFile.ReadUInt16();
                                if (entry.Type == InputType.CHARGE)
                                {
                                    entry.Charge = bcm.Charges[a];
                                }
                                entry.Input = (Input)a;
                                Util.LogUnkEnum(entry.Input, "motion", inputMotion.Name, j);

                                entry.MoveFlags = (MoveFlags)inFile.ReadUInt16();
                                Util.LogUnkEnumFlags(entry.MoveFlags, "motion", inputMotion.Name, j);

                                entry.Flags = (InputReqType)inFile.ReadUInt16();
                                Util.LogUnkEnum(entry.Flags, "motion", inputMotion.Name, j);
                                entry.Requirement = inFile.ReadUInt16();
                                inputMotion.Entries.Add(entry);
                                //Console.WriteLine(entry);
                            }
                            tracker.IgnoreBytes(12 * (16 - cnt));
                            bcm.InputMotions.Add(inputMotion);
                        }

                        #endregion

                        #region Read Moves
                        AELogger.Log("motions done, reading moves");
                        tracker.SetLabel("Moves");
                        for (int i = 0; i < MoveCount; i++)
                        {
                            var move = new Move();
                            inFile.BaseStream.Seek(MoveNamesOffset + i * 4);
                            inFile.BaseStream.Seek(inFile.ReadUInt32());
                            move.Name = inFile.ReadCString();
                            //Console.WriteLine(move.Name);

                            inFile.BaseStream.Seek(MoveOffset + i * 0x54);

                            move.Input = (Input)inFile.ReadUInt16();
                            Util.LogUnkEnumFlags(move.Input, "move", move.Name);

                            move.MoveFlags = (MoveFlags)inFile.ReadUInt16();
                            Util.LogUnkEnumFlags(move.MoveFlags, "move", move.Name);

                            move.PositionRestriction = (PositionRestriction)inFile.ReadUInt16();
                            Util.LogUnkEnum(move.PositionRestriction, "move", move.Name);

                            move.Restriction = (MoveRestriction)inFile.ReadUInt16();
                            Util.LogUnkEnumFlags(move.MoveFlags, "move", move.Name);

                            move.Unk1 = inFile.ReadUInt16();

                            move.StateRestriction = (Move.MoveStateRestriction)inFile.ReadUInt16();
                            Util.LogUnkEnum(move.StateRestriction, "move", move.Name);

                            move.MiscRestriction = (Move.MoveMiscRestriction)inFile.ReadUInt32();
                            Util.LogUnkEnum(move.MiscRestriction, "move", move.Name);

                            move.UltraRestriction = (Move.MoveUltraRestriction)inFile.ReadUInt32();
                            Util.LogUnkEnum(move.UltraRestriction, "move", move.Name);

                            move.PositionRestrictionDistance = inFile.ReadSingle();
                            move.EXRequirement    = inFile.ReadInt16();
                            move.EXCost           = inFile.ReadInt16();
                            move.UltraRequirement = inFile.ReadInt16();
                            move.UltraCost        = inFile.ReadInt16();
                            var index = inFile.ReadInt32();
                            if (index != -1 && index < bcm.InputMotions.Count)
                            {
                                move.InputMotion = bcm.InputMotions[index + 1];
                            }
                            else
                            {
                                move.InputMotion = InputMotion.NONE;
                            }
                            move.ScriptIndex = inFile.ReadInt32();

                            /* AI data */
                            move.Features = (MoveFeatureFlags)inFile.ReadUInt32();
                            Util.LogUnkEnumFlags(move.Features, "move", move.Name);

                            move.CpuMinRange    = inFile.ReadSingle();
                            move.CpuMaxRange    = inFile.ReadSingle();
                            move.Unk2           = inFile.ReadUInt32();
                            move.Unk3           = inFile.ReadUInt16();
                            move.CpuPassiveMove = inFile.ReadUInt16();
                            move.CpuCounterMove = inFile.ReadUInt16();
                            move.CpuVsStand     = inFile.ReadUInt16();
                            move.CpuVsCrouch    = inFile.ReadUInt16();
                            move.CpuVsAir       = inFile.ReadUInt16();
                            move.CpuVsDown      = inFile.ReadUInt16();
                            move.CpuVsStunned   = inFile.ReadUInt16();
                            move.CpuProbeMove   = inFile.ReadUInt16();
                            move.CpuVsVeryClose = inFile.ReadUInt16();
                            move.CpuVsClose     = inFile.ReadUInt16();
                            move.CpuVsMidRange  = inFile.ReadUInt16();
                            move.CpuVsFar       = inFile.ReadUInt16();
                            move.CpuVsVeryFar   = inFile.ReadUInt16();

                            bcm.Moves.Add(move);
                        }

                        #endregion

                        #region ReadCancels
                        AELogger.Log("moves done, reading cancels");
                        tracker.SetLabel("Cancels");
                        for (int i = 0; i < CancelListCount; i++)
                        {
                            var cl = bcm.CancelLists[i];
                            inFile.BaseStream.Seek(CancelListNamesOffset + i * 4);
                            inFile.BaseStream.Seek(inFile.ReadUInt32());
                            cl.Name = inFile.ReadCString();
                            //Console.WriteLine(cl.Name);

                            inFile.BaseStream.Seek(CancelListOffset + i * 0x8);
                            var count = inFile.ReadUInt32();
                            var off   = inFile.ReadUInt32();
                            inFile.BaseStream.Seek(off - 8, SeekOrigin.Current);
                            for (int j = 0; j < count; j++)
                            {
                                var x = inFile.ReadInt16();
                                //Console.WriteLine(x);
                                if (x == -1)
                                {
                                    cl.Moves.Add(Move.NULL);
                                }
                                else if (x < bcm.Moves.Count)
                                {
                                    cl.Moves.Add(bcm.Moves[x]);
                                }
                                else
                                {
                                    AELogger.Log("WARNING: Out of range move detected!!!!");
                                }
                            }
                        }
                        AELogger.Log("cancels done");
                        #endregion

                        ////Console.WriteLine(tracker.Report());
                        AELogger.Log(AELogger.O_SEPARATOR, false);
                        return(bcm);
                    }
        }
Beispiel #4
0
        public static BCMFile FromFilename(string filename)
        {
            using (var fs = File.OpenRead(filename))
            using (var tracker = new TrackingStream(fs))
            using (var inFile = new BinaryReader(tracker))
            {
                AELogger.Log(AELogger.O_SEPARATOR, false);
                var bcm = new BCMFile();
                tracker.SetLabel("Header");
                var s = new string(inFile.ReadChars(4));
                //Console.WriteLine("{0} - {1:X} bytes",s,inFile.BaseStream.Length);
                if (s != "#BCM")
                    throw new Exception("This is not a valid BCM File!");
                tracker.IgnoreBytes(12);
                inFile.BaseStream.Seek(16);

                var ChargeCount = inFile.ReadUInt16();
                var InputCount = inFile.ReadUInt16();
                var MoveCount = inFile.ReadUInt16();
                var CancelListCount = inFile.ReadUInt16();
                for (int i = 0; i < CancelListCount; i++)
                    bcm.CancelLists.Add(new CancelList());
                var ChargeOffset = inFile.ReadUInt32();
                var ChargeNamesOffset = inFile.ReadUInt32();

                var InputOffset = inFile.ReadUInt32();
                var InputNamesOffset = inFile.ReadUInt32();

                var MoveOffset = inFile.ReadUInt32();
                var MoveNamesOffset = inFile.ReadUInt32();

                var CancelListOffset = inFile.ReadUInt32();
                var CancelListNamesOffset = inFile.ReadUInt32();

                #region Read Charges
                AELogger.Log("Header done, reading charges");
                tracker.SetLabel("Charges");
                for (int i = 0; i < ChargeCount; i++)
                {
                    var charge = new Charge();
                    inFile.BaseStream.Seek(ChargeNamesOffset + i*4);
                    inFile.BaseStream.Seek(inFile.ReadUInt32());
                    charge.Name = inFile.ReadCString();
                    inFile.BaseStream.Seek(ChargeOffset + i*16);
                    charge.Input = (Input)inFile.ReadUInt16();
                    Util.LogUnkEnumFlags(charge.Input, "charge", charge.Name);
                    charge.Unknown1 = inFile.ReadUInt16();
                    charge.MoveFlags = (MoveFlags)inFile.ReadUInt16();
                    Util.LogUnkEnumFlags(charge.MoveFlags, "charge", charge.Name);
                    charge.Frames = inFile.ReadUInt32();
                    charge.Unknown3 = inFile.ReadUInt16();
                    charge.StorageIndex = inFile.ReadUInt32();
                    //Console.WriteLine(charge);
                    bcm.Charges.Add(charge);
                }

                #endregion

                #region Read Inputs
                AELogger.Log("charges done, reading motions");
                tracker.SetLabel("Inputs");
                bcm.InputMotions.Add(InputMotion.NONE);
                for (int i = 0; i < InputCount; i++)
                {
                    var inputMotion = new InputMotion("tmp");
                    inFile.BaseStream.Seek(InputNamesOffset + i*4);
                    inFile.BaseStream.Seek(inFile.ReadUInt32());
                    inputMotion.Name = inFile.ReadCString();
                    //Console.WriteLine(inputMotion.Name);

                    inFile.BaseStream.Seek(InputOffset + i*0xC4);
                    var cnt = inFile.ReadUInt32();
                    for (int j = 0; j < cnt; j++)
                    {
                        var entry = new InputMotionEntry();
                        entry.Type = (InputType)inFile.ReadUInt16();
                        Util.LogUnkEnum(entry.Type, "motion", inputMotion.Name, j);

                        entry.Buffer = inFile.ReadUInt16();
                        System.UInt16 a = inFile.ReadUInt16();
                        if (entry.Type == InputType.CHARGE)
                            entry.Charge = bcm.Charges[a];
                        entry.Input = (Input)a;
                        Util.LogUnkEnum(entry.Input, "motion", inputMotion.Name, j);

                        entry.MoveFlags = (MoveFlags)inFile.ReadUInt16();
                        Util.LogUnkEnumFlags(entry.MoveFlags, "motion", inputMotion.Name, j);

                        entry.Flags = (InputReqType)inFile.ReadUInt16();
                        Util.LogUnkEnum(entry.Flags, "motion", inputMotion.Name, j);
                        entry.Requirement = inFile.ReadUInt16();
                        inputMotion.Entries.Add(entry);
                        //Console.WriteLine(entry);

                    }
                    tracker.IgnoreBytes(12*(16 - cnt));
                    bcm.InputMotions.Add(inputMotion);
                }

                #endregion

                #region Read Moves
                AELogger.Log("motions done, reading moves");
                tracker.SetLabel("Moves");
                for (int i = 0; i < MoveCount; i++)
                {
                    var move = new Move();
                    inFile.BaseStream.Seek(MoveNamesOffset + i*4);
                    inFile.BaseStream.Seek(inFile.ReadUInt32());
                    move.Name = inFile.ReadCString();
                    //Console.WriteLine(move.Name);

                    inFile.BaseStream.Seek(MoveOffset + i*0x54);

                    move.Input = (Input)inFile.ReadUInt16();
                    Util.LogUnkEnumFlags(move.Input, "move", move.Name);

                    move.MoveFlags = (MoveFlags)inFile.ReadUInt16();
                    Util.LogUnkEnumFlags(move.MoveFlags, "move", move.Name);

                    move.PositionRestriction = (PositionRestriction)inFile.ReadUInt16();
                    Util.LogUnkEnum(move.PositionRestriction, "move", move.Name);

                    move.Restriction = (MoveRestriction)inFile.ReadUInt16();
                    Util.LogUnkEnumFlags(move.MoveFlags, "move", move.Name);

                    move.Unk1 = inFile.ReadUInt16();

                    move.StateRestriction = (Move.MoveStateRestriction)inFile.ReadUInt16();
                    Util.LogUnkEnum(move.StateRestriction, "move", move.Name);

                    move.MiscRestriction = (Move.MoveMiscRestriction)inFile.ReadUInt32();
                    Util.LogUnkEnum(move.MiscRestriction, "move", move.Name);

                    move.UltraRestriction = (Move.MoveUltraRestriction)inFile.ReadUInt32();
                    Util.LogUnkEnum(move.UltraRestriction, "move", move.Name);

                    move.PositionRestrictionDistance = inFile.ReadSingle();
                    move.EXRequirement = inFile.ReadInt16();
                    move.EXCost = inFile.ReadInt16();
                    move.UltraRequirement = inFile.ReadInt16();
                    move.UltraCost = inFile.ReadInt16();
                    var index = inFile.ReadInt32();
                    if (index != -1 && index < bcm.InputMotions.Count)
                        move.InputMotion = bcm.InputMotions[index + 1];
                    else
                        move.InputMotion = InputMotion.NONE;
                    move.ScriptIndex = inFile.ReadInt32();

                    /* AI data */
                    move.Features = (MoveFeatureFlags)inFile.ReadUInt32();
                    Util.LogUnkEnumFlags(move.Features, "move", move.Name);

                    move.CpuMinRange = inFile.ReadSingle();
                    move.CpuMaxRange = inFile.ReadSingle();
                    move.Unk2 = inFile.ReadUInt32();
                    move.Unk3 = inFile.ReadUInt16();
                    move.CpuPassiveMove = inFile.ReadUInt16();
                    move.CpuCounterMove = inFile.ReadUInt16();
                    move.CpuVsStand = inFile.ReadUInt16();
                    move.CpuVsCrouch = inFile.ReadUInt16();
                    move.CpuVsAir = inFile.ReadUInt16();
                    move.CpuVsDown = inFile.ReadUInt16();
                    move.CpuVsStunned = inFile.ReadUInt16();
                    move.CpuProbeMove = inFile.ReadUInt16();
                    move.CpuVsVeryClose = inFile.ReadUInt16();
                    move.CpuVsClose = inFile.ReadUInt16();
                    move.CpuVsMidRange = inFile.ReadUInt16();
                    move.CpuVsFar = inFile.ReadUInt16();
                    move.CpuVsVeryFar = inFile.ReadUInt16();

                    bcm.Moves.Add(move);
                }

                #endregion

                #region ReadCancels
                AELogger.Log("moves done, reading cancels");
                tracker.SetLabel("Cancels");
                for (int i = 0; i < CancelListCount; i++)
                {
                    var cl = bcm.CancelLists[i];
                    inFile.BaseStream.Seek(CancelListNamesOffset + i*4);
                    inFile.BaseStream.Seek(inFile.ReadUInt32());
                    cl.Name = inFile.ReadCString();
                    //Console.WriteLine(cl.Name);

                    inFile.BaseStream.Seek(CancelListOffset + i*0x8);
                    var count = inFile.ReadUInt32();
                    var off = inFile.ReadUInt32();
                    inFile.BaseStream.Seek(off - 8, SeekOrigin.Current);
                    for (int j = 0; j < count; j++)
                    {
                        var x = inFile.ReadInt16();
                        //Console.WriteLine(x);
                        if (x == -1)
                        {
                            cl.Moves.Add(Move.NULL);
                        }
                        else if (x < bcm.Moves.Count)
                        {
                            cl.Moves.Add(bcm.Moves[x]);
                        }
                        else
                        {
                            AELogger.Log("WARNING: Out of range move detected!!!!");
                        }
                    }
                }
                AELogger.Log("cancels done");
                #endregion

                ////Console.WriteLine(tracker.Report());
                AELogger.Log(AELogger.O_SEPARATOR, false);
                return bcm;
            }
        }