Most of the time we use a GameCommand to store state, we don't want
Apply() itself to load the screen; we want to stuff it in m_sNextScreen and let the normal screen loading code path do it. That's why we have GetAndClearScreen. However, GetAndClearScreen is a non-const, and applying a GameCommand should be a const operation. It doesn't get along well with screen reuse; once you've applied it, you've destroyed the GameCommand. Instead, hold a flag indicating whether or not to apply screens, and set this true on load when we handle it manually. We should probably *always* do this, and never load a screen within GameCommand itself, so this may go away soon (always on).
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
|
||||
void GameCommand::Init()
|
||||
{
|
||||
m_bApplyCommitsScreens = true;
|
||||
m_sName = "";
|
||||
m_sText = "";
|
||||
m_bInvalid = true;
|
||||
@@ -591,6 +592,7 @@ void GameCommand::Apply( const vector<PlayerNumber> &vpns ) const
|
||||
{
|
||||
GameCommand gc;
|
||||
gc.m_bInvalid = false;
|
||||
gc.m_bApplyCommitsScreens = m_bApplyCommitsScreens;
|
||||
gc.LoadOne( *cmd );
|
||||
gc.ApplySelf( vpns );
|
||||
}
|
||||
@@ -669,7 +671,7 @@ void GameCommand::ApplySelf( const vector<PlayerNumber> &vpns ) const
|
||||
}
|
||||
LUA->Release(L);
|
||||
}
|
||||
if( m_sScreen != "" )
|
||||
if( m_sScreen != "" && m_bApplyCommitsScreens )
|
||||
SCREENMAN->SetNewScreen( m_sScreen );
|
||||
if( m_pSong )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user