2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-11-23 05:12:05 +00:00
Files
OpenAssetTools/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp
2025-11-01 16:16:15 +08:00

73 lines
2.6 KiB
C++

#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);
}
void ZoneDefinitionParserState::SetMapType(ZoneDefinitionMapType mapType)
{
m_definition->m_map_type = mapType;
}
namespace
{
void AddCurrentObjContainerToDefinitionIfNecessary(ZoneDefinition& zoneDefinition, std::optional<ZoneDefinitionObjContainer>& maybeObjContainer)
{
if (!maybeObjContainer)
return;
maybeObjContainer->m_asset_end = static_cast<unsigned>(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, static_cast<unsigned>(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);
}