예제 #1
0
        void WriteText(uint id, string text, Undo.UndoData undodata)
        {
            //無効なID
            if (id <= 0)
            {
                return;
            }
            //最後の改行の削除.
            if (text.Length < 2)
            {
                return;
            }
            string writetext = U.substr(text, 0, text.Length - 2);

            writetext = TextForm.ConvertFEditorToEscape(writetext);

            if (id < this.MaxTextCount)
            {
                WriteTextUnHffman(id, writetext, undodata);
            }
            else if (U.isSafetyPointer(id))
            {
                WriteCString(id, writetext, undodata);
            }
            else
            {
                Log.Error("不明な文字列", id.ToString(), writetext);
                return;
            }
        }
예제 #2
0
        public static string GetParamName(uint nameAddrP)
        {
            nameAddrP = U.toOffset(nameAddrP);
            if (!U.isSafetyOffset(nameAddrP))
            {
                return("");
            }
            uint id = Program.ROM.p32(nameAddrP);

            if (id <= 0x10)
            {
                return("");
            }

            string name = "";

            if (id > 0xFFFF && U.isSafetyOffset(id))
            {
                name = Program.ROM.getString(id);
            }
            if (name == "")
            {
                name = TextForm.Direct(id);
            }

            return(name);
        }
예제 #3
0
        public static string ChcekTextItem1ErrorMessage(uint id, string text, uint textid, uint type)
        {
            if (type <= 7 && type != 4)
            {
                if (text == "")
                {
                    if (Program.ROM.RomInfo.version() == 8)
                    {//FE8では武器の名前を""にすると、耐久などが表示されない
                        if (Program.ROM.RomInfo.is_multibyte())
                        {
                            return(R._("アイテムの説明欄が空です。\r\nFE8では、空にする場合は、倍角スペースを入れる必要があります。"));
                        }
                        else
                        {
                            return(R._("アイテムの説明欄が空です。\r\nFE8では、空にする場合は、空白スペースと[.]を入れる必要があります。\r\n例: \" [.]\""));
                        }
                    }
                }

                string errormessage = TextForm.GetErrorMessage(text, textid, "ITEM1");

                if (Program.ROM.RomInfo.version() == 7 && Program.ROM.RomInfo.is_multibyte() == false)
                {     //FE7Uにはバグがある
                    if (id == 0x59 || id == 0x99)
                    { //無視
                        errormessage = "";
                    }
                }
                return(errormessage);
            }
            else
            {
                return(TextForm.GetErrorMessage(text, textid, "ITEM3"));
            }
        }
예제 #4
0
        public void ToolMouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                actor             = new Actor(new Point(e.X, e.Y));
                actor.finishPoint = new Point(e.X, e.Y);

                DrawingObject drawingObject = canvas.GetObject(e.X, e.Y);

                if (drawingObject == null)
                {
                    canvas.AddDrawingObject(actor);
                }
                else
                {
                    textValue = drawingObject.GetText();
                    using (TextForm textForm = new TextForm(textValue, drawingObject, canvas))
                    {
                        if (textForm.ShowDialog() == DialogResult.OK)
                        {
                            textForm.ShowDialog();
                        }
                    }
                }
            }
        }
예제 #5
0
        static InputFormRef Init(Form self)
        {
            return(new InputFormRef(self
                                    , ""
                                    , Program.ROM.RomInfo.item_pointer
                                    , Program.ROM.RomInfo.item_datasize
                                    , (int i, uint addr) =>
            {    //12補正 16特効 がポインタ or nullであれば
                if (i > 0xff)
                {
                    return false;
                }
                if (Program.ROM.RomInfo.version == 8 && Program.ROM.RomInfo.is_multibyte == false)
                {
                    return U.isPointerOrNULL(Program.ROM.u32(addr + 12))
//                            && U.isPointerOrNULL(Program.ROM.u32(addr + 16)) //スキルシステムでなんかするみたいなのでやめる
                    ;
                }
                else
                {
                    return U.isPointerOrNULL(Program.ROM.u32(addr + 12)) &&
                    U.isPointerOrNULL(Program.ROM.u32(addr + 16))
                    ;
                }
            }
                                    , (int i, uint addr) =>
            {
                uint id = Program.ROM.u16(addr);
                return U.ToHexString(i) + " " + TextForm.Direct(id);
            }
                                    ));
        }
