diff --git a/stepmania/src/Screen.cpp b/stepmania/src/Screen.cpp index d5f3a4aa0a..49631fad57 100644 --- a/stepmania/src/Screen.cpp +++ b/stepmania/src/Screen.cpp @@ -40,22 +40,18 @@ void Screen::Update( float fDeltaTime ) { ActorFrame::Update( fDeltaTime ); - /* We need to ensure two things: + /* + * We need to ensure two things: * 1. Messages must be sent in the order of delay. If two messages are sent * simultaneously, one with a .001 delay and another with a .002 delay, the * .001 delay message must be sent first. * 2. Messages to be delivered simultaneously must be sent in the order queued. * - * Stable sort by time to ensure #2. */ + * Sort by time to ensure #1; use a stable sort to ensure #2. + */ stable_sort(m_QueuedMessages.begin(), m_QueuedMessages.end(), SortMessagesByDelayRemaining); - // update the times of queued ScreenMessages and send if timer has expired - // The order you remove messages in must be very careful! Sending a message can - // potentially clear all m_QueuedMessages, and set a new state! - /* Also, it might call ClearMessageQueue() to clear a single message type. - * This might clear previous messages on the queue. So, first apply time to - * everything. */ - + /* Update the times of queued ScreenMessages. */ for( unsigned i=0; i 0.0001f) + if( m_QueuedMessages[i].fDelayRemaining > 0.0001f ) { m_QueuedMessages[i].fDelayRemaining -= fDeltaTime; - m_QueuedMessages[i].fDelayRemaining = max(m_QueuedMessages[i].fDelayRemaining, 0.0001f); - } else { + m_QueuedMessages[i].fDelayRemaining = max( m_QueuedMessages[i].fDelayRemaining, 0.0001f ); + } + else + { m_QueuedMessages[i].fDelayRemaining -= fDeltaTime; } } @@ -91,17 +89,17 @@ void Screen::Update( float fDeltaTime ) /* Remove the message from the list. */ const ScreenMessage SM = m_QueuedMessages[i].SM; - m_QueuedMessages.erase(m_QueuedMessages.begin()+i); + m_QueuedMessages.erase( m_QueuedMessages.begin()+i ); i--; - unsigned size = m_QueuedMessages.size(); + unsigned iSize = m_QueuedMessages.size(); // send this sucker! CHECKPOINT_M( ssprintf("ScreenMessage(%i)", SM) ); this->HandleScreenMessage( SM ); /* If the size changed, start over. */ - if(size != m_QueuedMessages.size()) + if( iSize != m_QueuedMessages.size() ) i = 0; } }