public void JumpToPlist(uint anime2_plist)
        {
            int  selected = -1;
            uint addr     = U.NOT_FOUND;

            for (int i = 0; i < FilterComboBox.Items.Count; i++)
            {
                U.AddrResult ar = InputFormRef.SelectToAddrResult(FilterComboBox, i);
                if (ar.isNULL())
                {
                    continue;
                }
                if (ar.tag == anime2_plist)
                {//一致
                    selected = i;
                    addr     = ar.addr;
                    break;
                }
            }
            if (addr == U.NOT_FOUND)
            {
                return;
            }

            FilterComboBox.SelectedIndex = selected;
            this.InputFormRef.ReInit(addr);
        }
        private void FilterComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.InputFormRef == null)
            {
                return;
            }

            U.AddrResult ar = InputFormRef.SelectToAddrResult(FilterComboBox, FilterComboBox.SelectedIndex);
            if (ar.isNULL())
            {
                return;
            }
            //サンプルのマップを表示します.
            uint mapmax = MapSettingForm.GetDataCount();

            for (uint i = 0; i < mapmax; i++)
            {
                MapSettingForm.PLists plist = MapSettingForm.GetMapPListsWhereMapID(i);
                if (plist.anime2_plist == ar.tag)
                {
                    this.MapPictureBox.LoadMap(i);
                    break;
                }
            }

            this.InputFormRef.ReInit(ar.addr);
        }
        private void TextWriteButton_Click(object sender, EventArgs e)
        {
            U.AddrResult ar = InputFormRef.SelectToAddrResult(AddressList, AddressList.SelectedIndex);
            if (ar.isNULL())
            {
                return;
            }

            byte[] stringbyte = Program.SystemTextEncoder.Encode(TextBox.Text);
            stringbyte = U.ArrayAppend(stringbyte, new byte[] { 0x00 });

            string undoname = this.Text + ":" + U.ToHexString(this.AddressList.SelectedIndex);

            Undo.UndoData undodata = Program.Undo.NewUndoData(undoname);

            uint writeAddr = InputFormRef.WriteBinaryDataPointer(this
                                                                 , ar.addr
                                                                 , stringbyte
                                                                 , PatchUtil.get_data_pos_callback
                                                                 , undodata
                                                                 );

            Program.Undo.Push(undodata);
            InputFormRef.ShowWriteNotifyAnimation(this, writeAddr);

            UpdateAddressList();
        }
        private void AddressList_SelectedIndexChanged(object sender, EventArgs e)
        {
            U.AddrResult ar = InputFormRef.SelectToAddrResult(this.AddressList);
            if (ar.isNULL())
            {
                this.FlagNameTextBox.Text = "";
                return;
            }

            this.FlagNameTextBox.Text = ar.name;
            DeleteButton.Visible      = (this.BaseFlag[ar.addr] != ar.name);
        }
        private void DeleteButton_Click(object sender, EventArgs e)
        {
            this.FlagNameTextBox.Text = "";
            WriteButton.PerformClick();

            //元に戻す.
            U.AddrResult ar = InputFormRef.SelectToAddrResult(this.AddressList);
            if (ar.isNULL())
            {
                return;
            }
            this.FlagNameTextBox.Text = this.BaseFlag[ar.addr];
        }
        private void WriteButton_Click(object sender, EventArgs e)
        {
            U.AddrResult ar = InputFormRef.SelectToAddrResult(this.AddressList);
            if (ar.isNULL())
            {
                return;
            }
            string name = this.FlagNameTextBox.Text;

            if (this.BaseFlag[ar.addr] == name)
            {
                return;
            }
            Program.FlagCache.Update(ar.addr, name, this.BaseFlag[ar.addr]);

            //読み直し.
            Init();
            //再選択
            U.ReSelectList(this.AddressList);

            InputFormRef.ShowWriteNotifyAnimation(this, U.NOT_FOUND);
        }
