summaryrefslogtreecommitdiff
path: root/ZAPD/Main.cpp
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2021-10-16 18:55:56 -0300
committerGitHub <noreply@github.com>2021-10-16 17:55:56 -0400
commite7a8a48cf361a7591b88592eb3e333ddf8d3ab34 (patch)
tree4f63eac4c2136dd74e05593ea200b2c24c284a3f /ZAPD/Main.cpp
parent3e9ed72e202b1165152d42f7d160695f9f2f233a (diff)
`ExternalFile`: Expose other XML's declarations during extraction (#151)
* proof of concept * fix header include paths * GetDeclarationAlignment and others * this should fix this * minor * DeclareVar in ExtractFromXML * fix vtx intersections * Fix segmented vtxs * --version * zcollision changes * Use GetSegmentedPtrName a lot more * memory related stuff * minor style fixes and use the actual symbol for zlinkanimation instead of the hex address * Simplify lots of GetSourceOutputCode * ZSkeleton cleanup and other changes * Elevate unknown types in skeleton to errors * ZAnimation cleanup * Add ExternalFile to config * delete some code * Remove unused code * fix conflicts * format * remove redundant constructors * minor fixes * fix vtx warnings * extract every vtx as standalone files * format * uups * Bugfix: don't create extra blank files * Fix some Vtx warnings and remove "defaulting to normal" in skeleton error * Refactor ZLimb * Make each limb to look up in every file for dlists * Use GetSegmentedArrayIndexedName in VTX references in dlists * simplify simple condition * search by type * run format * Revert "search by type" This reverts commit a049bdfc94c4ab04613b354f466dee836a20508a. * Add range checks * uups * Always set rangeEnd * special case zsymbol * Revert "Revert "search by type"" This reverts commit 3f6e77c780bd30dc7000614304021a0940168316. * symbol fix and IsOffsetInFileRange * Bugfix and minor checks * run format * Don't extract data from external files * Fix extraction of overly big tluts * Minor changes * More minor fixes * Fix clang warnings * Remove unused parameter * Fix merge issues * Fix ZLimbTable::DeclareVar * Fix limbs not naming properly their DLists * Remove segment number check * Fix merge problems * Run formatter * Maybe fix? * path * empty commit * Fix a typo * Fix merge issues * Fix null ptr dereferencing * Fix merge issues and some clang warnings * Format * Fix not-matching * Format * Fix merge issues * Fix exporter * Last fixes I hope * Fix merge issues * format * fix * fix * I'm dumb * format * static fix * Whoops * fix asan * Fix? * fix * reduce artificial changes * reduce artificial changes 2 * reorder more stuff * format * fix borken thing * Remove redundant stuff in zfile * fix * Format * Fix conflict issues * format * cleanup header includes * format * Add error checks in for ExternalXMLFolder * format
Diffstat (limited to 'ZAPD/Main.cpp')
-rw-r--r--ZAPD/Main.cpp132
1 files changed, 80 insertions, 52 deletions
diff --git a/ZAPD/Main.cpp b/ZAPD/Main.cpp
index 9099cef..298ca02 100644
--- a/ZAPD/Main.cpp
+++ b/ZAPD/Main.cpp
@@ -25,7 +25,8 @@
extern const char gBuildHash[];
-bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, ZFileMode fileMode);
+bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath,
+ ZFileMode fileMode);
void BuildAssetTexture(const fs::path& pngFilePath, TextureType texType, const fs::path& outPath);
void BuildAssetBackground(const fs::path& imageFilePath, const fs::path& outPath);
@@ -261,6 +262,7 @@ int main(int argc, char* argv[])
if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO)
printf("ZAPD: Zelda Asset Processor For Decomp: %s\n", gBuildHash);
+ // TODO: switch
if (fileMode == ZFileMode::Extract || fileMode == ZFileMode::BuildSourceFile)
{
bool procFileModeSuccess = false;
@@ -270,39 +272,30 @@ int main(int argc, char* argv[])
if (!procFileModeSuccess)
{
- if (fileMode == ZFileMode::Extract || fileMode == ZFileMode::BuildSourceFile)
+ bool parseSuccessful;
+
+ for (auto& extFile : Globals::Instance->cfg.externalFiles)
{
- bool parseSuccessful =
- Parse(Globals::Instance->inputPath, Globals::Instance->baseRomPath, fileMode);
+ fs::path externalXmlFilePath =
+ Globals::Instance->cfg.externalXmlFolder / extFile.xmlPath;
+
+ if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO)
+ {
+ printf("Parsing external file from config: '%s'\n",
+ externalXmlFilePath.c_str());
+ }
+
+ parseSuccessful = Parse(externalXmlFilePath, Globals::Instance->baseRomPath,
+ extFile.outPath, ZFileMode::ExternalFile);
if (!parseSuccessful)
return 1;
}
- else if (fileMode == ZFileMode::BuildTexture)
- {
- TextureType texType = Globals::Instance->texType;
- BuildAssetTexture(Globals::Instance->inputPath, texType,
- Globals::Instance->outputPath);
- }
- else if (fileMode == ZFileMode::BuildBackground)
- {
- BuildAssetBackground(Globals::Instance->inputPath, Globals::Instance->outputPath);
- }
- else if (fileMode == ZFileMode::BuildBlob)
- {
- BuildAssetBlob(Globals::Instance->inputPath, Globals::Instance->outputPath);
- }
- else if (fileMode == ZFileMode::BuildOverlay)
- {
- ZOverlay* overlay = ZOverlay::FromBuild(
- Path::GetDirectoryName(Globals::Instance->inputPath.string()),
- Path::GetDirectoryName(Globals::Instance->cfgPath.string()));
-
- if (overlay)
- File::WriteAllText(Globals::Instance->outputPath.string(),
- overlay->GetSourceOutputCode(""));
- }
+ parseSuccessful = Parse(Globals::Instance->inputPath, Globals::Instance->baseRomPath,
+ Globals::Instance->outputPath, fileMode);
+ if (!parseSuccessful)
+ return 1;
}
}
else if (fileMode == ZFileMode::BuildTexture)
@@ -324,15 +317,17 @@ int main(int argc, char* argv[])
ZOverlay::FromBuild(Path::GetDirectoryName(Globals::Instance->inputPath),
Path::GetDirectoryName(Globals::Instance->cfgPath));
- if (overlay)
+ if (overlay != nullptr)
File::WriteAllText(Globals::Instance->outputPath.string(),
overlay->GetSourceOutputCode(""));
}
+
delete g;
return 0;
}
-bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, ZFileMode fileMode)
+bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath,
+ ZFileMode fileMode)
{
tinyxml2::XMLDocument doc;
tinyxml2::XMLError eResult = doc.LoadFile(xmlFilePath.string().c_str());
@@ -356,39 +351,72 @@ bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, ZFileMode file
{
if (std::string_view(child->Name()) == "File")
{
- ZFile* file = new ZFile(fileMode, child, basePath, "", xmlFilePath, false);
+ ZFile* file = new ZFile(fileMode, child, basePath, outPath, "", xmlFilePath);
Globals::Instance->files.push_back(file);
+ if (fileMode == ZFileMode::ExternalFile)
+ {
+ Globals::Instance->externalFiles.push_back(file);
+ file->isExternalFile = true;
+ }
}
- else
+ else if (std::string(child->Name()) == "ExternalFile")
{
- throw std::runtime_error(
- StringHelper::Sprintf("Parse: Fatal error in '%s'.\n\t Found a resource outside of "
- "a File element: '%s'\n",
- xmlFilePath.c_str(), child->Name()));
- }
- }
+ const char* xmlPathValue = child->Attribute("XmlPath");
+ if (xmlPathValue == nullptr)
+ {
+ throw std::runtime_error(StringHelper::Sprintf(
+ "Parse: Fatal error in '%s'.\n"
+ "\t Missing 'XmlPath' attribute in `ExternalFile` element.\n",
+ xmlFilePath.c_str()));
+ }
+ const char* outPathValue = child->Attribute("OutPath");
+ if (outPathValue == nullptr)
+ {
+ throw std::runtime_error(StringHelper::Sprintf(
+ "Parse: Fatal error in '%s'.\n"
+ "\t Missing 'OutPath' attribute in `ExternalFile` element.\n",
+ xmlFilePath.c_str()));
+ }
- ExporterSet* exporterSet = Globals::Instance->GetExporterSet();
+ fs::path externalXmlFilePath =
+ Globals::Instance->cfg.externalXmlFolder / fs::path(xmlPathValue);
+ fs::path externalOutFilePath = fs::path(outPathValue);
- if (exporterSet != nullptr && exporterSet->beginXMLFunc != nullptr)
- exporterSet->beginXMLFunc();
+ if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO)
+ {
+ printf("Parsing external file: '%s'\n", externalXmlFilePath.c_str());
+ }
- for (ZFile* file : Globals::Instance->files)
- {
- if (fileMode == ZFileMode::BuildSourceFile)
- file->BuildSourceFile();
+ // Recursion. What can go wrong?
+ Parse(externalXmlFilePath, basePath, externalOutFilePath, ZFileMode::ExternalFile);
+ }
else
- file->ExtractResources();
+ {
+ throw std::runtime_error(StringHelper::Sprintf(
+ "Parse: Fatal error in '%s'.\n\t A resource was found outside of "
+ "a File element: '%s'\n",
+ xmlFilePath.c_str(), child->Name()));
+ }
}
- if (exporterSet != nullptr && exporterSet->endXMLFunc != nullptr)
- exporterSet->endXMLFunc();
+ if (fileMode != ZFileMode::ExternalFile)
+ {
+ ExporterSet* exporterSet = Globals::Instance->GetExporterSet();
+
+ if (exporterSet != nullptr && exporterSet->beginXMLFunc != nullptr)
+ exporterSet->beginXMLFunc();
- // All done, free files
- for (ZFile* file : Globals::Instance->files)
- delete file;
+ for (ZFile* file : Globals::Instance->files)
+ {
+ if (fileMode == ZFileMode::BuildSourceFile)
+ file->BuildSourceFile();
+ else
+ file->ExtractResources();
+ }
- Globals::Instance->files.clear();
+ if (exporterSet != nullptr && exporterSet->endXMLFunc != nullptr)
+ exporterSet->endXMLFunc();
+ }
return true;
}