コード例 #1
0
ファイル: ImageUtilAP.cs プロジェクト: laqieer/FEBuilderGBA
        AnimeArr ParseAnime(uint addr)
        {
            AnimeArr arr = new AnimeArr();

            arr.Animes = new List <Anime>();

            for (; ; addr += 4)
            {
                if (!U.isSafetyOffset(addr + 2 - 1))
                {//おかしなデータ
                    this.ErrorMessage = R.Error("APのデータ({0})が壊れています。Animeをスキャン中に、ROM終端を超えました。({1} @ {2})", U.To0xHexString(this.BaseAddr), U.To0xHexString(addr), arr.Animes.Count);
                    return(null);
                }

                Anime a = new Anime();
                a.Wait  = Program.ROM.u16(addr + 0);
                a.Frame = Program.ROM.u16(addr + 2);
                arr.Animes.Add(a);
                if (a.Wait == 0)
                {//アニメ終端
                    break;
                }
            }
            addr += 4;
            UpdateLength(addr);
            return(arr);
        }
コード例 #2
0
ファイル: ImageUtilAP.cs プロジェクト: laqieer/FEBuilderGBA
        public bool Parse(uint addr)
        {
            this.BaseAddr = addr;
            if (!U.isSafetyOffset(addr + 4 - 1))
            {//おかしなデータ
                this.ErrorMessage = R.Error("APのデータ({0})が壊れています。ヘッダがROM終端を超えています", U.To0xHexString(this.BaseAddr));
                return(false);
            }

            uint frameDataOffset  = Program.ROM.u16(addr);
            uint animeTableOffset = Program.ROM.u16(addr + 2);

            UpdateLength(addr + 4);

            //終端マークが存在しないので、読込むときには工夫が必要.
            uint minData = 0xFFFF;

            //フレームはアニメ開始地点まで
            uint end = this.BaseAddr + animeTableOffset;

            if (!U.isSafetyOffset(end - 1))
            {//おかしなデータ
                this.ErrorMessage = R.Error("APのデータ({0})が壊れています。フレーム終端がROM終端を超えました。({1})", U.To0xHexString(this.BaseAddr), U.To0xHexString(addr));
                return(false);
            }

            for (addr = this.BaseAddr + frameDataOffset; addr < end; addr += 2)
            {
                uint f = Program.ROM.u16(addr);
                if (minData > f)
                {
                    minData = f;
                }
                FrameArr farr = ParseFrame(this.BaseAddr + frameDataOffset + f);
                if (farr == null)
                {
                    return(false);
                }
                FrameArray.Add(farr);
            }

            if (minData >= 0x100)
            {//おかしなデータ
                this.ErrorMessage = R.Error("APのデータ({0})が壊れています。Animeデータの個数がありえない数です({1})。", U.To0xHexString(this.BaseAddr), minData);
                return(false);
            }

            //アニメの終了地点は最初のフレームの開始位置まで
            end = this.BaseAddr + frameDataOffset + minData;
            if (!U.isSafetyOffset(end - 1))
            {//おかしなデータ
                this.ErrorMessage = R.Error("APのデータ({0})が壊れています。Anime終端がROM終端を超えました。({1})", U.To0xHexString(this.BaseAddr), U.To0xHexString(addr));
                return(false);
            }

            for (addr = this.BaseAddr + animeTableOffset; addr < end; addr += 2)
            {
                uint a = Program.ROM.u16(addr);

                AnimeArr aarr = ParseAnime(this.BaseAddr + animeTableOffset + a);
                if (aarr == null)
                {
                    return(false);
                }
                AnimeArray.Add(aarr);
            }

            UpdateLength(addr);
            return(true);
        }