use standard command parsing for unlocks (eliminate one case

where Command's AtExpression stuff is used)
This commit is contained in:
Glenn Maynard
2006-10-11 02:02:31 +00:00
parent 00d1fc742c
commit aab51ed30e
2 changed files with 56 additions and 64 deletions
+54 -64
View File
@@ -19,7 +19,7 @@
UnlockManager* UNLOCKMAN = NULL; // global and accessable from anywhere in our program
#define UNLOCK_NAMES THEME->GetMetric ("UnlockManager","UnlockNames")
#define UNLOCK(sLineName) THEME->GetMetric ("UnlockManager",ssprintf("Unlock%s",sLineName.c_str()))
#define UNLOCK THEME->GetMetricR("UnlockManager", ssprintf("Unlock%sCommand",sUnlockName.c_str()));
ThemeMetric<bool> AUTO_LOCK_CHALLENGE_STEPS( "UnlockManager", "AutoLockChallengeSteps" );
@@ -399,67 +399,32 @@ void UnlockManager::Load()
vector<RString> asUnlockNames;
split( UNLOCK_NAMES, ",", asUnlockNames );
Lua *L = LUA->Get();
for( unsigned i = 0; i < asUnlockNames.size(); ++i )
{
const RString &sUnlockName = asUnlockNames[i];
RString sUnlock = UNLOCK(sUnlockName);
Commands vCommands;
ParseCommands( sUnlock, vCommands );
LuaReference cmds = UNLOCK( sUnlockName );
UnlockEntry current;
bool bRoulette = false;
current.m_sEntryID = sUnlockName; // default
for( unsigned j = 0; j < vCommands.v.size(); ++j )
{
const Command &cmd = vCommands.v[j];
RString sName = cmd.GetName();
// function
cmds.PushSelf( L );
ASSERT( !lua_isnil(L, -1) );
if( sName == "song" )
{
current.m_Type = UnlockRewardType_Song;
current.m_cmd = cmd;
}
if( sName == "steps" )
{
current.m_Type = UnlockRewardType_Steps;
current.m_cmd = cmd;
}
if( sName == "course" )
{
current.m_Type = UnlockRewardType_Course;
current.m_cmd = cmd;
}
if( sName == "mod" )
{
current.m_Type = UnlockRewardType_Modifier;
current.m_cmd = cmd;
}
else if( sName == "code" )
{
current.m_sEntryID = (RString)cmd.GetArg(1);
}
else if( sName == "roulette" )
{
bRoulette = true;
}
else if( sName == "requrepasshardsteps" )
{
current.m_bRequirePassHardSteps = true;
}
else
{
const UnlockRequirement ut = StringToUnlockRequirement( cmd.GetName() );
if( ut != UnlockRequirement_Invalid )
current.m_fRequirement[ut] = cmd.GetArg(1);
}
}
// 1st parameter
current.PushSelf( L );
// call function with 1 argument and 0 results
lua_call( L, 1, 0 );
if( bRoulette )
if( current.m_bRoulette )
m_RouletteCodes.insert( current.m_sEntryID );
m_UnlockEntries.push_back( current );
}
LUA->Release(L);
if( AUTO_LOCK_CHALLENGE_STEPS )
{
@@ -477,23 +442,15 @@ void UnlockManager::Load()
continue;
UnlockEntry ue;
ue.m_sEntryID = "_challenge_" + (*s)->GetSongDir();
ue.m_Type = UnlockRewardType_Steps;
ue.m_cmd.Load( "steps,"+(*s)->m_sGroupName+"/"+(*s)->GetTranslitFullTitle()+",expert" );
ue.m_cmd.Load( (*s)->m_sGroupName+"/"+(*s)->GetTranslitFullTitle()+",expert" );
ue.m_bRequirePassHardSteps = true;
m_UnlockEntries.push_back( ue );
}
}
//
// Fill in unlock entry IDs that weren't specified
//
FOREACH( UnlockEntry, m_UnlockEntries, e )
{
if( e->m_sEntryID.empty() )
e->m_sEntryID = e->m_cmd.GetOriginalCommandString();
}
// Make sure that we don't have duplicate unlock IDs. This can cause problems
// with UnlockCelebrate and with codes.
FOREACH_CONST( UnlockEntry, m_UnlockEntries, ue )
@@ -513,7 +470,7 @@ void UnlockManager::Load()
if( e->m_fRequirement[j] )
str += ssprintf( "%s = %f; ", UnlockRequirementToString(j).c_str(), e->m_fRequirement[j] );
if( e->m_bRequirePassHardSteps )
str += "RequrePassHardSteps; ";
str += "RequirePassHardSteps; ";
str += ssprintf( "entryID = %s ", e->m_sEntryID.c_str() );
str += e->IsLocked()? "locked":"unlocked";
@@ -562,19 +519,19 @@ void UnlockManager::UpdateCachedPointers()
switch( e->m_Type )
{
case UnlockRewardType_Song:
e->m_pSong = SONGMAN->FindSong( e->m_cmd.GetArg(1) );
e->m_pSong = SONGMAN->FindSong( e->m_cmd.GetArg(0).s );
if( e->m_pSong == NULL )
LOG->Warn( "Unlock: Cannot find song matching \"%s\"", e->m_cmd.GetArg(1).s.c_str() );
break;
case UnlockRewardType_Steps:
e->m_pSong = SONGMAN->FindSong( e->m_cmd.GetArg(1) );
e->m_pSong = SONGMAN->FindSong( e->m_cmd.GetArg(0).s );
if( e->m_pSong == NULL )
{
LOG->Warn( "Unlock: Cannot find song matching \"%s\"", e->m_cmd.GetArg(1).s.c_str() );
break;
}
e->m_dc = StringToDifficulty( e->m_cmd.GetArg(2) );
e->m_dc = StringToDifficulty( e->m_cmd.GetArg(1).s );
if( e->m_dc == Difficulty_Invalid )
{
LOG->Warn( "Unlock: Invalid difficulty \"%s\"", e->m_cmd.GetArg(2).s.c_str() );
@@ -583,7 +540,7 @@ void UnlockManager::UpdateCachedPointers()
break;
case UnlockRewardType_Course:
e->m_pCourse = SONGMAN->FindCourse( e->m_cmd.GetArg(1) );
e->m_pCourse = SONGMAN->FindCourse( e->m_cmd.GetArg(0).s );
if( e->m_pCourse == NULL )
LOG->Warn( "Unlock: Cannot find course matching \"%s\"", e->m_cmd.GetArg(1).s.c_str() );
break;
@@ -701,6 +658,30 @@ public:
static int GetRequirement( T* p, lua_State *L ) { UnlockRequirement i = Enum::Check<UnlockRequirement>( L, 1 ); lua_pushnumber(L, p->m_fRequirement[i] ); return 1; }
static int GetRequirePassHardSteps( T* p, lua_State *L ){ lua_pushboolean(L, p->m_bRequirePassHardSteps); return 1; }
static int GetArgs( T* p, lua_State *L )
{
Command cmd;
for( int i = 1; i <= lua_gettop(L); ++i )
cmd.m_vsArgs.push_back( SArg(i) );
p->m_cmd = cmd;
return 0;
}
static int song( T* p, lua_State *L ) { GetArgs( p, L ); p->m_Type = UnlockRewardType_Song; return 0; }
static int steps( T* p, lua_State *L ) { GetArgs( p, L ); p->m_Type = UnlockRewardType_Steps; return 0; }
static int course( T* p, lua_State *L ) { GetArgs( p, L ); p->m_Type = UnlockRewardType_Course; return 0; }
static int mod( T* p, lua_State *L ) { GetArgs( p, L ); p->m_Type = UnlockRewardType_Modifier; return 0; }
static int code( T* p, lua_State *L ) { p->m_sEntryID = SArg(1); return 0; }
static int roulette( T* p, lua_State *L ) { p->m_bRoulette = true; return 0; }
static int requirepasshardsteps( T* p, lua_State *L ) { p->m_bRequirePassHardSteps = true; return 0; }
static int require( T* p, lua_State *L )
{
const UnlockRequirement ut = Enum::Check<UnlockRequirement>( L, 1 );
if( ut != UnlockRequirement_Invalid )
p->m_fRequirement[ut] = FArg(2);
return 0;
}
LunaUnlockEntry()
{
ADD_METHOD( IsLocked );
@@ -708,6 +689,15 @@ public:
ADD_METHOD( GetUnlockRewardType );
ADD_METHOD( GetRequirement );
ADD_METHOD( GetRequirePassHardSteps );
ADD_METHOD( GetRequirePassHardSteps );
ADD_METHOD( song );
ADD_METHOD( steps );
ADD_METHOD( course );
ADD_METHOD( mod );
ADD_METHOD( code );
ADD_METHOD( roulette );
ADD_METHOD( requirepasshardsteps );
ADD_METHOD( require );
}
};