//リストが拡張されたとき
        void AddressListExpandsEvent(object sender, EventArgs e)
        {
            uint pathaddr = InputFormRef.SelectToAddr(PathType);

            //拡張したアドレスの先頭アドレスを知りたい
            ListBox lb = (ListBox)sender;

            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)e;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            uint old_addr = Program.ROM.u32(pathaddr + 8);

            if (old_addr != 0x0)
            {//NULLでなければ、自動更新で更新されるだろう
                return;
            }

            Undo.UndoData undodata = Program.Undo.NewUndoData(this.Text + " " + PathType.Text + " Expapnds");

            //null の状態から拡張したデータには、 0xFF 0xFF 0xFF 0xFF の終端データがないので追加します.
            uint term_addr = (uint)(addr + ((count) * InputFormRef.BlockSize));

            Program.ROM.write_u32(term_addr, 0xFFFFFFFF, undodata);

            //拡張したアドレスを道情報に書き込みます.
            //なぜなら、道情報は null がありうるので、関連したポインタの自動更新から外れる時があるためです.
            Program.ROM.write_p32(pathaddr + 8, addr, undodata);

            Program.Undo.Push(undodata);
        }
Exemplo n.º 2
0
        private void AddressListExpandsEvent_N4(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "N4");

            //スキルが0だと終端がわからなくなるので、適当なものを入れる.
            uint       a             = addr + (eearg.OldDataCount * eearg.BlockSize);
            const uint default_skill = 0x01;

            for (int i = (int)eearg.OldDataCount; i < count; i++)
            {
                uint skill_lv = Program.ROM.u8(a);
                if (skill_lv == 0)
                {
                    Program.ROM.write_u8(a, default_skill, undodata);
                }

                a += eearg.BlockSize;
            }
            Program.Undo.Push(undodata);

            P16.Value = addr;
            WriteButton.PerformClick();

            N4_ReadCount.Value = eearg.NewDataCount;
            N4_InputFormRef.ReInit(addr, eearg.NewDataCount);
        }
        void FixBattleAnimePointerOnAddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            if (CLASS_LISTBOX.SelectedIndex < 0)
            {
                return;
            }

            uint cid = (uint)CLASS_LISTBOX.SelectedIndex;
            uint pointer;

            ClassForm.GetBattleAnimeAddrWhereID(cid, out pointer);
            if (!U.isSafetyOffset(pointer))
            {
                return;
            }
            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "FixBattleAnimeSetting");
            //クラスの戦闘アニメポインタを更新する.
            Program.ROM.write_p32(pointer, addr, undodata);
            Program.Undo.Push(undodata);

            this.InputFormRef.ReInit(addr, (uint)count);
        }
        void FixBattleAnimeSettingDataOnAddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            uint rom_length = (uint)Program.ROM.Data.Length;

            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "FixBattleAnimeSetting");

            //途中にnullが含まれている場合は、補正します.
            for (int i = 0; i < count; i++)
            {
                if (addr + 4 > rom_length)
                {
                    Log.Error("ROM Broken! Address after allocation is out of range. {0}+2/{1}", U.ToHexString8(addr), U.ToHexString8(rom_length));
                    break;
                }
                if (Program.ROM.u32(addr + 0) == 0)
                {//アドレスが空だったら増やす必要がある
                    //とりあえずアイテム、剣、アニメ1
                    Program.ROM.write_u8(addr + 0, 0x0, undodata);
                    Program.ROM.write_u8(addr + 1, 0x1, undodata);
                    Program.ROM.write_u16(addr + 2, 0x1, undodata);
                }

                addr += eearg.BlockSize;
            }
            Program.Undo.Push(undodata);
        }
