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; } }
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)); }