mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-14 00:38:15 -05:00
refactor: refactor ZoneDefWriter
This commit is contained in:
@ -2,11 +2,6 @@
|
||||
|
||||
#include "ContentLister/ContentPrinter.h"
|
||||
#include "ContentLister/ZoneDefWriter.h"
|
||||
#include "Game/IW3/ZoneDefWriterIW3.h"
|
||||
#include "Game/IW4/ZoneDefWriterIW4.h"
|
||||
#include "Game/IW5/ZoneDefWriterIW5.h"
|
||||
#include "Game/T5/ZoneDefWriterT5.h"
|
||||
#include "Game/T6/ZoneDefWriterT6.h"
|
||||
#include "ObjContainer/IWD/IWD.h"
|
||||
#include "ObjLoading.h"
|
||||
#include "ObjWriting.h"
|
||||
@ -25,14 +20,6 @@
|
||||
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
const IZoneDefWriter* const ZONE_DEF_WRITERS[]{
|
||||
new IW3::ZoneDefWriter(),
|
||||
new IW4::ZoneDefWriter(),
|
||||
new IW5::ZoneDefWriter(),
|
||||
new T5::ZoneDefWriter(),
|
||||
new T6::ZoneDefWriter(),
|
||||
};
|
||||
|
||||
class Unlinker::Impl
|
||||
{
|
||||
public:
|
||||
@ -166,51 +153,41 @@ private:
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteZoneDefinitionFile(Zone* zone, const fs::path& zoneDefinitionFileFolder) const
|
||||
bool WriteZoneDefinitionFile(const Zone& zone, const fs::path& zoneDefinitionFileFolder) const
|
||||
{
|
||||
auto zoneDefinitionFilePath(zoneDefinitionFileFolder);
|
||||
zoneDefinitionFilePath.append(zone->m_name);
|
||||
zoneDefinitionFilePath.append(zone.m_name);
|
||||
zoneDefinitionFilePath.replace_extension(".zone");
|
||||
|
||||
std::ofstream zoneDefinitionFile(zoneDefinitionFilePath, std::fstream::out | std::fstream::binary);
|
||||
if (!zoneDefinitionFile.is_open())
|
||||
{
|
||||
std::cerr << std::format("Failed to open file for zone definition file of zone \"{}\".\n", zone->m_name);
|
||||
std::cerr << std::format("Failed to open file for zone definition file of zone \"{}\".\n", zone.m_name);
|
||||
return false;
|
||||
}
|
||||
|
||||
auto result = false;
|
||||
for (const auto* zoneDefWriter : ZONE_DEF_WRITERS)
|
||||
{
|
||||
if (zoneDefWriter->CanHandleZone(zone))
|
||||
{
|
||||
zoneDefWriter->WriteZoneDef(zoneDefinitionFile, &m_args, zone);
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!result)
|
||||
std::cerr << std::format("Failed to find writer for zone definition file of zone \"{}\".\n", zone->m_name);
|
||||
const auto* zoneDefWriter = IZoneDefWriter::GetZoneDefWriterForGame(zone.m_game->GetId());
|
||||
zoneDefWriter->WriteZoneDef(zoneDefinitionFile, m_args, zone);
|
||||
|
||||
zoneDefinitionFile.close();
|
||||
return result;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool OpenGdtFile(Zone* zone, const fs::path& outputFolder, std::ofstream& stream)
|
||||
static bool OpenGdtFile(const Zone& zone, const fs::path& outputFolder, std::ofstream& stream)
|
||||
{
|
||||
auto gdtFilePath(outputFolder);
|
||||
gdtFilePath.append("source_data");
|
||||
|
||||
fs::create_directories(gdtFilePath);
|
||||
|
||||
gdtFilePath.append(zone->m_name);
|
||||
gdtFilePath.append(zone.m_name);
|
||||
gdtFilePath.replace_extension(".gdt");
|
||||
|
||||
stream = std::ofstream(gdtFilePath, std::fstream::out | std::fstream::binary);
|
||||
if (!stream.is_open())
|
||||
{
|
||||
std::cerr << std::format("Failed to open file for zone definition file of zone \"{}\".\n", zone->m_name);
|
||||
std::cerr << std::format("Failed to open file for zone definition file of zone \"{}\".\n", zone.m_name);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -274,7 +251,7 @@ private:
|
||||
* \param zone The zone to handle.
|
||||
* \return \c true if handling the zone was successful, otherwise \c false.
|
||||
*/
|
||||
bool HandleZone(ISearchPath& searchPath, Zone* zone) const
|
||||
bool HandleZone(ISearchPath& searchPath, Zone& zone) const
|
||||
{
|
||||
if (m_args.m_task == UnlinkerArgs::ProcessingTask::LIST)
|
||||
{
|
||||
@ -295,7 +272,7 @@ private:
|
||||
|
||||
std::ofstream gdtStream;
|
||||
AssetDumpingContext context;
|
||||
context.m_zone = zone;
|
||||
context.m_zone = &zone;
|
||||
context.m_base_path = outputFolderPath;
|
||||
context.m_obj_search_path = &searchPath;
|
||||
|
||||
@ -305,7 +282,7 @@ private:
|
||||
return false;
|
||||
auto gdt = std::make_unique<GdtOutputStream>(gdtStream);
|
||||
gdt->BeginStream();
|
||||
gdt->WriteVersion(GdtVersion(zone->m_game->GetShortName(), 1));
|
||||
gdt->WriteVersion(GdtVersion(zone.m_game->GetShortName(), 1));
|
||||
context.m_gdt = std::move(gdt);
|
||||
}
|
||||
|
||||
@ -409,7 +386,7 @@ private:
|
||||
if (ShouldLoadObj())
|
||||
ObjLoading::LoadReferencedContainersForZone(searchPathsForZone, *zone);
|
||||
|
||||
if (!HandleZone(searchPathsForZone, zone.get()))
|
||||
if (!HandleZone(searchPathsForZone, *zone))
|
||||
return false;
|
||||
|
||||
if (ShouldLoadObj())
|
||||
|
Reference in New Issue
Block a user