Exemplo n.º 5
0
        //リストが拡張されたとき
        void AddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            //戦闘アニメーションを0クリアしておきます。トラブルを避けるため
            //クラスIDもちゃんと割り振ろう
            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "ClearBattleAnimationPointer");
            addr = addr + (eearg.OldDataCount * eearg.BlockSize);
            for (int i = (int)eearg.OldDataCount; i < count; i++)
            {
                //クラスID
                Program.ROM.write_u8(addr + 4, (uint)i, undodata);

                //戦闘アニメクリア
                Program.ROM.write_u32(addr + 52, 0, undodata);

                addr += eearg.BlockSize;
            }

            if (Program.ROM.RomInfo.version() == 8)
            {
                CCBranchForm.ExpandsArea(this, eearg.OldDataCount, (uint)count, undodata);
            }
            if (Program.ROM.RomInfo.is_multibyte())
            {
                OPClassAlphaNameForm.ExpandsArea(this, eearg.OldDataCount, (uint)count, undodata);
            }
            //移動アイコンはクラスIDと連動しているので増設しないといけない.
            ImageUnitMoveIconFrom.ExpandsArea(this, eearg.OldDataCount, (uint)count, undodata);

            Program.Undo.Push(undodata);
        }
Exemplo n.º 6
0
        //リストが拡張されたとき
        void AddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            uint rom_length = (uint)Program.ROM.Data.Length;

            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "FixUnitPlacer");

            //途中にnullが含まれている場合は、補正します.
            for (int i = 0; i < count; i++)
            {
                if (addr + 2 > rom_length)
                {
                    Log.Error("ROM Broken! Address after allocation is out of range. {0}+2/{1}", U.ToHexString8(addr), U.ToHexString8(rom_length));
                    break;
                }
                if (Program.ROM.u8(addr + 0) == 0)
                {//アドレスが空だったら増やす必要がある
                    //とりあえずUnitID: 0x01 を設置する.
                    Program.ROM.write_u8(addr + 0, 0x1, undodata);
                    Program.ROM.write_u8(addr + 1, 0x1, undodata);
                }

                addr += eearg.BlockSize;
            }
            Program.Undo.Push(undodata);

            //未割り当て領域を拡張した場合の帳尻合わせ
            EventUnitForm.ReallocUnrelatedData(eearg);

            U.ReSelectList(this.MAP_LISTBOX, this.EVENT_LISTBOX);
        }
Exemplo n.º 7
0
        private void OnAddressListExpandsEvent(object sender, EventArgs e)
        {
            if (!(e is InputFormRef.ExpandsEventArgs))
            {
                return;
            }

            InputFormRef.ExpandsEventArgs eventarg = (InputFormRef.ExpandsEventArgs)e;
            //アドレスが書き換わったときのみ通知される.
            Debug.Assert(eventarg.OldBaseAddress != eventarg.NewBaseAddress);

            for (int i = 0; i < ProcsList.Count; i++)
            {
                Address address = ProcsList[i];
                if (address.Addr != eventarg.OldBaseAddress)
                {
                    continue;
                }

                //FEBuilderGBAの自動書き換えが働いて、参照を書き換えているはず.
                Debug.Assert(Program.ROM.p32(U.toOffset(address.Pointer)) == eventarg.NewBaseAddress);

                ProcsList[i] = new Address(eventarg.NewBaseAddress, eventarg.NewDataCount, address.Pointer, address.Info, Address.DataTypeEnum.PROCS);
            }
        }
Exemplo n.º 8
0
        void AddressListExpandsEvent(object sender, EventArgs arg)
        {//アイテムテーブルの途中にある参照を変更する必要がある
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr = eearg.NewBaseAddress;

            Undo.UndoData undodata = Program.Undo.NewUndoData(this);
            Program.ROM.write_p32(Program.ROM.RomInfo.ai_preform_item_direct_asm_pointer, addr + 4, undodata);
            Program.Undo.Push(undodata);
        }