예제 #6
0
        static InputFormRef Init(Form self)
        {
            return(new InputFormRef(self
                                    , ""
                                    , Program.ROM.RomInfo.item_pointer
                                    , Program.ROM.RomInfo.item_datasize
                                    , (int i, uint addr) =>
            {    //12補正 16特効 がポインタ or nullであれば
                return U.isPointerOrNULL(Program.ROM.u32(addr + 12)) &&
                U.isPointerOrNULL(Program.ROM.u32(addr + 16))
                ;
            }
                                    , (int i, uint addr) =>
            {
                uint ITEMSTATBOOSTER = Program.ROM.u32(addr + 12);
                if (!U.isPointer(ITEMSTATBOOSTER))
                {
                    return new U.AddrResult();
                }

                U.AddrResult ar = new U.AddrResult();
                ar.addr = U.toOffset(ITEMSTATBOOSTER);

                uint id = Program.ROM.u16(addr);
                ar.name = U.ToHexString(i) + " " + TextForm.Direct(id);

                return ar;
            }
                                    ));
        }
예제 #7
0
        public static string GetName(uint id, bool with_hint_full = false)
        {
            string hint = with_hint_full ? MakeHint_Full(id) :MakeHint_Simple(id);

            if (!Program.ROM.RomInfo.is_multibyte())
            {
                string name = MapTerrainNameEngForm.GetName(id);
                name = TextForm.StripAllCode(name);
                return(name + hint);
            }

            InputFormRef InputFormRef = Init(null);
            uint         addr         = InputFormRef.IDToAddr(id);

            if (!U.isSafetyOffset(addr))
            {
                return("");
            }
            uint c_addr = Program.ROM.p32(addr);

            if (!U.isSafetyOffset(c_addr))
            {
                return("");
            }
            return(Program.ROM.getString(c_addr) + hint);
        }
예제 #8
0
 static InputFormRef Init(Form self)
 {
     return(new InputFormRef(self
                             , ""
                             , Program.ROM.RomInfo.class_pointer()
                             , Program.ROM.RomInfo.class_datasize()
                             , (int i, uint addr) =>
     {    //読込最大値検索
         if (i == 0)
         {
             return true;
         }
         if (i > 0xff)
         {
             return false;
         }
         uint no = Program.ROM.u8(addr + 4);
         return (no != 0);
     }
                             , (int i, uint addr) =>
     {
         uint id = Program.ROM.u16(addr);
         return U.ToHexString(i) + " " + TextForm.Direct(id);
     }
                             ));
 }
예제 #9
0
        public static List <U.AddrResult> GetShopAddr(uint addr)
        {
            List <U.AddrResult> ret = new List <U.AddrResult>();
            uint textid             = Program.ROM.u16(addr + 28);

            uint shopaddr;

            shopaddr = Program.ROM.p32(addr + 12);
            if (U.isSafetyOffset(shopaddr))
            {
                string name = TextForm.Direct(textid) + " " + R._("武器屋");
                ret.Add(new U.AddrResult(shopaddr, name, addr + 12));
            }

            shopaddr = Program.ROM.p32(addr + 16);
            if (U.isSafetyOffset(shopaddr))
            {
                string name = TextForm.Direct(textid) + " " + R._("道具屋");
                ret.Add(new U.AddrResult(shopaddr, name, addr + 16));
            }

            shopaddr = Program.ROM.p32(addr + 20);
            if (U.isSafetyOffset(shopaddr))
            {
                string name = TextForm.Direct(textid) + " " + R._("秘密の店");
                ret.Add(new U.AddrResult(shopaddr, name, addr + 20));
            }

            return(ret);
        }
예제 #10
0
        private void itmCopy_Click(object sender, System.EventArgs e)
        {
            TextForm documentForm = (TextForm)ActiveMdiChild;

            documentForm.textCopy();
            itmPaste.Enabled = true;
        }
예제 #11
0
        public static string GetMenuName(uint addr)
        {
            if (!U.isSafetyOffset(addr))
            {
                return("");
            }

            String name = "";

            if (Program.ROM.RomInfo.is_multibyte())
            {
                uint nameAddr = Program.ROM.p32(addr);
                if (nameAddr > 0xFFFF && U.isSafetyOffset(nameAddr))
                {
                    name = Program.ROM.getString(nameAddr);
                }
                if (name == "")
                {//日本語ポインタがない場合、文字列IDを参照する.
                    name = TextForm.Direct(Program.ROM.u16(addr + 4));
                }
            }
            else
            {
                name = TextForm.Direct(Program.ROM.u16(addr + 4));
            }
            return(name);
        }
