summaryrefslogtreecommitdiff
path: root/ZAPD/ZArray.cpp
diff options
context:
space:
mode:
authorNicholas Estelami <NEstelami@users.noreply.github.com>2021-01-19 15:08:29 -0500
committerGitHub <noreply@github.com>2021-01-19 15:08:29 -0500
commit2e1174063f3ed6bcf929bc7093cd2d1b05f8518b (patch)
treed62ac506b1017296dba708030745743da90a5b2d /ZAPD/ZArray.cpp
parentfda77edbcfcee7675fd1549553114d690d4fcd39 (diff)
Added in support for ZArray (WIP) and ZVtx. Also cleaned up some of the virtual functions. (#73)
Diffstat (limited to 'ZAPD/ZArray.cpp')
-rw-r--r--ZAPD/ZArray.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/ZAPD/ZArray.cpp b/ZAPD/ZArray.cpp
new file mode 100644
index 0000000..622aef5
--- /dev/null
+++ b/ZAPD/ZArray.cpp
@@ -0,0 +1,73 @@
+#include "ZArray.h"
+#include "ZFile.h"
+#include "Globals.h"
+#include "StringHelper.h"
+
+ZArray::ZArray()
+{
+
+}
+
+void ZArray::ParseXML(tinyxml2::XMLElement* reader)
+{
+ ZResource::ParseXML(reader);
+
+ arrayCnt = reader->IntAttribute("Count", 0);
+ testFile = new ZFile(ZFileMode::Extract, reader, Globals::Instance->baseRomPath, "", parent->GetName(), true);
+}
+
+// TODO: This is a bit hacky, but until we refactor how ZFile parses the XML, it'll have to do.
+std::string ZArray::GetSourceOutputCode(const std::string& prefix)
+{
+ std::string output = "";
+
+ if (testFile->resources.size() <= 0)
+ {
+ throw StringHelper::Sprintf("Error! Array needs at least one sub-element.\n");
+ }
+
+ ZResource* res = testFile->resources[0];
+ int resSize = res->GetRawDataSize();
+
+ if (!res->DoesSupportArray())
+ {
+ throw StringHelper::Sprintf("Error! Resource %s does not support being wrapped in an array!\n", res->GetName().c_str());
+ }
+
+ for (int i = 0; i < arrayCnt; i++)
+ {
+ int childIndex = rawDataIndex + (i * resSize);
+ res->SetRawDataIndex(childIndex);
+ res->ParseRawData();
+ std::string test = res->GetSourceOutputCode("");
+ //output += " { " + testFile->declarations[childIndex]->text + " }";
+ output += testFile->declarations[childIndex]->text;
+
+ if (i < arrayCnt - 1)
+ output += ",\n";
+
+ int bp = 0;
+ }
+
+ if (parent != nullptr)
+ parent->AddDeclarationArray(rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), res->GetSourceTypeName(), name, arrayCnt, output);
+
+ return "";
+}
+
+int ZArray::GetRawDataSize()
+{
+ return arrayCnt * testFile->resources[0]->GetRawDataSize();
+}
+
+ZArray* ZArray::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8_t>& nRawData, const int rawDataIndex, const std::string& nRelPath, ZFile* nParent)
+{
+ ZArray* arr = new ZArray();
+ arr->rawData = nRawData;
+ arr->rawDataIndex = rawDataIndex;
+ arr->parent = nParent;
+ arr->ParseXML(reader);
+ //arr->ParseRawData();
+
+ return arr;
+}