Beispiel #1
0
        private void X_N_JumpEditor_Click(object sender, EventArgs e)
        {
            if (InputFormRef.IsPleaseWaitDialog(this))
            {//2重割り込み禁止
                return;
            }
            uint ID = (uint)AddressList.SelectedIndex;

            string filehint = AddressList.Text;

            //少し時間がかかるので、しばらくお待ちください表示.
            using (InputFormRef.AutoPleaseWait pleaseWait = new InputFormRef.AutoPleaseWait(this))
                //テンポラリディレクトリを利用する
                using (U.MakeTempDirectory tempdir = new U.MakeTempDirectory())
                {
                    string filename = Path.Combine(tempdir.Dir, "anime.txt");
                    ImageUtilSkillSystemsAnimeCreator.Export(filename, (uint)ANIMATION.Value);
                    if (!File.Exists(filename))
                    {
                        R.ShowStopError("アニメーションエディタを表示するために、アニメーションをエクスポートしようとしましたが、アニメをファイルにエクスポートできませんでした。\r\n\r\nファイル:{0}", filename);
                        return;
                    }

                    ToolAnimationCreatorForm f = (ToolAnimationCreatorForm)InputFormRef.JumpFormLow <ToolAnimationCreatorForm>();
                    f.Init(ToolAnimationCreatorUserControl.AnimationTypeEnum.Skill
                           , ID, filehint, filename);
                    f.Show();
                }
        }
Beispiel #2
0
        private void ShowFrameUpDown_ValueChanged(object sender, EventArgs e)
        {
            uint anime = (uint)ANIMATION.Value;
            uint frame = (uint)ShowFrameUpDown.Value;

            AnimationPictureBox.Image = ImageUtilSkillSystemsAnimeCreator.Draw(anime, frame);
        }
Beispiel #3
0
        public string SkillAnimeImportDirect(uint id, string filename)
        {
            if (InputFormRef.IsPleaseWaitDialog(this))
            {//2重割り込み禁止
                return(R._("現在他の処理中です"));
            }

            if (id <= 0)
            {
                return(R._("指定されたID({0})は存在しません。", U.To0xHexString(id)));
            }
            uint animePointer = this.AnimeBaseAddress + (4 * id);

            string error = "";

            //少し時間がかかるので、しばらくお待ちください表示.
            using (InputFormRef.AutoPleaseWait pleaseWait = new InputFormRef.AutoPleaseWait(this))
            {
                error = ImageUtilSkillSystemsAnimeCreator.Import(filename, animePointer);
            }

            if (error != "")
            {
                return(error);
            }

            U.ReSelectList(this.AddressList);
            //書き込み通知
            InputFormRef.ShowWriteNotifyAnimation(this, 0);

            return("");
        }
Beispiel #4
0
        private void ShowFrameUpDown_ValueChanged(object sender, EventArgs e)
        {
            uint   anime = (uint)AnimePointer.Value;
            uint   frame = (uint)ShowFrameUpDown.Value;
            string log;

            AnimationPictureBox.Image = ImageUtilSkillSystemsAnimeCreator.Draw(anime, frame, out log);
            BinInfo.Text = log;
        }
        public static void MakeCheckError(List <FELint.ErrorSt> errors)
        {
            PatchUtil.skill_system_enum skill = PatchUtil.SearchSkillSystem();
            if (skill != PatchUtil.skill_system_enum.SkillSystem)
            {
                return;
            }

            InputFormRef ifr;
            uint         baseiconP  = FindIconPointer();
            uint         basetextP  = FindTextPointer();
            uint         baseanimeP = FindAnimePointer();

            if (baseiconP == U.NOT_FOUND)
            {
                return;
            }
            if (basetextP == U.NOT_FOUND)
            {
                return;
            }
            if (baseanimeP == U.NOT_FOUND)
            {
                return;
            }
            ifr = Init(null, basetextP);
            uint skill_addr = ifr.BaseAddress;

            for (uint i = 0; i < ifr.DataCount; i++, skill_addr += ifr.BlockSize)
            {
                uint name = Program.ROM.u16(skill_addr + 0);
                if (name == 0 || name == 0xFFFF)
                {
                    continue;
                }
                FELint.CheckText(name, "DETAIL3", errors, FELint.Type.SKILL_CONFIG, skill_addr, i);
            }

            uint anime = Program.ROM.p32(baseanimeP);

            for (uint i = 0; i < ifr.DataCount; i++, anime += 4)
            {
                if (!U.isSafetyOffset(anime))
                {
                    break;
                }
                uint addr = Program.ROM.p32(anime);
                if (!U.isSafetyOffset(addr))
                {
                    continue;
                }
                ImageUtilSkillSystemsAnimeCreator.MakeCheckError(errors, addr, i);
            }
        }
