2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-09 06:27:43 +00:00

Another PAK indexing fix

This commit is contained in:
Jack Andersen
2015-09-23 17:57:45 -10:00
parent d6ce7559b9
commit cf1c7e4781
8 changed files with 113 additions and 296 deletions

View File

@@ -50,98 +50,6 @@ PAKBridge::PAKBridge(HECL::Database::Project& project, const NOD::DiscBase::IPar
}
}
UniqueResult PAKBridge::uniqueCheck(const DNAMP1::PAK::Entry& entry)
{
UniqueResult::Type result = UniqueResult::UNIQUE_NOTFOUND;
bool foundOneLayer = false;
const HECL::SystemString* levelName = nullptr;
UniqueID32 levelId;
UniqueID32 areaId;
unsigned layerIdx;
for (const auto& lpair : m_levelDeps)
{
levelName = &lpair.second.name;
if (entry.id == lpair.first)
{
result = UniqueResult::UNIQUE_LEVEL;
break;
}
for (const auto& pair : lpair.second.areas)
{
unsigned l=0;
for (const auto& layer : pair.second.layers)
{
if (layer.resources.find(entry.id) != layer.resources.end())
{
if (foundOneLayer)
{
if (areaId == pair.first)
{
result = UniqueResult::UNIQUE_AREA;
}
else if (levelId == lpair.first)
{
result = UniqueResult::UNIQUE_LEVEL;
break;
}
else
{
return {UniqueResult::UNIQUE_PAK};
}
continue;
}
else
result = UniqueResult::UNIQUE_LAYER;
levelId = lpair.first;
areaId = pair.first;
layerIdx = l;
foundOneLayer = true;
}
++l;
}
if (pair.second.resources.find(entry.id) != pair.second.resources.end())
{
if (foundOneLayer)
{
if (areaId == pair.first)
{
result = UniqueResult::UNIQUE_AREA;
}
else if (levelId == lpair.first)
{
result = UniqueResult::UNIQUE_LEVEL;
break;
}
else
{
return {UniqueResult::UNIQUE_PAK};
}
continue;
}
else
result = UniqueResult::UNIQUE_AREA;
levelId = lpair.first;
areaId = pair.first;
foundOneLayer = true;
}
}
}
UniqueResult retval = {result};
retval.levelName = levelName;
if (result == UniqueResult::UNIQUE_LAYER || result == UniqueResult::UNIQUE_AREA)
{
const PAKBridge::Level::Area& area = m_levelDeps[levelId].areas[areaId];
retval.areaName = &area.name;
if (result == UniqueResult::UNIQUE_LAYER)
{
const PAKBridge::Level::Area::Layer& layer = area.layers[layerIdx];
retval.layerName = &layer.name;
}
}
return retval;
}
static HECL::SystemString LayerName(const std::string& name)
{
#if HECL_UCS2
@@ -271,7 +179,7 @@ void PAKBridge::build()
/* Second pass: cross-compare uniqueness */
for (DNAMP1::PAK::Entry& entry : m_pak.m_entries)
{
entry.unique = uniqueCheck(entry);
entry.unique.checkEntry(*this, entry);
}
}