From f59c963eab2fb533cb9ed945a29ed9c5b8fd1b8e Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 12 Feb 2007 04:08:39 +0000 Subject: [PATCH] fix wrong actor order when creating more than 10 actors in Lua --- stepmania/src/XmlFileUtil.cpp | 47 ++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/stepmania/src/XmlFileUtil.cpp b/stepmania/src/XmlFileUtil.cpp index 7303ec0e30..81ea44e1ff 100644 --- a/stepmania/src/XmlFileUtil.cpp +++ b/stepmania/src/XmlFileUtil.cpp @@ -645,19 +645,48 @@ namespace } /* Iterate over the table, pulling out attributes and tables to process. */ - map NodesToAdd; + vector NodeNamesToAdd; + vector NodesToAdd; + + /* Add array elements first, in array order, so iterating over the XNode keeps the + * array in order. */ + FOREACH_LUATABLEI( L, -1, i ) + { + if( !lua_istable(L, -1) ) + continue; + NodeNamesToAdd.push_back( ssprintf("%i", i) ); + NodesToAdd.push_back( LuaReference() ); + NodesToAdd.back().SetFromStack( L ); + } + + int iLen = NodeNamesToAdd.size(); FOREACH_LUATABLE( L, -1 ) { - RString sName; - LuaHelpers::Pop( L, sName ); - /* If this entry is a table, add it recursively. */ - if( lua_istable(L, -1) ) + if( lua_istable(L, -2) ) { - NodesToAdd[sName].SetFromStack( L ); + if( lua_isnumber(L, -1) ) + { + /* If this number is an integer, and between [1,iLen], then we added + * this one already above. */ + lua_Number f = lua_tonumber( L, -1 ); + int i; + lua_number2int(i, f); + if( i >= 1 && i <= iLen && float(i) == f ) + continue; + } + + RString sName; + LuaHelpers::Pop( L, sName ); + NodeNamesToAdd.push_back( sName ); + NodesToAdd.push_back( LuaReference() ); + NodesToAdd.back().SetFromStack( L ); continue; } + RString sName; + LuaHelpers::Pop( L, sName ); + /* Otherwise, add an attribute. */ XNodeLuaValue *pValue = new XNodeLuaValue; pValue->SetValueFromStack( L ); @@ -666,10 +695,10 @@ namespace lua_pop( L, 1 ); /* Recursively process tables. */ - FOREACHM( RString, LuaReference, NodesToAdd, t ) + for( size_t i = 0; i < NodesToAdd.size(); ++i ) { - const RString &sNodeName = t->first; - LuaReference &NodeToAdd = t->second; + const RString &sNodeName = NodeNamesToAdd[i]; + LuaReference &NodeToAdd = NodesToAdd[i]; /* Check if the table is on the stack. */ ProcessedTables.PushSelf( L );