Beispiel #6
0
        //全データの取得
        public static void MakeAllDataLength(List <Address> list, bool isPointerOnly)
        {
            InputFormRef InputFormRef;

            if (PatchUtil.SearchSkillSystem() != PatchUtil.skill_system_enum.SkillSystem)
            {
                return;
            }

            {
                uint baseiconP  = FindIconPointer();
                uint basetextP  = FindTextPointer();
                uint baseanimeP = FindAnimePointer();

                if (baseiconP == U.NOT_FOUND)
                {
                    return;
                }
                if (basetextP == U.NOT_FOUND)
                {
                    return;
                }
                if (baseanimeP == U.NOT_FOUND)
                {
                    return;
                }
                InputFormRef = Init(null, basetextP);
                FEBuilderGBA.Address.AddAddress(list, InputFormRef, "SkillConfigSkillSystem", new uint[] { });

                uint anime = Program.ROM.p32(baseanimeP);
                for (uint i = 0; i < InputFormRef.DataCount; i++, anime += 4)
                {
                    if (!U.isSafetyOffset(anime))
                    {
                        break;
                    }
                    uint addr = Program.ROM.p32(anime);
                    if (!U.isSafetyOffset(addr))
                    {
                        continue;
                    }
                    string name = "SkillAnime:" + U.To0xHexString(i) + " ";
                    FEBuilderGBA.Address.AddAddress(list, addr, 0, anime, name, FEBuilderGBA.Address.DataTypeEnum.POINTER);

                    ImageUtilSkillSystemsAnimeCreator.RecycleOldAnime(ref list
                                                                      , name
                                                                      , isPointerOnly
                                                                      , addr);
                }
            }
        }
Beispiel #7
0
        private void AnimationExportButton_Click(object sender, EventArgs e)
        {
            string title  = R._("保存するファイル名を選択してください");
            string filter = R._("スキルアニメスクリプト|*.txt|アニメGIF|*.gif|Dump All|*.txt|All files|*");

            SaveFileDialog save = new SaveFileDialog();

            save.Title        = title;
            save.Filter       = filter;
            save.AddExtension = true;
            Program.LastSelectedFilename.Load(this, "", save, "skill_" + this.AddressList.Text.Trim());

            DialogResult dr = save.ShowDialog();

            if (dr != DialogResult.OK)
            {
                return;
            }
            if (save.FileNames.Length <= 0 || !U.CanWriteFileRetry(save.FileNames[0]))
            {
                return;
            }
            string filename = save.FileNames[0];

            Program.LastSelectedFilename.Save(this, "", save);

            if (save.FilterIndex == 2)
            {//GIF
                ImageUtilSkillSystemsAnimeCreator.ExportGif(filename, (uint)ANIMATION.Value);
            }
            else if (save.FilterIndex == 3)
            {//All
                ImageUtilSkillSystemsAnimeCreator.Export(filename, (uint)ANIMATION.Value);
                filename = U.ChangeExtFilename(filename, ".gif");
                ImageUtilSkillSystemsAnimeCreator.ExportGif(filename, (uint)ANIMATION.Value);
            }
            else
            {//Script
                ImageUtilSkillSystemsAnimeCreator.Export(filename, (uint)ANIMATION.Value);
            }

            //エクスプローラで選択しよう
            U.SelectFileByExplorer(filename);
        }
