diff --git a/stepmania/src/ActorCommands.cpp b/stepmania/src/ActorCommands.cpp index eb4db4ac8f..873ccb7709 100644 --- a/stepmania/src/ActorCommands.cpp +++ b/stepmania/src/ActorCommands.cpp @@ -7,108 +7,6 @@ #include #include "LuaManager.h" -apActorCommands ActorCommands( const RString &sCommands ) -{ - RString sLuaFunction; - if( sCommands.size() > 0 && sCommands[0] == '\033' ) - { - /* This is a compiled Lua chunk. Just pass it on directly. */ - sLuaFunction = sCommands; - } - else if( sCommands.size() > 0 && sCommands[0] == '%' ) - { - sLuaFunction = "return "; - sLuaFunction.append( sCommands.begin()+1, sCommands.end() ); - } - else - { - Commands cmds; - ParseCommands( sCommands, cmds ); - - // - // Convert cmds to a Lua function - // - ostringstream s; - - s << "return function(self,parent)\n"; - - FOREACH_CONST( Command, cmds.v, c ) - { - const Command& cmd = (*c); - RString sName = cmd.GetName(); - TrimLeft( sName ); - TrimRight( sName ); - s << "\tself:" << sName << "("; - - bool bFirstParamIsString = - sName == "horizalign" || - sName == "vertalign" || - sName == "effectclock" || - sName == "blend" || - sName == "ztestmode" || - sName == "cullmode" || - sName == "playcommand" || - sName == "queuecommand" || - sName == "queuemessage"; - - for( unsigned i=1; i "200" - if( sArg[0] == '+' ) - sArg.erase( sArg.begin() ); - - if( i==1 && bFirstParamIsString ) // string literal - { - sArg.Replace( "'", "\\'" ); // escape quote - s << "'" << sArg << "'"; - } - else if( sArg[0] == '#' ) // HTML color - { - RageColor c; // in case FromString fails - c.FromString( sArg ); - // c is still valid if FromString fails - s << c.r << "," << c.g << "," << c.b << "," << c.a; - } - else - { - s << sArg; - } - - if( i != cmd.m_vsArgs.size()-1 ) - s << ","; - } - s << ")\n"; - } - - s << "end\n"; - - sLuaFunction = s.str(); - } - - Lua *L = LUA->Get(); - - LuaReference *pRet = new LuaReference; - - RString sError; - if( !LuaHelpers::RunScript( L, sLuaFunction, "in", sError, 1 ) ) - { - FAIL_M( ssprintf("Compiling \"%s\": %s", sLuaFunction.c_str(), sError.c_str()) ); - } - - /* The function is now on the stack. */ - pRet->SetFromStack( L ); - LUA->Release( L ); - - ASSERT_M( !pRet->IsNil(), sLuaFunction.c_str() ); - - pRet->SetName( sLuaFunction ); - - return apActorCommands( pRet ); -} - - /* * (c) 2004 Chris Danford * All rights reserved. diff --git a/stepmania/src/ActorUtil.cpp b/stepmania/src/ActorUtil.cpp index 21a6b3b78c..fafb931e00 100644 --- a/stepmania/src/ActorUtil.cpp +++ b/stepmania/src/ActorUtil.cpp @@ -12,6 +12,8 @@ #include "XmlFileUtil.h" #include "LuaManager.h" #include "Foreach.h" +#include "Command.h" +#include #include "arch/Dialog/Dialog.h" @@ -396,7 +398,103 @@ Actor* ActorUtil::MakeActor( const RString &sPath_, const XNode *pParent, Actor apActorCommands ActorUtil::ParseActorCommands( const RString &sCommands ) { - return ActorCommands( sCommands ); + RString sLuaFunction; + if( sCommands.size() > 0 && sCommands[0] == '\033' ) + { + /* This is a compiled Lua chunk. Just pass it on directly. */ + sLuaFunction = sCommands; + } + else if( sCommands.size() > 0 && sCommands[0] == '%' ) + { + sLuaFunction = "return "; + sLuaFunction.append( sCommands.begin()+1, sCommands.end() ); + } + else + { + Commands cmds; + ParseCommands( sCommands, cmds ); + + // + // Convert cmds to a Lua function + // + ostringstream s; + + s << "return function(self,parent)\n"; + + FOREACH_CONST( Command, cmds.v, c ) + { + const Command& cmd = (*c); + RString sName = cmd.GetName(); + TrimLeft( sName ); + TrimRight( sName ); + s << "\tself:" << sName << "("; + + bool bFirstParamIsString = + sName == "horizalign" || + sName == "vertalign" || + sName == "effectclock" || + sName == "blend" || + sName == "ztestmode" || + sName == "cullmode" || + sName == "playcommand" || + sName == "queuecommand" || + sName == "queuemessage"; + + for( unsigned i=1; i "200" + if( sArg[0] == '+' ) + sArg.erase( sArg.begin() ); + + if( i==1 && bFirstParamIsString ) // string literal + { + sArg.Replace( "'", "\\'" ); // escape quote + s << "'" << sArg << "'"; + } + else if( sArg[0] == '#' ) // HTML color + { + RageColor c; // in case FromString fails + c.FromString( sArg ); + // c is still valid if FromString fails + s << c.r << "," << c.g << "," << c.b << "," << c.a; + } + else + { + s << sArg; + } + + if( i != cmd.m_vsArgs.size()-1 ) + s << ","; + } + s << ")\n"; + } + + s << "end\n"; + + sLuaFunction = s.str(); + } + + Lua *L = LUA->Get(); + + LuaReference *pRet = new LuaReference; + + RString sError; + if( !LuaHelpers::RunScript( L, sLuaFunction, "in", sError, 1 ) ) + { + FAIL_M( ssprintf("Compiling \"%s\": %s", sLuaFunction.c_str(), sError.c_str()) ); + } + + /* The function is now on the stack. */ + pRet->SetFromStack( L ); + LUA->Release( L ); + + ASSERT_M( !pRet->IsNil(), sLuaFunction.c_str() ); + + pRet->SetName( sLuaFunction ); + + return apActorCommands( pRet ); } void ActorUtil::SetXY( Actor& actor, const RString &sType )