216 bool include_tail = parser.
HasFlag(
"include-tail");
217 bool check_tile16 = parser.
HasFlag(
"check-tile16");
218 bool verbose = parser.
HasFlag(
"verbose");
219 bool is_json = formatter.
IsJson();
226 std::vector<MapValidationResult> results;
227 results.reserve(max_map);
229 ValidationSummary summary;
230 summary.total_maps = max_map;
232 for (
int i = 0; i < max_map; ++i) {
234 ValidateMapPointers(overworld, i, include_tail));
235 results.push_back(result);
237 if (result.skipped) {
238 summary.skipped_maps++;
239 }
else if (result.IsValid()) {
240 summary.valid_maps++;
242 summary.invalid_maps++;
243 if (!result.pointers_valid) {
244 summary.pointer_failures++;
246 if (!result.decompress_low_ok || !result.decompress_high_ok) {
247 summary.decompress_failures++;
254 for (
const auto& result : results) {
257 }
else if (verbose || !result.IsValid()) {
265 formatter.
AddField(
"total_maps", summary.total_maps);
266 formatter.
AddField(
"valid_maps", summary.valid_maps);
267 formatter.
AddField(
"invalid_maps", summary.invalid_maps);
268 formatter.
AddField(
"skipped_maps", summary.skipped_maps);
269 formatter.
AddField(
"pointer_failures", summary.pointer_failures);
270 formatter.
AddField(
"decompress_failures", summary.decompress_failures);
274 auto tile16_result = ValidateTile16Region(rom);
275 formatter.
AddField(
"tile16_uses_expanded", tile16_result.uses_expanded);
277 if (tile16_result.uses_expanded) {
278 formatter.
AddField(
"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();