// MIT License // Copyright (c) 2026 by Peter Siegmund (mars3142) // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include "cartridge/parser.h" #include "storage/storage.h" #include #include #include #include #include #include #include namespace cartridge { std::unique_ptr parseData(const std::vector &bytes) { try { constexpr std::array header = {0x02, 0x0a, 0x43, 0x41, 0x52, 0x54, 0x00}; BinaryReader reader(bytes, Endian::Little); if (!std::ranges::all_of(header, [&reader](const uint8_t expected) { return reader.getByte() == expected; })) { return nullptr; } return Cartridge::create(reader); } catch (...) { return nullptr; } } std::unique_ptr parseFile(const std::string &filePath) { storage::Storage storage; auto result = storage.readFile(filePath); if (!result) { std::println(std::cerr, "Fehler beim Lesen der Datei: {}", filePath); return nullptr; } return parseData(*result); } std::unique_ptr parseCartridge() { auto cartridge = parseFile("/Volumes/Coding/git.mars3142.dev/mars3142/" "wx_wherigo/cartridges/the_ombos_idol_-_c.gwc"); if (!cartridge) { std::println(std::cerr, "Cartridge konnte nicht geladen werden."); return nullptr; } const int count = cartridge->mediaCount(); const std::filesystem::path outDir = "/Volumes/Coding/git.mars3142.dev/mars3142/wx_wherigo/cartridges"; storage::Storage storage; for (const int i : std::views::iota(0, count)) { auto media = cartridge->getMedia(i); if (!media) { std::println(std::cerr, "Media-Objekt an Index {} ist nullptr.", i); continue; } const auto &data = media->getData(); if (data.empty()) { std::println(std::cerr, "Media-Daten an Index {} sind leer.", i); continue; } std::string ext = media->getObjectType(); if (ext.empty()) { std::println(std::cerr, "Media-Extension an Index {} ist leer.", i); ext = "bin"; } const std::filesystem::path outFile = outDir / std::format("file{}.{}", i, ext); if (auto writeResult = storage.writeFile(outFile.string(), data); !writeResult) { std::println(std::cerr, "Fehler beim Schreiben der Datei: {}", outFile.string()); } } return cartridge; } } // namespace cartridge