예제 #12
0
        public static string GetNameWhereCustomBattleAnime(uint custom_battle_id)
        {
            if (custom_battle_id == 0)
            {
                return("");
            }

            InputFormRef InputFormRef = Init(null);

            uint addr = InputFormRef.BaseAddress;

            for (int i = 0; i < InputFormRef.DataCount; i++)
            {
                if (custom_battle_id == Program.ROM.u8(addr + 37))
                {//下級職
                    uint id = Program.ROM.u16(addr);
                    return(TextForm.Direct(id) + " " + R._("下級職"));
                }
                if (custom_battle_id == Program.ROM.u8(addr + 38))
                {//上級職
                    uint id = Program.ROM.u16(addr);
                    return(TextForm.Direct(id) + " " + R._("上級職"));
                }

                addr += InputFormRef.BlockSize;
            }
            return("");
        }
예제 #13
0
        //スキル名を検索します.
        //残念ながら、スキルIDでの実装がされていないので文字列でヒントとかから検索します.
        public static uint FindSkillIconAndText(uint[] pointers, string searchSkillName, out string outText)
        {
            if (pointers == null || pointers.Length < 4)
            {
                outText = "";
                return(U.NOT_FOUND);
            }

            InputFormRef InputFormRef = Init(null);

            List <U.AddrResult> list = InputFormRef.MakeList();

            for (int n = 0; n < list.Count; n++)
            {
                uint addr = list[n].addr;
                if (list[n].name.IndexOf(searchSkillName) >= 0)
                {
                    outText = TextForm.Direct(Program.ROM.u16(addr + 0));
                    return((uint)(n + 0x100));
                }
            }

            outText = "";
            return(U.NOT_FOUND);
        }
        public void ShowSubtile(string text, int startPoint, int endPoint)
        {
            if (text.Length < this.ShortLength)
            {//短すぎる.
                this.CurrentText = text;
                HideForm();
                return;
            }

            if (CurrentText == text)
            {
                if (CurrentPoint == startPoint)
                {//変更なし
                    return;
                }
            }
            else
            {
                CurrentText = text;
                if (!TransDic.TryGetValue(text.ToUpper(), out CurrentSubtile))
                {
                    CurrentSubtile = "";
                }
                this.Subtile.Text = TextForm.ConvertEscapeText(this.CurrentSubtile);
            }

            CurrentPoint = startPoint;

            UpdateCount(startPoint, endPoint);

            PickupLine();

            ShowForm();
        }
        private void Subtile_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            using (InputFormRef.AutoPleaseWait pleaseWait = new InputFormRef.AutoPleaseWait(this))
            {
                uint text_id = TextForm.SearchText(this.CurrentText);
                if (text_id == U.NOT_FOUND)
                {
                    return;
                }

                string clipbord = "";
                uint   num      = TranslateTextUtil.GrepReverseSearchDic(this.SimpleTranslateToTranslateDataFilename, U.ToHexString(text_id) + "]");
                if (num == U.NOT_FOUND)
                {
                    clipbord = "[" + U.ToHexString(text_id) + "]";
                }
                clipbord += this.CurrentText;
                U.SetClipboardText(clipbord);

                try
                {
                    MainFormUtil.OpenTextEditor(this.SimpleTranslateToTranslateDataFilename, num);
                }
                catch (Exception ee)
                {
                    R.ShowStopError(ee.ToString());
                }
            }
        }
예제 #16
0
        private void itmOpen_Click(object sender, System.EventArgs e)
        {
            string path;

            openFile.Multiselect = false;


            System.Windows.Forms.DialogResult enmResult = openFile.ShowDialog();

            if (enmResult == System.Windows.Forms.DialogResult.OK)
            {
                path = openFile.FileName;

                System.IO.StreamReader reader = new System.IO.StreamReader(path);

                TextForm documentForm = new TextForm();
                documentForm.MdiParent = this;
                documentForm.textData  = reader.ReadToEnd();
                documentForm.Text      = openFile.SafeFileName;
                //documentForm.saveStatus = true;
                documentForm.pathFile = path;
                documentForm.Show();

                setSomethingToEnable();
            }

            capsLockStatus();
        }
