Exemplo n.º 1
0
        static void MakeCheckError_Check(List <FELint.ErrorSt> errors, uint support_addr, uint id)
        {
            uint uid = UnitForm.GetUnitIDWhereSupportAddr(support_addr);

            if (uid == U.NOT_FOUND)
            {
                return;
            }
            uid++;

            //実際の値を見る
            uint support_unit_count = 0;
            uint limit = support_addr + SUPPORT_LIMIT;

            for (uint addr = support_addr; addr < limit; addr++)
            {
                uint target_uid = Program.ROM.u8(addr);
                if (target_uid == 0)
                {
                    continue;
                }
                support_unit_count++;

                uint init_value = Program.ROM.u8(addr + SUPPORT_LIMIT);
                uint add_value  = Program.ROM.u8(addr + SUPPORT_LIMIT + SUPPORT_LIMIT);
                MakeCheckError_SelfCheck(errors, support_addr, id, uid, target_uid, init_value, add_value);

                if (target_uid > 0x45)
                {     //敵ユニット支援
                    if (add_value > 0)
                    { //敵ユニット支援に進行度があるのはおかしいよ
                        errors.Add(new FELint.ErrorSt(FELint.Type.SUPPORT_UNIT, support_addr
                                                      , R._("ユニット({0})が、ユニット({1})への支援は、支援相手のユニットがUnitID:0x45を超えているので、敵ユニット同士の支援だと思われますが、「進行度」が({2})に設定されています。\r\n敵ユニットの支援ポイントが増えることはないので、0にするべきです。\r\n(UnitID:0x45を超えるデータに仲間になるユニットを配置してはいけません)"
                                                            , UnitForm.GetUnitNameWithID(uid), UnitForm.GetUnitNameWithID(target_uid), add_value
                                                            )
                                                      , id));
                    }
                }
            }
            //件数の比較
            uint all_count = Program.ROM.u8(support_addr + 0x15);

            if (all_count != support_unit_count)
            {
                errors.Add(new FELint.ErrorSt(FELint.Type.SUPPORT_UNIT, support_addr
                                              , R._("ユニット({0})の支援人数が正しくありません。支援人数が{1}人なのに、実際のデータには、{2}人の支援があります。"
                                                    , UnitForm.GetUnitNameWithID(uid), all_count, support_unit_count
                                                    )
                                              , id));
            }
            if (all_count > SUPPORT_LIMIT)
            {
                errors.Add(new FELint.ErrorSt(FELint.Type.SUPPORT_UNIT, support_addr
                                              , R._("支援で登録できる人数は7人までです。それを上回る({0})人を、データ({1})で、指定しています。"
                                                    , all_count, U.ToHexString(support_addr)
                                                    )
                                              , id));
                return;
            }
        }
Exemplo n.º 2
0
        static void MakeCheckError_SelfCheck(List <FELint.ErrorSt> errors
                                             , uint support_addr, uint id
                                             , uint uid, uint target_uid, uint init_value, uint add_value)
        {
            //このユニットの支援相手が、自分に対して支援をもっているか確認します.
            uint addr = UnitForm.GetSupportAddrWhereUnitID(target_uid);

            if (addr != U.NOT_FOUND)
            {
                uint target_limit = addr + SUPPORT_LIMIT;
                for (; addr < target_limit; addr++)
                {
                    if (!U.isSafetyOffset(addr + SUPPORT_LIMIT + SUPPORT_LIMIT))
                    {//危険なアドレス
                        break;
                    }
                    uint target_uid2 = Program.ROM.u8(addr);
                    if (uid != target_uid2)
                    {
                        continue;
                    }

                    uint init_value2 = Program.ROM.u8(addr + SUPPORT_LIMIT);
                    uint add_value2  = Program.ROM.u8(addr + SUPPORT_LIMIT + SUPPORT_LIMIT);
                    if (init_value != init_value2 || add_value != add_value2)
                    {
                        errors.Add(new FELint.ErrorSt(FELint.Type.SUPPORT_UNIT, support_addr
                                                      , R._("ユニット({0})->ユニット({1})へ支援と、その逆の、ユニット({1})->ユニット({0})へ支援の設定値が違います。\r\n初期値({2} vs {3})、進行度({4} vs {5})\r\n初期値と進行度は、同じ値にする必要があります。"
                                                            , UnitForm.GetUnitNameWithID(uid), UnitForm.GetUnitNameWithID(target_uid), init_value, init_value2, add_value, add_value2
                                                            )
                                                      , id));
                    }
                    return;
                }
            }

            errors.Add(new FELint.ErrorSt(FELint.Type.SUPPORT_UNIT, support_addr
                                          , R._("ユニット({0})->ユニット({1})への支援はありますが、逆に、ユニット({1})->ユニット({0})への支援がありません。"
                                                , UnitForm.GetUnitNameWithID(uid), UnitForm.GetUnitNameWithID(target_uid)
                                                )
                                          , id));
        }