From acc11a1609b3cfbae875487e2d87f9ac491e7a0d Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 8 May 2021 16:41:21 +0200 Subject: [PATCH] Fix IW4 fastfile writer factory steps --- src/ZoneWriting/Game/IW4/ZoneWriterFactoryIW4.cpp | 8 ++++++++ .../Writing/Steps/StepWriteTimestamp.cpp | 15 +++++++++++++++ .../Writing/Steps/StepWriteTimestamp.h | 10 ++++++++++ 3 files changed, 33 insertions(+) create mode 100644 src/ZoneWriting/Writing/Steps/StepWriteTimestamp.cpp create mode 100644 src/ZoneWriting/Writing/Steps/StepWriteTimestamp.h diff --git a/src/ZoneWriting/Game/IW4/ZoneWriterFactoryIW4.cpp b/src/ZoneWriting/Game/IW4/ZoneWriterFactoryIW4.cpp index fd2eb02a..50fea07b 100644 --- a/src/ZoneWriting/Game/IW4/ZoneWriterFactoryIW4.cpp +++ b/src/ZoneWriting/Game/IW4/ZoneWriterFactoryIW4.cpp @@ -8,7 +8,9 @@ #include "Game/IW4/ZoneConstantsIW4.h" #include "Writing/Processor/OutputProcessorDeflate.h" #include "Writing/Steps/StepAddOutputProcessor.h" +#include "Writing/Steps/StepWriteTimestamp.h" #include "Writing/Steps/StepWriteXBlockSizes.h" +#include "Writing/Steps/StepWriteZero.h" #include "Writing/Steps/StepWriteZoneContentToFile.h" #include "Writing/Steps/StepWriteZoneContentToMemory.h" #include "Writing/Steps/StepWriteZoneHeader.h" @@ -78,6 +80,12 @@ public: // Write zone header m_writer->AddWritingStep(std::make_unique(CreateHeaderForParams(isSecure, false))); + // Write dummy byte that the game ignores as well. No clue what it means. + m_writer->AddWritingStep(std::make_unique(1)); + + // Write timestamp + m_writer->AddWritingStep(std::make_unique()); + m_writer->AddWritingStep(std::make_unique(std::make_unique())); // Start of the XFile struct diff --git a/src/ZoneWriting/Writing/Steps/StepWriteTimestamp.cpp b/src/ZoneWriting/Writing/Steps/StepWriteTimestamp.cpp new file mode 100644 index 00000000..c0681265 --- /dev/null +++ b/src/ZoneWriting/Writing/Steps/StepWriteTimestamp.cpp @@ -0,0 +1,15 @@ +#include "StepWriteTimestamp.h" + +#include +#include + +StepWriteTimestamp::StepWriteTimestamp() +{ +} + +void StepWriteTimestamp::PerformStep(ZoneWriter* zoneWriter, IWritingStream* stream) +{ + // time_t is not guaranteed to be 64bit so cast is necessary + const auto time = static_cast(std::time(nullptr)); + stream->Write(&time, sizeof(time)); +} diff --git a/src/ZoneWriting/Writing/Steps/StepWriteTimestamp.h b/src/ZoneWriting/Writing/Steps/StepWriteTimestamp.h new file mode 100644 index 00000000..58ae7021 --- /dev/null +++ b/src/ZoneWriting/Writing/Steps/StepWriteTimestamp.h @@ -0,0 +1,10 @@ +#pragma once +#include "Writing/IWritingStep.h" + +class StepWriteTimestamp final : public IWritingStep +{ +public: + StepWriteTimestamp(); + + void PerformStep(ZoneWriter* zoneWriter, IWritingStream* stream) override; +};