Exemplo n.º 9
0
        //支援はなぜかポインタ指定なのでユニットの支援ポインタを書き換えます。
        public static void AddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint oldaddr  = eearg.OldBaseAddress;
            int  oldcount = (int)eearg.OldDataCount;

            uint newaddr  = eearg.NewBaseAddress;
            int  newcount = (int)eearg.NewDataCount;

            //リストを縮めた場合も考慮したい.
            uint newaddr_limit = (uint)(newaddr + (eearg.BlockSize * newcount));

            List <U.AddrResult> unitlist = UnitForm.MakeUnitList();

            Undo.UndoData undodata = Program.Undo.NewUndoData("ChangeSupportPointer");
            int           i;

            for (i = 0; i < oldcount; i++)
            {
                uint support_addr = (uint)(oldaddr + (i * eearg.BlockSize));
                for (int n = 0; n < unitlist.Count; n++)
                {
                    uint addr44 = unitlist[n].addr + 44;

                    if (support_addr == Program.ROM.p32(addr44))
                    {//FE6,FE7,FE8共通で offset+44が支援ポインタ
                        uint change_addr = (uint)(newaddr + (i * eearg.BlockSize));
                        if (change_addr > newaddr_limit)
                        {//リストが縮小されたので無効化する.
                            change_addr = 0;
                        }

                        Program.ROM.write_p32(addr44, change_addr, undodata);
                    }
                }
            }
            //増えた分はわかるように設定します.
            byte[] cleadata = new byte[eearg.BlockSize];
            cleadata[0] = 0xf;
            cleadata[1] = 0xe;
            cleadata[2] = 0xe;
            cleadata[3] = 0xe;

            for (; i < newcount; i++)
            {
                uint support_addr = (uint)(newaddr + (i * eearg.BlockSize));

                //先頭2バイトでデータ生存判定をしているので、それは残す
                undodata.list.Add(new Undo.UndoPostion(support_addr, eearg.BlockSize));
                Program.ROM.write_range(support_addr, cleadata);
            }
            Program.Undo.Push(undodata);

            //リードしなおしてください.
            eearg.IsReload = true;
        }
Exemplo n.º 10
0
        //リストが拡張されたとき
        void AddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            if (Program.ROM.RomInfo.version() != 8)
            {
                Debug.Assert(false);
                eearg.IsCancel = true;
                return;
            }
            if (count >= 257 || count <= 0)
            {
                Debug.Assert(false);
                eearg.IsCancel = true;
                return;
            }
            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "SummonRepointExtraData");

            //table+1のアドレスを指定している部分があるので、その部分も書き換える必要あり
            {
                uint[] write_count_addr;
                if (Program.ROM.RomInfo.is_multibyte())
                {//For FE8J
                    write_count_addr = new uint[] { 0x024450, 0x07D14C };
                }
                else
                {//For FE8U
                    write_count_addr = new uint[] { 0x0244A0, 0x07AE04 };
                }
                for (int i = 0; i < write_count_addr.Length; i++)
                {
                    Program.ROM.write_u8(write_count_addr[i], U.toPointer(eearg.NewBaseAddress + 1));
                }
            }

            //件数を書く必要があるらしい.
            {
                uint[] write_count_addr;
                if (Program.ROM.RomInfo.is_multibyte())
                {//For FE8J
                    write_count_addr = new uint[] { 0x07D0B6, 0x0243EA };
                }
                else
                {//For FE8U
                    write_count_addr = new uint[] { 0x07AD66, 0x024436 };
                }
                for (int i = 0; i < write_count_addr.Length; i++)
                {
                    Program.ROM.write_u8(write_count_addr[i], (uint)(count - 1));
                }
            }
            Program.Undo.Push(undodata);
        }
Exemplo n.º 11
0
        public static void OnPreClassExtendsWarningHandler(object sender, EventArgs e)
        {
            InputFormRef.ExpandsEventArgs eventarg = (InputFormRef.ExpandsEventArgs)e;

            DialogResult dr = R.ShowNoYes("拡張した領域にある移動アニメーションを利用するには、移動アニメーション拡張のパッチが別途必要です。\r\n移動アニメーションを拡張してもよろしいですか?\r\n");
            if (dr != DialogResult.Yes)
            {//キャンセル.
                eventarg.IsCancel = true;
                return;
            }
        }
