diff --git a/stepmania/TODO.andy b/stepmania/TODO.andy index ac48286810..61a6ca63a9 100644 --- a/stepmania/TODO.andy +++ b/stepmania/TODO.andy @@ -8,7 +8,7 @@ H denotes task on hold. TODO As of: 11:42:PM 05/09/02 -Fix the Bug on ScreenStage that reports the current stage number for final stage as being 00 in Ez2 +* Fix the Bug on ScreenStage that reports the current stage number for final stage as being 00 in Ez2 TODO As of: 01:29:AM 04/09/02 diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index e1632c618c..9f472ea925 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -2,6 +2,7 @@ // - ScreenCaution // - ScreenEz2SelectPlayer // - ScreenEz2SelectStyle +// - ScreenEz2SelectMusic // - ScreenHowToPlay // - ScreenSelectCourse // - ScreenSelectDifficulty @@ -210,6 +211,33 @@ HelpText=! or " change music Hold ! and " then press START to change sort::# TimerSeconds=60 ScoreConnectedToMusicWheel=1 +[ScreenEz2SelectMusic] +BannerX=320 // central banner +BannerY=240 // central banner +BannerWidth=200 +BannerHeight=200 +ScoreFrameP1X=80 +ScoreFrameP1Y=60 +ScoreFrameP2X=560 +ScoreFrameP2Y=60 +ScoreP1X=80 +ScoreP1Y=60 +ScoreP2X=560 +ScoreP2Y=60 +MeterFrameP1X=82 +MeterFrameP1Y=432 +MeterFrameP2X=238 +MeterFrameP2Y=432 +MeterP1X=88 +MeterP1Y=432 +MeterP2X=228 +MeterP2Y=432 +WheelX=999 // hide +WheelY=999 // hide +HelpText=! or " change music Hold ! and " then press START to change sort::## easier difficulty $$ harder difficulty::#$#$ to change sort +TimerSeconds=60 +ScoreConnectedToMusicWheel=1 + [ScreenSelectCourse] ExplanationX=132 ExplanationY=68 diff --git a/stepmania/src/ScreenEz2SelectMusic.cpp b/stepmania/src/ScreenEz2SelectMusic.cpp new file mode 100644 index 0000000000..92d836150f --- /dev/null +++ b/stepmania/src/ScreenEz2SelectMusic.cpp @@ -0,0 +1,735 @@ +#include "stdafx.h" +/* +----------------------------------------------------------------------------- + Class: ScreenEz2SelectMusic + + Desc: See header. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford + Andrew Livy +----------------------------------------------------------------------------- +*/ + + +#include "ScreenEz2SelectMusic.h" +#include "ScreenManager.h" +#include "PrefsManager.h" +#include "SongManager.h" +#include "GameManager.h" +#include "RageMusic.h" +#include "GameConstantsAndTypes.h" +#include "PrefsManager.h" +#include "RageLog.h" +#include "InputMapper.h" +#include "InputQueue.h" +#include "AnnouncerManager.h" +#include "InputMapper.h" +#include "GameState.h" +#include "CodeDetector.h" + + +#define BANNER_X THEME->GetMetricF("ScreenEz2SelectMusic","BannerX") +#define BANNER_Y THEME->GetMetricF("ScreenEz2SelectMusic","BannerY") +#define BANNER_WIDTH THEME->GetMetricF("ScreenEz2SelectMusic","BannerWidth") +#define BANNER_HEIGHT THEME->GetMetricF("ScreenEz2SelectMusic","BannerHeight") +#define STAGE_X THEME->GetMetricF("ScreenEz2SelectMusic","StageX") +#define STAGE_Y THEME->GetMetricF("ScreenEz2SelectMusic","StageY") +#define STAGE_ZOOM THEME->GetMetricF("ScreenEz2SelectMusic","StageZoom") +#define SCORE_FRAME_X( p ) THEME->GetMetricF("ScreenEz2SelectMusic",ssprintf("ScoreFrameP%dX",p+1)) +#define SCORE_FRAME_Y( p ) THEME->GetMetricF("ScreenEz2SelectMusic",ssprintf("ScoreFrameP%dY",p+1)) +#define SCORE_X( p ) THEME->GetMetricF("ScreenEz2SelectMusic",ssprintf("ScoreP%dX",p+1)) +#define SCORE_Y( p ) THEME->GetMetricF("ScreenEz2SelectMusic",ssprintf("ScoreP%dY",p+1)) +#define METER_FRAME_X( p ) THEME->GetMetricF("ScreenEz2SelectMusic",ssprintf("MeterFrameP%dX",p+1)) +#define METER_FRAME_Y( p ) THEME->GetMetricF("ScreenEz2SelectMusic",ssprintf("MeterFrameP%dY",p+1)) +#define METER_X( p ) THEME->GetMetricF("ScreenEz2SelectMusic",ssprintf("MeterP%dX",p+1)) +#define METER_Y( p ) THEME->GetMetricF("ScreenEz2SelectMusic",ssprintf("MeterP%dY",p+1)) +#define WHEEL_X THEME->GetMetricF("ScreenEz2SelectMusic","WheelX") +#define WHEEL_Y THEME->GetMetricF("ScreenEz2SelectMusic","WheelY") +#define HELP_TEXT THEME->GetMetric("ScreenEz2SelectMusic","HelpText") +#define TIMER_SECONDS THEME->GetMetricI("ScreenEz2SelectMusic","TimerSeconds") +#define SCORE_CONNECTED_TO_MUSIC_WHEEL THEME->GetMetricB("ScreenEz2SelectMusic","ScoreConnectedToMusicWheel") + +const float TWEEN_TIME = 0.5f; + +const float SIDE_BANNER_ANGLE = 600.0f; +const float SIDE_BANNER_ZOOM = 340.0f; +const float SIDE_BANNER_SPACING = 150.0f; + +const ScreenMessage SM_GoToPrevScreen = ScreenMessage(SM_User+1); +const ScreenMessage SM_GoToNextScreen = ScreenMessage(SM_User+2); + + + +ScreenEz2SelectMusic::ScreenEz2SelectMusic() +{ + LOG->Trace( "ScreenEz2SelectMusic::ScreenEz2SelectMusic()" ); + + + CodeDetector::RefreshCacheItems(); + + + int p; + + m_Menu.Load( + THEME->GetPathTo("Graphics","select music background"), + THEME->GetPathTo("Graphics","select music top edge"), + HELP_TEXT, true, true, TIMER_SECONDS + ); + this->AddChild( &m_Menu ); + + // these guys get loaded SetSong and TweenToSong + m_Banner.SetXY( BANNER_X, BANNER_Y ); + m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); + this->AddChild( &m_Banner ); + + // these guys get loaded SetSong and TweenToSong + m_BannerNext.SetXY( BANNER_X+220, BANNER_Y ); + m_BannerNext.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); +// this->AddChild( &m_BannerNext ); + + // these guys get loaded SetSong and TweenToSong + m_BannerPrevious.SetXY( BANNER_X-220, BANNER_Y ); + m_BannerPrevious.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); +// this->AddChild( &m_BannerPrevious ); + + m_MusicWheel.SetXY( WHEEL_X, WHEEL_Y ); + this->AddChild( &m_MusicWheel ); + + for( p=0; pIsPlayerEnabled((PlayerNumber)p) ) + continue; // skip + + m_sprHighScoreFrame[p].Load( THEME->GetPathTo("Graphics","select music score frame") ); + m_sprHighScoreFrame[p].StopAnimating(); + m_sprHighScoreFrame[p].SetState( p ); + m_sprHighScoreFrame[p].SetXY( SCORE_X(p), SCORE_Y(p) ); + this->AddChild( &m_sprHighScoreFrame[p] ); + + m_HighScore[p].SetXY( SCORE_X(p), SCORE_Y(p) ); + m_HighScore[p].SetZoom( 0.6f ); + m_HighScore[p].SetDiffuse( PlayerToColor(p) ); + this->AddChild( &m_HighScore[p] ); + } + + + m_textHoldForOptions.LoadFromFont( THEME->GetPathTo("Fonts","select music hold") ); + m_textHoldForOptions.SetXY( CENTER_X, CENTER_Y ); + m_textHoldForOptions.SetText( "press START again for options" ); + m_textHoldForOptions.SetZoom( 1 ); + m_textHoldForOptions.SetZoomY( 0 ); + m_textHoldForOptions.SetDiffuse( D3DXCOLOR(1,1,1,0) ); + m_textHoldForOptions.SetZ( -2 ); + this->AddChild( &m_textHoldForOptions ); + + + m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundChangeNotes.Load( THEME->GetPathTo("Sounds","select music change notes") ); + m_soundOptionsChange.Load( THEME->GetPathTo("Sounds","select music change options") ); + m_soundLocked.Load( THEME->GetPathTo("Sounds","select music wheel locked") ); + + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo("select music intro") ); + + m_bMadeChoice = false; + m_bGoToOptions = false; + + UpdateOptionsDisplays(); + + AfterMusicChange(); + TweenOnScreen(); + m_Menu.TweenOnScreenFromMenu( SM_None ); +} + + +ScreenEz2SelectMusic::~ScreenEz2SelectMusic() +{ + LOG->Trace( "ScreenEz2SelectMusic::~ScreenEz2SelectMusic()" ); + +} + +void ScreenEz2SelectMusic::DrawPrimitives() +{ + + m_Menu.DrawBottomLayer(); + Screen::DrawPrimitives(); + m_Menu.DrawTopLayer(); + + D3DXMATRIX matOldView, matOldProj; + + // save old view and projection + DISPLAY->GetViewTransform( &matOldView ); + DISPLAY->GetProjectionTransform( &matOldProj ); + + // construct view and project matrix + + + D3DXMATRIX matNewView; + + D3DXMatrixLookAtLH( + &matNewView, + &D3DXVECTOR3( CENTER_X+SIDE_BANNER_ANGLE, CENTER_Y, SIDE_BANNER_ZOOM ), + &D3DXVECTOR3( CENTER_X-SIDE_BANNER_SPACING, CENTER_Y, 0.0f ), + &D3DXVECTOR3( 0.0f, -1.0f, 0.0f ) + ); + + DISPLAY->SetViewTransform( &matNewView ); + + D3DXMATRIX matNewProj; + D3DXMatrixPerspectiveFovLH( &matNewProj, D3DX_PI/4.0f, SCREEN_WIDTH/(float)SCREEN_HEIGHT, 0.0f, 1000.0f ); + DISPLAY->SetProjectionTransform( &matNewProj ); +// } + + m_BannerNext.Draw(); + + D3DXMatrixLookAtLH( + &matNewView, + &D3DXVECTOR3( CENTER_X-SIDE_BANNER_ANGLE, CENTER_Y, SIDE_BANNER_ZOOM ), + &D3DXVECTOR3( CENTER_X+SIDE_BANNER_SPACING, CENTER_Y, 0.0f ), + &D3DXVECTOR3( 0.0f, -1.0f, 0.0f ) + ); + + DISPLAY->SetViewTransform( &matNewView ); + + D3DXMatrixPerspectiveFovLH( &matNewProj, D3DX_PI/4.0f, SCREEN_WIDTH/(float)SCREEN_HEIGHT, 0.0f, 1000.0f ); + DISPLAY->SetProjectionTransform( &matNewProj ); + + m_BannerPrevious.Draw(); + + // restore old view and projection + DISPLAY->SetViewTransform( &matOldView ); + DISPLAY->SetProjectionTransform( &matOldProj ); + + +} + +void ScreenEz2SelectMusic::TweenOnScreen() +{ + int p; + + for( p=0; p apActorsInScore; + for( p=0; pBeginTweening( TWEEN_TIME, TWEEN_BIAS_END ); + apActorsInScore[i]->SetTweenX( SCORE_CONNECTED_TO_MUSIC_WHEEL ? apActorsInScore[i]->GetX()+400 : apActorsInScore[i]->GetX()-400 ); + } + + m_MusicWheel.TweenOffScreen(); +} + +void ScreenEz2SelectMusic::TweenScoreOnAndOffAfterChangeSort() +{ + if( !SCORE_CONNECTED_TO_MUSIC_WHEEL ) + return; // do nothing + + CArray apActorsInScore; + for( int p=0; pStopTweening(); + + float fOriginalX = apActorsInScore[i]->GetX(); + apActorsInScore[i]->BeginTweening( TWEEN_TIME, TWEEN_BIAS_END ); // tween off screen + apActorsInScore[i]->SetTweenX( fOriginalX+400 ); + + apActorsInScore[i]->BeginTweening( 0.5f ); // sleep + + apActorsInScore[i]->BeginTweening( 1, TWEEN_BIAS_BEGIN ); // tween back on screen + apActorsInScore[i]->SetTweenX( fOriginalX ); + } +} + +void ScreenEz2SelectMusic::Update( float fDeltaTime ) +{ + Screen::Update( fDeltaTime ); +} + +void ScreenEz2SelectMusic::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) +{ + LOG->Trace( "ScreenEz2SelectMusic::Input()" ); + + if( type == IET_RELEASE ) return; // don't care + + if( m_Menu.IsClosing() ) return; // ignore + + if( !GameI.IsValid() ) return; // don't care + + if( m_bMadeChoice && !m_bGoToOptions && MenuI.IsValid() && MenuI.button == MENU_BUTTON_START && !GAMESTATE->IsExtraStage() && !GAMESTATE->IsExtraStage2() ) + { + m_bGoToOptions = true; + m_textHoldForOptions.SetText( "Entering Options..." ); + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","menu start") ); + return; + } + + if( m_bMadeChoice ) + return; + + PlayerNumber pn = GAMESTATE->GetCurrentStyleDef()->ControllerToPlayerNumber( GameI.controller ); + + if( CodeDetector::EnteredEasierDifficulty(GameI.controller) ) + { + if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) + m_soundLocked.Play(); + else + EasierDifficulty( pn ); + return; + } + if( CodeDetector::EnteredHarderDifficulty(GameI.controller) ) + { + if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) + m_soundLocked.Play(); + else + HarderDifficulty( pn ); + return; + } + if( CodeDetector::EnteredNextSort(GameI.controller) ) + { + if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) + m_soundLocked.Play(); + else + if( m_MusicWheel.NextSort() ) + { + MUSIC->Stop(); + + m_MusicSortDisplay.BeginTweening( 0.3f ); + m_MusicSortDisplay.SetTweenDiffuse( D3DXCOLOR(1,1,1,0) ); + + TweenScoreOnAndOffAfterChangeSort(); + } + return; + } + if( CodeDetector::DetectAndAdjustOptions(GameI.controller) ) + { + m_soundOptionsChange.Play(); + UpdateOptionsDisplays(); + return; + } + + Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler +} + + +void ScreenEz2SelectMusic::EasierDifficulty( PlayerNumber pn ) +{ + LOG->Trace( "ScreenEz2SelectMusic::EasierDifficulty( %d )", pn ); + + if( !GAMESTATE->IsPlayerEnabled(pn) ) + return; + if( m_arrayNotes.GetSize() == 0 ) + return; + if( m_iSelection[pn] == 0 ) + return; + + m_iSelection[pn]--; + // the user explicity switched difficulties. Update the preferred difficulty + GAMESTATE->m_PreferredDifficultyClass[pn] = m_arrayNotes[ m_iSelection[pn] ]->m_DifficultyClass; + + m_soundChangeNotes.Play(); + + AfterNotesChange( pn ); +} + +void ScreenEz2SelectMusic::HarderDifficulty( PlayerNumber pn ) +{ + LOG->Trace( "ScreenEz2SelectMusic::HarderDifficulty( %d )", pn ); + + if( !GAMESTATE->IsPlayerEnabled(pn) ) + return; + if( m_arrayNotes.GetSize() == 0 ) + return; + if( m_iSelection[pn] == m_arrayNotes.GetSize()-1 ) + return; + + m_iSelection[pn]++; + // the user explicity switched difficulties. Update the preferred difficulty + GAMESTATE->m_PreferredDifficultyClass[pn] = m_arrayNotes[ m_iSelection[pn] ]->m_DifficultyClass; + + m_soundChangeNotes.Play(); + + AfterNotesChange( pn ); +} + + +void ScreenEz2SelectMusic::HandleScreenMessage( const ScreenMessage SM ) +{ + Screen::HandleScreenMessage( SM ); + + switch( SM ) + { + case SM_MenuTimer: + if( m_MusicWheel.IsRouletting() ) + { + MenuStart(PLAYER_INVALID); + m_Menu.SetTimer( 15 ); + } + else if( m_MusicWheel.GetSelectedType() != TYPE_SONG ) + { + m_MusicWheel.StartRoulette(); + m_Menu.SetTimer( 15 ); + } + else + { + MenuStart(PLAYER_INVALID); + } + break; + case SM_GoToPrevScreen: + SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); + break; + case SM_GoToNextScreen: + if( m_bGoToOptions ) + { + SCREENMAN->SetNewScreen( "ScreenPlayerOptions" ); + } + else + { + MUSIC->Stop(); + SCREENMAN->SetNewScreen( "ScreenStage" ); + } + break; + case SM_PlaySongSample: + PlayMusicSample(); + break; + case SM_SongChanged: + AfterMusicChange(); + break; + case SM_SortOrderChanged: + SortOrderChanged(); + break; + } +} + +void ScreenEz2SelectMusic::MenuLeft( PlayerNumber pn, const InputEventType type ) +{ + if( type >= IET_SLOW_REPEAT && INPUTMAPPER->IsButtonDown( MenuInput(pn, MENU_BUTTON_RIGHT) ) ) + return; // ignore + + if( ! m_MusicWheel.WheelIsLocked() ) + MUSIC->Stop(); + + m_MusicWheel.PrevMusic(); +} + + +void ScreenEz2SelectMusic::MenuRight( PlayerNumber pn, const InputEventType type ) +{ + if( type >= IET_SLOW_REPEAT && INPUTMAPPER->IsButtonDown( MenuInput(pn, MENU_BUTTON_LEFT) ) ) + return; // ignore + + if( ! m_MusicWheel.WheelIsLocked() ) + MUSIC->Stop(); + + m_MusicWheel.NextMusic(); +} + +void ScreenEz2SelectMusic::MenuStart( PlayerNumber pn ) +{ + if( pn != PLAYER_INVALID && + INPUTMAPPER->IsButtonDown( MenuInput(pn, MENU_BUTTON_LEFT) ) && + INPUTMAPPER->IsButtonDown( MenuInput(pn, MENU_BUTTON_RIGHT) ) ) + { + if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) + m_soundLocked.Play(); + else + { + if( m_MusicWheel.NextSort() ) + { + MUSIC->Stop(); + + m_MusicSortDisplay.BeginTweening( 0.3f ); + m_MusicSortDisplay.SetTweenDiffuse( D3DXCOLOR(1,1,1,0) ); + + TweenScoreOnAndOffAfterChangeSort(); + } + } + return; + } + + + // this needs to check whether valid Notes are selected! + bool bResult = m_MusicWheel.Select(); + + if( !bResult ) + { + /* why do this? breaks tabs and roulette -glenn */ +// if( pn != PLAYER_INVALID ) +// this->SendScreenMessage( SM_MenuTimer, 1 ); // re-throw a timer message + } + else // if !bResult + { + // a song was selected + switch( m_MusicWheel.GetSelectedType() ) + { + case TYPE_SONG: + { + if( !m_MusicWheel.GetSelectedSong()->HasMusic() ) + { + /* TODO: gray these out. + * + * XXX: also, make sure they're not selected by roulette */ + SCREENMAN->Prompt( SM_None, "ERROR:\n \nThis song does not have a music file\n and cannot be played." ); + return; + } + + bool bIsNew = m_MusicWheel.GetSelectedSong()->IsNew(); + bool bIsHard = false; + for( int p=0; pIsPlayerEnabled( (PlayerNumber)p ) ) + continue; // skip + if( GAMESTATE->m_pCurNotes[p] && GAMESTATE->m_pCurNotes[p]->m_iMeter >= 9 ) + bIsHard = true; + } + + if( bIsNew ) + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo("select music comment new") ); + else if( bIsHard ) + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo("select music comment hard") ); + else + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo("select music comment general") ); + + + TweenOffScreen(); + + m_bMadeChoice = true; + + m_soundSelect.Play(); + + if( !GAMESTATE->IsExtraStage() && !GAMESTATE->IsExtraStage2() ) + { + // show "hold START for options" + m_textHoldForOptions.SetDiffuse( D3DXCOLOR(1,1,1,0) ); + m_textHoldForOptions.BeginTweening( 0.25f ); // fade in + m_textHoldForOptions.SetTweenZoomY( 1 ); + m_textHoldForOptions.SetTweenDiffuse( D3DXCOLOR(1,1,1,1) ); + m_textHoldForOptions.BeginTweening( 2.0f ); // sleep + m_textHoldForOptions.BeginTweening( 0.25f ); // fade out + m_textHoldForOptions.SetTweenDiffuse( D3DXCOLOR(1,1,1,0) ); + m_textHoldForOptions.SetTweenZoomY( 0 ); + } + + m_Menu.TweenOffScreenToBlack( SM_None, false ); + + m_Menu.StopTimer(); + + this->SendScreenMessage( SM_GoToNextScreen, 2.5f ); + } + break; + case TYPE_SECTION: + + break; + case TYPE_ROULETTE: + + break; + } + } + +} + + +void ScreenEz2SelectMusic::MenuBack( PlayerNumber pn ) +{ + MUSIC->Stop(); + + m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); +} + +void ScreenEz2SelectMusic::AfterNotesChange( PlayerNumber pn ) +{ + if( !GAMESTATE->IsPlayerEnabled(pn) ) + return; + + m_iSelection[pn] = clamp( m_iSelection[pn], 0, m_arrayNotes.GetSize()-1 ); // bounds clamping + + Notes* pNotes = m_arrayNotes.GetSize()>0 ? m_arrayNotes[m_iSelection[pn]] : NULL; + + GAMESTATE->m_pCurNotes[pn] = pNotes; + +// m_BPMDisplay.SetZoomY( 0 ); +// m_BPMDisplay.BeginTweening( 0.2f ); +// m_BPMDisplay.SetTweenZoomY( 1.2f ); + + DifficultyClass dc = GAMESTATE->m_PreferredDifficultyClass[pn]; + Song* pSong = GAMESTATE->m_pCurSong; + Notes* m_pNotes = GAMESTATE->m_pCurNotes[pn]; + + if( m_pNotes ) + m_HighScore[pn].SetScore( (float)m_pNotes->m_iTopScore ); + + m_DifficultyIcon[pn].SetFromNotes( pNotes ); + m_FootMeter[pn].SetFromNotes( pNotes ); + m_GrooveRadar.SetFromNotes( pn, pNotes ); + m_MusicWheel.NotesChanged( pn ); +} + +void ScreenEz2SelectMusic::AfterMusicChange() +{ + m_Menu.StallTimer(); + + Song* pSong = m_MusicWheel.GetSelectedSong(); + + GAMESTATE->m_pCurSong = pSong; + + m_arrayNotes.RemoveAll(); + + switch( m_MusicWheel.GetSelectedType() ) + { + case TYPE_SECTION: + { + CString sGroup = m_MusicWheel.GetSelectedSection(); + for( int p=0; pGetNotesThatMatch( GAMESTATE->GetCurrentStyleDef()->m_NotesType, m_arrayNotes ); + SortNotesArrayByDifficulty( m_arrayNotes ); + + m_Banner.SetFromSong( pSong ); + m_BannerNext.SetFromSong( pSong ); + m_BannerPrevious.SetFromSong( pSong ); + + float fMinBPM, fMaxBPM; + pSong->GetMinMaxBPM( fMinBPM, fMaxBPM ); + m_BPMDisplay.SetBPMRange( fMinBPM, fMaxBPM ); + + if( pSong->HasCDTitle() ) + m_sprCDTitle.Load( pSong->GetCDTitlePath() ); + else + m_sprCDTitle.Load( THEME->GetPathTo("Graphics","fallback cd title") ); + for( int p=0; pIsPlayerEnabled( PlayerNumber(p) ) ) + continue; + for( int i=0; im_DifficultyClass == GAMESTATE->m_PreferredDifficultyClass[p] ) + m_iSelection[p] = i; + + m_iSelection[p] = clamp( m_iSelection[p], 0, m_arrayNotes.GetSize() ) ; + } + } + break; + case TYPE_ROULETTE: + m_Banner.SetRoulette(); + m_BannerNext.SetRoulette(); + m_BannerPrevious.SetRoulette(); + m_BPMDisplay.SetBPMRange( 0, 0 ); + m_sprCDTitle.UnloadTexture(); + break; + } + + for( int p=0; pTrace( "ScreenSelectSong::PlaySONGample()" ); + + Song* pSong = m_MusicWheel.GetSelectedSong(); + if( pSong ) + { + MUSIC->Stop(); + MUSIC->Load( pSong->GetMusicPath() ); + MUSIC->Play( true, pSong->m_fMusicSampleStartSeconds, pSong->m_fMusicSampleLengthSeconds ); + } + else + MUSIC->LoadAndPlayIfNotAlready( THEME->GetPathTo("Sounds","select music music") ); +} + +void ScreenEz2SelectMusic::UpdateOptionsDisplays() +{ +// m_OptionIcons.Load( GAMESTATE->m_PlayerOptions, &GAMESTATE->m_SongOptions ); + +// m_PlayerOptionIcons.Refresh(); + +// for( int p=0; pIsPlayerEnabled(p) ) +// { +// CString s = GAMESTATE->m_PlayerOptions[p].GetString(); +// s.Replace( ", ", "\n" ); +// m_textPlayerOptions[p].SetText( s ); +// } +// } + +// CString s = GAMESTATE->m_SongOptions.GetString(); +// s.Replace( ", ", "\n" ); +// m_textSongOptions.SetText( s ); +} + +void ScreenEz2SelectMusic::SortOrderChanged() +{ + m_MusicSortDisplay.SetState( GAMESTATE->m_SongSortOrder ); + + // tween music sort on screen +// m_MusicSortDisplay.SetEffectGlowing(); + m_MusicSortDisplay.BeginTweening( 0.3f ); + m_MusicSortDisplay.SetTweenDiffuse( D3DXCOLOR(1,1,1,1) ); +} + diff --git a/stepmania/src/ScreenEz2SelectMusic.h b/stepmania/src/ScreenEz2SelectMusic.h new file mode 100644 index 0000000000..8deed739fc --- /dev/null +++ b/stepmania/src/ScreenEz2SelectMusic.h @@ -0,0 +1,96 @@ +/* +----------------------------------------------------------------------------- + Class: ScreenEz2SelectMusic + + Desc: The screen in PLAY_MODE_ARCADE where you choose a Song and Notes. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford + Andrew Livy +----------------------------------------------------------------------------- +*/ + +#include "Screen.h" +#include "Sprite.h" +#include "BitmapText.h" +#include "RandomStream.h" +#include "GameConstantsAndTypes.h" +#include "MusicWheel.h" +#include "Banner.h" +#include "FadingBanner.h" +#include "BPMDisplay.h" +#include "MenuElements.h" +#include "GrooveRadar.h" +#include "DifficultyIcon.h" +#include "FootMeter.h" +#include "OptionIconRow.h" + + +class ScreenEz2SelectMusic : public Screen +{ +public: + ScreenEz2SelectMusic(); + virtual ~ScreenEz2SelectMusic(); + + virtual void DrawPrimitives(); + + virtual void Update( float fDeltaTime ); + virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ); + virtual void HandleScreenMessage( const ScreenMessage SM ); + + virtual void MenuLeft( PlayerNumber pn, const InputEventType type ); + virtual void MenuRight( PlayerNumber pn, const InputEventType type ); + virtual void MenuStart( PlayerNumber pn ); + virtual void MenuBack( PlayerNumber pn ); + +protected: + void TweenOnScreen(); + void TweenOffScreen(); + void TweenScoreOnAndOffAfterChangeSort(); + + void EasierDifficulty( PlayerNumber pn ); + void HarderDifficulty( PlayerNumber pn ); + + void AfterNotesChange( PlayerNumber pn ); + void AfterMusicChange(); + void PlayMusicSample(); + void SortOrderChanged(); + + void UpdateOptionsDisplays(); + + CArray m_arrayNotes; + int m_iSelection[NUM_PLAYERS]; + + MenuElements m_Menu; + + Sprite m_sprBannerFrame; + + FadingBanner m_Banner; + FadingBanner m_BannerNext; + FadingBanner m_BannerPrevious; + + BPMDisplay m_BPMDisplay; + BitmapText m_textStage; + Sprite m_sprCDTitle; + Sprite m_sprDifficultyFrame[NUM_PLAYERS]; + DifficultyIcon m_DifficultyIcon[NUM_PLAYERS]; + GrooveRadar m_GrooveRadar; +// BitmapText m_textPlayerOptions[NUM_PLAYERS]; + BitmapText m_textSongOptions; + OptionIconRow m_OptionIconRow[NUM_PLAYERS]; + Sprite m_sprMeterFrame[NUM_PLAYERS]; + FootMeter m_FootMeter[NUM_PLAYERS]; + MusicSortDisplay m_MusicSortDisplay; + Sprite m_sprHighScoreFrame[NUM_PLAYERS]; + ScoreDisplayNormal m_HighScore[NUM_PLAYERS]; + MusicWheel m_MusicWheel; + + bool m_bMadeChoice; + bool m_bGoToOptions; + BitmapText m_textHoldForOptions; + + RageSoundSample m_soundSelect; + RageSoundSample m_soundChangeNotes; + RageSoundSample m_soundOptionsChange; + RageSoundSample m_soundLocked; +}; diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index de0862cb1f..fb79c24a0a 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -202,6 +202,7 @@ void ScreenManager::Input( const DeviceInput& DeviceI, const InputEventType type #include "ScreenSongOptions.h" #include "ScreenStage.h" #include "ScreenTitleMenu.h" +#include "ScreenEz2SelectMusic.h" #include "ScreenPrompt.h" #include "ScreenTextEntry.h" @@ -235,6 +236,7 @@ Screen* ScreenManager::MakeNewScreen( CString sClassName ) else if( 0==stricmp(sClassName, "ScreenSongOptions") ) return new ScreenSongOptions; else if( 0==stricmp(sClassName, "ScreenStage") ) return new ScreenStage; else if( 0==stricmp(sClassName, "ScreenTitleMenu") ) return new ScreenTitleMenu; + else if( 0==stricmp(sClassName, "ScreenEz2SelectMusic") ) return new ScreenEz2SelectMusic; else throw RageException( "Invalid Screen class name '%s'", sClassName ); } diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index 7197339b5d..70d106a1a6 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -56,10 +56,10 @@ LINK32=link.exe # ADD LINK32 $(intdir)\verstub.obj /nologo /subsystem:windows /map /debug /machine:I386 # Begin Special Build Tool IntDir=.\../Release -TargetDir=\stepmania\stepmania +TargetDir=\Stepmania\stepmania TargetName=StepMania SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -92,10 +92,10 @@ LINK32=link.exe # SUBTRACT LINK32 /profile /incremental:no /nodefaultlib # Begin Special Build Tool IntDir=.\../Debug -TargetDir=\stepmania\stepmania +TargetDir=\Stepmania\stepmania TargetName=StepMania-debug SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -1053,6 +1053,14 @@ SOURCE=.\ScreenEvaluation.h # End Source File # Begin Source File +SOURCE=.\ScreenEz2SelectMusic.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScreenEz2SelectMusic.h +# End Source File +# Begin Source File + SOURCE=.\ScreenEz2SelectPlayer.cpp # End Source File # Begin Source File @@ -1069,14 +1077,6 @@ SOURCE=.\ScreenEz2SelectStyle.h # End Source File # Begin Source File -SOURCE=.\ScreenEz2Stage.cpp -# End Source File -# Begin Source File - -SOURCE=.\ScreenEz2Stage.h -# End Source File -# Begin Source File - SOURCE=.\ScreenGameOptions.cpp # End Source File # Begin Source File