Beispiel #7
0
        string MakEA2String(InputFormRef ifr, uint target)
        {
            List <Control>     controls = InputFormRef.GetAllControls(ifr.SelfForm);
            ListBox            listbox  = ifr.AddressList;
            List <NameMapping> dic      = MakeStruct(ifr, controls);

            StringBuilder sb = new StringBuilder();

            sb.Append("//");
            foreach (NameMapping nm in dic)
            {
                string comment = nm.GetName();

                sb.Append("\t");
                if (nm.TypeName[0] == 'b')
                {
                    sb.Append(comment);
                }
                else if (nm.TypeName[0] == 'l')
                {
                    sb.Append(comment);
                }
                else if (nm.TypeName[0] == 'h')
                {
                }
                else if (nm.TypeName[0] == 'B')
                {
                    sb.Append(comment);
                }
                else if (nm.TypeName[0] == 'W')
                {
                    sb.Append(comment);
                }
                else if (nm.TypeName[0] == 'D')
                {
                    sb.Append(comment);
                }
                else if (nm.TypeName[0] == 'P')
                {
                    sb.Append(comment);
                }
            }

            U.AddrResult[] addr_array;
            if (target == U.NOT_FOUND)
            {
                addr_array = new U.AddrResult[ifr.DataCount];
                for (int i = 0; i < ifr.DataCount; i++)
                {
                    addr_array[i] = InputFormRef.SelectToAddrResult(listbox, i);
                }
            }
            else
            {
                addr_array = new U.AddrResult[] { InputFormRef.SelectToAddrResult(listbox, (int)target) };
            }
            sb.AppendLine("");
            sb.AppendLine("PUSH");
            sb.AppendLine("ORG " + U.To0xHexString(addr_array[0].addr));
            string lastData = "";

            for (int i = 0; i < addr_array.Length; i++)
            {
                string       line = "";
                U.AddrResult ar   = addr_array[i];
                if (ar.isNULL())
                {
                    continue;
                }
                uint addr = ar.addr;
                foreach (NameMapping nm in dic)
                {
                    if (nm.TypeName[0] == 'b')
                    {
                        if (lastData != "BYTE")
                        {
                            lastData = "BYTE";
                            line    += ";" + lastData;
                        }
                        line += " ";
                        uint v = Program.ROM.u8(addr + nm.Id);
                        if (nm.Value.Hexadecimal)
                        {
                            line += U.To0xHexString(v);
                        }
                        else
                        {
                            line += (sbyte)v;
                        }
                    }
                    else if (nm.TypeName[0] == 'l')
                    {
                        if (lastData != "BYTE")
                        {
                            lastData = "BYTE";
                            line    += ";" + lastData;
                        }
                        line += " ";
                        uint v = Program.ROM.u8(addr + nm.Id);
                        if (nm.Value.Hexadecimal)
                        {
                            line += U.To0xHexString(v);
                        }
                        else
                        {
                            line += (sbyte)v;
                        }
                    }
                    else if (nm.TypeName[0] == 'h')
                    {
                    }
                    else if (nm.TypeName[0] == 'B')
                    {
                        if (lastData != "BYTE")
                        {
                            lastData = "BYTE";
                            line    += ";" + lastData;
                        }
                        line += " ";

                        uint v = Program.ROM.u8(addr + nm.Id);
                        if (nm.Value.Hexadecimal)
                        {
                            line += U.To0xHexString(v);
                        }
                        else
                        {
                            line += v;
                        }
                    }
                    else if (nm.TypeName[0] == 'W')
                    {
                        if (lastData != "SHORT")
                        {
                            lastData = "SHORT";
                            line    += ";" + lastData;
                        }
                        line += " ";

                        uint v = Program.ROM.u16(addr + nm.Id);
                        if (nm.Value.Hexadecimal)
                        {
                            line += U.To0xHexString(v);
                        }
                        else
                        {
                            line += v;
                        }
                    }
                    else if (nm.TypeName[0] == 'D')
                    {
                        if (lastData != "WORD")
                        {
                            lastData = "WORD";
                            line    += ";" + lastData;
                        }
                        line += " ";

                        uint v = Program.ROM.u32(addr + nm.Id);
                        if (nm.Value.Hexadecimal)
                        {
                            line += U.To0xHexString(v);
                        }
                        else
                        {
                            line += v;
                        }
                    }
                    else if (nm.TypeName[0] == 'P')
                    {
                        if (lastData != "POIN")
                        {
                            lastData = "POIN";
                            line    += ";" + lastData;
                        }
                        line += " ";

                        uint v = Program.ROM.p32(addr + nm.Id);
                        if (nm.Value.Hexadecimal)
                        {
                            line += U.To0xHexString(v);
                        }
                        else
                        {
                            line += v;
                        }
                    }
                }
                line     = line + " " + "//" + ar.name;
                lastData = "";
                sb.AppendLine(U.substr(line, 1));
            }
            sb.AppendLine("POP");
            return(sb.ToString());
        }