예제 #17
0
        private void SEARCH_COUNT_BUTTON_Click(object sender, EventArgs e)
        {
            Dictionary <uint, FETextDecode.huffman_count_st> dic = new Dictionary <uint, FETextDecode.huffman_count_st>();
            //初期値を入れる.
            uint addr      = (uint)InputFormRef.BaseAddress;
            int  limitsize = (int)InputFormRef.DataCount;

            for (int i = 0; i < limitsize; i++)
            {
                FETextDecode.huffman_count_st st = new FETextDecode.huffman_count_st();
                st.code_number             = i;
                dic[Program.ROM.u16(addr)] = st;
                addr += InputFormRef.BlockSize;
            }

            //テキスト探索.
            FETextDecode        textdecoder = new FETextDecode();
            List <U.AddrResult> list        = TextForm.MakeItemList();

            for (int i = 0; i < list.Count; i++)
            {
                uint textaddr = Program.ROM.p32(list[i].addr);
                textdecoder.huffman_count(textaddr, ref dic);
            }

            SEARCH_COUNT_LIST.Items.Clear();
            uint minimaumCount = (uint)SEARCH_COUNT.Value;

            foreach (var pair in dic)
            {
                if (pair.Key == 0)
                {
                    continue;
                }
                if (pair.Value.count > minimaumCount)
                {
                    continue;
                }
                string line = pair.Value.code_number.ToString();

                line = line + "," + U.ConvertUnitToMojiChar((uint)pair.Key);
                line = line + "," + pair.Value.count.ToString();

                for (int n = 0; n < pair.Value.unsing_text_addr.Count; n++)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        uint textaddr = Program.ROM.p32(list[i].addr);
                        if (pair.Value.unsing_text_addr[n] == textaddr)
                        {
                            line = line + "," + i.ToString("X");
                            break;
                        }
                    }
                }

                SEARCH_COUNT_LIST.Items.Add(line);
            }
        }
예제 #18
0
        public static string GetSkillText(uint index, uint textBaseAddress)
        {
            uint size       = 2;
            uint textOffset = textBaseAddress + (size * index);
            uint id         = Program.ROM.u16(textOffset);

            return(TextForm.Direct(id));
        }
예제 #19
0
        void AddRecycle(uint id, List <Address> list)
        {
            //無効なID
            if (id <= 0)
            {
                return;
            }
            if (id < this.MaxTextCount)
            {
                uint addr  = this.TextBaseAddress + (id * 4);
                uint paddr = Program.ROM.u32(addr);
                if (TextForm.Is_RAMPointerArea(paddr))
                {
                    return;
                }
                uint data_addr;

                int length;
                if (FETextEncode.IsUnHuffmanPatchPointer(paddr))
                {//un-huffman patch?
                    uint unhuffman_addr = U.toOffset(FETextEncode.ConvertUnHuffmanPatchToPointer(paddr));
                    data_addr = unhuffman_addr;
                    TextDecode.UnHffmanPatchDecode(unhuffman_addr, out length);
                }
                else if (U.isPointer(paddr))
                {
                    data_addr = U.toOffset(paddr);
                    TextDecode.huffman_decode(data_addr, out length);
                }
                else
                {
                    return;
                }

                if (length <= 0)
                {
                    return;
                }
                if (data_addr == this.TextID0Addr)
                {
                    return;
                }
                FEBuilderGBA.Address.AddAddress(list
                                                , data_addr
                                                , (uint)length
                                                , U.NOT_FOUND
                                                , "text " + U.ToHexString(id)
                                                , FEBuilderGBA.Address.DataTypeEnum.BIN);
            }
//CStringに対しては、リサイクルバッファを利用する方式を利用しない
//なぜなら、FE6には大量のポインタ参照があるためです。
//容量も大きくないので、メリットよりデメリットの方が上回る
//            else if (U.isSafetyPointer(id))
//            {
//                uint p = U.toOffset(id);
//                FEBuilderGBA.Address.AddCString(list, p);
//            }
        }
