Ejemplo n.º 1
0
        public void Init(uint instaddr, SongUtil.Track track)
        {
            this.SongInstrumentList     = SongInstrumentForm.MakeList(instaddr);
            this.ChangeVoices           = SongUtil.GetVoices(track);
            this.VolNumericUpDown.Value = 0;
            this.PanNumericUpDown.Value = 0;

            this.VoiceListbox.BeginUpdate();
            for (int i = 0; i < this.ChangeVoices.Count; i++)
            {
                string v = GetVoiceName(this.ChangeVoices[i]);
                this.VoiceListbox.Items.Add(v);
            }
            this.VoiceListbox.EndUpdate();

            this.Address.Value = Program.ROM.p32((uint)track.basepointer);
        }
Ejemplo n.º 2
0
        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);
            }
        }