#ifndef __DNAMP1_PAK_HPP__ #define __DNAMP1_PAK_HPP__ #include #include #include "../DNACommon/DNACommon.hpp" namespace Retro { namespace DNAMP1 { struct PAK : BigDNA { bool m_useLzo; PAK(bool useLzo) : m_useLzo(useLzo) {} DECL_EXPLICIT_DNA struct NameEntry : BigDNA { DECL_DNA FourCC type; UniqueID32 id; Value nameLen; String name; }; struct Entry : BigDNA { DECL_DNA Value compressed; FourCC type; UniqueID32 id; Value size; Value offset; std::unique_ptr getBuffer(const NOD::DiscBase::IPartition::Node& pak, atUint64& szOut) const; inline PAKEntryReadStream beginReadStream(const NOD::DiscBase::IPartition::Node& pak, atUint64 off=0) const { atUint64 sz; std::unique_ptr buf = getBuffer(pak, sz); return PAKEntryReadStream(std::move(buf), sz, off); } }; std::vector m_nameEntries; std::vector m_entries; std::unordered_map m_idMap; std::unordered_map m_nameMap; inline const Entry* lookupEntry(const UniqueID32& id) const { std::unordered_map::const_iterator result = m_idMap.find(id); if (result != m_idMap.end()) return result->second; return nullptr; } inline const Entry* lookupEntry(const std::string& name) const { std::unordered_map::const_iterator result = m_nameMap.find(name); if (result != m_nameMap.end()) return result->second; return nullptr; } inline std::string bestEntryName(const Entry& entry) const { /* Prefer named entries first */ for (const NameEntry& nentry : m_nameEntries) if (nentry.id == entry.id) return nentry.name; /* Otherwise return ID format string */ return entry.type.toString() + '_' + entry.id.toString(); } }; } } #endif // __DNAMP1_PAK_HPP__