예제 #20
0
        public static int MakeClassSkillButtons(uint cid, Button[] buttons, ToolTipEx tooltip)
        {
            uint[] pointer = FindSkillFE8NVer2IconPointers();
            if (pointer == null)
            {
                return(0);
            }
            if (pointer.Length < 5)
            {
                return(0);
            }

            InputFormRef InputFormRef    = Init(null);
            InputFormRef N2_InputFormRef = N2_Init(null);

            int skillCount           = 0;
            List <U.AddrResult> list = InputFormRef.MakeList();

            for (int i = 1; i < list.Count; i++)
            {
                uint classAddr = Program.ROM.p32(list[i].addr + 8);
                if (!U.isSafetyOffset(classAddr))
                {
                    continue;
                }

                bool found = false;
                N2_InputFormRef.ReInit(classAddr);
                List <U.AddrResult> classList = N2_InputFormRef.MakeList();
                for (int n = 0; n < classList.Count; n++)
                {
                    uint classID = Program.ROM.u8(classList[n].addr);
                    if (cid == classID)
                    {
                        found = true;
                        break;
                    }
                }

                if (!found)
                {
                    continue;
                }

                uint textid = Program.ROM.u16(list[i].addr + 0);

                buttons[skillCount].BackgroundImage = DrawSkillIconLow((uint)i);
                buttons[skillCount].Tag             = (uint)i;
                tooltip.SetToolTip(buttons[skillCount], TextForm.Direct(textid));
                skillCount++;
                if (skillCount >= buttons.Length)
                {
                    break;
                }
            }

            return(skillCount);
        }
예제 #21
0
        private TabPage AddTabPage(KoreFileInfo kfi, Color tabColor, KoreFileInfo parentKfi = null)
        {
            var tabPage = new TabPage
            {
                BackColor = SystemColors.Window,
                Padding   = new Padding(0, 2, 2, 1)
            };

            IKuriimuForm tabControl = null;

            try
            {
                if (kfi.Adapter is ITextAdapter)
                {
                    tabControl = new TextForm(kfi, tabPage, parentKfi?.Adapter as IArchiveAdapter, GetTabPageForKfi(parentKfi), _pluginLoader.GetAdapters <IGameAdapter>());
                }
                else if (kfi.Adapter is IImageAdapter)
                {
                    tabControl = new ImageForm(kfi, tabPage, parentKfi?.Adapter as IArchiveAdapter, GetTabPageForKfi(parentKfi));
                }
                else if (kfi.Adapter is ILayoutAdapter)
                {
                    tabControl = new LayoutForm(kfi, tabPage, parentKfi?.Adapter as IArchiveAdapter, GetTabPageForKfi(parentKfi));
                }
                else if (kfi.Adapter is IArchiveAdapter)
                {
                    tabControl = new ArchiveForm(kfi, tabPage, parentKfi?.Adapter as IArchiveAdapter, GetTabPageForKfi(parentKfi), _tempFolder, _pluginLoader);
                    (tabControl as IArchiveForm).OpenTab        += Kuriimu2_OpenTab;
                    (tabControl as IArchiveForm).GetAdapterById += Kuriimu2_GetAdapterById;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString(), "Exception catched.");
                return(null);
            }

            tabControl.TabColor = tabColor;

            if (tabControl is UserControl uc)
            {
                uc.Dock = DockStyle.Fill;
            }

            tabControl.SaveTab        += TabControl_SaveTab;
            tabControl.CloseTab       += TabControl_CloseTab;
            tabControl.ReportProgress += Report_ProgressChanged;

            tabPage.Controls.Add(tabControl as UserControl);

            openFiles.TabPages.Add(tabPage);
            tabPage.ImageKey      = "close-button"; // setting ImageKey before adding, makes the image not working
            openFiles.SelectedTab = tabPage;

            return(tabPage);
        }
예제 #22
0
 private void btnOpenUserMetadataForm_Click(object sender, EventArgs e)
 {
     using (var form = new TextForm(UserMetadata, txtUserMetadata.Text))
     {
         if (form.ShowDialog() == DialogResult.OK)
         {
             txtUserMetadata.Text = form.Content;
         }
     }
 }
예제 #23
0
    //
    // Plugin specific methods
    //

    private void chartBox_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        X = e.X;
        Y = e.Y;

        TextForm textForm = new TextForm();

        textForm.Closed += new EventHandler(TextForm_Closed);
        textForm.ShowDialog();
    }
예제 #24
0
        public static String GetClassNameLow(uint addr)
        {
            if (!U.isSafetyOffset(addr))
            {
                return("");
            }
            uint id = Program.ROM.u16(addr);

            return(TextForm.Direct(id).Trim());
        }
