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); }
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); }