diff options
| author | Anghelo Carvajal <angheloalf95@gmail.com> | 2021-05-26 20:04:02 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-26 20:04:02 -0400 |
| commit | 4410b554e835ab7844c8eb78fd54fa3842d50f16 (patch) | |
| tree | 065b8f53d6e1052c9f7ad1917c1b3b66d5eef645 /ZAPD/ZArray.cpp | |
| parent | 769f5702a422d14bfb0a60a39319da4b4bf9ec1f (diff) | |
Check XML resource attributes (#126)
* register attibutes
* fix array problems
* cutscene problems
* Set inner
* fix merge
* ups
* Run format
* small cleaning
* A small blob cleanup
* Simplify the logic a bit
* ups
* Fix merge problem
* Fix merge issues
* Fix merge issues
* fix merge-produced type
* Fix merge issues
* run format and update easteregg
* register ZPath attributes
* dumb problems
* How dumb can I be?
* future proof change
* empty commit
* Check if Width and Height attributes of ZTexture has only decimal digits
Diffstat (limited to 'ZAPD/ZArray.cpp')
| -rw-r--r-- | ZAPD/ZArray.cpp | 70 |
1 files changed, 39 insertions, 31 deletions
diff --git a/ZAPD/ZArray.cpp b/ZAPD/ZArray.cpp index 5429277..3194eac 100644 --- a/ZAPD/ZArray.cpp +++ b/ZAPD/ZArray.cpp @@ -1,4 +1,5 @@ #include "ZArray.h" +#include <cassert> #include "Globals.h" #include "StringHelper.h" #include "ZFile.h" @@ -8,49 +9,57 @@ REGISTER_ZFILENODE(Array, ZArray); ZArray::ZArray(ZFile* nParent) : ZResource(nParent) { canHaveInner = true; + RegisterRequiredAttribute("Count"); } ZArray::~ZArray() { - delete testFile; + for (auto res : resList) + delete res; } 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(), "ZArray subfile", 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 = ""; + arrayCnt = StringHelper::StrToL(registeredAttributes.at("Count").value, 0); + // TODO: do a better check. + assert(arrayCnt > 0); - if (testFile->resources.size() <= 0) + tinyxml2::XMLElement* child = reader->FirstChildElement(); + if (child == nullptr) throw std::runtime_error( StringHelper::Sprintf("Error! Array needs at least one sub-element.\n")); - ZResource* res = testFile->resources[0]; - size_t resSize = res->GetRawDataSize(); + childName = child->Name(); - if (!res->DoesSupportArray()) + auto nodeMap = ZFile::GetNodeMap(); + size_t childIndex = rawDataIndex; + for (size_t i = 0; i < arrayCnt; i++) { - throw std::runtime_error(StringHelper::Sprintf( - "Error! Resource %s does not support being wrapped in an array!\n", - res->GetName().c_str())); + ZResource* res = nodeMap->at(childName)(parent); + if (!res->DoesSupportArray()) + { + throw std::runtime_error(StringHelper::Sprintf( + "Error! Resource %s does not support being wrapped in an array!\n", + childName.c_str())); + } + res->parent = parent; + res->SetInnerNode(true); + res->ExtractFromXML(child, rawData, childIndex); + + childIndex += res->GetRawDataSize(); + resList.push_back(res); } +} + +std::string ZArray::GetSourceOutputCode(const std::string& prefix) +{ + std::string output = ""; for (size_t i = 0; i < arrayCnt; i++) { - size_t childIndex = rawDataIndex + (i * resSize); - res->SetRawDataIndex(childIndex); - res->ParseRawData(); - std::string test = res->GetSourceOutputCode(""); - // output += " { " + testFile->declarations[childIndex]->text + " }"; - output += testFile->declarations[childIndex]->text; + output += resList.at(i)->GetBodySourceCode(); if (i < arrayCnt - 1) output += ",\n"; @@ -58,21 +67,20 @@ std::string ZArray::GetSourceOutputCode(const std::string& prefix) if (parent != nullptr) parent->AddDeclarationArray(rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), - res->GetSourceTypeName(), name, arrayCnt, output); + resList.at(0)->GetSourceTypeName(), name, arrayCnt, output); return ""; } size_t ZArray::GetRawDataSize() const { - return arrayCnt * testFile->resources[0]->GetRawDataSize(); + size_t size = 0; + for (auto res : resList) + size += res->GetRawDataSize(); + return size; } -void ZArray::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8_t>& nRawData, - const uint32_t nRawDataIndex) +ZResourceType ZArray::GetResourceType() const { - rawData = nRawData; - rawDataIndex = nRawDataIndex; - ParseXML(reader); - // arr->ParseRawData(); + return ZResourceType::Array; } |
