public static void MakeCheckError(List <FELint.ErrorSt> errors)
        {
            InputFormRef InputFormRef;

            if (PatchUtil.SearchSkillSystem() != PatchUtil.skill_system_enum.SkillSystem)
            {
                return;
            }

            {
                uint assignUnitP = SkillConfigSkillSystemForm.FindAssignPersonalSkillPointer();
                if (assignUnitP == U.NOT_FOUND)
                {
                    return;
                }
                InputFormRef = Init(null, assignUnitP);

                uint assignLevelUpP = SkillConfigSkillSystemForm.FindAssignUnitLevelUpSkillPointer();
                if (assignLevelUpP == U.NOT_FOUND)
                {
                    return;
                }

                Dictionary <uint, string> skillNames = new Dictionary <uint, string>();
                InputFormRef N1_InputFormRef         = N1_Init(null, skillNames);

                uint assignLevelUpAddr = Program.ROM.p32(assignLevelUpP);
                for (uint i = 0; i < InputFormRef.DataCount; i++, assignLevelUpAddr += 4)
                {
                    if (!U.isSafetyOffset(assignLevelUpAddr))
                    {
                        errors.Add(new FELint.ErrorSt(FELint.Type.SKILL_UNIT, assignLevelUpAddr, R._("Skillのユニット割り当てが(UnitID: {0})までで、途中で終わってしまいました。", U.To0xHexString(i)), i));
                        break;
                    }

                    uint levelupList = Program.ROM.u32(assignLevelUpAddr);
                    if (levelupList == 0)
                    {//empty
                        continue;
                    }
                    else if (!U.isSafetyPointer(levelupList))
                    {
                        errors.Add(new FELint.ErrorSt(FELint.Type.SKILL_UNIT, assignLevelUpAddr, R._("Skillのユニット割り当て(UnitID: {0})のデータポインタ({1})が壊れています。\r\nこのユニットをLOADする時に無限ループが発生する可能性があります。\r\n正しいアドレスを入力するか、0に設定してください。", U.To0xHexString(i), U.To0xHexString(levelupList)), i));
                        continue;
                    }

                    N1_InputFormRef.ReInitPointer(assignLevelUpAddr);
                    if (N1_InputFormRef.DataCount >= 20)
                    {
                        errors.Add(new FELint.ErrorSt(FELint.Type.SKILL_UNIT, assignLevelUpAddr, R._("Skillのユニット割り当て(UnitID: {0})のデータポインタ({1})には、大量の({2})個のデータが登録されています。\r\nアドレスが間違っていませんか?\r\n正しいアドレスを入力するか、0に設定してください。", U.To0xHexString(i), U.To0xHexString(levelupList), N1_InputFormRef.DataCount), i));
                        continue;
                    }
                }
            }
        }
