diff options
| -rw-r--r-- | OTRExporter/Main.cpp | 133 |
1 files changed, 70 insertions, 63 deletions
diff --git a/OTRExporter/Main.cpp b/OTRExporter/Main.cpp index 3bc9da0..fb49210 100644 --- a/OTRExporter/Main.cpp +++ b/OTRExporter/Main.cpp @@ -64,35 +64,34 @@ static void ExporterParseFileMode(const std::string& buildMode, ZFileMode& fileM static void ExporterProgramEnd() { + uint32_t crc = 0xFFFFFFFF; + const uint8_t endianness = (uint8_t)Endianness::Big; + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) { + std::string romPath = Globals::Instance->baseRomPath.string(); + const std::vector<uint8_t>& romData = File::ReadAllBytes(romPath); + crc = BitConverter::ToUInt32BE(romData, 0x10); printf("Creating version file...\n"); // Get crc from rom - std::string romPath = Globals::Instance->baseRomPath.string(); - std::vector<uint8_t> romData = File::ReadAllBytes(romPath); - uint32_t crc = BitConverter::ToUInt32BE(romData, 0x10); - uint8_t endianness = (uint8_t)Endianness::Big; - - // Write crc to version file - fs::path versionPath("Extract/version"); - MemoryStream* versionStream = new MemoryStream(); - BinaryWriter writer(versionStream); - writer.SetEndianness(Endianness::Big); - writer.Write(endianness); - writer.Write(crc); - std::ofstream versionFile(versionPath.c_str(), std::ios::out | std::ios::binary); - versionFile.write(versionStream->ToVector().data(), versionStream->GetLength()); - versionFile.flush(); - versionFile.close(); - writer.Close(); + + MemoryStream *versionStream = new MemoryStream(); + BinaryWriter writer(versionStream); + writer.SetEndianness(Endianness::Big); + writer.Write(endianness); + writer.Write(crc); + writer.Close(); printf("Created version file.\n"); printf("Generating OTR Archive...\n"); otrArchive = Ship::Archive::CreateArchive(otrFileName, 40000); - for (auto item : files) { + otrArchive->AddFile("version", (uintptr_t)versionStream->ToVector().data(), versionStream->GetLength()); + + for (const auto& item : files) + { std::string fName = item.first; if (fName.find("gTitleZeldaShieldLogoMQTex") != std::string::npos && !ZRom(romPath).IsMQ()) { @@ -102,64 +101,72 @@ static void ExporterProgramEnd() fName.replace(pos, 27, "gTitleZeldaShieldLogoTex"); } } - auto fileData = item.second; + const auto& fileData = item.second; otrArchive->AddFile(fName, (uintptr_t)fileData.data(), - fileData.size()); + fileData.size()); } + } + otrArchive = nullptr; - // Add any additional files that need to be manually copied... - auto lst = Directory::ListFiles("Extract"); + // Add any additional files that need to be manually copied... + const auto& lst = Directory::ListFiles("Extract"); + std::shared_ptr<Ship::Archive> sohOtr = Ship::Archive::CreateArchive("soh.otr", 4096); + //sohOtr->AddFile("version", (uintptr_t)versionStream->ToVector().data(), versionStream->GetLength()); - for (auto item : lst) + for (const auto& item : lst) + { + std::vector<std::string> splitPath = StringHelper::Split(item, "."); + + if (splitPath.size() >= 3) { - std::vector<std::string> splitPath = StringHelper::Split(item, "."); - - if (splitPath.size() >= 3) { - std::string extension = splitPath.at(splitPath.size() - 1); - std::string format = splitPath.at(splitPath.size() - 2); - splitPath.pop_back(); - splitPath.pop_back(); - std::string afterPath = std::accumulate(splitPath.begin(), splitPath.end(), std::string("")); - if (extension == "png" && (format == "rgba32" || format == "rgb5a1" || format == "i4" || format == "i8" || format == "ia4" || format == "ia8" || format == "ia16" || format == "ci4" || format == "ci8")) { - ZTexture tex(nullptr); - Globals::Instance->buildRawTexture = true; - tex.FromPNG(item, ZTexture::GetTextureTypeFromString(format)); - printf("otrArchive->AddFile(%s)\n", StringHelper::Split(afterPath, "Extract/")[1].c_str()); - - auto exporter = new OTRExporter_Texture(); - MemoryStream* stream = new MemoryStream(); - BinaryWriter writer(stream); - - exporter->Save(&tex, "", &writer); - - std::string src = tex.GetBodySourceCode(); - writer.Write((char*) src.c_str(), src.size()); - - std::vector<char> fileData = stream->ToVector(); - otrArchive->AddFile(StringHelper::Split(afterPath, "Extract/assets/")[1], (uintptr_t)fileData.data(), fileData.size()); - continue; - } - } + const std::string& extension = splitPath.at(splitPath.size() - 1); + const std::string& format = splitPath.at(splitPath.size() - 2); + splitPath.pop_back(); + splitPath.pop_back(); + std::string afterPath = std::accumulate(splitPath.begin(), splitPath.end(), std::string("")); + if (extension == "png" && (format == "rgba32" || format == "rgb5a1" || format == "i4" || format == "i8" || format == "ia4" || format == "ia8" || format == "ia16" || format == "ci4" || format == "ci8")) + { + ZTexture tex(nullptr); + Globals::Instance->buildRawTexture = true; + tex.FromPNG(item, ZTexture::GetTextureTypeFromString(format)); + printf("sohOtr->AddFile(%s)\n", StringHelper::Split(afterPath, "Extract/")[1].c_str()); - if(item.find("accessibility") != std::string::npos) { - std::string extension = splitPath.at(splitPath.size() - 1); - splitPath.pop_back(); - if(extension == "json"){ - auto fileData = File::ReadAllBytes(item); - printf("Adding accessibility texts %s\n", StringHelper::Split(item, "texts/")[1].c_str()); - otrArchive->AddFile(StringHelper::Split(item, "Extract/assets/")[1], (uintptr_t)fileData.data(), fileData.size()); - } + OTRExporter_Texture exporter; + + MemoryStream* stream = new MemoryStream(); + BinaryWriter writer(stream); + + exporter.Save(&tex, "", &writer); + + std::string src = tex.GetBodySourceCode(); + writer.Write((char *)src.c_str(), src.size()); + + std::vector<char> fileData = stream->ToVector(); + sohOtr->AddFile(StringHelper::Split(afterPath, "Extract/assets/")[1], (uintptr_t)fileData.data(), fileData.size()); continue; } + } - auto fileData = File::ReadAllBytes(item); - printf("otrArchive->AddFile(%s)\n", StringHelper::Split(item, "Extract/")[1].c_str()); - otrArchive->AddFile(StringHelper::Split(item, item.find("Extract/assets/") != std::string::npos ? "Extract/assets/" : "Extract/")[1], (uintptr_t)fileData.data(), fileData.size()); + if (item.find("accessibility") != std::string::npos) + { + std::string extension = splitPath.at(splitPath.size() - 1); + splitPath.pop_back(); + if (extension == "json") + { + const auto &fileData = File::ReadAllBytes(item); + printf("Adding accessibility texts %s\n", StringHelper::Split(item, "texts/")[1].c_str()); + sohOtr->AddFile(StringHelper::Split(item, "Extract/assets/")[1], (uintptr_t)fileData.data(), fileData.size()); + } + continue; } + + const auto& fileData = File::ReadAllBytes(item); + printf("sohOtr->AddFile(%s)\n", StringHelper::Split(item, "Extract/")[1].c_str()); + sohOtr->AddFile(StringHelper::Split(item, item.find("Extract/assets/") != std::string::npos ? "Extract/assets/" : "Extract/")[1], (uintptr_t)fileData.data(), fileData.size()); } + sohOtr = nullptr; } - static void ExporterParseArgs(int argc, char* argv[], int& i) { std::string arg = argv[i]; |
