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;
        }
Exemplo n.º 3
0
 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);
     }
                             ));
 }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 6
0
 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);
     }
                             ));
 }