Esempio n. 2
0
        public SkillAssignmentUnitSkillSystemForm()
        {
            InitializeComponent();

            uint icon           = SkillConfigSkillSystemForm.FindIconPointer();
            uint text           = SkillConfigSkillSystemForm.FindTextPointer();
            uint assignUnit     = SkillConfigSkillSystemForm.FindAssignPersonalSkillPointer();
            uint assignLevelUpP = SkillConfigSkillSystemForm.FindAssignUnitLevelUpSkillPointer();

            if (icon == U.NOT_FOUND)
            {
                R.ShowStopError("スキル拡張 SkillSystem の、アイコンを取得できません。");
                return;
            }
            if (text == U.NOT_FOUND)
            {
                R.ShowStopError("スキル拡張 SkillSystem の、テキストを取得できません。");
                return;
            }
            if (assignUnit == U.NOT_FOUND)
            {
                R.ShowStopError("スキル拡張 SkillSystem の、個人スキルを取得できません。");
                return;
            }
            this.SkillNames = SkillConfigSkillSystemForm.LoadSkillNames();

            this.TextBaseAddress       = Program.ROM.p32(text);
            this.IconBaseAddress       = Program.ROM.p32(icon);
            this.AssignUnitBaseAddress = Program.ROM.p32(assignUnit);
            if (assignLevelUpP == U.NOT_FOUND)
            {//古いパッチでは、ユニットベースのレベルアップスキルが存在しない
                this.AssignLevelUpBaseAddress = U.NOT_FOUND;
                UnitLevelUpSkill.Hide();
            }
            else
            {
                this.AssignLevelUpBaseAddress = Program.ROM.p32(assignLevelUpP);
            }

            this.AddressList.OwnerDraw(ListBoxEx.DrawUnitAndText, DrawMode.OwnerDrawFixed);
            InputFormRef.markupJumpLabel(this.J_0_SKILLASSIGNMENT);
            InputFormRef = Init(this, assignUnit);
            InputFormRef.MakeGeneralAddressListContextMenu(true);
            InputFormRef.CheckProtectionPaddingALIGN4 = false;

            this.N1_AddressList.OwnerDraw(DrawSkillAndText, DrawMode.OwnerDrawFixed);
            InputFormRef.markupJumpLabel(this.N1_J_1_SKILLASSIGNMENT);
            N1_InputFormRef = N1_Init(this, this.SkillNames);
            N1_InputFormRef.AddressListExpandsEvent += N1_InputFormRef_AddressListExpandsEvent;
            N1_InputFormRef.MakeGeneralAddressListContextMenu(true);

            InputFormRef.markupJumpLabel(X_LEARNINFO);
        }
Esempio n. 3
0
        //全データの取得
        public static void MakeAllDataLength(List <Address> list)
        {
            InputFormRef InputFormRef;

            if (PatchUtil.SearchSkillSystem() != PatchUtil.skill_system_enum.SkillSystem)
            {
                return;
            }

            {
                uint assignUnitP = SkillConfigSkillSystemForm.FindAssignPersonalSkillPointer();

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


                InputFormRef = Init(null, assignUnitP);
                FEBuilderGBA.Address.AddAddress(list, InputFormRef, "SkillAssignmentUnitSkillSystem", new uint[] { });

                uint assignLevelUpP = SkillConfigSkillSystemForm.FindAssignUnitLevelUpSkillPointer();
                if (assignLevelUpP == U.NOT_FOUND)
                {
                    return;
                }

                Dictionary <uint, string> skillNames = new Dictionary <uint, string>();
                InputFormRef N1_InputFormRef         = N1_Init(null, skillNames);

                uint assignLevelUpAddr = Program.ROM.p32(assignLevelUpP);
                for (uint i = 0; i < InputFormRef.DataCount; i++, assignLevelUpAddr += 4)
                {
                    if (!U.isSafetyOffset(assignLevelUpAddr))
                    {
                        break;
                    }

                    uint levelupList = Program.ROM.p32(assignLevelUpAddr);
                    if (!U.isSafetyOffset(levelupList))
                    {
                        continue;
                    }

                    N1_InputFormRef.ReInitPointer(assignLevelUpAddr);
                    FEBuilderGBA.Address.AddAddress(list, N1_InputFormRef, "SkillAssignmentUnitSkillSystem.Levelup" + i, new uint[] { });
                }
            }
        }