Exemplo n.º 12
0
        private void AddressListExpandsEvent_N4(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr = eearg.NewBaseAddress;

            P16.Value = addr;
            WriteButton.PerformClick();

            N4_ReadCount.Value = eearg.NewDataCount;
            N4_InputFormRef.ReInit(addr, eearg.NewDataCount);
        }
        //リストが拡張されたとき
        void N_AddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            this.P0.Value = addr;
            this.B5.Value = count;

            InputFormRef.WriteButtonToYellow(this.WriteButton, true);
        }
Exemplo n.º 14
0
        //リストが拡張されたとき
        void AddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.WriteButtonToYellow(WriteButton, false);

            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "ClearAllocMenu");
            AddressListExpandsEventInner(this, eearg, undodata);
            eearg.NewDataCount -= 1;
            eearg.IsReload      = true;
            Program.Undo.Push(undodata);
        }
Exemplo n.º 15
0
        public static void OnPreClassExtendsWarningHandler(object sender, EventArgs e)
        {
            InputFormRef.ExpandsEventArgs eventarg = (InputFormRef.ExpandsEventArgs)e;

            DialogResult dr = R.ShowNoYes("クラスの拡張はさまざまな問題を引き起こし危険です。\r\nクラスを拡張するべきではないと思います。\r\nそれでもあなたがクラスを拡張したい場合、クラスを拡張した後に発生する問題を回避するために、以下のパッチを適応してください。\r\n\r\n拡張した0x80以降のクラスをセーブデータに記録できるようにするパッチ(Class Expansion)\r\n拡張した0x80以降の移動アニメーションを動作させるパッチ(Extended to Moving Map Animation 0xFF)\r\n\r\n本当に、クラスを拡張してもよろしいですか?\r\n");

            if (dr != DialogResult.Yes)
            {//キャンセル.
                eventarg.IsCancel = true;
                return;
            }
        }
Exemplo n.º 16
0
        public static void OnPreGameOptionExtendsWarningHandler(object sender, EventArgs e)
        {
            InputFormRef.ExpandsEventArgs eventarg = (InputFormRef.ExpandsEventArgs)e;

            DialogResult dr = R.ShowNoYes("ゲームオプションの拡張はROMの破壊につながることがあります。\r\nゲームオプションの拡張は、新しいゲームオプションを実現する時にのみにやるべきです。\r\nゲームオプションの順番や非表示をやりたいだけであれば、ゲームオプションの順番の方で行ってください。\r\n\r\n上記を理解した上で、それでもリポイント処理を実行してもいいですか?\r\n");

            if (dr != DialogResult.Yes)
            {//キャンセル.
                eventarg.IsCancel = true;
                return;
            }
        }
Exemplo n.º 17
0
        //リストが拡張されたとき
        void AddressListExpandsUpdateBaristaAnimationAddress(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            Program.ROM.write_p32(
                Program.ROM.RomInfo.unit_wait_barista_anime_address()
                , addr
                + 0x2 + (0x8 * Program.ROM.RomInfo.unit_wait_barista_id())
                );
        }
Exemplo n.º 18
0
        private void AddressList_DoubleClick(object sender, EventArgs e)
        {
            if (this.UpdateCallbackEventHandler == null)
            {
                return;
            }
            U.AddrResult ar = InputFormRef.SelectToAddrResult(this.AddressList);
            InputFormRef.ExpandsEventArgs args = new InputFormRef.ExpandsEventArgs();
            args.NewBaseAddress = ar.addr;

            this.UpdateCallbackEventHandler(sender, args);
            this.Close();
        }
