diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index b5562ceb6f..3266679e5c 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -1146,8 +1146,15 @@ void ScreenGameplay::Update( float fDeltaTime ) else Screen::Update( fDeltaTime ); + /* This happens if ScreenDemonstration::HandleScreenMessage sets a new screen when + * PREFSMAN->m_bDelayedScreenLoad. */ if( GAMESTATE->m_pCurSong == NULL ) return; + /* This can happen if ScreenDemonstration::HandleScreenMessage sets a new screen when + * !PREFSMAN->m_bDelayedScreenLoad. (The new screen was loaded when we called Screen::Update, + * and the ctor might set a new GAMESTATE->m_pCurSong, so the above check can fail.) */ + if( SCREENMAN->GetTopScreen() != this ) + return; if( GAMESTATE->m_MasterPlayerNumber != PLAYER_INVALID ) m_MaxCombo.SetText( ssprintf("%d", g_CurStageStats.iMaxCombo[GAMESTATE->m_MasterPlayerNumber]) ); /* MAKE THIS WORK FOR BOTH PLAYERS! */ diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index 367e7d4838..1051dfe4c7 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -371,6 +371,13 @@ void ScreenManager::EmptyDeleteQueue() TEXTUREMAN->DiagnosticOutput(); } +Screen *ScreenManager::GetTopScreen() +{ + if( m_ScreenStack.empty() ) + return NULL; + return m_ScreenStack[m_ScreenStack.size()-1]; +} + void ScreenManager::Update( float fDeltaTime ) { // Only update the topmost screen on the stack. @@ -392,7 +399,7 @@ void ScreenManager::Update( float fDeltaTime ) if( !m_ScreenStack.empty() ) { - Screen* pScreen = m_ScreenStack[m_ScreenStack.size()-1]; + Screen* pScreen = GetTopScreen(); if( pScreen->IsFirstUpdate() ) pScreen->Update( 0 ); else diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index 18e1e3856c..bf1858f9f5 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -59,6 +59,8 @@ public: void LoadDelayedScreen(); + Screen *GetTopScreen(); + private: vector m_ScreenStack; // bottommost to topmost ScreenMessage m_MessageSendOnPop;