diff --git a/data/dynos_bin_lvl.cpp b/data/dynos_bin_lvl.cpp index 663f4f2cc..633a98f9b 100644 --- a/data/dynos_bin_lvl.cpp +++ b/data/dynos_bin_lvl.cpp @@ -1367,8 +1367,23 @@ s64 DynOS_Lvl_ParseLevelScriptConstants(const String& _Arg, bool* found) { return 0; } +template +DataNode* FindDataNode(DataNodes& aDataNodes, String& aName, u32 aModelIdentifier) { + DataNode* best = NULL; + for (auto& node : aDataNodes) { + if (aName == node->mName) { + if (aModelIdentifier == node->mModelIdentifier) { + return node; + } + best = node; + } + } + return best; +} + static LevelScript ParseLevelScriptSymbolArgInternal(GfxData* aGfxData, DataNode* aNode, u64& aTokenIndex, bool* found) { String _Arg = aNode->mTokens[aTokenIndex++]; + u64 _ModelIdentifier = aNode->mModelIdentifier; *found = true; // Integers @@ -1399,8 +1414,9 @@ static LevelScript ParseLevelScriptSymbolArgInternal(GfxData* aGfxData, DataNode } // Level Scripts - for (auto& _Node : aGfxData->mLevelScripts) { - if (_Arg == _Node->mName) { + { + auto _Node = FindDataNode(aGfxData->mLevelScripts, _Arg, aGfxData->mModelIdentifier); + if (_Node != NULL) { auto base = DynOS_Lvl_Parse(aGfxData, _Node, false)->mData; auto data = (u8*)base + _Offset; if (_Offset != 0) { @@ -1411,50 +1427,57 @@ static LevelScript ParseLevelScriptSymbolArgInternal(GfxData* aGfxData, DataNode } // Geo layouts - for (auto& _Node : aGfxData->mGeoLayouts) { - if (_Arg == _Node->mName) { + { + auto _Node = FindDataNode(aGfxData->mGeoLayouts, _Arg, aGfxData->mModelIdentifier); + if (_Node != NULL) { return (LevelScript) DynOS_Geo_Parse(aGfxData, _Node, false)->mData; } } // Collisions - for (auto& _Node : aGfxData->mCollisions) { - if (_Arg == _Node->mName) { + { + auto _Node = FindDataNode(aGfxData->mCollisions, _Arg, aGfxData->mModelIdentifier); + if (_Node != NULL) { return (LevelScript) DynOS_Col_Parse(aGfxData, _Node, false)->mData; } } // MacroObjects - for (auto& _Node : aGfxData->mMacroObjects) { - if (_Arg == _Node->mName) { + { + auto _Node = FindDataNode(aGfxData->mMacroObjects, _Arg, aGfxData->mModelIdentifier); + if (_Node != NULL) { return (LevelScript) DynOS_MacroObject_Parse(aGfxData, _Node, false)->mData; } } // Trajectories - for (auto& _Node : aGfxData->mTrajectories) { - if (_Arg == _Node->mName) { + { + auto _Node = FindDataNode(aGfxData->mTrajectories, _Arg, aGfxData->mModelIdentifier); + if (_Node != NULL) { return (LevelScript) DynOS_Trajectory_Parse(aGfxData, _Node, false)->mData; } } // Movtexs - for (auto& _Node : aGfxData->mMovtexs) { - if (_Arg == _Node->mName) { + { + auto _Node = FindDataNode(aGfxData->mMovtexs, _Arg, aGfxData->mModelIdentifier); + if (_Node != NULL) { return (LevelScript) DynOS_Movtex_Parse(aGfxData, _Node, false)->mData; } } // MovtexQCs - for (auto& _Node : aGfxData->mMovtexQCs) { - if (_Arg == _Node->mName) { + { + auto _Node = FindDataNode(aGfxData->mMovtexQCs, _Arg, aGfxData->mModelIdentifier); + if (_Node != NULL) { return (LevelScript) DynOS_MovtexQC_Parse(aGfxData, _Node)->mData; } } // Rooms - for (auto& _Node : aGfxData->mRooms) { - if (_Arg == _Node->mName) { + { + auto _Node = FindDataNode(aGfxData->mRooms, _Arg, aGfxData->mModelIdentifier); + if (_Node != NULL) { return (LevelScript) DynOS_Rooms_Parse(aGfxData, _Node)->mData; } }