#include "ZoneWriterFactoryIW3.h" #include "ContentWriterIW3.h" #include "Game/IW3/GameIW3.h" #include "Game/IW3/IW3.h" #include "Game/IW3/ZoneConstantsIW3.h" #include "Writing/Processor/OutputProcessorDeflate.h" #include "Writing/Steps/StepAddOutputProcessor.h" #include "Writing/Steps/StepWriteXBlockSizes.h" #include "Writing/Steps/StepWriteZoneContentToFile.h" #include "Writing/Steps/StepWriteZoneContentToMemory.h" #include "Writing/Steps/StepWriteZoneHeader.h" #include "Writing/Steps/StepWriteZoneSizes.h" #include using namespace IW3; namespace { void SetupBlocks(ZoneWriter& writer) { #define XBLOCK_DEF(name, type) std::make_unique(STR(name), name, type) writer.AddXBlock(XBLOCK_DEF(IW3::XFILE_BLOCK_TEMP, XBlockType::BLOCK_TYPE_TEMP)); writer.AddXBlock(XBLOCK_DEF(IW3::XFILE_BLOCK_RUNTIME, XBlockType::BLOCK_TYPE_RUNTIME)); writer.AddXBlock(XBLOCK_DEF(IW3::XFILE_BLOCK_LARGE_RUNTIME, XBlockType::BLOCK_TYPE_RUNTIME)); writer.AddXBlock(XBLOCK_DEF(IW3::XFILE_BLOCK_PHYSICAL_RUNTIME, XBlockType::BLOCK_TYPE_RUNTIME)); writer.AddXBlock(XBLOCK_DEF(IW3::XFILE_BLOCK_VIRTUAL, XBlockType::BLOCK_TYPE_NORMAL)); writer.AddXBlock(XBLOCK_DEF(IW3::XFILE_BLOCK_LARGE, XBlockType::BLOCK_TYPE_NORMAL)); writer.AddXBlock(XBLOCK_DEF(IW3::XFILE_BLOCK_PHYSICAL, XBlockType::BLOCK_TYPE_NORMAL)); writer.AddXBlock(XBLOCK_DEF(IW3::XFILE_BLOCK_VERTEX, XBlockType::BLOCK_TYPE_NORMAL)); writer.AddXBlock(XBLOCK_DEF(IW3::XFILE_BLOCK_INDEX, XBlockType::BLOCK_TYPE_NORMAL)); #undef XBLOCK_DEF } ZoneHeader CreateHeaderForParams() { ZoneHeader header{}; header.m_version = ZoneConstants::ZONE_VERSION; memcpy(header.m_magic, ZoneConstants::MAGIC_UNSIGNED, sizeof(ZoneHeader::m_magic)); return header; } } // namespace std::unique_ptr ZoneWriterFactory::CreateWriter(const Zone& zone) const { auto writer = std::make_unique(); SetupBlocks(*writer); auto contentInMemory = std::make_unique( std::make_unique(zone), zone, ZoneConstants::OFFSET_BLOCK_BIT_COUNT, ZoneConstants::INSERT_BLOCK); auto* contentInMemoryPtr = contentInMemory.get(); writer->AddWritingStep(std::move(contentInMemory)); // Write zone header writer->AddWritingStep(std::make_unique(CreateHeaderForParams())); writer->AddWritingStep(std::make_unique(std::make_unique())); // Start of the XFile struct writer->AddWritingStep(std::make_unique(contentInMemoryPtr)); writer->AddWritingStep(std::make_unique(zone)); // Start of the zone content writer->AddWritingStep(std::make_unique(contentInMemoryPtr)); return std::move(writer); }