2019-08-23 23:24:04 +00:00
|
|
|
#include "DataSpec/DNACommon/ATBL.hpp"
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <cstdint>
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include "DataSpec/DNACommon/DNACommon.hpp"
|
|
|
|
#include "DataSpec/DNACommon/PAK.hpp"
|
|
|
|
|
|
|
|
#include <athena/FileReader.hpp>
|
|
|
|
#include <athena/FileWriter.hpp>
|
|
|
|
#include <athena/YAMLDocReader.hpp>
|
|
|
|
#include <athena/YAMLDocWriter.hpp>
|
|
|
|
|
|
|
|
#include <fmt/format.h>
|
2016-09-18 23:47:48 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
namespace DataSpec::DNAAudio {
|
|
|
|
|
|
|
|
bool ATBL::Extract(PAKEntryReadStream& rs, const hecl::ProjectPath& outPath) {
|
|
|
|
uint32_t idxCount = rs.readUint32Big();
|
|
|
|
athena::io::YAMLDocWriter w("ATBL");
|
|
|
|
for (uint32_t i = 0; i < idxCount; ++i) {
|
|
|
|
uint16_t idx = rs.readUint16Big();
|
|
|
|
if (idx == 0xffff)
|
|
|
|
continue;
|
2020-04-11 22:51:39 +00:00
|
|
|
w.writeUint16(fmt::format(FMT_STRING("0x{:04X}"), i), idx);
|
2018-12-08 05:30:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
athena::io::FileWriter fw(outPath.getAbsolutePath());
|
|
|
|
w.finish(&fw);
|
|
|
|
|
|
|
|
return true;
|
2016-09-18 23:47:48 +00:00
|
|
|
}
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
bool ATBL::Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPath) {
|
|
|
|
athena::io::FileReader r(inPath.getAbsolutePath());
|
|
|
|
if (r.hasError())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
athena::io::YAMLDocReader dr;
|
|
|
|
if (!dr.parse(&r))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
unsigned long maxI = 0;
|
|
|
|
for (const auto& pair : dr.getRootNode()->m_mapChildren) {
|
|
|
|
unsigned long i = strtoul(pair.first.c_str(), nullptr, 0);
|
|
|
|
maxI = std::max(maxI, i);
|
|
|
|
}
|
|
|
|
|
2020-03-31 11:36:24 +00:00
|
|
|
std::vector<uint16_t> vecOut(maxI + 1, 0xffff);
|
2018-12-08 05:30:43 +00:00
|
|
|
for (const auto& pair : dr.getRootNode()->m_mapChildren) {
|
|
|
|
unsigned long i = strtoul(pair.first.c_str(), nullptr, 0);
|
|
|
|
vecOut[i] = hecl::SBig(uint16_t(strtoul(pair.second->m_scalarString.c_str(), nullptr, 0)));
|
|
|
|
}
|
|
|
|
|
|
|
|
athena::io::FileWriter w(outPath.getAbsolutePath());
|
|
|
|
if (w.hasError())
|
|
|
|
return false;
|
|
|
|
w.writeUint32Big(uint32_t(vecOut.size()));
|
|
|
|
w.writeBytes(vecOut.data(), vecOut.size() * 2);
|
|
|
|
|
|
|
|
return true;
|
2016-09-18 23:47:48 +00:00
|
|
|
}
|
2018-12-08 05:30:43 +00:00
|
|
|
|
|
|
|
} // namespace DataSpec::DNAAudio
|