diff --git a/stepmania/src/Actor.cpp b/stepmania/src/Actor.cpp index ff31d760a9..2343dbbec5 100644 --- a/stepmania/src/Actor.cpp +++ b/stepmania/src/Actor.cpp @@ -619,7 +619,7 @@ void Actor::AddRotationR( float rot ) void Actor::Command( const ActorCommands &vCommands ) { - FOREACH_CONST( ActorCommand, vCommands, c ) + FOREACH_CONST( ActorCommand, vCommands.v, c ) this->HandleCommand( *c ); } diff --git a/stepmania/src/ActorCommands.cpp b/stepmania/src/ActorCommands.cpp index 529b1b0a15..e19cc87f7b 100644 --- a/stepmania/src/ActorCommands.cpp +++ b/stepmania/src/ActorCommands.cpp @@ -54,16 +54,16 @@ CString ActorCommand::GetOriginalCommandString() const void ParseActorCommands( const CString &sCommands, ActorCommands &vCommandsOut ) { - vCommandsOut.clear(); + vCommandsOut.v.clear(); CStringArray vsCommands; split( sCommands, ";", vsCommands, true ); // do ignore empty - vCommandsOut.resize( vsCommands.size() ); + vCommandsOut.v.resize( vsCommands.size() ); for( unsigned i=0; i ActorCommands; +struct ActorCommands +{ + vector v; +}; // Take a command list string and return pointers to each of the tokens in the // string. sCommand list is a list of commands separated by ';'. diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index ec8e3b1f54..97b30ee4af 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -86,7 +86,7 @@ void GameState::ApplyCmdline() for( int i = 0; GetCommandlineArgument( "mode", &sMode, i ); ++i ) { ModeChoice m; - m.Load( 0, sMode ); + m.Load( 0, ParseActorCommands(sMode) ); CString why; if( !m.IsPlayable(&why) ) RageException::Throw( "Can't apply mode \"%s\": %s", sMode.c_str(), why.c_str() ); diff --git a/stepmania/src/LuaHelpers.cpp b/stepmania/src/LuaHelpers.cpp index 8cf914d979..6537c197ea 100644 --- a/stepmania/src/LuaHelpers.cpp +++ b/stepmania/src/LuaHelpers.cpp @@ -201,7 +201,7 @@ bool RunExpression( const CString &str ) { CString err; Lua::PopStack( L, err ); - CString sError = ssprintf( "Runtime error running \"%s\": %s", str.c_str(), err.c_str() ); + CString sError = ssprintf( "Lua runtime error parsing \"%s\": %s", str.c_str(), err.c_str() ); Dialog::OK( sError, "LUA_ERROR" ); return false; } @@ -216,7 +216,7 @@ bool RunExpression( const CString &str ) { CString err; Lua::PopStack( L, err ); - CString sError = ssprintf( "Runtime error running \"%s\": %s", str.c_str(), err.c_str() ); + CString sError = ssprintf( "Lua runtime error evaluating \"%s\": %s", str.c_str(), err.c_str() ); Dialog::OK( sError, "LUA_ERROR" ); return false; } diff --git a/stepmania/src/ModeChoice.cpp b/stepmania/src/ModeChoice.cpp index 9e0c9c5083..81ff32ff09 100644 --- a/stepmania/src/ModeChoice.cpp +++ b/stepmania/src/ModeChoice.cpp @@ -16,6 +16,7 @@ #include "song.h" #include "Game.h" #include "Style.h" +#include "Foreach.h" void ModeChoice::Init() { @@ -96,7 +97,7 @@ bool ModeChoice::DescribesCurrentMode( PlayerNumber pn ) const return true; } -void ModeChoice::Load( int iIndex, CString sChoice ) +void ModeChoice::Load( int iIndex, const ActorCommands& acs ) { m_iIndex = iIndex; @@ -104,21 +105,22 @@ void ModeChoice::Load( int iIndex, CString sChoice ) CString sSteps; - CStringArray asCommands; - split( sChoice, ";", asCommands ); - for( unsigned i=0; ivTokens.empty() ) + continue; - CString sName = asBits[0]; - asBits.erase(asBits.begin(), asBits.begin()+1); - CString sValue = join( ",", asBits ); - - sName.MakeLower(); - // sValue.MakeLower(); + const CString &sName = command->vTokens[0]; // name is already made lowercase by ActorCommand + + CString sValue; + for( vector::const_iterator iter = command->vTokens.begin()+1; + iter != command->vTokens.end(); + iter++ ) + { + sValue += *iter; + if( iter != command->vTokens.end()-1 ) + sValue += ","; + } if( sName == "game" ) { @@ -207,7 +209,8 @@ void ModeChoice::Load( int iIndex, CString sChoice ) else if( sName == "setenv" ) { - m_SetEnv[ asBits[0] ] = sValue; + if( command->vTokens.size() == 3 ) + m_SetEnv[ command->vTokens[1] ] = command->vTokens[2]; } else if( sName == "songgroup" ) diff --git a/stepmania/src/ModeChoice.h b/stepmania/src/ModeChoice.h index 73e04bcdf0..0ec8674b99 100644 --- a/stepmania/src/ModeChoice.h +++ b/stepmania/src/ModeChoice.h @@ -14,13 +14,14 @@ class Trail; class Character; class Style; class Game; +struct ActorCommands; struct ModeChoice // used in SelectMode { ModeChoice() { Init(); } void Init(); - void Load( int iIndex, CString str ); + void Load( int iIndex, const ActorCommands& acs ); void ApplyToAllPlayers() const; void Apply( PlayerNumber pn ) const; bool DescribesCurrentMode( PlayerNumber pn ) const; diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index 7169341c70..38e49da7c3 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -437,7 +437,7 @@ void MusicWheel::BuildWheelItemDatas( vector &arrayWheelItemDatas WheelItemData wid( TYPE_SORT, NULL, "", NULL, SORT_MENU_COLOR, so ); wid.m_sLabel = Names[i]; - wid.m_Action.Load( i, Actions[i] ); + wid.m_Action.Load( i, ParseActorCommands(Actions[i]) ); switch( so ) { diff --git a/stepmania/src/ScreenBranch.cpp b/stepmania/src/ScreenBranch.cpp index 31e45ddf4c..4f9a5f3d2b 100644 --- a/stepmania/src/ScreenBranch.cpp +++ b/stepmania/src/ScreenBranch.cpp @@ -44,7 +44,7 @@ void ScreenBranch::HandleScreenMessage( const ScreenMessage SM ) LOG->Trace( "Branching to '%s'", sNextScreen.c_str() ); ModeChoice mc; - mc.Load( 0, sNextScreen ); + mc.Load( 0, ParseActorCommands(sNextScreen) ); if( mc.m_sScreen == "" ) RageException::Throw("Metric %s::%s must set \"screen\"", m_sName.c_str(), ("NextScreen"+m_sChoice).c_str() ); diff --git a/stepmania/src/ScreenOptionsMaster.cpp b/stepmania/src/ScreenOptionsMaster.cpp index 708760a30e..9824fb9b04 100644 --- a/stepmania/src/ScreenOptionsMaster.cpp +++ b/stepmania/src/ScreenOptionsMaster.cpp @@ -58,7 +58,7 @@ void ScreenOptionsMaster::SetList( OptionRowData &row, OptionRowHandler &hand, C return; } - hand.Default.Load( -1, ENTRY_DEFAULT(ListName) ); + hand.Default.Load( -1, ParseActorCommands(ENTRY_DEFAULT(ListName)) ); /* Parse the basic configuration metric. */ CStringArray asParts; @@ -79,7 +79,7 @@ void ScreenOptionsMaster::SetList( OptionRowData &row, OptionRowHandler &hand, C for( int col = 0; col < NumCols; ++col ) { ModeChoice mc; - mc.Load( 0, ENTRY_MODE(ListName, col) ); + mc.Load( 0, ParseActorCommands(ENTRY_MODE(ListName, col)) ); if( mc.m_sName == "" ) RageException::Throw( "List \"%s\", col %i has no name", ListName.c_str(), col ); @@ -250,13 +250,13 @@ ScreenOptionsMaster::ScreenOptionsMaster( CString sClassName ): ActorCommands vCommands; ParseActorCommands( sRowCommands, vCommands ); - if( vCommands.size() < 1 ) + if( vCommands.v.size() < 1 ) RageException::Throw( "Parse error in %s::Line%i", m_sName.c_str(), i+1 ); OptionRowHandler hand; - for( unsigned part = 0; part < vCommands.size(); ++part) + for( unsigned part = 0; part < vCommands.v.size(); ++part) { - ActorCommand& command = vCommands[part]; + ActorCommand& command = vCommands.v[part]; BeginHandleParams; diff --git a/stepmania/src/ScreenSelect.cpp b/stepmania/src/ScreenSelect.cpp index 1a5f667870..133ee6737e 100644 --- a/stepmania/src/ScreenSelect.cpp +++ b/stepmania/src/ScreenSelect.cpp @@ -51,7 +51,7 @@ ScreenSelect::ScreenSelect( CString sClassName ) : ScreenWithMenuElements(sClass ModeChoice mc; mc.m_sName = sChoiceName; - mc.Load( c, sChoice ); + mc.Load( c, ParseActorCommands(sChoice) ); m_aModeChoices.push_back( mc ); CString sBGAnimationDir = THEME->GetPath(BGAnimations, m_sName, mc.m_sName, true); // true="optional" @@ -74,7 +74,7 @@ ScreenSelect::ScreenSelect( CString sClassName ) : ScreenWithMenuElements(sClass m_aCodes.push_back( code ); m_aCodeActions.push_back( CODE_ACTION(c) ); ModeChoice mc; - mc.Load( c, CODE_ACTION(c) ); + mc.Load( c, ParseActorCommands(CODE_ACTION(c)) ); m_aCodeChoices.push_back( mc ); } diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index d640587e04..11d39bab67 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -765,6 +765,11 @@ void ThemeManager::GetModifierNames( set& AddTo ) } } +void ThemeManager::GetMetric( const CString &sClassName, const CString &sValueName, ActorCommands &valueOut ) +{ + valueOut = GetMetricA( sClassName, sValueName ); +} + /* * (c) 2001-2004 Chris Danford * All rights reserved. diff --git a/stepmania/src/ThemeManager.h b/stepmania/src/ThemeManager.h index 802ba85535..a7a3a85b48 100644 --- a/stepmania/src/ThemeManager.h +++ b/stepmania/src/ThemeManager.h @@ -5,12 +5,12 @@ #include "RageTypes.h" #include "RageTimer.h" -#include "ActorCommands.h" #include #include class IThemeMetric; class IniFile; +struct ActorCommands; enum ElementCategory { BGAnimations, Fonts, Graphics, Numbers, Sounds, Other, NUM_ELEMENT_CATEGORIES }; @@ -51,7 +51,7 @@ public: CString GetPathToS( const CString &sFileName, bool bOptional=false ); CString GetPathToO( const CString &sFileName, bool bOptional=false ); - + // TODO: Make these return values const refs. bool HasMetric( const CString &sClassName, const CString &sValueName ); CString GetMetricRaw( const CString &sClassName, const CString &sValueName ); CString GetMetric( const CString &sClassName, const CString &sValueName ); @@ -60,12 +60,13 @@ public: bool GetMetricB( const CString &sClassName, const CString &sValueName ); RageColor GetMetricC( const CString &sClassName, const CString &sValueName ); ActorCommands GetMetricA( const CString &sClassName, const CString &sValueName ); - void GetMetric( const CString &sClassName, const CString &sValueName, CString &valueOut ) { valueOut = GetMetric( sClassName, sValueName ); } - void GetMetric( const CString &sClassName, const CString &sValueName, int &valueOut ) { valueOut = GetMetricI( sClassName, sValueName ); } - void GetMetric( const CString &sClassName, const CString &sValueName, float &valueOut ) { valueOut = GetMetricF( sClassName, sValueName ); } - void GetMetric( const CString &sClassName, const CString &sValueName, bool &valueOut ) { valueOut = GetMetricB( sClassName, sValueName ); } - void GetMetric( const CString &sClassName, const CString &sValueName, RageColor &valueOut ) { valueOut = GetMetricC( sClassName, sValueName ); } - void GetMetric( const CString &sClassName, const CString &sValueName, ActorCommands &valueOut ){ valueOut = GetMetricA( sClassName, sValueName ); } + + void GetMetric( const CString &sClassName, const CString &sValueName, CString &valueOut ) { valueOut = GetMetric( sClassName, sValueName ); } + void GetMetric( const CString &sClassName, const CString &sValueName, int &valueOut ) { valueOut = GetMetricI( sClassName, sValueName ); } + void GetMetric( const CString &sClassName, const CString &sValueName, float &valueOut ) { valueOut = GetMetricF( sClassName, sValueName ); } + void GetMetric( const CString &sClassName, const CString &sValueName, bool &valueOut ) { valueOut = GetMetricB( sClassName, sValueName ); } + void GetMetric( const CString &sClassName, const CString &sValueName, RageColor &valueOut ) { valueOut = GetMetricC( sClassName, sValueName ); } + void GetMetric( const CString &sClassName, const CString &sValueName, ActorCommands &valueOut ); // // For self-registering metrics