diff --git a/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataDefScopeSequences.cpp b/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataDefScopeSequences.cpp index 8841d96e..fcda5ca3 100644 --- a/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataDefScopeSequences.cpp +++ b/src/ObjLoading/StructuredDataDef/Parsing/Sequence/StructuredDataDefScopeSequences.cpp @@ -87,6 +87,32 @@ namespace sdd::def_scope_sequences } }; + class SequenceChecksumOverride final : public StructuredDataDefParser::sequence_t + { + static constexpr auto CAPTURE_VALUE = 1; + + public: + SequenceChecksumOverride() + { + const SimpleMatcherFactory create(this); + + AddMatchers({ + create.Keyword("checksumoverride"), + create.Integer().Capture(CAPTURE_VALUE), + create.Char(';') + }); + } + + protected: + void ProcessMatch(StructuredDataDefParserState* state, SequenceResult& result) const override + { + assert(state->m_current_def); + + state->m_checksum_overriden = true; + state->m_checksum_override_value = result.NextCapture(CAPTURE_VALUE).IntegerValue(); + } + }; + class SequenceCloseScope final : public StructuredDataDefParser::sequence_t { static constexpr auto CAPTURE_NAME = 1; @@ -130,12 +156,17 @@ namespace sdd::def_scope_sequences CreateDefaultStructWhenNoStructsSpecified(state); SetDefSizeFromRootStruct(state); - // TODO: Calculate checksum here + if(!state->m_checksum_overriden) + state->m_current_def->m_checksum = state->m_current_def->CalculateChecksum(); + else + state->m_current_def->m_checksum = state->m_checksum_override_value; state->m_current_def = nullptr; state->m_def_types_by_name.clear(); state->m_def_indexed_arrays.clear(); state->m_def_enumed_arrays.clear(); + state->m_checksum_overriden = false; + state->m_checksum_override_value = 0u; } }; } @@ -154,4 +185,5 @@ void StructuredDataDefScopeSequences::AddSequences() const AddSequence(std::make_unique()); AddSequence(std::make_unique()); AddSequence(std::make_unique()); + AddSequence(std::make_unique()); } diff --git a/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefParserState.cpp b/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefParserState.cpp index 91d564fc..272fed68 100644 --- a/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefParserState.cpp +++ b/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefParserState.cpp @@ -6,6 +6,8 @@ StructuredDataDefParserState::StructuredDataDefParserState() : m_current_def(nullptr), m_current_enum(nullptr), m_current_struct(nullptr), - m_current_struct_offset_in_bits(0u) + m_current_struct_offset_in_bits(0u), + m_checksum_override_value(0u), + m_checksum_overriden(false) { } diff --git a/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefParserState.h b/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefParserState.h index 2d60aa5d..71afb02e 100644 --- a/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefParserState.h +++ b/src/ObjLoading/StructuredDataDef/Parsing/StructuredDataDefParserState.h @@ -19,6 +19,9 @@ namespace sdd CommonStructuredDataStruct* m_current_struct; size_t m_current_struct_offset_in_bits; + size_t m_checksum_override_value; + bool m_checksum_overriden; + std::map m_def_types_by_name; std::map m_def_indexed_arrays; std::map m_def_enumed_arrays;