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(); } }
private void ShowFrameUpDown_ValueChanged(object sender, EventArgs e) { uint anime = (uint)ANIMATION.Value; uint frame = (uint)ShowFrameUpDown.Value; AnimationPictureBox.Image = ImageUtilSkillSystemsAnimeCreator.Draw(anime, frame); }
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(""); }
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); } }
//全データの取得 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); } } }
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); }
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); }
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); }
//全データの取得 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[] { }); } } } }