Esempio n. 4
0
        public static int MakeUnitSkillButtons(uint uid, Button[] buttons, ToolTipEx tooltip)
        {
            uint iconP       = SkillConfigSkillSystemForm.FindIconPointer();
            uint textP       = SkillConfigSkillSystemForm.FindTextPointer();
            uint assignUnitP = SkillConfigSkillSystemForm.FindAssignPersonalSkillPointer();

            if (iconP == U.NOT_FOUND)
            {
                return(0);
            }
            if (textP == U.NOT_FOUND)
            {
                return(0);
            }
            if (assignUnitP == U.NOT_FOUND)
            {
                return(0);
            }


            InputFormRef        InputFormRef = Init(null, assignUnitP);
            List <U.AddrResult> list         = InputFormRef.MakeList();

            if (uid < 0 || uid >= list.Count)
            {
                return(0);
            }

            uint classaddr = list[(int)uid].addr;

            if (!U.isSafetyOffset(classaddr))
            {
                return(0);
            }
            uint b0 = Program.ROM.u8(classaddr);

            if (b0 <= 0)
            {
                return(0);
            }

            uint icon = Program.ROM.p32(iconP);
            uint text = Program.ROM.p32(textP);

            int skillCount = 0;

            {
                Bitmap bitmap = SkillConfigSkillSystemForm.DrawIcon((uint)b0, icon);
                U.MakeTransparent(bitmap);
                buttons[0].BackgroundImage = bitmap;
                buttons[0].Tag             = b0;

                string skillCaption = SkillConfigSkillSystemForm.GetSkillText((uint)b0, text);
                tooltip.SetToolTipOverraide(buttons[skillCount], skillCaption);
            }
            skillCount++;


            //レベルアップで覚えるスキル.
            Dictionary <uint, string> skillNames = new Dictionary <uint, string>();
            InputFormRef N1_InputFormRef         = N1_Init(null, skillNames);

            uint assignLevelUpP = SkillConfigSkillSystemForm.FindAssignUnitLevelUpSkillPointer();

            if (assignLevelUpP == U.NOT_FOUND)
            {//昔のバージョンには、存在しなかった
                return(skillCount);
            }

            SkillAssignmentClassSkillSystemForm.MakeUnitSkillButtonsList(uid, buttons, tooltip, assignLevelUpP, icon, text, skillCount);
            return(skillCount);
        }
Esempio n. 5
0
        public static void ImportAllData(string filename)
        {
            InputFormRef InputFormRef;

            if (PatchUtil.SearchSkillSystem() != PatchUtil.skill_system_enum.SkillSystem)
            {
                return;
            }

            string[] lines = File.ReadAllLines(filename);
            {
                uint iconP          = SkillConfigSkillSystemForm.FindIconPointer();
                uint textP          = SkillConfigSkillSystemForm.FindTextPointer();
                uint assignUnitP    = SkillConfigSkillSystemForm.FindAssignPersonalSkillPointer();
                uint assignLevelUpP = SkillConfigSkillSystemForm.FindAssignUnitLevelUpSkillPointer();

                if (iconP == U.NOT_FOUND)
                {
                    return;
                }
                if (textP == U.NOT_FOUND)
                {
                    return;
                }
                if (assignUnitP == U.NOT_FOUND)
                {
                    return;
                }
                if (assignLevelUpP == U.NOT_FOUND)
                {
                    return;
                }

                InputFormRef = Init(null, assignUnitP);

                Dictionary <uint, string> skillNames = new Dictionary <uint, string>();
                InputFormRef N1_InputFormRef         = N1_Init(null, skillNames);

                uint classBaseSkillAddr = InputFormRef.BaseAddress;
                uint assignLevelUpAddr  = Program.ROM.p32(assignLevelUpP);
                for (uint i = 0; i < InputFormRef.DataCount;
                     i++, assignLevelUpAddr += 4, classBaseSkillAddr += 1)
                {
                    if (!U.isSafetyOffset(assignLevelUpAddr))
                    {
                        break;
                    }
                    if (i >= lines.Length)
                    {
                        break;
                    }
                    string[] sp = lines[i].Split('\t');
                    if (sp.Length < 2)
                    {
                        continue;
                    }
                    {
                        uint skill = U.atoh(sp[0]);
                        Program.ROM.write_u8(classBaseSkillAddr + 0, skill);
                    }

                    uint levelupSkillAddr = U.atoh(sp[1]);
                    if (U.isExtrendsROMArea(levelupSkillAddr) || levelupSkillAddr == 0)
                    {//拡張領域、または0の値が設定されている場合は書き戻す
                        Program.ROM.write_p32(assignLevelUpAddr, levelupSkillAddr);
                        continue;
                    }

                    uint levelupList = Program.ROM.p32(assignLevelUpAddr);
                    if (!U.isSafetyOffset(levelupList))
                    {
                        continue;
                    }

                    N1_InputFormRef.ReInitPointer(assignLevelUpAddr);
                    uint levelupAddr = N1_InputFormRef.BaseAddress;
                    for (uint n = 0; n < N1_InputFormRef.DataCount; n++, levelupAddr += 2)
                    {
                        uint level = U.atoh(U.at(sp, 2 + (n * 2) + 0));
                        uint skill = U.atoh(U.at(sp, 2 + (n * 2) + 1));
                        Program.ROM.write_u8(levelupAddr + 0, level);
                        Program.ROM.write_u8(levelupAddr + 1, skill);
                    }
                }
            }
        }
