We have two "gamestate Lua environments": mapEnv and m_Environment. The

former is a map<CString,CString>; the latter is a Lua table.  The former
is reset on gamestate reset, the latter is not.

Merge the map into the table, and eliminate it.  We only need one, and
it makes sense for a Lua environment to be a Lua table.

Do reset the table on Reset.  Otherwise, there's little point; if you want
to store data inside Lua, you don't need GameState to help.
This commit is contained in:
Glenn Maynard
2006-01-13 21:49:35 +00:00
parent 4b072e00a3
commit 9c867fdd70
3 changed files with 23 additions and 9 deletions
+8 -1
View File
@@ -694,7 +694,14 @@ void GameCommand::ApplySelf( const vector<PlayerNumber> &vpns ) const
FOREACH_CONST( PlayerNumber, vpns, pn ) FOREACH_CONST( PlayerNumber, vpns, pn )
GAMESTATE->m_pCurCharacters[*pn] = m_pCharacter; GAMESTATE->m_pCurCharacters[*pn] = m_pCharacter;
for( map<CString,CString>::const_iterator i = m_SetEnv.begin(); i != m_SetEnv.end(); i++ ) for( map<CString,CString>::const_iterator i = m_SetEnv.begin(); i != m_SetEnv.end(); i++ )
GAMESTATE->m_mapEnv[ i->first ] = i->second; {
Lua *L = LUA->Get();
GAMESTATE->m_Environment->PushSelf(L);
lua_pushstring( L, i->first );
lua_pushstring( L, i->second );
lua_settable( L, -3 );
LUA->Release(L);
}
if( !m_sSongGroup.empty() ) if( !m_sSongGroup.empty() )
GAMESTATE->m_sPreferredSongGroup.Set( m_sSongGroup ); GAMESTATE->m_sPreferredSongGroup.Set( m_sSongGroup );
if( m_SortOrder != SORT_INVALID ) if( m_SortOrder != SORT_INVALID )
+15 -7
View File
@@ -178,7 +178,7 @@ void GameState::Reset()
// m_iCoins = 0; // don't reset coin count! // m_iCoins = 0; // don't reset coin count!
m_MasterPlayerNumber = PLAYER_INVALID; m_MasterPlayerNumber = PLAYER_INVALID;
m_bMultiplayer = false; m_bMultiplayer = false;
m_mapEnv.clear(); *m_Environment = LuaTable();
m_sPreferredSongGroup.Set( GROUP_ALL ); m_sPreferredSongGroup.Set( GROUP_ALL );
m_sPreferredCourseGroup.Set( GROUP_ALL ); m_sPreferredCourseGroup.Set( GROUP_ALL );
m_bChangedFailTypeOnScreenSongOptions = false; m_bChangedFailTypeOnScreenSongOptions = false;
@@ -726,6 +726,7 @@ Stage GameState::GetCurrentStage() const
else return (Stage)(STAGE_1+m_iCurrentStageIndex); else return (Stage)(STAGE_1+m_iCurrentStageIndex);
} }
// Return true if it's possible for GetCurrentStage() to return the given stage.
bool GameState::IsStagePossible( Stage s ) const bool GameState::IsStagePossible( Stage s ) const
{ {
/* HACK: Find out what the stage would be without long or marathon. /* HACK: Find out what the stage would be without long or marathon.
@@ -1883,14 +1884,21 @@ public:
} }
static int SetTemporaryEventMode( T* p, lua_State *L ) { p->m_bTemporaryEventMode = BArg(1); return 0; } static int SetTemporaryEventMode( T* p, lua_State *L ) { p->m_bTemporaryEventMode = BArg(1); return 0; }
static int Env( T* p, lua_State *L ) { p->m_Environment->PushSelf(L); return 1; } static int Env( T* p, lua_State *L ) { p->m_Environment->PushSelf(L); return 1; }
static int SetEnv( T* p, lua_State *L ) { p->m_mapEnv[SArg(1)] = SArg(2); return 0; } static int SetEnv( T* p, lua_State *L )
{
int iTop = lua_gettop(L);
p->m_Environment->PushSelf(L);
lua_pushvalue( L, iTop-1 );
lua_pushvalue( L, iTop );
lua_settable( L, -3 );
return 0;
}
static int GetEnv( T* p, lua_State *L ) static int GetEnv( T* p, lua_State *L )
{ {
map<CString,CString>::const_iterator iter = p->m_mapEnv.find(SArg(1)); int iTop = lua_gettop(L);
if( iter != p->m_mapEnv.end() ) p->m_Environment->PushSelf(L);
lua_pushstring(L,iter->second); lua_pushvalue( L, iTop );
else lua_gettable( L, -2 );
lua_pushnil(L);
return 1; return 1;
} }
static int GetEditSourceSteps( T* p, lua_State *L ) static int GetEditSourceSteps( T* p, lua_State *L )
-1
View File
@@ -69,7 +69,6 @@ public:
bool IsCourseDifficultyShown( CourseDifficulty cd ); bool IsCourseDifficultyShown( CourseDifficulty cd );
Difficulty GetEasiestStepsDifficulty() const; Difficulty GetEasiestStepsDifficulty() const;
RageTimer m_timeGameStarted; // from the moment the first player pressed Start RageTimer m_timeGameStarted; // from the moment the first player pressed Start
map<CString,CString> m_mapEnv;
LuaTable *m_Environment; LuaTable *m_Environment;
/* This is set to a random number per-game/round; it can be used for a random seed. */ /* This is set to a random number per-game/round; it can be used for a random seed. */