public void LoadMusic(uint sound_id, EventScript.ArgType argtype) { MAP.ClearAllPoint(); PlaySappyButton.Tag = sound_id; this.MusicName.Text = SongTableForm.GetSongName(sound_id); string errormessage = ""; if (argtype == EventScript.ArgType.SOUND) { errormessage = SongTableForm.GetErrorMessage(sound_id, "SFX"); } else if (argtype == EventScript.ArgType.MAPMUSIC) { errormessage = SongTableForm.GetErrorMessage(sound_id, "MAP"); } this.MusicName.ErrorMessage = errormessage; int width = 300; int height = 100; this.Tab.Width = width; this.Tab.Height = height; this.MAP.Width = width; this.MAP.Height = height; Tab.SelectedIndex = 2; this.Width = width; this.Height = height; }
public void LoadMusic(uint sound_id) { MAP.ClearAllPoint(); PlaySappyButton.Tag = sound_id; this.MusicName.Text = SongTableForm.GetSongName(sound_id); int width = 300; int height = 100; this.Tab.Width = width; this.Tab.Height = height; this.MAP.Width = width; this.MAP.Height = height; Tab.SelectedIndex = 2; this.Width = width; this.Height = height; }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.sound_table_pointer() , 8 , (int i, uint addr) => { //読込最大値検索 return U.isPointer(Program.ROM.u32(addr)); } , (int i, uint addr) => { uint songheader = Program.ROM.p32(addr + 0); string name = U.ToHexString(i) + " " + SongTableForm.GetSongName((uint)i); return new U.AddrResult(songheader, name); } )); }
public static void Export( string filename //書き込むファイル名 , uint anime_address) { string basename = Path.GetFileNameWithoutExtension(filename) + "_"; string basedir = Path.GetDirectoryName(filename); anime_address = U.toOffset(anime_address); if (!U.isSafetyOffset(anime_address)) { return; } string programCode; AnimeType animeType; uint anime_config_address = SkipCode(anime_address, out programCode, out animeType); if (anime_config_address == U.NOT_FOUND) { return; } if (anime_config_address + (4 * 5) > Program.ROM.Data.Length) {//範囲外 return; } //POIN Frames //POIN TSAList //POIN GraphicsList //POIN PalettesList //WORD 0x3d1 //sound id uint frames = Program.ROM.p32(anime_config_address + (4 * 0)); uint tsalist = Program.ROM.p32(anime_config_address + (4 * 1)); uint graphiclist = Program.ROM.p32(anime_config_address + (4 * 2)); uint palettelist = Program.ROM.p32(anime_config_address + (4 * 3)); uint sound_id = Program.ROM.u32(anime_config_address + (4 * 4)); if (!U.isSafetyOffset(frames)) { return; } if (!U.isSafetyOffset(tsalist)) { return; } if (!U.isSafetyOffset(graphiclist)) { return; } if (!U.isSafetyOffset(palettelist)) { return; } //同じアニメを何度も出力しないように記録する. Dictionary <uint, Bitmap> animeHash = new Dictionary <uint, Bitmap>(); List <string> lines = new List <string>(); if (animeType == AnimeType.D) { lines.Add("D #is defender anim"); } if (sound_id > 0) { lines.Add("S" + sound_id.ToString("X04") + " #play sound " + SongTableForm.GetSongName(sound_id)); } //圧縮されていないデータなので、事故防止のため リミッターをかける. uint limitter = frames + 1024 * 1024; //1MBサーチしたらもうあきらめる. limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length); for (uint n = frames; n < limitter; n += 4) { uint id = Program.ROM.u16(n + 0); uint wait = Program.ROM.u16(n + 2); if (id == 0xFFFF) { break; } Bitmap bitmap; string imagefilename = basename.Replace(" ", "_") + "g" + id.ToString("000") + ".png"; if (animeHash.ContainsKey(id)) { bitmap = animeHash[id]; } else { bitmap = DrawFrameImage(n, graphiclist, tsalist, palettelist); int paletteCount = ImageUtil.GetPalette16Count(bitmap); if (paletteCount < 1) { paletteCount = 1; } //利用していないパレットを消す. ImageUtil.BlackOutUnnecessaryColors(bitmap, paletteCount); U.BitmapSave(bitmap, Path.Combine(basedir, imagefilename)); animeHash[id] = bitmap; } string line = wait.ToString() + " " + imagefilename; lines.Add(line); } //まとめて書き込み File.WriteAllLines(filename, lines); }
public static void Export( bool enableComment //コメントを出すかどうか , string filename //書き込むファイル名 , uint frame , uint objRightToLeftOAM , uint objBGRightToLeftOAM ) { objRightToLeftOAM = U.toOffset(objRightToLeftOAM); objBGRightToLeftOAM = U.toOffset(objBGRightToLeftOAM); string basename = Path.GetFileNameWithoutExtension(filename) + "_"; string basedir = Path.GetDirectoryName(filename); //読みやすいようにコメントを入れます. Dictionary <uint, string> Comment_85command_Dic = U.LoadDicResource(U.ConfigDataFilename("battleanime_85command_")); U.MapMarge(ref Comment_85command_Dic, U.LoadDicResource(U.ConfigDataFilename("magic_command_"))); List <String> lines = new List <String>(); string line; if (enableComment) { lines.Add("#######################################################"); lines.Add("#"); lines.Add("#" + R._("CSA_Creatorにインポートする時には各行の#以降を削除してください。")); lines.Add("#######################################################"); } //同じアニメを何度も出力しないように記録する. List <uint> animeHash = new List <uint>(); frame = U.toOffset(frame); byte[] frameData = Program.ROM.Data; //圧縮されていないデータなので、事故防止のため リミッターをかける. uint limitter = frame + 1024 * 1024; //1MBサーチしたらもうあきらめる. limitter = (uint)Math.Min(limitter, Program.ROM.Data.Length); int termCount = 0; for (uint n = frame; n < limitter; n += 4) { if (frameData[n + 3] == 0x80) //0x80 Term { //終端. termCount++; if (frameData[n + 1] == 0x01) //0x00 0x01 0x00 0x80 の場合続くときがある. { line = "~"; if (termCount == 1) { if (enableComment) { line += " #miss terminator"; } lines.Add(line); continue; } else { if (enableComment) { line += " #terminator"; } lines.Add(line); } } break; } else if (frameData[n + 3] == 0x85) //0x85 コマンド { if (frameData[n] == 0x48) {//音楽再生なのだが魔法ではS命令不可. uint musicid = U.u16(frameData, n + 1); uint id = U.u24(frameData, n); line = "C" + id.ToString("X06"); if (enableComment) { line += " #Sound " + musicid + " " + SongTableForm.GetSongName(musicid); } lines.Add(line); } else {//それ以外の 0x85命令 uint id = U.u24(frameData, n); line = "C" + id.ToString("X06"); if (enableComment) { line += " #" + U.at(Comment_85command_Dic, frameData[n]); } lines.Add(line); } continue; } else if (frameData[n + 3] != 0x86) {//不明な命令なので終了 break; } //0x86 画像 pointer uint wait = U.u16(frameData, n); //OBJの出力 string obj_framefilename = ImageUtilMagicFEditor.ExportOBjFrameImage( n , frameData , objRightToLeftOAM , objBGRightToLeftOAM , basedir , basename , animeHash ); //BGの出力 string bg_framefilename = ExportBGFrameImage(n, frameData , basedir , basename , animeHash ); if (obj_framefilename == "") { Log.Error("borken obj frame", n.ToString()); obj_framefilename = ImageUtil.SaveDummyImage(basedir, basename + "_broken_obj" + n + ".png" , 480, 160); } if (bg_framefilename == "") { Log.Error("borken bg frame", n.ToString()); bg_framefilename = ImageUtil.SaveDummyImage(basedir, basename + "_broken_bg" + n + ".png" , 264, 160); } line = "O " + obj_framefilename; lines.Add(line); line = "B " + bg_framefilename; lines.Add(line); //表示時間の出力. line = wait.ToString(); lines.Add(line); n += 24 + 4; // 24+4+4 = 32bytes lines.Add(""); } line = "/// - End of animation"; lines.Add(line); //まとめて書き込み File.WriteAllLines(filename, lines); }
static InputFormRef Init(Form self) { return(new InputFormRef(self , "" , Program.ROM.RomInfo.sound_boss_bgm_pointer , 8 , (int i, uint addr) => { //0xFFまで if (Program.ROM.u16(addr) == 0xFFFF) { return false; } if (i > 10 && Program.ROM.IsEmpty(addr, 8 * 10)) { return false; } return true; } , (int i, uint addr) => { uint unit_id = (uint)Program.ROM.u8(addr); uint song_id = (uint)Program.ROM.u32(addr + 4); return U.ToHexString(unit_id) + " " + UnitForm.GetUnitName(unit_id) + " : " + U.ToHexString(song_id) + SongTableForm.GetSongName(song_id); } )); }