2002-01-16 10:01:32 +00:00
|
|
|
#include "stdafx.h"
|
|
|
|
|
/*
|
|
|
|
|
-----------------------------------------------------------------------------
|
2002-05-01 19:14:55 +00:00
|
|
|
Class: MusicWheel
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-01 19:14:55 +00:00
|
|
|
Desc: See header.
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
|
2002-05-01 19:14:55 +00:00
|
|
|
Chris Danford
|
2002-01-16 10:01:32 +00:00
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "MusicWheel.h"
|
|
|
|
|
#include "RageUtil.h"
|
2002-02-28 19:40:40 +00:00
|
|
|
#include "SongManager.h"
|
2002-03-19 07:09:49 +00:00
|
|
|
#include "GameManager.h"
|
2002-01-16 10:01:32 +00:00
|
|
|
#include "ThemeManager.h"
|
|
|
|
|
#include "RageMusic.h"
|
2002-05-19 01:59:48 +00:00
|
|
|
#include "ScreenManager.h" // for sending SM_PlayMusicSample
|
2002-05-01 19:14:55 +00:00
|
|
|
#include "RageLog.h"
|
|
|
|
|
#include "GameConstantsAndTypes.h"
|
2002-01-20 08:59:38 +00:00
|
|
|
|
|
|
|
|
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
const float SWITCH_MUSIC_TIME = 0.3f;
|
|
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
const float SORT_ICON_ON_SCREEN_X = -140;
|
|
|
|
|
const float SORT_ICON_ON_SCREEN_Y = -180;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
const float SORT_ICON_OFF_SCREEN_X = SORT_ICON_ON_SCREEN_X;
|
|
|
|
|
const float SORT_ICON_OFF_SCREEN_Y = SORT_ICON_ON_SCREEN_Y - 64;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
const float SCORE_X = 58;
|
|
|
|
|
const float SCORE_Y[NUM_PLAYERS] = { -40, 40 };
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-01 19:14:55 +00:00
|
|
|
const float SCROLLBAR_X = 150;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
D3DXCOLOR COLOR_SECTION_TEXT = D3DXCOLOR(1,1,0.3f,1);
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
D3DXCOLOR SECTION_COLORS[] = {
|
|
|
|
|
D3DXCOLOR( 0.9f, 0.0f, 0.2f, 1 ), // red
|
|
|
|
|
D3DXCOLOR( 0.6f, 0.0f, 0.4f, 1 ), // pink
|
|
|
|
|
D3DXCOLOR( 0.2f, 0.1f, 0.3f, 1 ), // purple
|
|
|
|
|
D3DXCOLOR( 0.0f, 0.4f, 0.8f, 1 ), // sky blue
|
|
|
|
|
D3DXCOLOR( 0.0f, 0.6f, 0.6f, 1 ), // sea green
|
|
|
|
|
D3DXCOLOR( 0.0f, 0.6f, 0.2f, 1 ), // green
|
|
|
|
|
D3DXCOLOR( 0.8f, 0.6f, 0.0f, 1 ), // orange
|
|
|
|
|
};
|
|
|
|
|
const int NUM_SECTION_COLORS = sizeof(SECTION_COLORS)/sizeof(D3DXCOLOR);
|
|
|
|
|
|
|
|
|
|
inline D3DXCOLOR GetNextSectionColor()
|
2002-02-05 05:33:33 +00:00
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
static int i=0;
|
|
|
|
|
i = i % NUM_SECTION_COLORS;
|
|
|
|
|
return SECTION_COLORS[i++];
|
2002-02-05 05:33:33 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
WheelItemData::WheelItemData()
|
2002-02-09 04:30:27 +00:00
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
m_pSong = NULL;
|
|
|
|
|
m_MusicStatusDisplayType = TYPE_NONE;
|
2002-02-09 04:30:27 +00:00
|
|
|
}
|
2002-02-05 05:33:33 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
void WheelItemData::Load( WheelItemType wit, Song* pSong, const CString &sSectionName, const D3DXCOLOR color )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
m_WheelItemType = wit;
|
2002-02-05 05:33:33 +00:00
|
|
|
m_pSong = pSong;
|
2002-05-19 01:59:48 +00:00
|
|
|
m_sSectionName = sSectionName;
|
|
|
|
|
m_color = color;
|
2002-02-09 04:30:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WheelItemDisplay::WheelItemDisplay()
|
|
|
|
|
{
|
2002-04-16 17:31:00 +00:00
|
|
|
m_MusicStatusDisplay.SetXY( -136, 0 );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
m_TextBanner.SetHorizAlign( align_left );
|
|
|
|
|
m_TextBanner.SetXY( -30, 0 );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
|
|
|
|
m_sprSongBar.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SONG_BAR) );
|
|
|
|
|
m_sprSongBar.SetXY( 0, 0 );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
m_sprSectionBar.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SECTION_BAR) );
|
2002-05-19 01:59:48 +00:00
|
|
|
m_sprSectionBar.SetXY( 0, 0 );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
m_textSectionName.Load( THEME->GetPathTo(FONT_HEADER1) );
|
2002-01-16 10:01:32 +00:00
|
|
|
m_textSectionName.TurnShadowOff();
|
2002-03-31 07:55:25 +00:00
|
|
|
m_textSectionName.SetHorizAlign( align_left );
|
2002-03-06 08:25:09 +00:00
|
|
|
m_textSectionName.SetVertAlign( align_middle );
|
2002-05-19 01:59:48 +00:00
|
|
|
m_textSectionName.SetXY( m_sprSectionBar.GetX() - m_sprSectionBar.GetUnzoomedWidth()/2 + 30, 0 );
|
2002-04-16 17:31:00 +00:00
|
|
|
m_textSectionName.SetZoom( 1.0f );
|
2002-05-19 01:59:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m_textRoulette.Load( THEME->GetPathTo(FONT_TEXT_BANNER) );
|
|
|
|
|
m_textRoulette.TurnShadowOff();
|
|
|
|
|
m_textRoulette.SetText( "ROULETTE" );
|
|
|
|
|
m_textRoulette.TurnRainbowOn();
|
|
|
|
|
m_textRoulette.SetZoom( 1.3f );
|
|
|
|
|
m_textRoulette.SetHorizAlign( align_left );
|
|
|
|
|
m_textRoulette.SetXY( -120, 0 );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
2002-05-01 19:14:55 +00:00
|
|
|
m_GradeDisplay[p].Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SMALL_GRADES) );
|
|
|
|
|
m_GradeDisplay[p].SetZoom( 1.0f );
|
2002-04-16 17:31:00 +00:00
|
|
|
m_GradeDisplay[p].SetXY( 90.0f + p*30.0f, 0 );
|
|
|
|
|
}
|
2002-02-05 05:33:33 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
void WheelItemDisplay::LoadFromWheelItemData( WheelItemData* pWID )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
ASSERT( pWID != NULL );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// copy all data items
|
|
|
|
|
m_WheelItemType = pWID->m_WheelItemType;
|
|
|
|
|
m_sSectionName = pWID->m_sSectionName;
|
|
|
|
|
m_pSong = pWID->m_pSong;
|
2002-05-19 01:59:48 +00:00
|
|
|
m_color = pWID->m_color;
|
2002-02-09 04:30:27 +00:00
|
|
|
m_MusicStatusDisplayType = pWID->m_MusicStatusDisplayType;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// init type specific stuff
|
|
|
|
|
switch( pWID->m_WheelItemType )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
case TYPE_SECTION:
|
2002-03-06 08:25:09 +00:00
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
CString sDisplayName = SONGMAN->ShortenGroupName(m_sSectionName);
|
|
|
|
|
m_textSectionName.SetZoom( 1 );
|
2002-04-16 17:31:00 +00:00
|
|
|
m_textSectionName.SetText( sDisplayName );
|
2002-05-19 01:59:48 +00:00
|
|
|
m_textSectionName.SetDiffuseColor( m_color );
|
|
|
|
|
m_textSectionName.TurnRainbowOff();
|
|
|
|
|
|
|
|
|
|
float fSourcePixelWidth = (float)m_textSectionName.GetWidestLineWidthInSourcePixels();
|
|
|
|
|
float fMaxTextWidth = 200;
|
|
|
|
|
if( fSourcePixelWidth > fMaxTextWidth )
|
|
|
|
|
m_textSectionName.SetZoomX( fMaxTextWidth / fSourcePixelWidth );
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
2002-02-09 04:30:27 +00:00
|
|
|
break;
|
2002-04-16 17:31:00 +00:00
|
|
|
case TYPE_SONG:
|
|
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
m_TextBanner.LoadFromSong( m_pSong );
|
|
|
|
|
D3DXCOLOR color = m_color;
|
2002-05-01 19:14:55 +00:00
|
|
|
color.r += 0.15f;
|
|
|
|
|
color.g += 0.15f;
|
|
|
|
|
color.b += 0.15f;
|
2002-05-19 01:59:48 +00:00
|
|
|
m_TextBanner.SetDiffuseColor( color );
|
2002-02-10 06:25:12 +00:00
|
|
|
m_MusicStatusDisplay.SetType( m_MusicStatusDisplayType );
|
2002-04-28 20:42:32 +00:00
|
|
|
RefreshGrades();
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
2002-02-09 04:30:27 +00:00
|
|
|
break;
|
2002-05-19 01:59:48 +00:00
|
|
|
case TYPE_ROULETTE:
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
break;
|
2002-02-09 04:30:27 +00:00
|
|
|
default:
|
2002-02-11 04:46:31 +00:00
|
|
|
ASSERT( false ); // invalid type
|
2002-02-09 04:30:27 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
void WheelItemDisplay::RefreshGrades()
|
|
|
|
|
{
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
2002-05-27 08:23:27 +00:00
|
|
|
if( !GAMEMAN->IsPlayerEnabled( (PlayerNumber)p ) )
|
2002-05-19 01:59:48 +00:00
|
|
|
{
|
|
|
|
|
m_GradeDisplay[p].SetDiffuseColor( D3DXCOLOR(1,1,1,0) );
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2002-05-27 08:23:27 +00:00
|
|
|
const DifficultyClass dc = PREFSMAN->m_PreferredDifficultyClass[p];
|
2002-05-19 01:59:48 +00:00
|
|
|
if( m_pSong ) // this is a song display
|
2002-04-28 20:42:32 +00:00
|
|
|
{
|
2002-05-27 08:23:27 +00:00
|
|
|
const Grade grade = m_pSong->GetGradeForDifficultyClass( GAMEMAN->GetCurrentStyleDef()->m_NotesType, dc );
|
2002-04-28 20:42:32 +00:00
|
|
|
m_GradeDisplay[p].SetGrade( grade );
|
2002-05-01 19:14:55 +00:00
|
|
|
m_GradeDisplay[p].SetDiffuseColor( PlayerToColor((PlayerNumber)p) );
|
2002-04-28 20:42:32 +00:00
|
|
|
}
|
2002-05-19 01:59:48 +00:00
|
|
|
else // this is a section display
|
2002-04-28 20:42:32 +00:00
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
m_GradeDisplay[p].SetGrade( GRADE_NO_DATA );
|
2002-04-28 20:42:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-02-09 04:30:27 +00:00
|
|
|
|
|
|
|
|
void WheelItemDisplay::Update( float fDeltaTime )
|
2002-02-05 05:33:33 +00:00
|
|
|
{
|
|
|
|
|
switch( m_WheelItemType )
|
|
|
|
|
{
|
|
|
|
|
case TYPE_SECTION:
|
2002-04-16 17:31:00 +00:00
|
|
|
m_sprSectionBar.Update( fDeltaTime );
|
2002-02-05 05:33:33 +00:00
|
|
|
m_textSectionName.Update( fDeltaTime );
|
|
|
|
|
break;
|
2002-05-19 01:59:48 +00:00
|
|
|
case TYPE_ROULETTE:
|
|
|
|
|
m_sprSectionBar.Update( fDeltaTime );
|
|
|
|
|
m_textRoulette.Update( fDeltaTime );
|
|
|
|
|
break;
|
2002-04-16 17:31:00 +00:00
|
|
|
case TYPE_SONG:
|
|
|
|
|
m_sprSongBar.Update( fDeltaTime );
|
2002-02-05 05:33:33 +00:00
|
|
|
m_MusicStatusDisplay.Update( fDeltaTime );
|
2002-05-19 01:59:48 +00:00
|
|
|
m_TextBanner.Update( fDeltaTime );
|
2002-04-16 17:31:00 +00:00
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
m_GradeDisplay[p].Update( fDeltaTime );
|
2002-02-05 05:33:33 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
void WheelItemDisplay::DrawPrimitives()
|
2002-02-05 05:33:33 +00:00
|
|
|
{
|
|
|
|
|
switch( m_WheelItemType )
|
|
|
|
|
{
|
|
|
|
|
case TYPE_SECTION:
|
2002-04-16 17:31:00 +00:00
|
|
|
m_sprSectionBar.Draw();
|
2002-02-05 05:33:33 +00:00
|
|
|
m_textSectionName.Draw();
|
|
|
|
|
break;
|
2002-05-19 01:59:48 +00:00
|
|
|
case TYPE_ROULETTE:
|
|
|
|
|
m_sprSectionBar.Draw();
|
|
|
|
|
m_textRoulette.Draw();
|
|
|
|
|
break;
|
2002-04-16 17:31:00 +00:00
|
|
|
case TYPE_SONG:
|
|
|
|
|
m_sprSongBar.Draw();
|
2002-02-05 05:33:33 +00:00
|
|
|
m_MusicStatusDisplay.Draw();
|
2002-05-19 01:59:48 +00:00
|
|
|
m_TextBanner.Draw();
|
2002-04-16 17:31:00 +00:00
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
m_GradeDisplay[p].Draw();
|
2002-02-05 05:33:33 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MusicWheel::MusicWheel()
|
|
|
|
|
{
|
2002-05-01 19:14:55 +00:00
|
|
|
LOG->WriteLine( "MusicWheel::MusicWheel()" );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
|
|
|
|
m_sprHighScoreFrame[p].Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SCORE_FRAME) );
|
|
|
|
|
m_sprHighScoreFrame[p].SetXY( SCORE_X, SCORE_Y[p] );
|
|
|
|
|
this->AddActor( &m_sprHighScoreFrame[p] );
|
|
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
m_HighScore[p].SetXY( SCORE_X, SCORE_Y[p]*0.97f );
|
|
|
|
|
m_HighScore[p].SetZoom( 0.6f );
|
2002-04-28 20:42:32 +00:00
|
|
|
this->AddActor( &m_HighScore[p] );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_sprHighScoreFrame[1].SetZoomY( -1 ); // flip vertically
|
|
|
|
|
|
|
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
m_sprSelectionOverlay.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SONG_HIGHLIGHT) );
|
2002-01-16 10:01:32 +00:00
|
|
|
m_sprSelectionOverlay.SetXY( 0, 0 );
|
2002-05-19 01:59:48 +00:00
|
|
|
m_sprSelectionOverlay.SetDiffuseColor( D3DXCOLOR(1,1,1,1) );
|
|
|
|
|
m_sprSelectionOverlay.SetEffectGlowing( 1.0f, D3DXCOLOR(1,1,1,0.4f), D3DXCOLOR(1,1,1,1) );
|
2002-04-28 20:42:32 +00:00
|
|
|
this->AddActor( &m_sprSelectionOverlay );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
m_MusicSortDisplay.SetXY( SORT_ICON_ON_SCREEN_X, SORT_ICON_ON_SCREEN_Y );
|
2002-04-28 20:42:32 +00:00
|
|
|
m_MusicSortDisplay.SetEffectGlowing( 1.0f );
|
2002-01-16 10:01:32 +00:00
|
|
|
this->AddActor( &m_MusicSortDisplay );
|
|
|
|
|
|
2002-05-01 19:14:55 +00:00
|
|
|
m_ScrollBar.SetX( SCROLLBAR_X );
|
|
|
|
|
this->AddActor( &m_ScrollBar );
|
|
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
|
|
|
|
|
m_soundChangeMusic.Load( THEME->GetPathTo(SOUND_SWITCH_MUSIC), 10 );
|
2002-01-16 10:01:32 +00:00
|
|
|
m_soundChangeSort.Load( THEME->GetPathTo(SOUND_SWITCH_SORT) );
|
|
|
|
|
m_soundExpand.Load( THEME->GetPathTo(SOUND_EXPAND) );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// init m_mapGroupNameToBannerColor
|
|
|
|
|
|
2002-02-11 04:46:31 +00:00
|
|
|
CArray<Song*, Song*> arraySongs;
|
2002-05-19 01:59:48 +00:00
|
|
|
arraySongs.Copy( SONGMAN->m_pSongs );
|
2002-01-16 10:01:32 +00:00
|
|
|
SortSongPointerArrayByGroup( arraySongs );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2002-05-27 08:23:27 +00:00
|
|
|
m_SortOrder = PREFSMAN->m_SongSortOrder;
|
2002-02-06 05:13:39 +00:00
|
|
|
m_MusicSortDisplay.Set( m_SortOrder );
|
|
|
|
|
m_MusicSortDisplay.SetXY( SORT_ICON_ON_SCREEN_X, SORT_ICON_ON_SCREEN_Y );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
m_sExpandedSectionName = "";
|
|
|
|
|
|
|
|
|
|
m_iSelection = 0;
|
|
|
|
|
|
|
|
|
|
|
2002-01-18 21:19:05 +00:00
|
|
|
m_WheelState = STATE_IDLE;
|
2002-01-16 10:01:32 +00:00
|
|
|
m_fTimeLeftInState = FADE_TIME;
|
2002-01-20 08:59:38 +00:00
|
|
|
m_fPositionOffsetFromSelection = 0;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
|
2002-02-09 18:53:47 +00:00
|
|
|
// build all of the wheel item datas
|
|
|
|
|
for( int so=0; so<NUM_SORT_ORDERS; so++ )
|
|
|
|
|
BuildWheelItemDatas( m_WheelItemDatas[so], SongSortOrder(so) );
|
|
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
// select a song if none are selected
|
2002-05-19 01:59:48 +00:00
|
|
|
if( SONGMAN->m_pCurSong == NULL && // if there is no currently selected song
|
|
|
|
|
SONGMAN->m_pSongs.GetSize() > 0 ) // and there is at least one song
|
2002-02-24 01:43:11 +00:00
|
|
|
{
|
2002-04-16 17:31:00 +00:00
|
|
|
CArray<Song*, Song*> arraySongs;
|
2002-05-19 01:59:48 +00:00
|
|
|
SONGMAN->GetSongsInGroup( SONGMAN->m_sPreferredGroup, arraySongs );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
|
|
|
|
if( arraySongs.GetSize() > 0 )
|
2002-05-19 01:59:48 +00:00
|
|
|
SONGMAN->m_pCurSong = arraySongs[0]; // select the first song
|
2002-02-24 01:43:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
if( SONGMAN->m_pCurSong != NULL )
|
2002-01-20 09:03:37 +00:00
|
|
|
{
|
2002-04-16 17:31:00 +00:00
|
|
|
// find the previously selected song (if any)
|
2002-05-01 19:14:55 +00:00
|
|
|
for( int i=0; i<GetCurWheelItemDatas().GetSize(); i++ )
|
2002-02-09 18:53:47 +00:00
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
if( GetCurWheelItemDatas()[i].m_pSong == SONGMAN->m_pCurSong )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
|
|
|
|
m_iSelection = i; // select it
|
|
|
|
|
m_sExpandedSectionName = GetCurWheelItemDatas()[m_iSelection].m_sSectionName; // make its group the currently expanded group
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-02-09 18:53:47 +00:00
|
|
|
}
|
2002-01-20 09:03:37 +00:00
|
|
|
}
|
2002-02-06 05:13:39 +00:00
|
|
|
|
2002-02-09 18:53:47 +00:00
|
|
|
// rebuild the WheelItems that appear on screen
|
2002-02-09 04:30:27 +00:00
|
|
|
RebuildWheelItemDisplays();
|
2002-02-06 05:13:39 +00:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MusicWheel::~MusicWheel()
|
|
|
|
|
{
|
2002-05-27 08:23:27 +00:00
|
|
|
PREFSMAN->m_SongSortOrder = m_SortOrder;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
void MusicWheel::BuildWheelItemDatas( CArray<WheelItemData, WheelItemData&> &arrayWheelItemDatas, SongSortOrder so )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-05-01 19:14:55 +00:00
|
|
|
int i;
|
2002-02-09 04:30:27 +00:00
|
|
|
|
|
|
|
|
///////////////////////////////////
|
|
|
|
|
// Make an array of Song*, then sort them
|
|
|
|
|
///////////////////////////////////
|
2002-02-11 04:46:31 +00:00
|
|
|
CArray<Song*, Song*> arraySongs;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
// copy only song that have at least one Notes for the current GameMode
|
|
|
|
|
for( i=0; i<SONGMAN->m_pSongs.GetSize(); i++ )
|
2002-02-09 18:53:47 +00:00
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
Song* pSong = SONGMAN->m_pSongs[i];
|
2002-02-09 18:53:47 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
CArray<Notes*, Notes*> arraySteps;
|
2002-05-27 08:23:27 +00:00
|
|
|
pSong->GetNotesThatMatch( GAMEMAN->GetCurrentStyleDef()->m_NotesType, arraySteps );
|
2002-02-09 18:53:47 +00:00
|
|
|
|
|
|
|
|
if( arraySteps.GetSize() > 0 )
|
|
|
|
|
arraySongs.Add( pSong );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
// sort the SONGMAN
|
2002-02-06 05:13:39 +00:00
|
|
|
switch( so )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
|
|
|
|
case SORT_GROUP:
|
|
|
|
|
SortSongPointerArrayByGroup( arraySongs );
|
|
|
|
|
break;
|
|
|
|
|
case SORT_TITLE:
|
|
|
|
|
SortSongPointerArrayByTitle( arraySongs );
|
|
|
|
|
break;
|
|
|
|
|
case SORT_BPM:
|
|
|
|
|
SortSongPointerArrayByBPM( arraySongs );
|
|
|
|
|
break;
|
2002-02-24 01:43:11 +00:00
|
|
|
// case SORT_ARTIST:
|
|
|
|
|
// SortSongPointerArrayByArtist( arraySongs );
|
|
|
|
|
// break;
|
2002-01-16 10:01:32 +00:00
|
|
|
case SORT_MOST_PLAYED:
|
|
|
|
|
SortSongPointerArrayByMostPlayed( arraySongs );
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2002-02-11 04:46:31 +00:00
|
|
|
ASSERT( false ); // unhandled SORT_ORDER
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////
|
|
|
|
|
// Build an array of WheelItemDatas from the sorted list of Song*
|
|
|
|
|
///////////////////////////////////
|
|
|
|
|
arrayWheelItemDatas.RemoveAll(); // clear out the previous wheel items...
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
// ...and load new ones
|
2002-04-16 17:31:00 +00:00
|
|
|
|
|
|
|
|
bool bUseSections;
|
2002-02-06 05:13:39 +00:00
|
|
|
switch( so )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-04-16 17:31:00 +00:00
|
|
|
case SORT_MOST_PLAYED: bUseSections = false; break;
|
|
|
|
|
case SORT_BPM: bUseSections = false; break;
|
2002-05-19 01:59:48 +00:00
|
|
|
case SORT_GROUP: bUseSections = SONGMAN->m_sPreferredGroup != "ALL MUSIC"; break;
|
2002-04-16 17:31:00 +00:00
|
|
|
case SORT_TITLE: bUseSections = true; break;
|
|
|
|
|
default: ASSERT( false );
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
if( bUseSections )
|
|
|
|
|
{
|
|
|
|
|
// make WheelItemDatas with sections
|
2002-02-09 04:30:27 +00:00
|
|
|
arrayWheelItemDatas.SetSize( arraySongs.GetSize()*2 ); // make sure we have enough room for all music and section items
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
CString sLastSection = "";
|
2002-05-19 01:59:48 +00:00
|
|
|
D3DXCOLOR colorSection;
|
2002-02-09 04:30:27 +00:00
|
|
|
int iCurWheelItem = 0;
|
|
|
|
|
for( int i=0; i< arraySongs.GetSize(); i++ )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
Song* pSong = arraySongs[i];
|
|
|
|
|
CString sThisSection = GetSectionNameFromSongAndSort( pSong, so );
|
2002-05-19 01:59:48 +00:00
|
|
|
int iSectionColorIndex = 0;
|
2002-02-09 04:30:27 +00:00
|
|
|
if( sThisSection != sLastSection ) // new section, make a section item
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
WheelItemData &WID = arrayWheelItemDatas[iCurWheelItem++];
|
2002-05-19 01:59:48 +00:00
|
|
|
colorSection = (so==SORT_TITLE) ? SONGMAN->GetGroupColor(pSong->GetGroupName()) : SECTION_COLORS[iSectionColorIndex];
|
|
|
|
|
iSectionColorIndex = (iSectionColorIndex+1) % NUM_SECTION_COLORS;
|
|
|
|
|
WID.Load( TYPE_SECTION, NULL, sThisSection, colorSection );
|
2002-02-09 04:30:27 +00:00
|
|
|
sLastSection = sThisSection;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
2002-02-09 04:30:27 +00:00
|
|
|
|
|
|
|
|
WheelItemData &WID = arrayWheelItemDatas[iCurWheelItem++];
|
2002-05-19 01:59:48 +00:00
|
|
|
WID.Load( TYPE_SONG, pSong, sThisSection, SONGMAN->GetGroupColor(pSong->GetGroupName()) );
|
2002-02-09 04:30:27 +00:00
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
arrayWheelItemDatas.SetSize( iCurWheelItem ); // make sure we have enough room for all music and section items
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
arrayWheelItemDatas.SetSize( arraySongs.GetSize() );
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<arraySongs.GetSize(); i++ )
|
|
|
|
|
{
|
|
|
|
|
Song* pSong = arraySongs[i];
|
|
|
|
|
WheelItemData &WID = arrayWheelItemDatas[i];
|
2002-05-19 01:59:48 +00:00
|
|
|
WID.Load( TYPE_SONG, pSong, "", SONGMAN->GetGroupColor(pSong->GetGroupName()) );
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-02-10 06:25:12 +00:00
|
|
|
// init crowns
|
|
|
|
|
for( i=0; i<arrayWheelItemDatas.GetSize(); i++ )
|
|
|
|
|
{
|
|
|
|
|
Song* pSong = arrayWheelItemDatas[i].m_pSong;
|
|
|
|
|
if( pSong != NULL )
|
|
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
arrayWheelItemDatas[i].m_MusicStatusDisplayType = (pSong->GetNumTimesPlayed()==0) ? TYPE_NEW : TYPE_NONE;
|
2002-02-10 06:25:12 +00:00
|
|
|
}
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-02-06 05:13:39 +00:00
|
|
|
if( so == SORT_MOST_PLAYED )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
|
|
|
|
// init crown icons
|
2002-02-10 06:25:12 +00:00
|
|
|
for( int i=0; i<arrayWheelItemDatas.GetSize() && i<3; i++ )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
arrayWheelItemDatas[i].m_MusicStatusDisplayType = MusicStatusDisplayType(TYPE_CROWN1 + i);
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
if( arrayWheelItemDatas.GetSize() == 0 )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
arrayWheelItemDatas.SetSize( 1 );
|
2002-05-19 01:59:48 +00:00
|
|
|
arrayWheelItemDatas[0].Load( TYPE_SECTION, NULL, "NO SONGS", D3DXCOLOR(1,0,0,1) );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
arrayWheelItemDatas.SetSize( arrayWheelItemDatas.GetSize()+1 );
|
|
|
|
|
arrayWheelItemDatas[arrayWheelItemDatas.GetSize()-1].Load( TYPE_ROULETTE, NULL, "", D3DXCOLOR(1,0,0,1) );
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-02-06 05:13:39 +00:00
|
|
|
void MusicWheel::SwitchSortOrder()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
float MusicWheel::GetBannerY( float fPosOffsetsFromMiddle )
|
|
|
|
|
{
|
2002-05-19 01:59:48 +00:00
|
|
|
return (float)roundf( fPosOffsetsFromMiddle*44 );
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float MusicWheel::GetBannerBrightness( float fPosOffsetsFromMiddle )
|
|
|
|
|
{
|
2002-04-16 17:31:00 +00:00
|
|
|
//return 1 - fabsf(fPosOffsetsFromMiddle)*0.11f;
|
|
|
|
|
return 1;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float MusicWheel::GetBannerAlpha( float fPosOffsetsFromMiddle )
|
|
|
|
|
{
|
2002-04-16 17:31:00 +00:00
|
|
|
/*
|
2002-01-18 21:19:05 +00:00
|
|
|
if( m_WheelState == STATE_FLYING_OFF_BEFORE_NEXT_SORT
|
|
|
|
|
|| m_WheelState == STATE_TWEENING_OFF_SCREEN )
|
|
|
|
|
{
|
2002-01-16 10:01:32 +00:00
|
|
|
return m_fTimeLeftInState / FADE_TIME;
|
2002-01-18 21:19:05 +00:00
|
|
|
}
|
|
|
|
|
else if( m_WheelState == STATE_FLYING_ON_AFTER_NEXT_SORT
|
|
|
|
|
|| m_WheelState == STATE_TWEENING_ON_SCREEN )
|
|
|
|
|
{
|
2002-01-16 10:01:32 +00:00
|
|
|
return 1 - (m_fTimeLeftInState / FADE_TIME);
|
2002-01-18 21:19:05 +00:00
|
|
|
}
|
|
|
|
|
else if( m_WheelState == STATE_WAITING_OFF_SCREEN )
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
else
|
2002-01-18 21:19:05 +00:00
|
|
|
{
|
2002-01-16 10:01:32 +00:00
|
|
|
return 1;
|
2002-01-18 21:19:05 +00:00
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
*/
|
|
|
|
|
return 1;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float MusicWheel::GetBannerX( float fPosOffsetsFromMiddle )
|
|
|
|
|
{
|
2002-02-24 01:43:11 +00:00
|
|
|
float fX = (1-cosf((fPosOffsetsFromMiddle)/3))*95.0f;
|
2002-04-16 17:31:00 +00:00
|
|
|
|
|
|
|
|
float fPercentOffScreen = 0;
|
|
|
|
|
switch( m_WheelState )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-04-16 17:31:00 +00:00
|
|
|
case STATE_FLYING_OFF_BEFORE_NEXT_SORT:
|
|
|
|
|
case STATE_TWEENING_OFF_SCREEN:
|
|
|
|
|
fPercentOffScreen = 1 - (m_fTimeLeftInState / FADE_TIME);
|
|
|
|
|
break;
|
|
|
|
|
case STATE_FLYING_ON_AFTER_NEXT_SORT:
|
|
|
|
|
case STATE_TWEENING_ON_SCREEN:
|
|
|
|
|
fPercentOffScreen = m_fTimeLeftInState / FADE_TIME;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
fPercentOffScreen = 1;
|
|
|
|
|
break;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
|
|
|
|
|
switch( m_WheelState )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-04-16 17:31:00 +00:00
|
|
|
case STATE_FLYING_OFF_BEFORE_NEXT_SORT:
|
|
|
|
|
case STATE_TWEENING_OFF_SCREEN:
|
|
|
|
|
case STATE_FLYING_ON_AFTER_NEXT_SORT:
|
|
|
|
|
case STATE_TWEENING_ON_SCREEN:
|
|
|
|
|
{
|
|
|
|
|
/*
|
2002-02-24 01:43:11 +00:00
|
|
|
float fDistFromCenter = fabsf( fPosOffsetsFromMiddle );
|
2002-04-16 17:31:00 +00:00
|
|
|
float fPercentOffScreen = 1- (m_fTimeLeftInState / FADE_TIME);
|
2002-01-16 10:01:32 +00:00
|
|
|
float fXLogicalOffset = max( 0, fPercentOffScreen - 1 + (fDistFromCenter+3)/6 );
|
2002-02-24 01:43:11 +00:00
|
|
|
fXLogicalOffset = powf( fXLogicalOffset, 1.7f ); // accelerate
|
2002-01-16 10:01:32 +00:00
|
|
|
float fXPixelOffset = fXLogicalOffset * 600;
|
|
|
|
|
fX += fXPixelOffset;
|
2002-04-16 17:31:00 +00:00
|
|
|
*/
|
|
|
|
|
const float fShift = fPosOffsetsFromMiddle/NUM_WHEEL_ITEMS_TO_DRAW - 0.5f; // this is always < 0
|
|
|
|
|
const float fXTween = fShift * 800 + fPercentOffScreen * 1200;
|
|
|
|
|
fX = max( fX, fXTween );
|
|
|
|
|
}
|
|
|
|
|
break;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
return (float)roundf( fX );
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
void MusicWheel::RebuildWheelItemDisplays()
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
// rewind to first index that will be displayed;
|
2002-01-16 10:01:32 +00:00
|
|
|
int iIndex = m_iSelection;
|
2002-02-10 06:25:12 +00:00
|
|
|
if( m_iSelection > GetCurWheelItemDatas().GetSize()-1 )
|
|
|
|
|
m_iSelection = 0;
|
|
|
|
|
|
2002-01-16 10:01:32 +00:00
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS_TO_DRAW/2; i++ )
|
|
|
|
|
{
|
2002-02-06 05:13:39 +00:00
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
iIndex--;
|
|
|
|
|
if( iIndex < 0 )
|
2002-02-09 04:30:27 +00:00
|
|
|
iIndex = GetCurWheelItemDatas().GetSize()-1;
|
2002-02-06 05:13:39 +00:00
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
while( GetCurWheelItemDatas()[iIndex].m_WheelItemType == TYPE_SONG
|
2002-02-09 04:30:27 +00:00
|
|
|
&& GetCurWheelItemDatas()[iIndex].m_sSectionName != ""
|
|
|
|
|
&& GetCurWheelItemDatas()[iIndex].m_sSectionName != m_sExpandedSectionName );
|
|
|
|
|
}
|
2002-02-06 05:13:39 +00:00
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
// iIndex is now the index of the lowest WheelItem to draw
|
|
|
|
|
for( i=0; i<NUM_WHEEL_ITEMS_TO_DRAW; i++ )
|
|
|
|
|
{
|
|
|
|
|
WheelItemData& data = GetCurWheelItemDatas()[iIndex];
|
|
|
|
|
WheelItemDisplay& display = m_WheelItemDisplays[i];
|
2002-02-06 05:13:39 +00:00
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
display.LoadFromWheelItemData( &data );
|
|
|
|
|
|
|
|
|
|
// increment iIndex
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
iIndex++;
|
|
|
|
|
if( iIndex > GetCurWheelItemDatas().GetSize()-1 )
|
|
|
|
|
iIndex = 0;
|
|
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
while( GetCurWheelItemDatas()[iIndex].m_WheelItemType == TYPE_SONG
|
2002-02-09 04:30:27 +00:00
|
|
|
&& GetCurWheelItemDatas()[iIndex].m_sSectionName != ""
|
|
|
|
|
&& GetCurWheelItemDatas()[iIndex].m_sSectionName != m_sExpandedSectionName );
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
}
|
|
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
void MusicWheel::NotesChanged( PlayerNumber pn ) // update grade graphics and top score
|
|
|
|
|
{
|
2002-05-27 08:23:27 +00:00
|
|
|
DifficultyClass dc = PREFSMAN->m_PreferredDifficultyClass[pn];
|
2002-05-19 01:59:48 +00:00
|
|
|
Song* pSong = SONGMAN->m_pCurSong;
|
|
|
|
|
Notes* m_pNotes = SONGMAN->m_pCurNotes[pn];
|
2002-04-28 20:42:32 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
if( m_pNotes )
|
|
|
|
|
m_HighScore[pn].SetScore( (float)m_pNotes->m_iTopScore );
|
2002-04-28 20:42:32 +00:00
|
|
|
|
|
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS_TO_DRAW; i++ )
|
|
|
|
|
{
|
|
|
|
|
WheelItemDisplay& display = m_WheelItemDisplays[i];
|
|
|
|
|
display.RefreshGrades();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
void MusicWheel::DrawPrimitives()
|
2002-02-09 04:30:27 +00:00
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS_TO_DRAW; i++ )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
WheelItemDisplay& display = m_WheelItemDisplays[i];
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS_TO_DRAW/2 + m_fPositionOffsetFromSelection;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-01-20 08:59:38 +00:00
|
|
|
float fY = GetBannerY( fThisBannerPositionOffsetFromSelection );
|
2002-05-01 19:14:55 +00:00
|
|
|
if( fY < -SCREEN_HEIGHT/2 || fY > SCREEN_HEIGHT/2 )
|
|
|
|
|
continue; // skip
|
|
|
|
|
|
2002-01-20 08:59:38 +00:00
|
|
|
float fX = GetBannerX( fThisBannerPositionOffsetFromSelection );
|
2002-02-09 04:30:27 +00:00
|
|
|
display.SetXY( fX, fY );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-01-20 08:59:38 +00:00
|
|
|
float fBrightness = GetBannerBrightness( m_fPositionOffsetFromSelection );
|
|
|
|
|
float fAlpha = GetBannerAlpha( m_fPositionOffsetFromSelection );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
display.SetDiffuseColor( D3DXCOLOR(fBrightness, fBrightness, fBrightness, fAlpha) );
|
|
|
|
|
display.Draw();
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
ActorFrame::DrawPrimitives();
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MusicWheel::Update( float fDeltaTime )
|
|
|
|
|
{
|
|
|
|
|
ActorFrame::Update( fDeltaTime );
|
|
|
|
|
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS_TO_DRAW; i++ )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
WheelItemDisplay& display = m_WheelItemDisplays[i];
|
|
|
|
|
|
|
|
|
|
display.Update( fDeltaTime );
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-05-01 19:14:55 +00:00
|
|
|
float fScrollPercentage = (m_iSelection-m_fPositionOffsetFromSelection) / (float)GetCurWheelItemDatas().GetSize();
|
|
|
|
|
m_ScrollBar.SetPercentage( fScrollPercentage );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
|
2002-01-16 10:01:32 +00:00
|
|
|
// update wheel state
|
|
|
|
|
m_fTimeLeftInState -= fDeltaTime;
|
|
|
|
|
if( m_fTimeLeftInState <= 0 ) // time to go to a new state
|
|
|
|
|
{
|
|
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
2002-01-20 08:59:38 +00:00
|
|
|
case STATE_SWITCHING_MUSIC:
|
2002-01-16 10:01:32 +00:00
|
|
|
m_WheelState = STATE_IDLE; // now, wait for input
|
2002-05-19 01:59:48 +00:00
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_PlaySongSample, 0 );
|
2002-01-16 10:01:32 +00:00
|
|
|
break;
|
2002-01-18 21:19:05 +00:00
|
|
|
case STATE_FLYING_OFF_BEFORE_NEXT_SORT:
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-01-18 21:19:05 +00:00
|
|
|
m_WheelState = STATE_FLYING_ON_AFTER_NEXT_SORT;
|
2002-01-16 10:01:32 +00:00
|
|
|
m_fTimeLeftInState = FADE_TIME;
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
Song* pPrevSelectedSong = GetCurWheelItemDatas()[m_iSelection].m_pSong;
|
2002-02-24 01:43:11 +00:00
|
|
|
CString sPrevSelectedSection = GetCurWheelItemDatas()[m_iSelection].m_sSectionName;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
// change the sort order
|
2002-02-06 05:13:39 +00:00
|
|
|
m_SortOrder = SongSortOrder(m_SortOrder+1);
|
2002-01-16 10:01:32 +00:00
|
|
|
if( m_SortOrder > NUM_SORT_ORDERS-1 )
|
2002-02-06 05:13:39 +00:00
|
|
|
m_SortOrder = (SongSortOrder)0;
|
2002-01-16 10:01:32 +00:00
|
|
|
m_sExpandedSectionName = GetSectionNameFromSongAndSort( pPrevSelectedSong, m_SortOrder );
|
2002-02-06 05:13:39 +00:00
|
|
|
//RebuildWheelItems();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
m_MusicSortDisplay.Set( m_SortOrder );
|
|
|
|
|
m_MusicSortDisplay.BeginTweening( FADE_TIME, TWEEN_BIAS_BEGIN );
|
|
|
|
|
m_MusicSortDisplay.SetTweenXY( SORT_ICON_ON_SCREEN_X, SORT_ICON_ON_SCREEN_Y );
|
|
|
|
|
|
|
|
|
|
|
2002-02-24 01:43:11 +00:00
|
|
|
m_iSelection = 0;
|
|
|
|
|
|
|
|
|
|
if( pPrevSelectedSong != NULL ) // the previous selected item was a song
|
|
|
|
|
{
|
|
|
|
|
// find the previously selected song, and select it
|
|
|
|
|
for( i=0; i<GetCurWheelItemDatas().GetSize(); i++ )
|
|
|
|
|
{
|
|
|
|
|
if( GetCurWheelItemDatas()[i].m_pSong == pPrevSelectedSong )
|
|
|
|
|
{
|
|
|
|
|
m_iSelection = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else // the previously selected item was a section
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-24 01:43:11 +00:00
|
|
|
// find the previously selected song, and select it
|
|
|
|
|
for( i=0; i<GetCurWheelItemDatas().GetSize(); i++ )
|
|
|
|
|
{
|
|
|
|
|
if( GetCurWheelItemDatas()[i].m_sSectionName == sPrevSelectedSection )
|
|
|
|
|
{
|
|
|
|
|
m_iSelection = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
2002-02-09 04:30:27 +00:00
|
|
|
|
|
|
|
|
RebuildWheelItemDisplays();
|
|
|
|
|
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2002-01-18 21:19:05 +00:00
|
|
|
case STATE_FLYING_ON_AFTER_NEXT_SORT:
|
2002-05-19 01:59:48 +00:00
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_PlaySongSample, 0 );
|
2002-01-16 10:01:32 +00:00
|
|
|
m_WheelState = STATE_IDLE; // now, wait for input
|
|
|
|
|
break;
|
2002-01-18 21:19:05 +00:00
|
|
|
case STATE_TWEENING_ON_SCREEN:
|
2002-05-19 01:59:48 +00:00
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_PlaySongSample, 0 );
|
2002-01-18 21:19:05 +00:00
|
|
|
m_WheelState = STATE_IDLE;
|
|
|
|
|
m_fTimeLeftInState = 0;
|
|
|
|
|
break;
|
|
|
|
|
case STATE_TWEENING_OFF_SCREEN:
|
|
|
|
|
m_WheelState = STATE_WAITING_OFF_SCREEN;
|
|
|
|
|
m_fTimeLeftInState = 0;
|
|
|
|
|
break;
|
2002-01-16 10:01:32 +00:00
|
|
|
case STATE_IDLE:
|
|
|
|
|
m_fTimeLeftInState = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-01-20 08:59:38 +00:00
|
|
|
// "rotate" wheel toward selected song
|
|
|
|
|
|
2002-02-24 01:43:11 +00:00
|
|
|
if( fabsf(m_fPositionOffsetFromSelection) < 0.02f )
|
2002-01-20 08:59:38 +00:00
|
|
|
m_fPositionOffsetFromSelection = 0;
|
|
|
|
|
else
|
|
|
|
|
{
|
2002-01-20 23:29:03 +00:00
|
|
|
m_fPositionOffsetFromSelection -= fDeltaTime * m_fPositionOffsetFromSelection*4; // linear
|
2002-02-24 01:43:11 +00:00
|
|
|
float fSign = m_fPositionOffsetFromSelection / fabsf(m_fPositionOffsetFromSelection);
|
2002-01-20 23:29:03 +00:00
|
|
|
m_fPositionOffsetFromSelection -= fDeltaTime * fSign; // constant
|
2002-01-20 08:59:38 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void MusicWheel::PrevMusic()
|
|
|
|
|
{
|
2002-01-20 07:51:09 +00:00
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
|
|
|
|
case STATE_IDLE:
|
2002-01-20 08:59:38 +00:00
|
|
|
case STATE_SWITCHING_MUSIC:
|
2002-01-20 07:51:09 +00:00
|
|
|
break; // fall through
|
|
|
|
|
default:
|
|
|
|
|
return; // don't fall through
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
MUSIC->Stop();
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
// decrement m_iSelection
|
2002-02-06 05:13:39 +00:00
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
m_iSelection--;
|
|
|
|
|
if( m_iSelection < 0 )
|
2002-02-09 04:30:27 +00:00
|
|
|
m_iSelection = GetCurWheelItemDatas().GetSize()-1;
|
2002-02-06 05:13:39 +00:00
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
while( GetCurWheelItemDatas()[m_iSelection].m_WheelItemType == TYPE_SONG
|
2002-02-09 04:30:27 +00:00
|
|
|
&& GetCurWheelItemDatas()[m_iSelection].m_sSectionName != ""
|
|
|
|
|
&& GetCurWheelItemDatas()[m_iSelection].m_sSectionName != m_sExpandedSectionName );
|
2002-02-06 05:13:39 +00:00
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
RebuildWheelItemDisplays();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-01-20 08:59:38 +00:00
|
|
|
m_fPositionOffsetFromSelection -= 1;
|
|
|
|
|
|
|
|
|
|
m_WheelState = STATE_SWITCHING_MUSIC;
|
2002-01-16 10:01:32 +00:00
|
|
|
m_fTimeLeftInState = SWITCH_MUSIC_TIME;
|
2002-04-28 20:42:32 +00:00
|
|
|
m_soundChangeMusic.Play();
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MusicWheel::NextMusic()
|
|
|
|
|
{
|
2002-01-18 22:18:41 +00:00
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
|
|
|
|
case STATE_IDLE:
|
2002-01-20 08:59:38 +00:00
|
|
|
case STATE_SWITCHING_MUSIC:
|
2002-01-18 22:18:41 +00:00
|
|
|
break; // fall through
|
|
|
|
|
default:
|
|
|
|
|
return; // don't continue
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
MUSIC->Stop();
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
// increment m_iSelection
|
2002-02-06 05:13:39 +00:00
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
m_iSelection++;
|
2002-02-09 04:30:27 +00:00
|
|
|
if( m_iSelection > GetCurWheelItemDatas().GetSize()-1 )
|
2002-02-06 05:13:39 +00:00
|
|
|
m_iSelection = 0;
|
|
|
|
|
}
|
2002-04-16 17:31:00 +00:00
|
|
|
while( GetCurWheelItemDatas()[m_iSelection].m_WheelItemType == TYPE_SONG
|
2002-02-09 04:30:27 +00:00
|
|
|
&& GetCurWheelItemDatas()[m_iSelection].m_sSectionName != ""
|
|
|
|
|
&& GetCurWheelItemDatas()[m_iSelection].m_sSectionName != m_sExpandedSectionName );
|
2002-02-06 05:13:39 +00:00
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
RebuildWheelItemDisplays();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-01-20 08:59:38 +00:00
|
|
|
m_fPositionOffsetFromSelection += 1;
|
|
|
|
|
|
|
|
|
|
m_WheelState = STATE_SWITCHING_MUSIC;
|
2002-01-16 10:01:32 +00:00
|
|
|
m_fTimeLeftInState = SWITCH_MUSIC_TIME;
|
2002-04-28 20:42:32 +00:00
|
|
|
m_soundChangeMusic.Play();
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
void MusicWheel::PrevSort()
|
|
|
|
|
{
|
|
|
|
|
NextSort();
|
|
|
|
|
}
|
|
|
|
|
|
2002-01-16 10:01:32 +00:00
|
|
|
void MusicWheel::NextSort()
|
|
|
|
|
{
|
2002-01-18 22:18:41 +00:00
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
|
|
|
|
case STATE_IDLE:
|
2002-01-20 08:59:38 +00:00
|
|
|
case STATE_SWITCHING_MUSIC:
|
2002-01-24 08:01:24 +00:00
|
|
|
case STATE_FLYING_ON_AFTER_NEXT_SORT:
|
2002-01-18 22:18:41 +00:00
|
|
|
break; // fall through
|
|
|
|
|
default:
|
|
|
|
|
return; // don't continue
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
MUSIC->Stop();
|
|
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
m_soundChangeSort.Play();
|
2002-01-16 10:01:32 +00:00
|
|
|
m_MusicSortDisplay.BeginTweening( FADE_TIME, TWEEN_BIAS_END );
|
|
|
|
|
m_MusicSortDisplay.SetTweenXY( SORT_ICON_OFF_SCREEN_X, SORT_ICON_OFF_SCREEN_Y );
|
|
|
|
|
|
2002-01-18 21:19:05 +00:00
|
|
|
m_WheelState = STATE_FLYING_OFF_BEFORE_NEXT_SORT;
|
2002-01-16 10:01:32 +00:00
|
|
|
m_fTimeLeftInState = FADE_TIME;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool MusicWheel::Select()
|
|
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
switch( GetCurWheelItemDatas()[m_iSelection].m_WheelItemType )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
case TYPE_SECTION:
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
CString sThisItemSectionName = GetCurWheelItemDatas()[m_iSelection].m_sSectionName;
|
2002-01-16 10:01:32 +00:00
|
|
|
if( m_sExpandedSectionName == sThisItemSectionName ) // already expanded
|
|
|
|
|
m_sExpandedSectionName = ""; // collapse it
|
|
|
|
|
else // already collapsed
|
|
|
|
|
m_sExpandedSectionName = sThisItemSectionName; // expand it
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
|
|
|
|
|
RebuildWheelItemDisplays();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
m_soundExpand.Play();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
m_iSelection = 0; // reset in case we can't find the last selected song
|
|
|
|
|
// find the section header and select it
|
2002-02-09 04:30:27 +00:00
|
|
|
for( int i=0; i<GetCurWheelItemDatas().GetSize(); i++ )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-02-09 04:30:27 +00:00
|
|
|
if( GetCurWheelItemDatas()[i].m_WheelItemType == TYPE_SECTION
|
|
|
|
|
&& GetCurWheelItemDatas()[i].m_sSectionName == sThisItemSectionName )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
|
|
|
|
m_iSelection = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
return false;
|
2002-05-19 01:59:48 +00:00
|
|
|
case TYPE_ROULETTE:
|
|
|
|
|
return false;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
case TYPE_SONG:
|
2002-01-16 10:01:32 +00:00
|
|
|
default:
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
void MusicWheel::TweenOnScreen()
|
|
|
|
|
{
|
2002-02-07 02:16:14 +00:00
|
|
|
m_WheelState = STATE_TWEENING_ON_SCREEN;
|
|
|
|
|
m_fTimeLeftInState = FADE_TIME;
|
|
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
float fOriginalZoomY;
|
|
|
|
|
fOriginalZoomY = m_sprSelectionOverlay.GetZoomY();
|
2002-02-07 02:16:14 +00:00
|
|
|
m_sprSelectionOverlay.SetZoomY( 0 );
|
|
|
|
|
m_sprSelectionOverlay.BeginTweening( FADE_TIME );
|
|
|
|
|
m_sprSelectionOverlay.SetTweenZoomY( fOriginalZoomY );
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
void MusicWheel::TweenOffScreen()
|
|
|
|
|
{
|
2002-02-07 02:16:14 +00:00
|
|
|
m_WheelState = STATE_TWEENING_OFF_SCREEN;
|
|
|
|
|
m_fTimeLeftInState = FADE_TIME;
|
|
|
|
|
|
|
|
|
|
m_sprSelectionOverlay.BeginTweening( FADE_TIME );
|
|
|
|
|
m_sprSelectionOverlay.SetTweenZoomY( 0 );
|
2002-02-09 18:53:47 +00:00
|
|
|
|
|
|
|
|
m_MusicSortDisplay.BeginTweening( FADE_TIME, TWEEN_BIAS_END );
|
|
|
|
|
m_MusicSortDisplay.SetTweenXY( SORT_ICON_OFF_SCREEN_X, SORT_ICON_OFF_SCREEN_Y );
|
2002-02-07 02:16:14 +00:00
|
|
|
}
|