Exemplo n.º 19
0
        public static uint ExpandsArea(Form form, string typename, uint newdatacount, Undo.UndoData undodata)
        {
            uint pointer;

            if (typename == "UNITMENU")
            {
                pointer = MenuDefinitionForm.GetUnitMenuPointer();
            }
            else if (typename == "GAMEMENU")
            {
                pointer = MenuDefinitionForm.GetGameMenuPointer();
            }
            else if (typename == "DEBUG1")
            {
                pointer = MenuDefinitionForm.GetDebug1MenuPointer();
            }
            else if (typename == "ITEMMENU")
            {
                pointer = MenuDefinitionForm.GetItemMenuPointer();
            }
            else
            {
                return(U.NOT_FOUND);
            }

            uint newaddr;

            {
                InputFormRef.ExpandsEventArgs eearg = new InputFormRef.ExpandsEventArgs();

                InputFormRef ifr = Init(null);
                ifr.ReInitPointer(pointer);

                eearg.OldBaseAddress = ifr.BaseAddress;
                eearg.OldDataCount   = ifr.DataCount;
                eearg.BlockSize      = ifr.BlockSize;

                newaddr = ifr.ExpandsArea(form, newdatacount, undodata, pointer);
                if (newaddr == U.NOT_FOUND)
                {
                    return(U.NOT_FOUND);
                }

                eearg.NewBaseAddress = newaddr;
                eearg.NewDataCount   = newdatacount;
                AddressListExpandsEventInner(form, eearg, undodata);
            }
            InputFormRef.ClearCacheDataCount();
            return(newaddr);
        }
Exemplo n.º 20
0
        //リストが拡張されたとき
        void AddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            //件数を書く必要があるらしい.
            uint write_count_addr = Program.ROM.RomInfo.status_game_option_order_count_address();

            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "StatusOptionOrder");
            Program.ROM.write_u8(write_count_addr, (uint)(count));

            Program.Undo.Push(undodata);
        }
Exemplo n.º 21
0
        static void AddressListExpandsEventInner(Form from, InputFormRef.ExpandsEventArgs eearg, Undo.UndoData undodata)
        {
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            if (count <= 2)
            {
                return;
            }

            uint rom_length = (uint)Program.ROM.Data.Length;

            //配置後アドレスを0クリアします.
            addr = addr + (eearg.OldDataCount * eearg.BlockSize);
            for (int i = (int)eearg.OldDataCount; i < count - 1; i++)
            {
                if (addr + 36 > rom_length)
                {
                    break;
                }
                WriteNullMenu(addr, undodata);
                addr += eearg.BlockSize;
            }

            //最後のメニューと新規確保したメニューの位置を入れ替える.
            if (eearg.OldDataCount < eearg.NewDataCount && eearg.OldDataCount >= 1)
            {
                uint   oldEndAddr = eearg.NewBaseAddress + ((eearg.OldDataCount - 1) * eearg.BlockSize);
                uint   newEndAddr = eearg.NewBaseAddress + ((eearg.NewDataCount - 2) * eearg.BlockSize);
                byte[] endEndData = Program.ROM.getBinaryData(oldEndAddr, eearg.BlockSize);
                byte[] newEndData = Program.ROM.getBinaryData(newEndAddr, eearg.BlockSize);

                Program.ROM.write_range(oldEndAddr, newEndData, undodata);
                Program.ROM.write_range(newEndAddr, endEndData, undodata);
            }

            {//終端
                addr = eearg.NewBaseAddress + ((eearg.NewDataCount - 1) * eearg.BlockSize);
                Program.ROM.write_u32(addr + 0, 0, undodata);
                Program.ROM.write_u32(addr + 4, 0, undodata);
                Program.ROM.write_u32(addr + 8, 0, undodata);
                Program.ROM.write_u32(addr + 12, 0, undodata);
                Program.ROM.write_u32(addr + 16, 0, undodata);
                Program.ROM.write_u32(addr + 20, 0, undodata);
                Program.ROM.write_u32(addr + 24, 0, undodata);
                Program.ROM.write_u32(addr + 28, 0, undodata);
                Program.ROM.write_u32(addr + 32, 0xFFFFFFFF, undodata); //nullが連続していると、間違われることがあるので、最終単に0xFFFFFFFFを入れる.
            }
        }
