diff --git a/stepmania/src/ActorFrame.cpp b/stepmania/src/ActorFrame.cpp index 77514bec0e..b9c5ebc435 100644 --- a/stepmania/src/ActorFrame.cpp +++ b/stepmania/src/ActorFrame.cpp @@ -128,3 +128,11 @@ void ActorFrame::SortByZ() // Preserve ordering of Actors with equal Z values. stable_sort( m_SubActors.begin(), m_SubActors.end(), CompareActorsByZDesc ); } + +void ActorFrame::DeleteAllChildren() +{ + for( unsigned i=0; i vActors, float fBaseX, float fBaseY, float fVelX, float fVelY, float fSpacingX, float fSpacingY ) +void ActorScroller::Load( float fScrollSecondsPerItem, float fSpacingX, float fSpacingY ) { - m_vActors = vActors; - m_vBase.x = fBaseX; - m_vBase.y = fBaseY; - m_vVelocity.x = fVelX; - m_vVelocity.y = fVelY; + ASSERT( fScrollSecondsPerItem > 0 ); + m_fScrollSecondsPerItem = fScrollSecondsPerItem; m_vSpacing.x = fSpacingX; m_vSpacing.y = fSpacingY; - - // adjust base - float t = 10000; // inf - if( m_vSpacing.x != 0 ) - t = min( t, m_vBase.x / fabsf(m_vSpacing.x) ); - if( m_vSpacing.y != 0 ) - t = min( t, m_vBase.y / fabsf(m_vSpacing.y) ); - m_vBase.x -= t * fabsf(m_vSpacing.x); - m_vBase.y -= t * fabsf(m_vSpacing.y); - if( m_vVelocity.x < 0 ) - m_vBase.x += SCREEN_WIDTH; - if( m_vVelocity.y < 0 ) - m_vBase.y += SCREEN_HEIGHT; - - // push off screen - if( m_vVelocity.x!=0 ) m_vBase.x += m_vSpacing.x/2; - if( m_vVelocity.y!=0 ) m_vBase.y += m_vSpacing.y/2; -} - -float ActorScroller::GetTotalSecsToScroll() -{ - float fMaxSecToScroll = 0; - if( m_vVelocity.x != 0 ) - { - float fSecToScroll = fabsf(m_vSpacing.x*(m_vActors.size()+1) + SCREEN_WIDTH) / fabsf(m_vVelocity.x); - fMaxSecToScroll = max( fMaxSecToScroll, fSecToScroll ); - } - if( m_vVelocity.y != 0 ) - { - float fSecToScroll = fabsf(m_vSpacing.y*(m_vActors.size()+1) + SCREEN_HEIGHT) / fabsf(m_vVelocity.y); - fMaxSecToScroll = max( fMaxSecToScroll, fSecToScroll ); - } - return fMaxSecToScroll; } void ActorScroller::Update( float fDeltaTime ) { - m_fSecsIntoScroll += fDeltaTime; + ActorFrame::Update( fDeltaTime ); - for( unsigned i=0; iSetXY( fX, fY ); - - m_vActors[i]->Update( fDeltaTime ); + pActor->SetXY( fX, fY ); } } - -void ActorScroller::DrawPrimitives() -{ - for( unsigned i=0; iDraw(); -} diff --git a/stepmania/src/ActorScroller.h b/stepmania/src/ActorScroller.h index 7723764b14..0054cef8b8 100644 --- a/stepmania/src/ActorScroller.h +++ b/stepmania/src/ActorScroller.h @@ -4,35 +4,33 @@ ----------------------------------------------------------------------------- Class: ActorScroller - Desc: A container for other actors. + Desc: An ActorFrame that moves its children. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Chris Danford ----------------------------------------------------------------------------- */ -#include "Actor.h" +#include "ActorFrame.h" -class ActorScroller : public Actor +class ActorScroller : public ActorFrame { public: ActorScroller(); - // owner's responsibility to delete vActors! - void Load( vector vActors, float fBaseX, float fBaseY, float fVelX, float fVelY, float fSpacingX, float fSpacingY ); + void Load( float fScrollSecondsPerItem, float fSpacingX, float fSpacingY ); - void Update( float fDelta ); - void DrawPrimitives(); + virtual void Update( float fDelta ); - float GetTotalSecsToScroll(); + void SetDestinationItem( int iItem ) { m_fDestinationItem = iItem; } + void SetCurrentAndDestinationItem( int iItem ) { m_fCurrentItem = m_fDestinationItem = iItem; } protected: - float m_fSecsIntoScroll; - RageVector2 m_vBase; - RageVector2 m_vVelocity; + float m_fCurrentItem; // usually between 0 and m_SubActors.size() + float m_fDestinationItem; + float m_fScrollSecondsPerItem; RageVector2 m_vSpacing; - vector m_vActors; }; diff --git a/stepmania/src/MenuTimer.cpp b/stepmania/src/MenuTimer.cpp index ad533f11fb..d6d4d152ca 100644 --- a/stepmania/src/MenuTimer.cpp +++ b/stepmania/src/MenuTimer.cpp @@ -94,11 +94,13 @@ void MenuTimer::Update( float fDeltaTime ) m_textDigit1.Command( WARNING_COMMAND(iNewDisplay) ); m_textDigit2.Command( WARNING_COMMAND(iNewDisplay) ); } - + if( iNewDisplay == 0 ) { Stop(); SCREENMAN->PostMessageToTopScreen( SM_MenuTimer, 0 ); + m_textDigit1.SetEffectNone(); + m_textDigit2.SetEffectNone(); } if( iNewDisplay <= WARNING_BEEP_START ) diff --git a/stepmania/src/ScreenAttract.h b/stepmania/src/ScreenAttract.h index bc0e36f14f..7a6ab374bc 100644 --- a/stepmania/src/ScreenAttract.h +++ b/stepmania/src/ScreenAttract.h @@ -31,10 +31,10 @@ public: protected: - BGAnimation m_Background; - Transition m_In; - Transition m_Out; - RandomSample m_soundStart; + BGAnimation m_Background; + Transition m_In; + Transition m_Out; + RandomSample m_soundStart; }; diff --git a/stepmania/src/ScreenCredits.cpp b/stepmania/src/ScreenCredits.cpp index ab117dc3b5..3e05a9191c 100644 --- a/stepmania/src/ScreenCredits.cpp +++ b/stepmania/src/ScreenCredits.cpp @@ -23,24 +23,18 @@ #include "BitmapText.h" -#define BACKGROUNDS_BASE_X THEME->GetMetricF("ScreenCredits","BackgroundsBaseX") -#define BACKGROUNDS_BASE_Y THEME->GetMetricF("ScreenCredits","BackgroundsBaseY") -#define BACKGROUNDS_VELOCITY_X THEME->GetMetricF("ScreenCredits","BackgroundsVelocityX") -#define BACKGROUNDS_VELOCITY_Y THEME->GetMetricF("ScreenCredits","BackgroundsVelocityY") -#define BACKGROUNDS_SPACING_X THEME->GetMetricF("ScreenCredits","BackgroundsSpacingX") -#define BACKGROUNDS_SPACING_Y THEME->GetMetricF("ScreenCredits","BackgroundsSpacingY") -#define BACKGROUNDS_WIDTH THEME->GetMetricF("ScreenCredits","BackgroundsWidth") -#define BACKGROUNDS_HEIGHT THEME->GetMetricF("ScreenCredits","BackgroundsHeight") -#define TEXTS_COLOR_INTRO THEME->GetMetricC("ScreenCredits","TextsColorIntro") -#define TEXTS_COLOR_HEADER THEME->GetMetricC("ScreenCredits","TextsColorHeader") -#define TEXTS_COLOR_NORMAL THEME->GetMetricC("ScreenCredits","TextsColorNormal") -#define TEXTS_ZOOM THEME->GetMetricF("ScreenCredits","TextsZoom") -#define TEXTS_BASE_X THEME->GetMetricF("ScreenCredits","TextsBaseX") -#define TEXTS_BASE_Y THEME->GetMetricF("ScreenCredits","TextsBaseY") -#define TEXTS_VELOCITY_X THEME->GetMetricF("ScreenCredits","TextsVelocityX") -#define TEXTS_VELOCITY_Y THEME->GetMetricF("ScreenCredits","TextsVelocityY") -#define TEXTS_SPACING_X THEME->GetMetricF("ScreenCredits","TextsSpacingX") -#define TEXTS_SPACING_Y THEME->GetMetricF("ScreenCredits","TextsSpacingY") +#define BACKGROUNDS_SPACING_X THEME->GetMetricF("ScreenCredits","BackgroundsSpacingX") +#define BACKGROUNDS_SPACING_Y THEME->GetMetricF("ScreenCredits","BackgroundsSpacingY") +#define BACKGROUNDS_SCROLL_SECONDS_PER_ITEM THEME->GetMetricF("ScreenCredits","BackgroundsScrollSecondsPerItem") +#define BACKGROUNDS_WIDTH THEME->GetMetricF("ScreenCredits","BackgroundsWidth") +#define BACKGROUNDS_HEIGHT THEME->GetMetricF("ScreenCredits","BackgroundsHeight") +#define TEXTS_COLOR_INTRO THEME->GetMetricC("ScreenCredits","TextsColorIntro") +#define TEXTS_COLOR_HEADER THEME->GetMetricC("ScreenCredits","TextsColorHeader") +#define TEXTS_COLOR_NORMAL THEME->GetMetricC("ScreenCredits","TextsColorNormal") +#define TEXTS_ZOOM THEME->GetMetricF("ScreenCredits","TextsZoom") +#define TEXTS_SPACING_X THEME->GetMetricF("ScreenCredits","TextsSpacingX") +#define TEXTS_SPACING_Y THEME->GetMetricF("ScreenCredits","TextsSpacingY") +#define TEXTS_SCROLL_SECONDS_PER_ITEM THEME->GetMetricF("ScreenCredits","TextsScrollSecondsPerItem") const int NUM_BACKGROUNDS = 20; @@ -60,7 +54,9 @@ static const CreditLine CREDIT_LINES[] = {0,"Lucas “v1ral” Tang"}, // "Who?" = "what is this person's real name", not "what did they do". // Who knows? Some people might not want to reveal their real name. - Friez. - // FYI: Several people have requested that their real names not be shown. -Chris + // Several people have requested that their real names not be shown. -Chris + // This isn't a good place to keep a master list of contributors because + // it's not a very complete list. -Chris {0,"SPiGuMuS"}, // who? {0,"Visage"}, // who? makes para para theme graphics for me, wants to do BM and IIDX graphics too. - Friez {0,"Ryan “DJ McFox” McKanna"}, @@ -171,7 +167,6 @@ static const CreditLine CREDIT_LINES[] = {1,"Join the StepMania team"}, {1,"and help us out!"}, }; -const unsigned NUM_CREDIT_LINES = sizeof(CREDIT_LINES) / sizeof(CreditLine); ScreenCredits::ScreenCredits( CString sName ) : ScreenAttract( sName ) @@ -180,50 +175,54 @@ ScreenCredits::ScreenCredits( CString sName ) : ScreenAttract( sName ) SONGMAN->GetSongs( arraySongs ); SortSongPointerArrayByTitle( arraySongs ); - int i; - for( i=0; iHasBackground() ) - break; - } - - Sprite* pBackground = new Sprite; - pBackground->LoadBG( pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathToG("Common fallback background") ); - pBackground->ScaleToClipped( BACKGROUNDS_WIDTH, BACKGROUNDS_HEIGHT ); - m_vBackgrounds.push_back( pBackground ); - - Sprite* pFrame = new Sprite; - pFrame->Load( THEME->GetPathToG("ScreenCredits background frame") ); - m_vFrames.push_back( pFrame ); - } - m_ScrollerBackgrounds.Load( m_vBackgrounds, BACKGROUNDS_BASE_X, BACKGROUNDS_BASE_Y, BACKGROUNDS_VELOCITY_X, BACKGROUNDS_VELOCITY_Y, BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y ); + m_ScrollerBackgrounds.Load( BACKGROUNDS_SCROLL_SECONDS_PER_ITEM, BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y ); this->AddChild( &m_ScrollerBackgrounds ); - m_ScrollerFrames.Load( m_vFrames, BACKGROUNDS_BASE_X, BACKGROUNDS_BASE_Y, BACKGROUNDS_VELOCITY_X, BACKGROUNDS_VELOCITY_Y, BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y ); + m_ScrollerFrames.Load( BACKGROUNDS_SCROLL_SECONDS_PER_ITEM, BACKGROUNDS_SPACING_X, BACKGROUNDS_SPACING_Y ); this->AddChild( &m_ScrollerFrames ); - - for( i=0; iLoadFromFont( THEME->GetPathToF("ScreenCredits titles") ); - pText->SetText( CREDIT_LINES[i].text ); - switch( CREDIT_LINES[i].colorIndex ) + for( int i=0; iSetDiffuse( TEXTS_COLOR_INTRO ); break; - case 2: pText->SetDiffuse( TEXTS_COLOR_HEADER ); break; - case 0: pText->SetDiffuse( TEXTS_COLOR_NORMAL ); break; - default: ASSERT(0); + Song* pSong = NULL; + for( int j=0; j<50; j++ ) + { + pSong = arraySongs[ rand()%arraySongs.size() ]; + if( pSong->HasBackground() ) + break; + } + + Sprite* pBackground = new Sprite; + pBackground->LoadBG( pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathToG("Common fallback background") ); + pBackground->ScaleToClipped( BACKGROUNDS_WIDTH, BACKGROUNDS_HEIGHT ); + m_ScrollerBackgrounds.AddChild( pBackground ); + + Sprite* pFrame = new Sprite; + pFrame->Load( THEME->GetPathToG("ScreenCredits background frame") ); + m_ScrollerFrames.AddChild( pFrame ); } - pText->SetZoom( TEXTS_ZOOM ); - m_vTexts.push_back( pText ); } - m_ScrollerTexts.Load( m_vTexts, TEXTS_BASE_X, TEXTS_BASE_Y, TEXTS_VELOCITY_X, TEXTS_VELOCITY_Y, TEXTS_SPACING_X, TEXTS_SPACING_Y ); + + m_ScrollerTexts.Load( TEXTS_SCROLL_SECONDS_PER_ITEM, TEXTS_SPACING_X, TEXTS_SPACING_Y ); this->AddChild( &m_ScrollerTexts ); + { + for( int i=0; iLoadFromFont( THEME->GetPathToF("ScreenCredits titles") ); + pText->SetText( CREDIT_LINES[i].text ); + switch( CREDIT_LINES[i].colorIndex ) + { + case 1: pText->SetDiffuse( TEXTS_COLOR_INTRO ); break; + case 2: pText->SetDiffuse( TEXTS_COLOR_HEADER ); break; + case 0: pText->SetDiffuse( TEXTS_COLOR_NORMAL ); break; + default: ASSERT(0); + } + pText->SetZoom( TEXTS_ZOOM ); + m_ScrollerTexts.AddChild( pText ); + } + } + m_Overlay.LoadFromAniDir( THEME->GetPathToB("ScreenCredits overlay") ); this->AddChild( &m_Overlay ); @@ -231,26 +230,16 @@ ScreenCredits::ScreenCredits( CString sName ) : ScreenAttract( sName ) this->MoveToTail( &m_Out ); // put it in the back so it covers up the stuff we just added this->ClearMessageQueue( SM_BeginFadingOut ); // ignore ScreenAttract's SecsToShow - this->PostScreenMessage( SM_BeginFadingOut, m_ScrollerTexts.GetTotalSecsToScroll() ); + this->PostScreenMessage( SM_BeginFadingOut, m_Background.GetLengthSeconds() ); SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo("credits") ); } ScreenCredits::~ScreenCredits() { - unsigned i; - - for( i=0; i m_vBackgrounds; - ActorScroller m_ScrollerFrames; - vector m_vFrames; - ActorScroller m_ScrollerTexts; - vector m_vTexts; BGAnimation m_Overlay; }; diff --git a/stepmania/src/ScreenSelectMaster.cpp b/stepmania/src/ScreenSelectMaster.cpp index 8c1e8aca30..daedbee536 100644 --- a/stepmania/src/ScreenSelectMaster.cpp +++ b/stepmania/src/ScreenSelectMaster.cpp @@ -33,6 +33,10 @@ #define POST_SWITCH_PAGE_SECONDS THEME->GetMetricF(m_sName,"PostSwitchPageSeconds") #define EXTRA_SLEEP_AFTER_TWEEN_OFF_SECONDS THEME->GetMetricF(m_sName,"ExtraSleepAfterTweenOffSeconds") #define OPTION_ORDER( dir ) THEME->GetMetric (m_sName,"OptionOrder"+CString(dir)) +#define SHOW_SCROLLER THEME->GetMetricB(m_sName,"ShowScroller") +#define SCROLLER_SECONDS_PER_ITEM THEME->GetMetricF(m_sName,"ScrollerSecondsPerItem") +#define SCROLLER_SPACING_X THEME->GetMetricF(m_sName,"ScrollerSpacingX") +#define SCROLLER_SPACING_Y THEME->GetMetricF(m_sName,"ScrollerSpacingY") /* OptionOrderLeft=0:1,1:2,2:3,3:4 */ const char *ScreenSelectMaster::dirs[NUM_DIRS] = @@ -52,6 +56,7 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl m_bChosen[p] = false; } + // init cursor if( SHARED_PREVIEW_AND_CURSOR ) { for( i=0; iAddChild( &m_Scroller[0] ); + + for( unsigned c=0; cGetPathToG(sFName) ); + m_sprScroll[c][0]->SetName( ssprintf("Scroll") ); + m_Scroller[0].AddChild( m_sprScroll[c][0] ); + } + } + else + { + for( p=0; pIsPlayerEnabled(p) ) + continue; // skip + + m_Scroller[p].Load( SCROLLER_SECONDS_PER_ITEM, SCROLLER_SPACING_X, SCROLLER_SPACING_Y ); + m_Scroller[p].SetName( ssprintf("ScrollerP%d",p+1) ); + this->AddChild( &m_Scroller[p] ); + + for( unsigned c=0; cGetPathToG(sFName) ); + m_sprScroll[c][p]->SetName( ssprintf("ScrollP%d",p+1) ); + m_Scroller[p].AddChild( m_sprScroll[c][p] ); + } + } + } + } + for( unsigned c=0; cAddChild( m_sprIcon[i][c] ); } + // init preview if( SHARED_PREVIEW_AND_CURSOR ) { for( i=0; iIsPlayerEnabled(p) ) + continue; // skip + for( i=0; iIsPlayerEnabled(p) ) - continue; // skip CString sFName = ssprintf("%s Preview Part%d Choice%d P%d", m_sName.c_str(),i+1,c+1,p+1); m_sprPreview[i][c][p].Load( THEME->GetPathToG(sFName) ); m_sprPreview[i][c][p]->SetName( ssprintf("PreviewPart%dP%d",i+1,p+1) ); @@ -117,6 +167,7 @@ ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sCl } } + for( int page=0; pageGetPathToS( "Common start") ); m_soundDifficult.Load( ANNOUNCER->GetPathTo("select difficulty challenge") ); + // init m_Next order info for( int dir = 0; dir < NUM_DIRS; ++dir ) { const CString dirname = dirs[dir]; @@ -370,6 +422,7 @@ bool ScreenSelectMaster::ChangePage( int iNewChoice ) // XXX: only play this once (I thought we already did that?) // DDR plays it on every change to page 2. -Chris /* That sounds ugly if you go back and forth quickly. -g */ + // DDR locks input while it's scrolling. Should we do the same? -Chris m_soundDifficult.Stop(); m_soundDifficult.PlayRandom(); } @@ -444,8 +497,24 @@ bool ScreenSelectMaster::ChangeSelection( PlayerNumber pn, int iNewChoice ) m_sprCursor[i][p].SetXY( GetCursorX((PlayerNumber)p,i), GetCursorY((PlayerNumber)p,i) ); } } + + if( SHOW_SCROLLER ) + { + if( SHARED_PREVIEW_AND_CURSOR ) + m_Scroller[0].SetDestinationItem( iNewChoice ); + else + m_Scroller[p].SetDestinationItem( iNewChoice ); + + if( SHARED_PREVIEW_AND_CURSOR ) + for( unsigned c=0; cIsPlayerEnabled(p) ) + { + m_Scroller[p].SetCurrentAndDestinationItem( m_iChoice[p] ); + fSecs = max( fSecs, SET_XY_AND_ON_COMMAND( m_Scroller[p] ) ); + for( unsigned c=0; c