diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index 846a16469d..463b54d76a 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -136,6 +136,13 @@ void MusicWheel::BeginScreen() { WheelBase::BeginScreen(); + if( (GAMESTATE->IsExtraStage() && !PREFSMAN->m_bPickExtraStage) || GAMESTATE->IsExtraStage2() ) + { + m_WheelState = STATE_LOCKED; + SCREENMAN->PlayStartSound(); + m_fLockedWheelVelocity = 0; + } + GAMESTATE->m_SortOrder.Set( GAMESTATE->m_PreferredSortOrder ); /* Never start in the mode menu; some elements may not initialize correctly. */ @@ -748,7 +755,6 @@ void MusicWheel::UpdateSwitch() SCREENMAN->PostMessageToTopScreen( SM_SongChanged, 0 ); RebuildWheelItems(); TweenOnScreenForSort(); - m_WheelState = STATE_FLYING_ON_AFTER_NEXT_SORT; SCREENMAN->ZeroNextUpdate(); } @@ -758,31 +764,12 @@ void MusicWheel::UpdateSwitch() m_WheelState = STATE_SELECTING; // now, wait for input break; - case STATE_TWEENING_ON_SCREEN: - m_fTimeLeftInState = 0; - if( (GAMESTATE->IsExtraStage() && !PREFSMAN->m_bPickExtraStage) || GAMESTATE->IsExtraStage2() ) - { - m_WheelState = STATE_LOCKED; - SCREENMAN->PlayStartSound(); - m_fLockedWheelVelocity = 0; - } - else - { - m_WheelState = STATE_SELECTING; - } - break; - case STATE_TWEENING_OFF_SCREEN: - m_WheelState = STATE_WAITING_OFF_SCREEN; - m_fTimeLeftInState = 0; - break; case STATE_SELECTING: m_fTimeLeftInState = 0; break; case STATE_ROULETTE_SPINNING: case STATE_RANDOM_SPINNING: break; - case STATE_WAITING_OFF_SCREEN: - break; case STATE_LOCKED: break; case STATE_ROULETTE_SLOWING_DOWN: @@ -864,7 +851,6 @@ bool MusicWheel::ChangeSort( SortOrder new_so ) // return true if change success GAMESTATE->m_PreferredSortOrder = new_so; GAMESTATE->m_SortOrder.Set( new_so ); - m_WheelState = STATE_FLYING_OFF_BEFORE_NEXT_SORT; return true; } diff --git a/stepmania/src/WheelBase.cpp b/stepmania/src/WheelBase.cpp index d58b7808b4..54796590c6 100644 --- a/stepmania/src/WheelBase.cpp +++ b/stepmania/src/WheelBase.cpp @@ -73,31 +73,12 @@ void WheelBase::Load( RString sType ) this->AddChild( m_sprHighlight ); ActorUtil::LoadAllCommands( *m_sprHighlight, m_sName ); + m_ScrollBar.SetName( "ScrollBar" ); m_ScrollBar.SetBarHeight( SCROLL_BAR_HEIGHT ); this->AddChild( &m_ScrollBar ); ActorUtil::LoadAllCommands( m_ScrollBar, m_sName ); - { - Lua *L = LUA->Get(); - m_sprHighlight->PushContext(L); - lua_pushstring( L, "WheelIndex" ); - lua_pushnumber( L, NUM_WHEEL_ITEMS/2.0f ); - lua_settable( L, -3 ); - lua_pop( L, 1 ); - LUA->Release( L ); - } - - Lua *L = LUA->Get(); - for( int i=0; i < (int) m_WheelBaseItems.size(); i++ ) - { - m_WheelBaseItems[i]->PushContext(L); - lua_pushstring( L, "WheelIndex" ); - lua_pushnumber( L, i ); - lua_settable( L, -3 ); - lua_pop( L, 1 ); - } - LUA->Release( L ); - + SetPositions(); } void WheelBase::BeginScreen() @@ -182,33 +163,32 @@ bool WheelBase::IsSettled() const return true; } - -void WheelBase::Update( float fDeltaTime ) +void WheelBase::SetPositions() { - ActorFrame::Update( fDeltaTime ); - for( int i=0; i NUM_WHEEL_ITEMS_TO_DRAW/2 ) - { pDisplay->SetHidden( true ); - continue; - } - pDisplay->SetHidden( false ); + else + pDisplay->SetHidden( false ); - switch( m_WheelState ) - { - case STATE_SELECTING: - case STATE_LOCKED: - case STATE_ROULETTE_SPINNING: - case STATE_ROULETTE_SLOWING_DOWN: - case STATE_RANDOM_SPINNING: - SetItemPosition( *pDisplay, fOffsetFromSelection ); - break; - } + SetItemPosition( *pDisplay, fOffsetFromSelection ); + } +} +void WheelBase::Update( float fDeltaTime ) +{ + ActorFrame::Update( fDeltaTime ); + + /* If tweens aren't controlling the position of the wheel, set positions. */ + if( !GetTweenTimeLeft() ) + SetPositions(); + + for( int i=0; im_colorLocked = WHEEL_ITEM_LOCKED_COLOR.GetValue(); else @@ -228,9 +208,7 @@ void WheelBase::Update( float fDeltaTime ) // update wheel state m_fTimeLeftInState -= fDeltaTime; if( m_fTimeLeftInState <= 0 ) // time to go to a new state - { UpdateSwitch(); - } if( m_WheelState == STATE_LOCKED ) { @@ -313,28 +291,9 @@ void WheelBase::UpdateSwitch() { switch( m_WheelState ) { - case STATE_TWEENING_ON_SCREEN: - m_fTimeLeftInState = 0; - if( (GAMESTATE->IsExtraStage() && !PREFSMAN->m_bPickExtraStage) || GAMESTATE->IsExtraStage2() ) - { - m_WheelState = STATE_LOCKED; - SCREENMAN->PlayStartSound(); - m_fLockedWheelVelocity = 0; - } - else - { - m_WheelState = STATE_SELECTING; - } - break; - case STATE_TWEENING_OFF_SCREEN: - m_WheelState = STATE_WAITING_OFF_SCREEN; - m_fTimeLeftInState = 0; - break; case STATE_SELECTING: m_fTimeLeftInState = 0; break; - case STATE_WAITING_OFF_SCREEN: - break; case STATE_LOCKED: break; default: @@ -391,20 +350,26 @@ int WheelBase::IsMoving() const void WheelBase::TweenOnScreenForSort() { - m_WheelState = STATE_TWEENING_ON_SCREEN; + m_fPositionOffsetFromSelection = 0; + + /* Before we send SortOn, position items back to their destinations, so commands + * can use this as a reference point. */ + SetPositions(); + + m_WheelState = STATE_FLYING_ON_AFTER_NEXT_SORT; COMMAND( this, "SortOn" ); - m_fTimeLeftInState = GetTweenTimeLeft() + 0.100f; + m_fTimeLeftInState = GetTweenTimeLeft(); } void WheelBase::TweenOffScreenForSort() { - m_WheelState = STATE_TWEENING_OFF_SCREEN; + m_WheelState = STATE_FLYING_OFF_BEFORE_NEXT_SORT; COMMAND( this, "SortOff" ); - m_fTimeLeftInState = GetTweenTimeLeft() + 0.100f; + m_fTimeLeftInState = GetTweenTimeLeft(); } void WheelBase::ChangeMusicUnlessLocked( int n ) @@ -533,6 +498,17 @@ void WheelBase::RebuildWheelItems( int iDist ) iLast = -iDist-1; } + Lua *L = LUA->Get(); + for( int i=0; i < (int) m_WheelBaseItems.size(); i++ ) + { + m_WheelBaseItems[i]->PushContext(L); + lua_pushstring( L, "WheelIndex" ); + lua_pushnumber( L, i ); + lua_settable( L, -3 ); + lua_pop( L, 1 ); + } + LUA->Release( L ); + for( int i=iFirst; i <= iLast; i++ ) { int iIndex = iFirstVisibleIndex + i; diff --git a/stepmania/src/WheelBase.h b/stepmania/src/WheelBase.h index ac0dd39fb7..6acb30f23e 100644 --- a/stepmania/src/WheelBase.h +++ b/stepmania/src/WheelBase.h @@ -53,6 +53,7 @@ protected: virtual WheelItemBase *MakeItem() = 0; virtual void UpdateSwitch(); virtual bool MoveSpecific(int n); + void SetPositions(); int FirstVisibleIndex(); @@ -79,9 +80,6 @@ protected: STATE_SELECTING, STATE_FLYING_OFF_BEFORE_NEXT_SORT, STATE_FLYING_ON_AFTER_NEXT_SORT, - STATE_TWEENING_ON_SCREEN, - STATE_TWEENING_OFF_SCREEN, - STATE_WAITING_OFF_SCREEN, STATE_ROULETTE_SPINNING, STATE_ROULETTE_SLOWING_DOWN, STATE_RANDOM_SPINNING,