private void AddressList_SelectedIndexChanged(object sender, EventArgs e) { this.Tracks = SongUtil.ParseTrack((uint)Address.Value, (uint)B0.Value); for (int i = 0; i < this.TrackListBoxs.Length; i++) { if (Tracks.Count > i) { SongUtil.TrackToListBox(this.TrackListBoxs[i], Tracks[i]); InputFormRef.markupJumpLabel(this.TrackLabels[i]); } else { this.TrackListBoxs[i].Items.Clear(); InputFormRef.unmarkupJumpLabel(this.TrackLabels[i]); } } if (this.Tracks.Count >= 12) {//このトラックは再生できますか? if (Program.ROM.RomInfo.version() >= 7 && Program.ROM.RomInfo.version() <= 8) { HowDoYouLikePatchForm.CheckAndShowPopupDialog(HowDoYouLikePatchForm.TYPE.Track12_Over_By_SongTrack); } } }
public static void MakeCheckError(List <FELint.ErrorSt> errors, uint songid, uint songaddr, bool isMapBGM) { if (songaddr == 0) { return; } if (!U.isSafetyOffset(songaddr)) { return; } uint trackCount = Program.ROM.u8(songaddr + 0); if (songid == 0) { if (trackCount != 0) { errors.Add(new FELint.ErrorSt(FELint.Type.SONGTRACK, songaddr , R._("SongID {0}のトラックは常に0である必要があります。現在値:{1}", U.To0xHexString(songid), U.To0xHexString(trackCount)), songid)); } return; } if (trackCount > 16) { errors.Add(new FELint.ErrorSt(FELint.Type.SONGTRACK, songaddr , R._("SongID {0}のトラックは常に16以内である必要があります。現在値:{1}", U.To0xHexString(songid), U.To0xHexString(trackCount)), songid)); } if (trackCount == 0) {//トラック数が0のダミートラックの場合、チェックしない return; } //楽器のチェック uint instPointer = Program.ROM.u32(songaddr + 4); if (!U.isSafetyPointer(instPointer)) {//無効なポインタ errors.Add(new FELint.ErrorSt(FELint.Type.SONGTRACK, U.toOffset(songaddr) , R._("SongID {0}の楽器ポインタ「{1}」は無効です。", U.To0xHexString(songid), U.To0xHexString(instPointer)), songid)); return; } //他のゲームからインポートした楽器は、複雑すぎて誤爆するのでEOTの検出するの辞めようと思いました bool othergame_song = SongInstrumentForm.IsOtherGameInst(instPointer); if (othergame_song) { isMapBGM = false; } //トラックのポインタチェック List <SongUtil.Track> tracks = SongUtil.ParseTrack(songaddr, trackCount); for (uint tracknumber = 0; tracknumber < trackCount; tracknumber++) { uint trackAddr = songaddr + 8 + (tracknumber * 4); uint trackPointer = Program.ROM.u32(trackAddr); if (!U.isSafetyPointer(trackPointer)) {//無効なポインタ errors.Add(new FELint.ErrorSt(FELint.Type.SONGTRACK, U.toOffset(songaddr) , R._("SongID {0}のトラック{1}のポインタ「{2}」は無効です。\r\nトラック数が間違っていませんか?", U.To0xHexString(songid), tracknumber, U.To0xHexString(trackPointer)), songid)); continue; } if (tracknumber >= tracks.Count) { continue; } SongUtil.Track track = tracks[(int)tracknumber]; SongUtil.MakeCheckError(errors, track, U.toOffset(instPointer), songaddr, songid, tracknumber, isMapBGM); } }