Beispiel #8
0
        public static bool ImportAllData(string filename)
        {
            InputFormRef InputFormRef;

            if (PatchUtil.SearchSkillSystem() != PatchUtil.skill_system_enum.SkillSystem)
            {
                return(false);
            }

            string basedir = Path.GetDirectoryName(filename);

            string[] lines = File.ReadAllLines(filename);
            {
                uint baseiconP  = FindIconPointer();
                uint basetextP  = FindTextPointer();
                uint baseanimeP = FindAnimePointer();

                if (baseiconP == U.NOT_FOUND)
                {
                    return(false);
                }
                if (basetextP == U.NOT_FOUND)
                {
                    return(false);
                }
                if (baseanimeP == U.NOT_FOUND)
                {
                    return(false);
                }
                InputFormRef = Init(null, basetextP);
                uint textAddr = InputFormRef.BaseAddress;

                uint anime = Program.ROM.p32(baseanimeP);
                for (uint i = 0; i < InputFormRef.DataCount;
                     i++, anime += 4, textAddr += 2)
                {
                    if (!U.isSafetyOffset(anime))
                    {
                        break;
                    }
                    if (i >= lines.Length)
                    {
                        break;
                    }
                    string[] sp = lines[i].Split('\t');
                    if (sp.Length < 2)
                    {
                        continue;
                    }
                    uint textid = U.atoh(sp[0]);
                    if (textid != 0)
                    {
                        Program.ROM.write_u16(textAddr + 0, textid);
                    }

                    uint animePAddr = U.atoh(sp[1]);
                    if (animePAddr == 0)
                    {//0の値が設定されている場合は、アニメ未指定になっているので0を書き込みます.
                        Program.ROM.write_p32(anime, 0);
                        continue;
                    }
                    string anime_filename = Path.Combine(basedir, "anime" + U.ToHexString(i), "anime.txt");
                    if (File.Exists(anime_filename))
                    {//インポートしなおす
                        ImageUtilSkillSystemsAnimeCreator.Import(anime_filename, anime);
                    }
                    //それ以外の値の場合、ディフォルト設定だとして、最新の値を採用します.
                }
            }
            return(true);
        }
Beispiel #9
0
        public static void ExportAllData(string filename)
        {
            InputFormRef InputFormRef;

            if (PatchUtil.SearchSkillSystem() != PatchUtil.skill_system_enum.SkillSystem)
            {
                return;
            }

            string        basedir = Path.GetDirectoryName(filename);
            List <string> lines   = new List <string>();

            {
                uint baseiconP  = FindIconPointer();
                uint basetextP  = FindTextPointer();
                uint baseanimeP = FindAnimePointer();

                if (baseiconP == U.NOT_FOUND)
                {
                    return;
                }
                if (basetextP == U.NOT_FOUND)
                {
                    return;
                }
                if (baseanimeP == U.NOT_FOUND)
                {
                    return;
                }
                InputFormRef = Init(null, basetextP);
                uint textAddr = InputFormRef.BaseAddress;

                uint anime = Program.ROM.p32(baseanimeP);
                for (uint i = 0; i < InputFormRef.DataCount;
                     i++, anime += 4, textAddr += 2)
                {
                    if (!U.isSafetyOffset(anime))
                    {
                        break;
                    }
                    StringBuilder sb = new StringBuilder();
                    sb.Append(U.ToHexString(Program.ROM.u16(textAddr + 0)));

                    uint addr = Program.ROM.p32(anime);
                    sb.Append("\t");
                    sb.Append(U.ToHexString(addr));
                    lines.Add(sb.ToString());

                    if (!U.isExtrendsROMArea(addr) || addr == 0)
                    {//既存領域内なので新しいアニメで上書きする.
                        continue;
                    }

                    //拡張領域のアニメはexportしないといけないようだ.
                    //内部に非拡張領域のデータを使いまわしていることがあるため
                    string animedir = Path.Combine(basedir, "anime" + U.ToHexString(i));
                    U.mkdir(animedir);
                    string anime_filename = Path.Combine(animedir, "anime.txt");
                    ImageUtilSkillSystemsAnimeCreator.Export(anime_filename, addr);
                }
            }
            File.WriteAllLines(filename, lines);
        }
