refactor: refactor ZoneDefWriter

This commit is contained in:
Jan
2024-10-13 00:57:35 +02:00
parent eec643fab5
commit c034ac790a
28 changed files with 159 additions and 180 deletions

View File

@ -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())