215 bool include_tail = parser.
HasFlag(
"include-tail");
216 bool check_tile16 = parser.
HasFlag(
"check-tile16");
217 bool verbose = parser.
HasFlag(
"verbose");
218 bool is_json = formatter.
IsJson();
225 std::vector<MapValidationResult> results;
226 results.reserve(max_map);
228 ValidationSummary summary;
229 summary.total_maps = max_map;
231 for (
int i = 0; i < max_map; ++i) {
233 ValidateMapPointers(overworld, i, include_tail));
234 results.push_back(result);
236 if (result.skipped) {
237 summary.skipped_maps++;
238 }
else if (result.IsValid()) {
239 summary.valid_maps++;
241 summary.invalid_maps++;
242 if (!result.pointers_valid) {
243 summary.pointer_failures++;
245 if (!result.decompress_low_ok || !result.decompress_high_ok) {
246 summary.decompress_failures++;
253 for (
const auto& result : results) {
256 }
else if (verbose || !result.IsValid()) {
264 formatter.
AddField(
"total_maps", summary.total_maps);
265 formatter.
AddField(
"valid_maps", summary.valid_maps);
266 formatter.
AddField(
"invalid_maps", summary.invalid_maps);
267 formatter.
AddField(
"skipped_maps", summary.skipped_maps);
268 formatter.
AddField(
"pointer_failures", summary.pointer_failures);
269 formatter.
AddField(
"decompress_failures", summary.decompress_failures);
273 auto tile16_result = ValidateTile16Region(rom);
274 formatter.
AddField(
"tile16_uses_expanded", tile16_result.uses_expanded);
276 if (tile16_result.uses_expanded) {
278 "tile16_problem_addresses",
279 static_cast<int>(tile16_result.problem_addresses.size()));
280 formatter.
AddField(
"tile16_suspicious_count",
281 tile16_result.suspicious_count);
283 if (!is_json && !tile16_result.problem_addresses.empty()) {
284 std::cout <<
"\n=== Tile16 Problems ===\n";
285 for (uint32_t addr : tile16_result.problem_addresses) {
287 std::cout << absl::StrFormat(
" 0x%06X (tile16 #%d): SUSPICIOUS\n",
296 std::cout <<
"\n=== Validation Summary ===\n";
297 std::cout << absl::StrFormat(
" Total maps: %d\n", summary.total_maps);
298 std::cout << absl::StrFormat(
" Valid: %d\n", summary.valid_maps);
299 std::cout << absl::StrFormat(
" Invalid: %d\n", summary.invalid_maps);
300 std::cout << absl::StrFormat(
" Skipped: %d\n", summary.skipped_maps);
301 if (summary.invalid_maps > 0) {
302 std::cout << absl::StrFormat(
" Pointer failures: %d\n",
303 summary.pointer_failures);
304 std::cout << absl::StrFormat(
" Decompress failures: %d\n",
305 summary.decompress_failures);
309 return absl::OkStatus();