Beispiel #8
0
        string MakeTSVString(InputFormRef ifr, bool isCSV)
        {
            List <Control>     controls = InputFormRef.GetAllControls(ifr.SelfForm);
            ListBox            listbox  = ifr.AddressList;
            List <NameMapping> dic      = MakeStruct(ifr, controls);

            StringBuilder sb = new StringBuilder();

            sb.Append(U.To0xHexString(ifr.BaseAddress));
            foreach (NameMapping nm in dic)
            {
                string comment = nm.GetName();
                if (isCSV)
                {
                    sb.Append(",");
                    comment = U.EncloseDoubleQuotesIfNeed(comment);
                }
                else
                {
                    sb.Append("\t");
                }

                if (nm.TypeName[0] == 'b')
                {
                    sb.Append(comment);
                }
                else if (nm.TypeName[0] == 'l')
                {
                    sb.AppendLine(comment);
                }
                else if (nm.TypeName[0] == 'h')
                {
                }
                else if (nm.TypeName[0] == 'B')
                {
                    sb.Append(comment);
                }
                else if (nm.TypeName[0] == 'W')
                {
                    sb.Append(comment);
                }
                else if (nm.TypeName[0] == 'D')
                {
                    sb.Append(comment);
                }
                else if (nm.TypeName[0] == 'P')
                {
                    sb.Append(comment);
                }
            }

            U.AddrResult[] addr_array;
            addr_array = new U.AddrResult[ifr.DataCount];
            for (int i = 0; i < ifr.DataCount; i++)
            {
                addr_array[i] = InputFormRef.SelectToAddrResult(listbox, i);
            }
            sb.AppendLine("");

            for (int i = 0; i < addr_array.Length; i++)
            {
                U.AddrResult ar = addr_array[i];
                if (ar.isNULL())
                {
                    continue;
                }

                if (isCSV)
                {
                    sb.Append(U.EncloseDoubleQuotesIfNeed(ar.name));
                }
                else
                {
                    sb.Append(ar.name);
                }
                uint addr = ar.addr;
                foreach (NameMapping nm in dic)
                {
                    if (isCSV)
                    {
                        sb.Append(",");
                    }
                    else
                    {
                        sb.Append("\t");
                    }

                    if (nm.TypeName[0] == 'b')
                    {
                        uint v = Program.ROM.u8(addr + nm.Id);
                        sb.Append(U.To0xHexString(v));
                    }
                    else if (nm.TypeName[0] == 'l')
                    {
                        uint v = Program.ROM.u8(addr + nm.Id);
                        sb.Append(U.To0xHexString(v));
                    }
                    else if (nm.TypeName[0] == 'h')
                    {
                    }
                    else if (nm.TypeName[0] == 'B')
                    {
                        uint v = Program.ROM.u8(addr + nm.Id);
                        sb.Append(U.To0xHexString(v));
                    }
                    else if (nm.TypeName[0] == 'W')
                    {
                        uint v = Program.ROM.u16(addr + nm.Id);
                        sb.Append(U.To0xHexString(v));
                    }
                    else if (nm.TypeName[0] == 'D')
                    {
                        uint v = Program.ROM.u32(addr + nm.Id);
                        sb.Append(U.To0xHexString(v));
                    }
                    else if (nm.TypeName[0] == 'P')
                    {
                        uint v = Program.ROM.p32(addr + nm.Id);
                        sb.Append(U.To0xHexString(v));
                    }
                }
                sb.AppendLine("");
            }
            return(sb.ToString());
        }
        static void ExportAllLow(string filename, uint voca_baseaddress, bool isNest)
        {
            voca_baseaddress = U.toOffset(voca_baseaddress);
            if (!U.isSafetyOffset(voca_baseaddress))
            {
                return;
            }

            string dir      = Path.GetDirectoryName(filename);
            string basename = Path.GetFileNameWithoutExtension(filename);

            //楽器リスト本体
            InputFormRef InputFormRef = Init(null);

            InputFormRef.ReInit(voca_baseaddress);

            List <string> lines = new List <string>();

            uint voca_endaddress = voca_baseaddress + ((InputFormRef.DataCount + 1) * InputFormRef.BlockSize);
            uint addr            = voca_baseaddress;

            for (int i = 0; i < InputFormRef.DataCount; i++, addr += InputFormRef.BlockSize)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(U.ToHexString(Program.ROM.u8(addr + 0))); sb.Append("\t");
                sb.Append(U.ToHexString(Program.ROM.u8(addr + 1))); sb.Append("\t");
                sb.Append(U.ToHexString(Program.ROM.u8(addr + 2))); sb.Append("\t");
                sb.Append(U.ToHexString(Program.ROM.u8(addr + 3))); sb.Append("\t");

                uint type = Program.ROM.u8(addr);
                if (type == 0x00 ||
                    type == 0x08 ||
                    type == 0x10 ||
                    type == 0x18
                    )
                {//directsound waveデータ.
                    uint songdata_addr = Program.ROM.p32(addr + 4);
                    if (!U.isSafetyOffset(songdata_addr))
                    {
                        continue;
                    }
                    uint sample_length = Program.ROM.u32(songdata_addr + 12);
                    if (!U.isSafetyLength(songdata_addr + 12 + 4, sample_length))
                    {
                        continue;
                    }
                    if (!SongUtil.IsDirectSoundData(Program.ROM.Data, songdata_addr))
                    {//壊れたデータ
                        continue;
                    }

                    string waveFilename = basename + U.To0xHexString(i) + ".DirectSound.bin";
                    byte[] bin          = Program.ROM.getBinaryData(songdata_addr, 12 + 4 + sample_length);
                    U.WriteAllBytes(Path.Combine(dir, waveFilename), bin);

                    sb.Append(waveFilename); sb.Append("\t");
                }
                else if (type == 0x03 ||
                         type == 0x0B
                         )
                {//波形データ
                    uint songdata_addr = Program.ROM.p32(addr + 4);
                    if (!U.isSafetyOffset(songdata_addr))
                    {
                        continue;
                    }

                    byte[] bin          = Program.ROM.getBinaryData(songdata_addr, 16);
                    string waveFilename = basename + U.To0xHexString(i) + ".Wave.bin";
                    U.WriteAllBytes(Path.Combine(dir, waveFilename), bin);

                    sb.Append(waveFilename); sb.Append("\t");
                }
                else if (type == 0x80)
                {//ドラム
                    uint drum_voices = Program.ROM.p32(addr + 4);
                    if (!U.isSafetyOffset(drum_voices))
                    {
                        continue;
                    }

                    if (drum_voices == voca_baseaddress)
                    {
                        sb.Append("@SELF+0"); sb.Append("\t");
                    }
                    else if (isNest)
                    {
                        if (drum_voices >= voca_baseaddress && drum_voices < voca_endaddress)
                        {
                            sb.Append("@SELF+" + U.ToHexString(drum_voices - voca_baseaddress)); sb.Append("\t");
                        }
                        else
                        {
                            sb.Append("@BROKENDATA"); sb.Append("\t");
                        }
                    }
                    else
                    {
                        string drumFilename = basename + U.To0xHexString(i) + ".Drum.instrument";
                        ExportAllLow(Path.Combine(dir, drumFilename), drum_voices, true);
                        sb.Append(drumFilename); sb.Append("\t");
                    }
                }
                else if (type == 0x40)
                {//マルチサンプル
                    uint multisample_voices = Program.ROM.p32(addr + 4);
                    uint sample_location    = Program.ROM.p32(addr + 8);
                    if (!U.isSafetyOffset(multisample_voices))
                    {
                        continue;
                    }
                    if (!U.isSafetyOffset(sample_location))
                    {
                        continue;
                    }

                    if (multisample_voices == voca_baseaddress)
                    {
                        sb.Append("@SELF+0"); sb.Append("\t");
                    }
                    else if (isNest)
                    {
                        if (multisample_voices >= voca_baseaddress && multisample_voices < voca_endaddress)
                        {
                            sb.Append("@SELF+" + U.ToHexString(multisample_voices - voca_baseaddress)); sb.Append("\t");
                        }
                        else
                        {
                            sb.Append("@BROKENDATA"); sb.Append("\t");
                        }
                    }
                    else
                    {//自己参照以外を記録します
                        string multiFilename = basename + U.To0xHexString(i) + ".Multi.instrument";
                        ExportAllLow(Path.Combine(dir, multiFilename), multisample_voices, true);
                        sb.Append(multiFilename); sb.Append("\t");
                    }

                    byte[] bin          = Program.ROM.getBinaryData(sample_location, 128);
                    string waveFilename = basename + U.To0xHexString(i) + ".Multi.keys.bin";
                    U.WriteAllBytes(Path.Combine(dir, waveFilename), bin);

                    sb.Append(waveFilename); sb.Append("\t");
                }
                else
                {
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 4))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 5))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 6))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 7))); sb.Append("\t");
                }

                if (type != 0x40)
                {//マルチサンプル以外は、最後の4バイトはデータです
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 8))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 9))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 10))); sb.Append("\t");
                    sb.Append(U.ToHexString(Program.ROM.u8(addr + 11)));
                }

                U.AddrResult ar = InputFormRef.LoopCallback(i, addr);
                if (!ar.isNULL())
                {
                    sb.Append("\t//");
                    sb.Append(ar.name);
                }

                lines.Add(sb.ToString());
            }
            File.WriteAllLines(filename, lines);
        }
        private void ImportAllButton_Click(object sender, EventArgs e)
        {
            U.AddrResult ar = InputFormRef.SelectToAddrResult(FilterComboBox, FilterComboBox.SelectedIndex);
            if (ar.isNULL())
            {
                R.ShowStopError("タイルアニメーションのPLISTを特定できません");
                return;
            }
            uint pointer;
            uint tileanime_addr = MapPointerForm.PlistToOffsetAddrFast(MapPointerForm.PLIST_TYPE.ANIMATION, ar.tag, out pointer);

            if (tileanime_addr == U.NOT_FOUND)
            {
                R.ShowStopError("タイルアニメーションのPLISTからポインタを求められません。\r\nPLIST:{0}", ar.tag);
                return;
            }
            string filename;

            if (ImageFormRef.GetDragFilePath(out filename))
            {
            }
            else
            {
                string title  = R._("読込むファイル名を選択してください");
                string filter = R._("マップアニメ2|*.mapanime2.txt|All files|*");

                OpenFileDialog open = new OpenFileDialog();
                open.Title  = title;
                open.Filter = filter;

                DialogResult dr = open.ShowDialog();
                if (dr != DialogResult.OK)
                {
                    return;
                }
                if (open.FileNames.Length <= 0 || !U.CanReadFileRetry(open.FileNames[0]))
                {
                    return;
                }
                filename = open.FileNames[0];
                Program.LastSelectedFilename.Save(this, "", open);
            }

            using (InputFormRef.AutoPleaseWait wait = new InputFormRef.AutoPleaseWait(this))
            {
                string errorMessage = ImportAll(filename, pointer, this.InputFormRef);
                if (errorMessage != "")
                {
                    R.ShowStopError(errorMessage);
                    return;
                }
            }

            //リストを読み直し.
            int selected = FilterComboBox.SelectedIndex;
            List <U.AddrResult> animeList = MakeTileAnimation2();

            U.ConvertComboBox(animeList, ref FilterComboBox);

            //現在地を再選択して、リストを描画する.
            U.ForceUpdate(FilterComboBox, selected);
        }