metaforce/DataSpec/DNAMP1/AGSC.cpp

104 lines
3.1 KiB
C++
Raw Normal View History

2016-09-18 23:47:48 +00:00
#include "AGSC.hpp"
2017-12-29 08:08:12 +00:00
namespace DataSpec::DNAMP1
2016-09-18 23:47:48 +00:00
{
2017-11-13 06:19:18 +00:00
using namespace std::literals;
2016-09-18 23:47:48 +00:00
bool AGSC::Extract(PAKEntryReadStream& rs, const hecl::ProjectPath& outPath)
{
Header head;
head.read(rs);
{
hecl::ProjectPath poolPath = outPath.getWithExtension(_S(".pool"), true);
uint32_t poolLen = rs.readUint32Big();
athena::io::FileWriter w(poolPath.getAbsolutePath());
w.writeBytes(rs.readBytes(poolLen).get(), poolLen);
}
{
hecl::ProjectPath projPath = outPath.getWithExtension(_S(".proj"), true);
uint32_t projLen = rs.readUint32Big();
athena::io::FileWriter w(projPath.getAbsolutePath());
w.writeBytes(rs.readBytes(projLen).get(), projLen);
}
{
hecl::ProjectPath sampPath = outPath.getWithExtension(_S(".samp"), true);
uint32_t sampLen = rs.readUint32Big();
athena::io::FileWriter w(sampPath.getAbsolutePath());
w.writeBytes(rs.readBytes(sampLen).get(), sampLen);
}
{
hecl::ProjectPath sdirPath = outPath.getWithExtension(_S(".sdir"), true);
uint32_t sdirLen = rs.readUint32Big();
athena::io::FileWriter w(sdirPath.getAbsolutePath());
w.writeBytes(rs.readBytes(sdirLen).get(), sdirLen);
}
return true;
}
bool AGSC::Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPath)
{
athena::io::FileWriter w(outPath.getAbsolutePath());
if (w.hasError())
return false;
hecl::ProjectPath woExt = inPath.getWithExtension(nullptr, true);
2017-11-13 06:19:18 +00:00
std::string lastComp = std::string(woExt.getLastComponentUTF8());
2016-09-18 23:47:48 +00:00
if (hecl::StringUtils::EndsWith(lastComp, "_AGSC"))
lastComp.assign(lastComp.cbegin(), lastComp.cend() - 5);
Header head;
2017-11-13 06:19:18 +00:00
head.audioDir = "Audio/"sv;
2016-09-18 23:47:48 +00:00
head.groupName = lastComp;
head.write(w);
{
hecl::ProjectPath poolPath = inPath.getWithExtension(_S(".pool"), true);
athena::io::FileReader r(poolPath.getAbsolutePath());
if (r.hasError())
return false;
uint32_t poolLen = r.length();
w.writeUint32Big(poolLen);
w.writeBytes(r.readBytes(poolLen).get(), poolLen);
}
{
hecl::ProjectPath projPath = inPath.getWithExtension(_S(".proj"), true);
athena::io::FileReader r(projPath.getAbsolutePath());
if (r.hasError())
return false;
uint32_t projLen = r.length();
w.writeUint32Big(projLen);
w.writeBytes(r.readBytes(projLen).get(), projLen);
}
{
hecl::ProjectPath sampPath = inPath.getWithExtension(_S(".samp"), true);
athena::io::FileReader r(sampPath.getAbsolutePath());
if (r.hasError())
return false;
uint32_t sampLen = r.length();
w.writeUint32Big(sampLen);
w.writeBytes(r.readBytes(sampLen).get(), sampLen);
}
{
hecl::ProjectPath sdirPath = inPath.getWithExtension(_S(".sdir"), true);
athena::io::FileReader r(sdirPath.getAbsolutePath());
if (r.hasError())
return false;
uint32_t sdirLen = r.length();
w.writeUint32Big(sdirLen);
w.writeBytes(r.readBytes(sdirLen).get(), sdirLen);
}
return true;
}
}