From 348fc75e9902a653d7cd0cee7c4d9aae7c0f3c43 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Sat, 8 Feb 2025 20:59:18 -0600 Subject: [PATCH] Added a validation for geo layouts --- src/factories/sm64/GeoLayoutFactory.cpp | 28 ++++++++++++++++++++----- src/factories/sm64/GeoLayoutFactory.h | 1 + 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/factories/sm64/GeoLayoutFactory.cpp b/src/factories/sm64/GeoLayoutFactory.cpp index ebe679c..d853e00 100644 --- a/src/factories/sm64/GeoLayoutFactory.cpp +++ b/src/factories/sm64/GeoLayoutFactory.cpp @@ -65,7 +65,7 @@ ExportResult SM64::GeoCodeExporter::Export(std::ostream&write, std::shared_ptrcommands) { + for(auto& [opcode, arguments, skip] : layout->commands) { + if(skip){ + continue; + } writer.Write(static_cast(opcode)); for(auto& args : arguments) { @@ -314,10 +321,12 @@ std::optional> SM64::GeoLayoutFactory::parse(std::v auto cmd = segment.data; bool processing = true; + int32_t openCount = 0; std::vector commands; while(processing) { auto opcode = static_cast(cmd[0x00]); + auto skip = false; SPDLOG_INFO("Processing Command {}", opcode); @@ -352,9 +361,18 @@ std::optional> SM64::GeoLayoutFactory::parse(std::v processing = false; break; } - case GeoOpcode::OpenNode: + case GeoOpcode::OpenNode: { + openCount++; + cmd += 0x04 << CMD_SIZE_SHIFT; + break; + } case GeoOpcode::CloseNode: { cmd += 0x04 << CMD_SIZE_SHIFT; + if (openCount - 1 < 0) { + skip = true; + } else { + openCount--; + } break; } case GeoOpcode::AssignAsView: { @@ -690,7 +708,7 @@ std::optional> SM64::GeoLayoutFactory::parse(std::v } } - commands.push_back({ opcode, arguments }); + commands.push_back({ opcode, arguments, skip }); } return std::make_shared(commands); diff --git a/src/factories/sm64/GeoLayoutFactory.h b/src/factories/sm64/GeoLayoutFactory.h index 8792990..b572896 100644 --- a/src/factories/sm64/GeoLayoutFactory.h +++ b/src/factories/sm64/GeoLayoutFactory.h @@ -16,6 +16,7 @@ namespace SM64 { struct GeoCommand { GeoOpcode opcode; std::vector arguments; + bool skipped; }; class GeoLayout : public IParsedData {