Exemplo n.º 22
0
        public static void OnPreClassExtendsWarningHandler(object sender, EventArgs e)
        {
            InputFormRef.ExpandsEventArgs eventarg = (InputFormRef.ExpandsEventArgs)e;
            bool r = HowDoYouLikePatchForm.CheckAndShowPopupDialog(HowDoYouLikePatchForm.TYPE.ExtendedMovingMapAnimationList);

            if (!r)
            {
                DialogResult dr = R.ShowNoYes("拡張した領域にある移動アニメーションを利用するには、移動アニメーション拡張のパッチが別途必要です。\r\n移動アニメーションを拡張してもよろしいですか?\r\n");
                if (dr != DialogResult.Yes)
                {//キャンセル.
                    eventarg.IsCancel = true;
                    return;
                }
            }
        }
        //リストが拡張されたとき
        void AddressListExpandsUpdateBaristaAnimationAddress(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            Program.ROM.write_p32(
                Program.ROM.RomInfo.unit_wait_barista_anime_address
                , addr
                + 0x2 + (0x8 * Program.ROM.RomInfo.unit_wait_barista_id)
                );
            if (count > 128)
            {
                HowDoYouLikePatchForm.CheckAndShowPopupDialog(HowDoYouLikePatchForm.TYPE.ExtendedMovingMapAnimationList);
            }
        }
Exemplo n.º 24
0
        //配置座標が拡張されたとき
        void AddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            if (count <= 0)
            {
                return;
            }

            //マントコマンドは個数が書かれているので、修正しないといけない.
            uint count_addr = Program.ROM.RomInfo.mant_command_count_address();

            Program.Undo.Push("MantCount", count_addr, 4);
            Program.ROM.write_u8(count_addr, (uint)count - 1);
        }
Exemplo n.º 25
0
        //リストが拡張されたとき P12イベントポインタをNULLにする.
        void AddressListExpandsEventNoCopyP12(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            InputFormRef.WriteButtonToYellow(WriteButton, false);

            //増えた分のP12をゼロにする.
            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "ClearP12Pointer");
            addr = addr + (eearg.OldDataCount * eearg.BlockSize);
            for (int i = (int)eearg.OldDataCount; i < count; i++)
            {
                Program.ROM.write_u32(addr + 12, 0, undodata);

                addr += eearg.BlockSize;
            }
            Program.Undo.Push(undodata);
        }
        void N1_InputFormRef_AddressListExpandsEvent(object sender, EventArgs e)
        {
            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "AssignLevelUpBase");

            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)e;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            uint termAddr = (uint)(addr + eearg.BlockSize * (count)); //余分に確保した終端データ
            uint termData = Program.ROM.u16(termAddr);

            if ((termData != 0 && count > 1))
            {//スキルリストは特殊で終端データは、0x00 0x00 でないといけない
                //終端コードを 0x00 0x00 にする.
                Program.ROM.write_u16(termAddr, 0x0000, undodata);
            }

            //スキルが0だと終端がわからなくなるので、適当なものを入れる.
            uint       a = addr + (eearg.OldDataCount * eearg.BlockSize);
            const uint default_skill_lv = 0x0101;

            for (int i = (int)eearg.OldDataCount; i < count; i++)
            {
                uint skill_lv = Program.ROM.u16(a);
                if (skill_lv == 0)
                {
                    Program.ROM.write_u16(a, default_skill_lv, undodata);
                }

                a += eearg.BlockSize;
            }

            //拡張したアドレスを書き込む.
            uint write_addr = AssignLevelUpBaseAddress + (((uint)AddressList.SelectedIndex) * 4);

            Program.ROM.write_p32(write_addr, addr, undodata);
            this.X_LevelUpAddr.Value = U.toPointer(addr);

            Program.Undo.Push(undodata);

//            N1_ReadCount.Value = eearg.NewDataCount;
//            N1_InputFormRef.ReInit(addr, eearg.NewDataCount);
        }