예제 #25
0
        public static string GetTIDName(uint tid)
        {
            if (tid <= 0x10)
            {
                return("");
            }
            string name = TextForm.Direct(tid);

            return(name);
        }
예제 #26
0
        static string GetNameFast(uint addr)
        {
            if (!U.isSafetyOffset(addr))
            {
                return("");
            }
            uint textid = Program.ROM.u32(addr + 4);

            return(TextForm.DirectAndStripAllCode(textid));
        }
예제 #27
0
        private void btnEdit_Click(object sender, EventArgs e)
        {
            TextForm form = new TextForm();

            form.TextValue = textBox.Text;
            if (form.ShowDialog() == DialogResult.OK)
            {
                textBox.Text = form.TextValue.Trim();
            }
        }
예제 #28
0
        private void itmFont_Click(object sender, System.EventArgs e)
        {
            TextForm documentForm = (TextForm)ActiveMdiChild;

            System.Windows.Forms.DialogResult enmResult = fontDialog.ShowDialog();
            if (enmResult == System.Windows.Forms.DialogResult.OK)
            {
                documentForm.fontData = fontDialog.Font;
            }
        }
예제 #29
0
        public static string GetStringFromDialog()
        {
            TextForm stringForm = new TextForm();

            if (stringForm.ShowDialog() == DialogResult.OK)
            {
                return(stringForm.StringValue);
            }
            return("");
        }
예제 #30
0
        public static String GetItemNameAddr(uint addr)
        {
            if (!U.isSafetyOffset(addr))
            {
                return("");
            }
            uint textid = Program.ROM.u16(addr);

            return(TextForm.Direct(textid));
        }
예제 #31
0
 public static TextWindow GuiOpenWindow(TextWindowCreateArgs args)
 {
     var form = new TextForm(args);
     if (args.Owned)
     {
         form.Owner = TerminalWindow;
     }
     return form.Content.Window;
 }
        public void Update_Main()
        {
            UpdateTime();
            UpdateForms();

            if (WarningMessages.Count == 0 && !FatalError)
            {
                FadeTo(LevelMultiform.MultiformName);
            }
            else
            {
                if ((KeyboardInput.IsPressed(C) && KeyboardInput.IsReleased(CTRL)) ||
                    (KeyboardInput.IsReleased(C) && KeyboardInput.IsPressed(CTRL)))
                {
                    var messages = new List<string>(WarningMessages);
                    if (FatalError)
                    {
                        messages.Insert(0, ErrorMessage);
                    }
                    Clipboard.SetText(String.Join("\n", messages));

                    GetForm(PressToCopyMessageFormName).AddEffector(new FadeOutEffector(15));

                    // Setting this adds a MESSAGES_COPIED_MESSAGE TextForm, since it activates
                    // the if (AtFrame(TimeOfMessagesCopied)) if statement below.
                    TimeOfMessagesCopied = LocalFrame + 20;
                }
                if (MouseInput.IsReleased(DemeterEngine.Input.MouseButtons.Left))
                {
                    if (FatalError)
                    {
                        FadeTo(LevelSelectMultiform.MultiformName);
                    }
                    else
                    {
                        FadeTo(LevelMultiform.MultiformName);
                    }
                }
            }

            for (int i = 0; i < RegisteredTextForms.Count; i++)
            {
                var textForm = RegisteredTextForms[i];
                if (AtFrame((int)(textForm.Position.Y / 5f)))
                {
                    textForm.AddEffector(new FadeInEffector(15));
                }
            }

            if (AtFrame(TimeOfMessagesCopied))
            {
                var pos = GetForm<TextForm>(PressToCopyMessageFormName).Position;
                var newForm = new TextForm(
                    MESSAGES_COPIED_MESSAGE, Assets.LevelLoad.Fonts.PlainMessage, pos, Color.TransparentBlack);
                newForm.AddEffector(new FadeInEffector(15));
                RegisterForm(newForm);
            }
        }
        private void RegisterMessage(string message, SpriteFont font, int gap, ref Vector2 center, string name = null)
        {
            var form = new TextForm(message, font, center, Color.TransparentBlack, true);
            if (name != null)
            {
                RegisterForm(name, form);
            }
            else
            {
                RegisterForm(form);
            }
            RegisteredTextForms.Add(form);

            center += new Vector2(0, font.MeasureString(message).Y + gap);
        }