Beispiel #10
0
        //全データの取得
        public static void MakeAllDataLength(List <Address> list, bool isPointerOnly)
        {
            InputFormRef ifr;

            if (PatchUtil.SearchSkillSystem() != PatchUtil.skill_system_enum.FE8N_ver2)
            {
                return;
            }

            uint[] pointer = FindSkillFE8NVer2IconPointers();
            if (pointer == null)
            {
                return;
            }
            if (g_SkillBaseAddress == 0)
            {
                return;
            }
            if (!U.isSafetyOffset(g_SkillBaseAddress))
            {
                return;
            }

            ifr = Init(null);
            Debug.Assert(ifr.BlockSize == g_ICON_LIST_SIZE);
            if (ifr.BlockSize == 20)
            {//sizeof(20)
                FEBuilderGBA.Address.AddAddress(list, ifr, "SkillConfigFE8NVer2", new uint[] { 4, 8, 12, 16 });
            }
            else
            {//sizeof(16)
                FEBuilderGBA.Address.AddAddress(list, ifr, "SkillConfigFE8NVer2", new uint[] { 4, 8, 12 });
            }

            if (g_AnimeBaseAddress != 0)
            {
                uint anime = Program.ROM.p32(g_AnimeBaseAddress);
                for (uint i = 0; i < ifr.DataCount; i++, anime += 4)
                {
                    if (!U.isSafetyOffset(anime))
                    {
                        break;
                    }
                    uint addr = Program.ROM.p32(anime);
                    if (!U.isSafetyOffset(addr))
                    {
                        continue;
                    }
                    string name = "SkillAnime:" + U.To0xHexString(i) + " ";
                    FEBuilderGBA.Address.AddAddress(list, addr, 0, anime, name, FEBuilderGBA.Address.DataTypeEnum.POINTER);

                    ImageUtilSkillSystemsAnimeCreator.RecycleOldAnime(ref list
                                                                      , name
                                                                      , isPointerOnly
                                                                      , addr);
                }
            }

            {
                InputFormRef ifr_n1 = N1_Init(null);
                InputFormRef ifr_n2 = N2_Init(null);
                InputFormRef ifr_n3 = N3_Init(null);
                InputFormRef ifr_n4 = null;
                if (g_ICON_LIST_SIZE >= 20)
                {
                    ifr_n4 = N4_Init(null);
                }
                uint icondatacount = (2 * 8 * 2 * 8) / 2; // /2しているのは16色のため

                uint icon = Program.ROM.p32(g_SkillBaseAddress);
                uint addr = ifr.BaseAddress;
                for (uint i = 0; i < ifr.DataCount;
                     i++, addr += ifr.BlockSize, icon += icondatacount)
                {
                    if (!U.isSafetyOffset(addr))
                    {
                        break;
                    }
                    ifr_n1.ReInitPointer(addr + 4);
                    ifr_n2.ReInitPointer(addr + 8);
                    ifr_n3.ReInitPointer(addr + 12);

                    FEBuilderGBA.Address.AddAddress(list, ifr_n1
                                                    , "SkillUnit:" + U.To0xHexString(i)
                                                    , new uint[] {});
                    FEBuilderGBA.Address.AddAddress(list, ifr_n2
                                                    , "SkillClass:" + U.To0xHexString(i)
                                                    , new uint[] { });
                    FEBuilderGBA.Address.AddAddress(list, ifr_n3
                                                    , "SkillItem:" + U.To0xHexString(i)
                                                    , new uint[] { });

                    FEBuilderGBA.Address.AddAddress(list, icon
                                                    , icondatacount
                                                    , U.NOT_FOUND
                                                    , "SkillIcon:" + U.To0xHexString(i)
                                                    , FEBuilderGBA.Address.DataTypeEnum.IMG);

                    if (ifr_n4 != null)
                    {
                        ifr_n4.ReInitPointer(addr + 16);
                        FEBuilderGBA.Address.AddAddress(list, ifr_n4
                                                        , "SkillItem2:" + U.To0xHexString(i)
                                                        , new uint[] { });
                    }
                }
            }
        }