Exemplo n.º 27
0
        //拡張されていた場合イベントの送信.
        void FireAddressListExpandsEvent(uint addr, uint newaddr, uint newSize)
        {
            if (addr == newaddr)
            {//同一
                return;
            }
            if (this.AddressListExpandsEvent == null)
            {//イベントがない
                return;
            }

            InputFormRef.ExpandsEventArgs eventarg = new InputFormRef.ExpandsEventArgs();
            eventarg.OldBaseAddress = addr;
            eventarg.BlockSize      = 8;
            eventarg.OldDataCount   = 0;
            eventarg.NewBaseAddress = newaddr;
            eventarg.NewDataCount   = newSize;
            this.AddressListExpandsEvent(this.Script, eventarg);

            //asm mapキャッシュの更新.
            Program.AsmMapFileAsmCache.ClearCache();
        }
Exemplo n.º 28
0
        //リストが拡張されたとき
        void AddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            //戦闘アニメーションを0クリアしておきます。トラブルを避けるため
            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "ClearBattleAnimationPointer");
            addr = addr + ((eearg.OldDataCount - 1) * eearg.BlockSize);            //-1は class は 0x00から始まるため
            for (int i = (int)eearg.OldDataCount - 1; i < count; i++)
            {
                //クラスID
                Program.ROM.write_u8(addr + 4, (uint)i, undodata);

                //戦闘アニメクリア
                Program.ROM.write_u32(addr + 48, 0, undodata);
                addr += eearg.BlockSize;
            }
            //移動アイコンはクラスIDと連動しているので増設しないといけない.
            ImageUnitMoveIconFrom.ExpandsArea(this, eearg.OldDataCount, (uint)count, undodata);

            Program.Undo.Push(undodata);
        }
        void N1_InputFormRef_AddressListExpandsEvent(object sender, EventArgs e)
        {
            uint assignLevelUpP = FindFE8SpellPatchPointer();

            if (assignLevelUpP == U.NOT_FOUND)
            {
                return;
            }
            uint assignLevelUpAddr = Program.ROM.p32(assignLevelUpP);

            if (!U.isSafetyOffset(assignLevelUpAddr))
            {
                return;
            }

            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "AssignLevelUpBase");

            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)e;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            uint termAddr = (uint)(addr + eearg.BlockSize * (count)); //余分に確保した終端データ
            uint termData = Program.ROM.u16(termAddr);

            if ((termData != 0 && count > 1))
            {//スキルリストは特殊で終端データは、0x00 0x00 でないといけない
                //終端コードを 0x00 0x00 にする.
                Program.ROM.write_u16(termAddr, 0x0000, undodata);
            }

            //拡張したアドレスを書き込む.
            uint write_addr = assignLevelUpAddr + (((uint)AddressList.SelectedIndex) * 4);

            Program.ROM.write_p32(write_addr, addr, undodata);

            Program.Undo.Push(undodata);
        }
Exemplo n.º 30
0
        //リストが拡張されたとき
        void AddressListExpandsEvent(object sender, EventArgs arg)
        {
            InputFormRef.ExpandsEventArgs eearg = (InputFormRef.ExpandsEventArgs)arg;
            uint addr  = eearg.NewBaseAddress;
            int  count = (int)eearg.NewDataCount;

            if (Program.ROM.RomInfo.version() != 8)
            {
                Debug.Assert(false);
                eearg.IsCancel = true;
                return;
            }
            if (count >= 257 || count <= 0)
            {
                Debug.Assert(false);
                eearg.IsCancel = true;
                return;
            }

            //件数を書く必要があるらしい.
            uint[] write_count_addr;
            if (Program.ROM.RomInfo.is_multibyte())
            {//For FE8J
                write_count_addr = new uint[] { 0x07D0B6, 0x0243EA };
            }
            else
            {//For FE8U
                write_count_addr = new uint[] { 0x07AD66, 0x024436 };
            }
            Undo.UndoData undodata = Program.Undo.NewUndoData(this, "SummonCount");
            for (int i = 0; i < write_count_addr.Length; i++)
            {
                Program.ROM.write_u8(write_count_addr[i], (uint)(count - 1));
            }

            Program.Undo.Push(undodata);
        }