Esempio n. 1
0
        public static uint CheckDuplicateMapChangeID(uint mapid, int current_no)
        {
            List <ChangeSt> changeList  = new List <ChangeSt>();
            uint            change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid);

            if (change_addr == U.NOT_FOUND)
            {
                return(U.NOT_FOUND);
            }
            InputFormRef N_InputFormRef = N_Init(null);

            N_InputFormRef.ReInit(change_addr);
            if (current_no >= N_InputFormRef.DataCount)
            {
                return(U.NOT_FOUND);
            }

            change_addr = change_addr + (uint)(current_no * N_InputFormRef.BlockSize);
            if (!U.isSafetyOffset(change_addr))
            {
                return(U.NOT_FOUND);
            }

            uint no = Program.ROM.u8(change_addr + 0);

            if (CheckDuplicateMapChangeIDLow(mapid, N_InputFormRef, no, change_addr))
            {
                return(MakeNewUniqeMapChangeID(mapid, N_InputFormRef, change_addr));
            }

            return(U.NOT_FOUND);
        }
Esempio n. 2
0
        public static List <ChangeSt> MakeChangeList(uint mapid)
        {
            List <ChangeSt> changeList = new List <ChangeSt>();

            uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid);

            if (change_addr == U.NOT_FOUND)
            {
                return(changeList);
            }

            InputFormRef N_InputFormRef = N_Init(null);

            N_InputFormRef.ReInit(change_addr);
            for (int i = 0; i < N_InputFormRef.DataCount; i++)
            {
                ChangeSt p = new ChangeSt();
                p.no               = Program.ROM.u8(change_addr + 0);
                p.x                = Program.ROM.u8(change_addr + 1);
                p.y                = Program.ROM.u8(change_addr + 2);
                p.width            = Program.ROM.u8(change_addr + 3);
                p.height           = Program.ROM.u8(change_addr + 4);
                p.addr             = Program.ROM.p32(change_addr + 8);
                p.self_change_addr = change_addr;
                changeList.Add(p);

                change_addr += N_InputFormRef.BlockSize;
            }

            return(changeList);
        }
Esempio n. 3
0
        //マップ変化のベース領域がなければ割り当てる
        public static bool PreciseChangeList(uint mapid)
        {
            List <ChangeSt> changeList = new List <ChangeSt>();

            uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid);

            if (U.isSafetyOffset(change_addr))
            {
                return(true);
            }

            return(PreciseChangeListForce(mapid) != 0);
        }
Esempio n. 4
0
        public static void MakeFlagIDArray(uint mapid, List <UseFlagID> list)
        {
            uint pointer;
            uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid, out pointer);

            if (change_addr == U.NOT_FOUND)
            {
                return;
            }

            InputFormRef N_InputFormRef = N_Init(null);

            N_InputFormRef.ReInitPointer(pointer);
            UseFlagID.AppendFlagIDFixedMapID(list, FELint.Type.MAPCHANGE, N_InputFormRef, 5, mapid);
        }
Esempio n. 5
0
        private void AddressList_SelectedIndexChanged(object sender, EventArgs e)
        {
            U.AddrResult ar    = InputFormRef.SelectToAddrResult(this.AddressList);
            uint         mapid = ar.tag;

            MapPictureBox.LoadMap(mapid);
            this.MapPictureBox.ClearAllPoint();

            uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid);

            if (!U.isSafetyOffset(change_addr))
            {
                this.N_InputFormRef.ClearSelect(true);
                this.N_AddressListExpandsButton_80.Enabled = false;
                return;
            }

            this.N_InputFormRef.ReInit(change_addr);
        }
        private void MAP_LISTBOX_SelectedIndexChanged(object sender, EventArgs e)
        {
            uint mapid = (uint)AddressList.SelectedIndex;

            if (mapid == U.NOT_FOUND)
            {
                return;
            }
            uint addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid);

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

            U.ForceUpdate(this.ReadStartAddress, addr);

            this.InputFormRef.ReInit(addr);
        }