Esempio n. 6
0
        public static void ExportAllData(string filename)
        {
            InputFormRef InputFormRef;

            if (PatchUtil.SearchSkillSystem() != PatchUtil.skill_system_enum.SkillSystem)
            {
                return;
            }

            List <string> lines = new List <string>();

            {
                uint iconP          = SkillConfigSkillSystemForm.FindIconPointer();
                uint textP          = SkillConfigSkillSystemForm.FindTextPointer();
                uint assignUnitP    = SkillConfigSkillSystemForm.FindAssignPersonalSkillPointer();
                uint assignLevelUpP = SkillConfigSkillSystemForm.FindAssignUnitLevelUpSkillPointer();

                if (iconP == U.NOT_FOUND)
                {
                    return;
                }
                if (textP == U.NOT_FOUND)
                {
                    return;
                }
                if (assignUnitP == U.NOT_FOUND)
                {
                    return;
                }

                InputFormRef = Init(null, assignUnitP);

                Dictionary <uint, string> skillNames = new Dictionary <uint, string>();
                InputFormRef N1_InputFormRef         = N1_Init(null, skillNames);

                uint classBaseSkillAddr = InputFormRef.BaseAddress;

                if (assignLevelUpP == U.NOT_FOUND)
                {//旧バージョン
                    InputFormRef = Init(null, assignUnitP);
                    uint p = InputFormRef.BaseAddress;
                    for (int i = 0; i < InputFormRef.DataCount; i++, p += InputFormRef.BlockSize)
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.Append(U.ToHexString(Program.ROM.u8(p + 0)));
                        sb.Append("\t");
                        sb.Append("0");
                        lines.Add(sb.ToString());
                    }
                }
                else
                {
                    uint assignLevelUpAddr = Program.ROM.p32(assignLevelUpP);
                    for (uint i = 0; i < InputFormRef.DataCount;
                         i++, assignLevelUpAddr += 4, classBaseSkillAddr += 1)
                    {
                        if (!U.isSafetyOffset(assignLevelUpAddr))
                        {
                            break;
                        }

                        StringBuilder sb = new StringBuilder();
                        sb.Append(U.ToHexString(Program.ROM.u8(classBaseSkillAddr + 0)));

                        uint levelupList = Program.ROM.p32(assignLevelUpAddr);
                        sb.Append("\t");
                        sb.Append(U.ToHexString(levelupList));
                        if (!U.isSafetyOffset(levelupList))
                        {
                            lines.Add(sb.ToString());
                            continue;
                        }

                        N1_InputFormRef.ReInitPointer(assignLevelUpAddr);
                        uint levelupAddr = N1_InputFormRef.BaseAddress;
                        for (uint n = 0; n < N1_InputFormRef.DataCount; n++, levelupAddr += 2)
                        {
                            sb.Append("\t");
                            sb.Append(U.ToHexString(Program.ROM.u8(levelupAddr + 0)));
                            sb.Append("\t");
                            sb.Append(U.ToHexString(Program.ROM.u8(levelupAddr + 1)));
                        }
                        lines.Add(sb.ToString());
                    }
                }
            }
            File.WriteAllLines(filename, lines);
        }