mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-11-23 05:12:05 +00:00
73 lines
2.6 KiB
C++
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);
|
|
}
|