2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-11-23 05:12:05 +00:00

chore: parse includes and assetlists while parsing zone definition

This commit is contained in:
Jan
2025-01-01 18:13:23 +01:00
parent 9852f52a15
commit aa212e0958
74 changed files with 530 additions and 437 deletions

View File

@@ -0,0 +1,67 @@
#include "ZoneDefinitionParserState.h"
#include <algorithm>
ZoneDefinitionParserState::ZoneDefinitionParserState(std::string targetName, ISearchPath& searchPath, IParserLineStream& underlyingStream)
: m_search_path(searchPath),
m_underlying_stream(underlyingStream),
m_asset_name_resolver(nullptr),
m_definition(std::make_unique<ZoneDefinition>())
{
m_inclusions.emplace(targetName);
m_definition->m_name = std::move(targetName);
}
void ZoneDefinitionParserState::SetGame(const GameId game)
{
m_definition->m_game = game;
m_asset_name_resolver = IAssetNameResolver::GetResolverForGame(game);
}
namespace
{
void AddCurrentObjContainerToDefinitionIfNecessary(ZoneDefinition& zoneDefinition, std::optional<ZoneDefinitionObjContainer>& maybeObjContainer)
{
if (!maybeObjContainer)
return;
maybeObjContainer->m_asset_end = zoneDefinition.m_assets.size();
zoneDefinition.m_obj_containers.emplace_back(std::move(*maybeObjContainer));
maybeObjContainer = std::nullopt;
}
ZoneDefinitionObjContainer DefineNewObjContainer(const ZoneDefinition& zoneDefinition, std::string name, const ZoneDefinitionObjContainerType type)
{
return ZoneDefinitionObjContainer(std::move(name), type, zoneDefinition.m_assets.size());
}
void SortObjContainer(ZoneDefinition& zoneDefinition)
{
std::ranges::sort(zoneDefinition.m_obj_containers,
[](const ZoneDefinitionObjContainer& obj0, const ZoneDefinitionObjContainer& obj1)
{
return obj0.m_asset_start < obj1.m_asset_start;
});
}
} // namespace
void ZoneDefinitionParserState::StartIPak(std::string ipakName)
{
AddCurrentObjContainerToDefinitionIfNecessary(*m_definition, m_current_ipak);
m_current_ipak = DefineNewObjContainer(*m_definition, std::move(ipakName), ZoneDefinitionObjContainerType::IPAK);
}
void ZoneDefinitionParserState::StartIwd(std::string iwdName)
{
AddCurrentObjContainerToDefinitionIfNecessary(*m_definition, m_current_iwd);
m_current_iwd = DefineNewObjContainer(*m_definition, std::move(iwdName), ZoneDefinitionObjContainerType::IWD);
}
void ZoneDefinitionParserState::Finalize()
{
AddCurrentObjContainerToDefinitionIfNecessary(*m_definition, m_current_ipak);
AddCurrentObjContainerToDefinitionIfNecessary(*m_definition, m_current_iwd);
SortObjContainer(*m_definition);
}