From 8e0199bcc051f1e7ed245381099b07ddf1fd61cf Mon Sep 17 00:00:00 2001 From: cadmic Date: Wed, 19 Jun 2024 11:56:54 -0700 Subject: [PATCH] Add ZAPD flags to override virtual address / start offset / end offset --- tools/ZAPD/README.md | 11 +++++++---- tools/ZAPD/ZAPD/Globals.h | 3 +++ tools/ZAPD/ZAPD/Main.cpp | 21 +++++++++++++++++++++ tools/ZAPD/ZAPD/ZFile.cpp | 6 ++++++ 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/tools/ZAPD/README.md b/tools/ZAPD/README.md index d51dd05583..3820fee2b8 100644 --- a/tools/ZAPD/README.md +++ b/tools/ZAPD/README.md @@ -118,10 +118,13 @@ ZAPD also accepts the following list of extra parameters: - `-s` / `--static` : Mark every asset as `static`. - This behaviour can be overridden per asset using `Static=` in the respective XML node. - `--cs-float` : How cutscene floats should be extracted. -- Valid values: - - `hex` - - `float` - - `both` + - Valid values: + - `hex` + - `float` + - `both` +- `--base-address ADDRESS`: Override base virtual address for input files. +- `--start-offset OFFSET`: Override start offset for input files. +- `--end-offset OFFSET`: Override end offset for input files. - `-W...`: warning flags, see below Additionally, you can pass the flag `--version` to see the current ZAPD version. If that flag is passed, ZAPD will ignore any other parameter passed. diff --git a/tools/ZAPD/ZAPD/Globals.h b/tools/ZAPD/ZAPD/Globals.h index 14bd065841..3f3f0245ce 100644 --- a/tools/ZAPD/ZAPD/Globals.h +++ b/tools/ZAPD/ZAPD/Globals.h @@ -39,6 +39,9 @@ public: fs::path baseRomPath, inputPath, outputPath, sourceOutputPath, cfgPath; TextureType texType; CsFloatType floatType = CsFloatType::FloatOnly; + int baseAddress = -1; + int startOffset = -1; + int endOffset = -1; ZGame game; GameConfig cfg; bool verboseUnaccounted = false; diff --git a/tools/ZAPD/ZAPD/Main.cpp b/tools/ZAPD/ZAPD/Main.cpp index eb1737d643..592c9291c2 100644 --- a/tools/ZAPD/ZAPD/Main.cpp +++ b/tools/ZAPD/ZAPD/Main.cpp @@ -37,6 +37,9 @@ void Arg_EnableGCCCompat(int& i, char* argv[]); void Arg_ForceStatic(int& i, char* argv[]); void Arg_ForceUnaccountedStatic(int& i, char* argv[]); void Arg_CsFloatMode(int& i, char* argv[]); +void Arg_BaseAddress(int& i, char* argv[]); +void Arg_StartOffset(int& i, char* argv[]); +void Arg_EndOffset(int& i, char* argv[]); int main(int argc, char* argv[]); @@ -254,6 +257,9 @@ void ParseArgs(int& argc, char* argv[]) {"-us", &Arg_ForceUnaccountedStatic}, {"--unaccounted-static", &Arg_ForceUnaccountedStatic}, {"--cs-float", &Arg_CsFloatMode}, + {"--base-address", &Arg_BaseAddress}, + {"--start-offset", &Arg_StartOffset}, + {"--end-offset", &Arg_EndOffset}, }; for (int32_t i = 2; i < argc; i++) @@ -420,6 +426,21 @@ void Arg_CsFloatMode([[maybe_unused]] int& i, [[maybe_unused]] char* argv[]) } } +void Arg_BaseAddress(int& i, char* argv[]) +{ + Globals::Instance->baseAddress = std::stoul(argv[++i], nullptr, 16); +} + +void Arg_StartOffset(int& i, char* argv[]) +{ + Globals::Instance->startOffset = std::stoul(argv[++i], nullptr, 16); +} + +void Arg_EndOffset(int& i, char* argv[]) +{ + Globals::Instance->endOffset = std::stoul(argv[++i], nullptr, 16); +} + int HandleExtract(ZFileMode fileMode, ExporterSet* exporterSet) { bool procFileModeSuccess = false; diff --git a/tools/ZAPD/ZAPD/ZFile.cpp b/tools/ZAPD/ZAPD/ZFile.cpp index 656ef6aa69..db2d251a5c 100644 --- a/tools/ZAPD/ZAPD/ZFile.cpp +++ b/tools/ZAPD/ZAPD/ZFile.cpp @@ -120,6 +120,9 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename) if (reader->Attribute("BaseAddress") != nullptr) baseAddress = StringHelper::StrToL(reader->Attribute("BaseAddress"), 16); + if (mode == ZFileMode::Extract && Globals::Instance->baseAddress != -1) + baseAddress = Globals::Instance->baseAddress; + if (reader->Attribute("RangeStart") != nullptr) rangeStart = StringHelper::StrToL(reader->Attribute("RangeStart"), 16); @@ -197,6 +200,9 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename) } rawData = File::ReadAllBytes((basePath / name).string()); + if (mode == ZFileMode::Extract && Globals::Instance->startOffset != -1 && Globals::Instance->endOffset != -1) + rawData = std::vector(rawData.begin() + Globals::Instance->startOffset, + rawData.begin() + Globals::Instance->endOffset); if (reader->Attribute("RangeEnd") == nullptr) rangeEnd = rawData.size();