Esempio n. 7
0
        //全データの取得
        public static void MakeAllDataLength(List <Address> list)
        {
            InputFormRef N_InputFormRef = N_Init(null);

            uint mapmax = MapSettingForm.GetDataCount();

            for (uint mapid = 0; mapid < mapmax; mapid++)
            {
                uint pointer;
                uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid, out pointer);
                if (change_addr == U.NOT_FOUND)
                {
                    continue;
                }

                //N_InputFormRef.ReInit(change_addr);
                N_InputFormRef.ReInitPointer(pointer);

                string name = "MapChange map:" + U.To0xHexString(mapid);
                FEBuilderGBA.Address.AddAddress(list, N_InputFormRef, name, new uint[] { 8 });

                List <U.AddrResult> arlist = N_InputFormRef.MakeList();
                for (int n = 0; n < arlist.Count; n++)
                {
                    uint addr       = arlist[n].addr;
                    uint w          = Program.ROM.u8((uint)addr + 3);  //サイズw
                    uint h          = Program.ROM.u8((uint)addr + 4);  //サイズh
                    uint change_mar = Program.ROM.p32((uint)addr + 8); //変化ポインタ
                    if (!U.isSafetyOffset(change_mar))
                    {
                        continue;
                    }
                    name = "MapChange map:" + U.To0xHexString(mapid) + " n:" + U.To0xHexString(n);
                    FEBuilderGBA.Address.AddAddress(list, change_mar
                                                    , w * h * 2
                                                    , addr + 8
                                                    , name
                                                    , Address.DataTypeEnum.BIN);
                }
            }
        }
Esempio n. 8
0
        static string GetNameLow(uint mapid, uint changeid)
        {
            uint pointer;
            uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid, out pointer);

            if (change_addr == U.NOT_FOUND)
            {
                return("");
            }

            InputFormRef N_InputFormRef = N_Init(null);

            N_InputFormRef.ReInitPointer(pointer);
            for (int i = 0; i < N_InputFormRef.DataCount; i++)
            {
                uint no = Program.ROM.u8(change_addr + 0);
                if (no == changeid)
                {
                    return(Program.CommentCache.At(change_addr));
                }
                change_addr += N_InputFormRef.BlockSize;
            }
            return("");
        }
        private void MAP_LISTBOX_SelectedIndexChanged(object sender, EventArgs e)
        {
            uint mapid = (uint)MAP_LISTBOX.SelectedIndex;

            if (mapid == U.NOT_FOUND)
            {
                this.InputFormRef.ClearSelect();
                return;
            }
            uint addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid);

            if (!Program.ROM.isSafetyOffset(addr))
            {
                this.InputFormRef.ClearSelect();
                return;
            }

            this.ReadStartAddress.Value = addr;

            MapPictureBox.LoadMap(mapid);

            this.MapPictureBox.ClearAllPoint();
            this.InputFormRef.ReInit(addr);
        }
Esempio n. 10
0
        //プログラムからのデータ拡張
        public static bool ResizeChangeList(uint mapid, uint newcount)
        {
            List <ChangeSt> changeList = new List <ChangeSt>();

            uint change_addr = MapSettingForm.GetMapChangeAddrWhereMapID(mapid);

            if (change_addr == U.NOT_FOUND)
            {
                return(false);
            }

            InputFormRef N_InputFormRef = N_Init(null);

            N_InputFormRef.ReInit(change_addr);

            uint olddatasize = N_InputFormRef.DataCount * N_InputFormRef.BlockSize;
            uint newdatasize = (newcount + 1) * N_InputFormRef.BlockSize;

            if (newdatasize < olddatasize)
            {//新しく確保するテーブル数が小さい場合
             //特に何もしない.
                return(true);
            }

            //既存データの取得
            byte[] oldDataByte = Program.ROM.getBinaryData(change_addr, olddatasize);
            //新規
            byte[] newDataByte = new byte[newdatasize];
            Array.Copy(oldDataByte, newDataByte, olddatasize);

            //新規に確保した領域にindex番号等を振る.
            int i = (int)N_InputFormRef.DataCount;

            for (; i < newcount; i++)
            {
                uint offset = (uint)(i * N_InputFormRef.BlockSize);
                U.write_u8(newDataByte, (uint)offset + 0, (uint)i);
                U.write_u8(newDataByte, (uint)offset + 3, 1); //サイズw
                U.write_u8(newDataByte, (uint)offset + 4, 1); //サイズh
            }
            //終端データ(newdata+1で確保しているため安全)
            U.write_u8(newDataByte, (uint)(i * N_InputFormRef.BlockSize), (uint)0xff);

            Undo.UndoData undodata = Program.Undo.NewUndoData("Resize MapChange", mapid.ToString("X"), newcount.ToString("X"));

            //新規領域の確保
            uint newaddr = InputFormRef.AppendBinaryData(newDataByte, undodata);

            if (newaddr == U.NOT_FOUND)
            {
                Program.Undo.Rollback(undodata);
                return(false);
            }

            //PLISTのポインタを書き換える.
            MapSettingForm.PLists plist = MapSettingForm.GetMapPListsWhereMapID(mapid);
            bool r = MapPointerForm.Write_Plsit(MapPointerForm.PLIST_TYPE.CHANGE, plist.mapchange_plist, newaddr, undodata);

            if (!r)
            {
                Program.Undo.Rollback(undodata);
                return(false);
            }

            Program.Undo.Push(undodata);

            return(true);
        }