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-07-23 01:41:40 +00:00
|
|
|
#include "PrefsManager.h"
|
2002-01-16 10:01:32 +00:00
|
|
|
#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-07-23 01:41:40 +00:00
|
|
|
#include "GameState.h"
|
2002-01-20 08:59:38 +00:00
|
|
|
|
2002-09-03 06:33:08 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
// WheelItem stuff
|
2002-08-27 03:59:22 +00:00
|
|
|
#define ICON_X THEME->GetMetricF("WheelItemDisplay","IconX")
|
|
|
|
|
#define SONG_NAME_X THEME->GetMetricF("WheelItemDisplay","SongNameX")
|
|
|
|
|
#define SECTION_NAME_X THEME->GetMetricF("WheelItemDisplay","SectionNameX")
|
|
|
|
|
#define SECTION_ZOOM THEME->GetMetricF("WheelItemDisplay","SectionZoom")
|
|
|
|
|
#define ROULETTE_X THEME->GetMetricF("WheelItemDisplay","RouletteX")
|
|
|
|
|
#define ROULETTE_ZOOM THEME->GetMetricF("WheelItemDisplay","RouletteZoom")
|
|
|
|
|
#define COURSE_X THEME->GetMetricF("WheelItemDisplay","CourseX")
|
|
|
|
|
#define COURSE_ZOOM THEME->GetMetricF("WheelItemDisplay","CourseZoom")
|
2002-09-03 06:33:08 +00:00
|
|
|
#define GRADE_X( p ) THEME->GetMetricF("WheelItemDisplay",ssprintf("GradeP%dX",p+1))
|
2002-08-13 23:26:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
// MusicWheel stuff
|
|
|
|
|
#define FADE_SECONDS THEME->GetMetricF("MusicWheel","FadeSeconds")
|
|
|
|
|
#define SWITCH_SECONDS THEME->GetMetricF("MusicWheel","SwitchSeconds")
|
|
|
|
|
#define SAMPLE_MUSIC_DELAY THEME->GetMetricF("MusicWheel","SampleMusicDelay")
|
|
|
|
|
#define ROULETTE_SWITCH_SECONDS THEME->GetMetricF("MusicWheel","RouletteSwitchSeconds")
|
|
|
|
|
#define ROULETTE_SLOW_DOWN_SWITCHES THEME->GetMetricI("MusicWheel","RouletteSlowDownSwitches")
|
|
|
|
|
#define LOCKED_INITIAL_VELOCITY THEME->GetMetricF("MusicWheel","LockedInitialVelocity")
|
|
|
|
|
#define SCROLL_BAR_X THEME->GetMetricF("MusicWheel","ScrollBarX")
|
2002-08-26 05:53:48 +00:00
|
|
|
#define SCROLL_BAR_HEIGHT THEME->GetMetricI("MusicWheel","ScrollBarHeight")
|
2002-09-03 06:33:08 +00:00
|
|
|
#define ITEM_SPACING_Y THEME->GetMetricF("MusicWheel","ItemSpacingY")
|
|
|
|
|
#define NUM_SECTION_COLORS THEME->GetMetricI("MusicWheel","NumSectionColors")
|
|
|
|
|
#define SECTION_COLORS( i ) THEME->GetMetricC("MusicWheel",ssprintf("SectionColor%d",i+1))
|
|
|
|
|
|
|
|
|
|
float g_fItemSpacingY; // cache
|
|
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
inline D3DXCOLOR GetNextSectionColor() {
|
2002-05-19 01:59:48 +00:00
|
|
|
static int i=0;
|
|
|
|
|
i = i % NUM_SECTION_COLORS;
|
2002-08-13 23:26:46 +00:00
|
|
|
return SECTION_COLORS(i++);
|
2002-02-05 05:33:33 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-02-05 05:33:33 +00:00
|
|
|
|
2002-07-27 19:29:51 +00:00
|
|
|
WheelItemData::WheelItemData( WheelItemType wit, Song* pSong, const CString &sSectionName, Course* pCourse, 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;
|
2002-06-14 22:25:22 +00:00
|
|
|
m_pCourse = pCourse;
|
2002-05-19 01:59:48 +00:00
|
|
|
m_color = color;
|
2002-08-20 21:00:56 +00:00
|
|
|
m_IconType = MusicStatusDisplay::none;
|
2002-02-09 04:30:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WheelItemDisplay::WheelItemDisplay()
|
|
|
|
|
{
|
2002-06-30 23:19:33 +00:00
|
|
|
m_fPercentGray = 0;
|
|
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
m_MusicStatusDisplay.SetXY( ICON_X, 0 );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-19 01:59:48 +00:00
|
|
|
m_TextBanner.SetHorizAlign( align_left );
|
2002-08-13 23:26:46 +00:00
|
|
|
m_TextBanner.SetXY( SONG_NAME_X, 0 );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
m_sprSongBar.Load( THEME->GetPathTo("Graphics","select music song bar") );
|
2002-04-16 17:31:00 +00:00
|
|
|
m_sprSongBar.SetXY( 0, 0 );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
m_sprSectionBar.Load( THEME->GetPathTo("Graphics","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-09-03 22:31:06 +00:00
|
|
|
m_textSectionName.LoadFromFont( THEME->GetPathTo("Fonts","musicwheel section") );
|
2002-01-16 10:01:32 +00:00
|
|
|
m_textSectionName.TurnShadowOff();
|
2002-03-06 08:25:09 +00:00
|
|
|
m_textSectionName.SetVertAlign( align_middle );
|
2002-08-13 23:26:46 +00:00
|
|
|
m_textSectionName.SetXY( SECTION_NAME_X, 0 );
|
|
|
|
|
m_textSectionName.SetZoom( SECTION_ZOOM );
|
2002-05-19 01:59:48 +00:00
|
|
|
|
|
|
|
|
|
2002-09-03 22:31:06 +00:00
|
|
|
m_textRoulette.LoadFromFont( THEME->GetPathTo("Fonts","musicwheel roulette") );
|
2002-05-19 01:59:48 +00:00
|
|
|
m_textRoulette.TurnShadowOff();
|
|
|
|
|
m_textRoulette.SetText( "ROULETTE" );
|
|
|
|
|
m_textRoulette.TurnRainbowOn();
|
2002-08-13 23:26:46 +00:00
|
|
|
m_textRoulette.SetZoom( ROULETTE_ZOOM );
|
|
|
|
|
m_textRoulette.SetXY( ROULETTE_X, 0 );
|
2002-04-16 17:31:00 +00:00
|
|
|
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
2002-08-22 09:31:32 +00:00
|
|
|
m_GradeDisplay[p].Load( THEME->GetPathTo("Graphics","select music small grades 2x8") );
|
2002-05-01 19:14:55 +00:00
|
|
|
m_GradeDisplay[p].SetZoom( 1.0f );
|
2002-09-03 06:33:08 +00:00
|
|
|
m_GradeDisplay[p].SetXY( GRADE_X(p), 0 );
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
2002-06-14 22:25:22 +00:00
|
|
|
|
2002-09-03 22:31:06 +00:00
|
|
|
m_textCourse.LoadFromFont( THEME->GetPathTo("Fonts","musicwheel course") );
|
2002-06-14 22:25:22 +00:00
|
|
|
m_textCourse.TurnShadowOff();
|
2002-08-13 23:26:46 +00:00
|
|
|
m_textCourse.SetZoom( COURSE_ZOOM );
|
2002-06-14 22:25:22 +00:00
|
|
|
m_textCourse.SetHorizAlign( align_left );
|
2002-08-13 23:26:46 +00:00
|
|
|
m_textCourse.SetXY( COURSE_X, 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
|
2002-06-14 22:25:22 +00:00
|
|
|
this->m_WheelItemType = pWID->m_WheelItemType;
|
|
|
|
|
this->m_sSectionName = pWID->m_sSectionName;
|
|
|
|
|
this->m_pCourse = pWID->m_pCourse;
|
|
|
|
|
this->m_pSong = pWID->m_pSong;
|
|
|
|
|
this->m_color = pWID->m_color;
|
2002-08-20 21:00:56 +00:00
|
|
|
this->m_IconType = pWID->m_IconType;
|
2002-02-09 04:30:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
// init type specific stuff
|
|
|
|
|
switch( pWID->m_WheelItemType )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
case TYPE_SECTION:
|
2002-03-06 08:25:09 +00:00
|
|
|
{
|
2002-06-14 22:25:22 +00:00
|
|
|
CString sDisplayName = SONGMAN->ShortenGroupName(m_sSectionName);
|
|
|
|
|
m_textSectionName.SetZoom( 1 );
|
|
|
|
|
m_textSectionName.SetText( sDisplayName );
|
2002-09-02 21:59:58 +00:00
|
|
|
m_textSectionName.SetDiffuse( m_color );
|
2002-06-14 22:25:22 +00:00
|
|
|
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-29 09:47:24 +00:00
|
|
|
m_TextBanner.LoadFromSong( m_pSong );
|
|
|
|
|
D3DXCOLOR color = m_color;
|
2002-09-02 21:59:58 +00:00
|
|
|
m_TextBanner.SetDiffuse( color );
|
2002-08-20 21:00:56 +00:00
|
|
|
m_MusicStatusDisplay.SetType( m_IconType );
|
2002-05-29 09:47:24 +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-06-14 22:25:22 +00:00
|
|
|
case TYPE_COURSE:
|
|
|
|
|
{
|
|
|
|
|
m_textCourse.SetZoom( 1 );
|
|
|
|
|
m_textCourse.SetText( m_pCourse->m_sName );
|
2002-09-02 21:59:58 +00:00
|
|
|
m_textCourse.SetDiffuse( m_color );
|
2002-06-14 22:25:22 +00:00
|
|
|
m_textCourse.TurnRainbowOff();
|
|
|
|
|
|
|
|
|
|
float fSourcePixelWidth = (float)m_textCourse.GetWidestLineWidthInSourcePixels();
|
|
|
|
|
float fMaxTextWidth = 200;
|
|
|
|
|
if( fSourcePixelWidth > fMaxTextWidth )
|
|
|
|
|
m_textCourse.SetZoomX( fMaxTextWidth / fSourcePixelWidth );
|
|
|
|
|
}
|
|
|
|
|
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()
|
|
|
|
|
{
|
2002-05-29 09:47:24 +00:00
|
|
|
// Refresh Grades
|
2002-04-28 20:42:32 +00:00
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
2002-07-23 01:41:40 +00:00
|
|
|
if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
|
2002-05-19 01:59:48 +00:00
|
|
|
{
|
2002-09-02 21:59:58 +00:00
|
|
|
m_GradeDisplay[p].SetDiffuse( D3DXCOLOR(1,1,1,0) );
|
2002-05-19 01:59:48 +00:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( m_pSong ) // this is a song display
|
2002-04-28 20:42:32 +00:00
|
|
|
{
|
2002-07-23 01:41:40 +00:00
|
|
|
const DifficultyClass dc = GAMESTATE->m_PreferredDifficultyClass[p];
|
|
|
|
|
const Grade grade = m_pSong->GetGradeForDifficultyClass( GAMESTATE->GetCurrentStyleDef()->m_NotesType, dc );
|
2002-08-22 09:31:32 +00:00
|
|
|
m_GradeDisplay[p].SetGrade( (PlayerNumber)p, grade );
|
2002-09-02 21:59:58 +00:00
|
|
|
//m_GradeDisplay[p].SetDiffuse( 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-08-22 09:31:32 +00:00
|
|
|
m_GradeDisplay[p].SetGrade( (PlayerNumber)p, GRADE_NO_DATA );
|
2002-04-28 20:42:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
2002-05-29 09:47:24 +00:00
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
}
|
2002-02-09 04:30:27 +00:00
|
|
|
|
2002-05-29 09:47:24 +00:00
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
void WheelItemDisplay::Update( float fDeltaTime )
|
2002-02-05 05:33:33 +00:00
|
|
|
{
|
2002-05-28 20:01:22 +00:00
|
|
|
Actor::Update( 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:
|
2002-06-14 22:25:22 +00:00
|
|
|
{
|
|
|
|
|
m_sprSongBar.Update( fDeltaTime );
|
|
|
|
|
m_MusicStatusDisplay.Update( fDeltaTime );
|
|
|
|
|
m_TextBanner.Update( fDeltaTime );
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
m_GradeDisplay[p].Update( fDeltaTime );
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TYPE_COURSE:
|
2002-04-16 17:31:00 +00:00
|
|
|
m_sprSongBar.Update( fDeltaTime );
|
2002-06-14 22:25:22 +00:00
|
|
|
m_textCourse.Update( fDeltaTime );
|
2002-02-05 05:33:33 +00:00
|
|
|
break;
|
2002-06-14 22:25:22 +00:00
|
|
|
default:
|
|
|
|
|
ASSERT(0);
|
2002-02-05 05:33:33 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
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-08-20 21:00:56 +00:00
|
|
|
m_textSectionName.Draw();
|
2002-02-05 05:33:33 +00:00
|
|
|
break;
|
2002-05-19 01:59:48 +00:00
|
|
|
case TYPE_ROULETTE:
|
|
|
|
|
m_sprSectionBar.Draw();
|
2002-08-20 21:00:56 +00:00
|
|
|
m_textRoulette.Draw();
|
2002-08-19 20:02:30 +00:00
|
|
|
break;
|
|
|
|
|
case TYPE_SONG:
|
|
|
|
|
m_sprSongBar.Draw();
|
|
|
|
|
m_TextBanner.Draw();
|
|
|
|
|
m_MusicStatusDisplay.Draw();
|
|
|
|
|
int p;
|
|
|
|
|
for( p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
m_GradeDisplay[p].Draw();
|
|
|
|
|
if( m_fPercentGray > 0 )
|
2002-06-14 22:25:22 +00:00
|
|
|
{
|
2002-09-02 21:59:58 +00:00
|
|
|
m_sprSongBar.SetGlow( D3DXCOLOR(0,0,0,m_fPercentGray) );
|
|
|
|
|
m_sprSongBar.SetDiffuse( D3DXCOLOR(0,0,0,0) );
|
2002-06-14 22:25:22 +00:00
|
|
|
m_sprSongBar.Draw();
|
2002-09-02 21:59:58 +00:00
|
|
|
m_sprSongBar.SetDiffuse( D3DXCOLOR(0,0,0,1) );
|
|
|
|
|
m_sprSongBar.SetGlow( D3DXCOLOR(0,0,0,0) );
|
2002-06-14 22:25:22 +00:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TYPE_COURSE:
|
2002-08-20 21:00:56 +00:00
|
|
|
m_sprSongBar.Draw();
|
|
|
|
|
m_textCourse.Draw();
|
2002-02-05 05:33:33 +00:00
|
|
|
break;
|
2002-06-14 22:25:22 +00:00
|
|
|
default:
|
|
|
|
|
ASSERT(0);
|
2002-02-05 05:33:33 +00:00
|
|
|
}
|
2002-08-19 20:02:30 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
MusicWheel::MusicWheel()
|
|
|
|
|
{
|
2002-07-31 19:40:40 +00:00
|
|
|
LOG->Trace( "MusicWheel::MusicWheel()" );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-09-03 06:33:08 +00:00
|
|
|
|
|
|
|
|
// update theme metric cache
|
|
|
|
|
g_fItemSpacingY = ITEM_SPACING_Y;
|
|
|
|
|
|
|
|
|
|
|
2002-05-28 20:01:22 +00:00
|
|
|
// for debugging
|
2002-07-23 01:41:40 +00:00
|
|
|
if( GAMESTATE->m_CurStyle == STYLE_NONE )
|
|
|
|
|
GAMESTATE->m_CurStyle = STYLE_DANCE_SINGLE;
|
2002-05-28 20:01:22 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
m_sprSelectionOverlay.Load( THEME->GetPathTo("Graphics","select music song highlight") );
|
2002-01-16 10:01:32 +00:00
|
|
|
m_sprSelectionOverlay.SetXY( 0, 0 );
|
2002-09-02 21:59:58 +00:00
|
|
|
m_sprSelectionOverlay.SetDiffuse( D3DXCOLOR(1,1,1,1) );
|
2002-05-19 01:59:48 +00:00
|
|
|
m_sprSelectionOverlay.SetEffectGlowing( 1.0f, D3DXCOLOR(1,1,1,0.4f), D3DXCOLOR(1,1,1,1) );
|
2002-09-02 21:59:58 +00:00
|
|
|
AddChild( &m_sprSelectionOverlay );
|
2002-05-29 09:47:24 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
m_ScrollBar.SetX( SCROLL_BAR_X );
|
2002-08-26 05:53:48 +00:00
|
|
|
m_ScrollBar.SetBarHeight( SCROLL_BAR_HEIGHT );
|
2002-09-02 21:59:58 +00:00
|
|
|
this->AddChild( &m_ScrollBar );
|
2002-05-01 19:14:55 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
m_soundChangeMusic.Load( THEME->GetPathTo("Sounds","select music change music"), 16 );
|
|
|
|
|
m_soundChangeSort.Load( THEME->GetPathTo("Sounds","select music change sort") );
|
|
|
|
|
m_soundExpand.Load( THEME->GetPathTo("Sounds","select music section expand") );
|
|
|
|
|
m_soundStart.Load( THEME->GetPathTo("Sounds","menu start") );
|
|
|
|
|
m_soundLocked.Load( THEME->GetPathTo("Sounds","select music wheel locked") );
|
2002-06-24 22:04:31 +00:00
|
|
|
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-06-24 22:04:31 +00:00
|
|
|
m_fTimeLeftBeforePlayMusicSample = 0;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
// 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 );
|
|
|
|
|
|
|
|
|
|
m_sExpandedSectionName = "";
|
|
|
|
|
|
|
|
|
|
m_iSelection = 0;
|
|
|
|
|
|
2002-06-24 22:04:31 +00:00
|
|
|
m_WheelState = STATE_SELECTING_MUSIC;
|
|
|
|
|
m_fTimeLeftInState = 0;
|
2002-01-20 08:59:38 +00:00
|
|
|
m_fPositionOffsetFromSelection = 0;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-06-24 22:04:31 +00:00
|
|
|
m_iSwitchesLeftInSpinDown = 0;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-08-01 13:42:56 +00:00
|
|
|
if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() )
|
2002-07-31 04:06:34 +00:00
|
|
|
{
|
2002-08-01 13:42:56 +00:00
|
|
|
// make the preferred group the group of the last song played.
|
|
|
|
|
if( GAMESTATE->m_sPreferredGroup == "ALL MUSIC" )
|
|
|
|
|
GAMESTATE->m_sPreferredGroup = GAMESTATE->m_pCurSong->m_sGroupName;
|
|
|
|
|
|
|
|
|
|
Song* pSong;
|
|
|
|
|
Notes* pNotes;
|
|
|
|
|
PlayerOptions po;
|
|
|
|
|
SongOptions so;
|
|
|
|
|
SONGMAN->GetExtraStageInfo(
|
|
|
|
|
GAMESTATE->IsExtraStage2(),
|
|
|
|
|
GAMESTATE->m_sPreferredGroup,
|
|
|
|
|
GAMESTATE->GetCurrentStyleDef()->m_NotesType,
|
|
|
|
|
pSong,
|
|
|
|
|
pNotes,
|
|
|
|
|
po,
|
|
|
|
|
so );
|
|
|
|
|
GAMESTATE->m_pCurSong = pSong;
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
2002-07-31 04:06:34 +00:00
|
|
|
{
|
2002-08-01 13:42:56 +00:00
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
2002-07-31 04:06:34 +00:00
|
|
|
{
|
2002-08-01 13:42:56 +00:00
|
|
|
GAMESTATE->m_pCurNotes[p] = pNotes;
|
|
|
|
|
GAMESTATE->m_PlayerOptions[p] = po;
|
2002-07-31 04:06:34 +00:00
|
|
|
}
|
|
|
|
|
}
|
2002-08-01 13:42:56 +00:00
|
|
|
GAMESTATE->m_SongOptions = so;
|
2002-07-31 04:06:34 +00:00
|
|
|
}
|
|
|
|
|
|
2002-08-30 21:51:40 +00:00
|
|
|
/* Build all of the wheel item data. Do tihs after selecting
|
|
|
|
|
* the extra stage, so it knows to always display it. */
|
|
|
|
|
for( int so=0; so<NUM_SORT_ORDERS; so++ )
|
|
|
|
|
BuildWheelItemDatas( m_WheelItemDatas[so], SongSortOrder(so) );
|
|
|
|
|
|
2002-08-01 13:42:56 +00:00
|
|
|
// If there is no currently selected song, select one.
|
|
|
|
|
if( GAMESTATE->m_pCurSong == NULL )
|
2002-02-24 01:43:11 +00:00
|
|
|
{
|
2002-08-01 13:42:56 +00:00
|
|
|
CStringArray asGroupNames;
|
|
|
|
|
SONGMAN->GetGroupNames( asGroupNames );
|
|
|
|
|
if( asGroupNames.GetSize() > 0 )
|
|
|
|
|
{
|
2002-08-30 21:51:40 +00:00
|
|
|
/* XXX: Do groups get added if they're empty?
|
|
|
|
|
* This will select songs we can't use; we want the first song
|
|
|
|
|
* that's actually visible. Should we select out wheel data?
|
|
|
|
|
* -glenn */
|
2002-08-01 13:42:56 +00:00
|
|
|
CArray<Song*, Song*> arraySongs;
|
|
|
|
|
SONGMAN->GetSongsInGroup( asGroupNames[0], arraySongs );
|
|
|
|
|
if( arraySongs.GetSize() > 0 ) // still nothing selected
|
|
|
|
|
GAMESTATE->m_pCurSong = arraySongs[0]; // select the first song
|
|
|
|
|
}
|
2002-02-24 01:43:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-08-01 05:11:11 +00:00
|
|
|
// Select the the previously selected song (if any)
|
2002-08-01 13:42:56 +00:00
|
|
|
if( GAMESTATE->m_pCurSong )
|
2002-01-20 09:03:37 +00:00
|
|
|
{
|
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-07-23 01:41:40 +00:00
|
|
|
if( GetCurWheelItemDatas()[i].m_pSong == GAMESTATE->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-08-01 05:11:11 +00:00
|
|
|
// Select the the previously selected course (if any)
|
|
|
|
|
if( GAMESTATE->m_pCurCourse != NULL )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<GetCurWheelItemDatas().GetSize(); i++ )
|
|
|
|
|
{
|
|
|
|
|
if( GetCurWheelItemDatas()[i].m_pCourse == GAMESTATE->m_pCurCourse )
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
// 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-08-13 23:26:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CArray<WheelItemData, WheelItemData&>& MusicWheel::GetCurWheelItemDatas()
|
|
|
|
|
{
|
|
|
|
|
return m_WheelItemDatas[GAMESTATE->m_SongSortOrder];
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-06-30 23:19:33 +00:00
|
|
|
void MusicWheel::BuildWheelItemDatas( CArray<WheelItemData, WheelItemData&> &arrayWheelItemDatas, SongSortOrder so, bool bRoulette )
|
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
|
|
|
|
2002-07-23 01:41:40 +00:00
|
|
|
switch( GAMESTATE->m_PlayMode )
|
2002-02-09 18:53:47 +00:00
|
|
|
{
|
2002-06-14 22:25:22 +00:00
|
|
|
case PLAY_MODE_ARCADE:
|
|
|
|
|
{
|
|
|
|
|
///////////////////////////////////
|
|
|
|
|
// Make an array of Song*, then sort them
|
|
|
|
|
///////////////////////////////////
|
|
|
|
|
CArray<Song*, Song*> arraySongs;
|
|
|
|
|
|
2002-08-30 21:51:40 +00:00
|
|
|
// copy only songs that have at least one Notes for the current GameMode
|
2002-06-14 22:25:22 +00:00
|
|
|
for( i=0; i<SONGMAN->m_pSongs.GetSize(); i++ )
|
|
|
|
|
{
|
|
|
|
|
Song* pSong = SONGMAN->m_pSongs[i];
|
2002-02-09 18:53:47 +00:00
|
|
|
|
2002-08-30 21:51:40 +00:00
|
|
|
/* If we're on an extra stage, and this song is selected, ignore
|
|
|
|
|
* #SELECTABLE. */
|
|
|
|
|
if( pSong != GAMESTATE->m_pCurSong ||
|
|
|
|
|
(!GAMESTATE->IsExtraStage() && !GAMESTATE->IsExtraStage2()) ) {
|
|
|
|
|
/* Hide songs that asked to be hidden via #SELECTABLE. */
|
|
|
|
|
if( !bRoulette && !pSong->NormallyDisplayed() )
|
|
|
|
|
continue;
|
|
|
|
|
if( bRoulette && !pSong->RouletteDisplayed() )
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2002-08-30 04:28:12 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
CArray<Notes*, Notes*> arraySteps;
|
2002-07-23 01:41:40 +00:00
|
|
|
pSong->GetNotesThatMatch( GAMESTATE->GetCurrentStyleDef()->m_NotesType, arraySteps );
|
2002-02-09 18:53:47 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
if( arraySteps.GetSize() > 0 )
|
|
|
|
|
arraySongs.Add( pSong );
|
|
|
|
|
}
|
2002-02-09 18:53:47 +00:00
|
|
|
|
|
|
|
|
|
2002-07-27 19:29:51 +00:00
|
|
|
// sort the songs
|
2002-06-14 22:25:22 +00:00
|
|
|
switch( so )
|
|
|
|
|
{
|
|
|
|
|
case SORT_GROUP:
|
|
|
|
|
SortSongPointerArrayByGroup( arraySongs );
|
|
|
|
|
break;
|
|
|
|
|
case SORT_TITLE:
|
|
|
|
|
SortSongPointerArrayByTitle( arraySongs );
|
|
|
|
|
break;
|
|
|
|
|
case SORT_BPM:
|
|
|
|
|
SortSongPointerArrayByBPM( arraySongs );
|
|
|
|
|
break;
|
|
|
|
|
// case SORT_ARTIST:
|
|
|
|
|
// SortSongPointerArrayByArtist( arraySongs );
|
|
|
|
|
// break;
|
|
|
|
|
case SORT_MOST_PLAYED:
|
|
|
|
|
SortSongPointerArrayByMostPlayed( arraySongs );
|
2002-09-03 00:05:25 +00:00
|
|
|
if( arraySongs.GetSize() > 30 )
|
|
|
|
|
arraySongs.SetSize( 30 );
|
2002-06-14 22:25:22 +00:00
|
|
|
break;
|
|
|
|
|
default:
|
2002-08-20 21:00:56 +00:00
|
|
|
ASSERT(0); // unhandled SortOrder
|
2002-06-14 22:25:22 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
|
|
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
///////////////////////////////////
|
2002-07-27 19:29:51 +00:00
|
|
|
// Build an array of WheelItemDatas from the sorted list of Song*s
|
2002-06-14 22:25:22 +00:00
|
|
|
///////////////////////////////////
|
2002-07-27 19:29:51 +00:00
|
|
|
arrayWheelItemDatas.SetSize( 0, 300 ); // clear out the previous wheel items and set large capacity jumps
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
bool bUseSections;
|
|
|
|
|
switch( so )
|
|
|
|
|
{
|
|
|
|
|
case SORT_MOST_PLAYED: bUseSections = false; break;
|
|
|
|
|
case SORT_BPM: bUseSections = false; break;
|
2002-07-28 16:20:46 +00:00
|
|
|
case SORT_GROUP: bUseSections = GAMESTATE->m_sPreferredGroup == "ALL MUSIC"; break;
|
2002-06-14 22:25:22 +00:00
|
|
|
case SORT_TITLE: bUseSections = true; break;
|
|
|
|
|
default: ASSERT( false );
|
|
|
|
|
}
|
2002-06-30 23:19:33 +00:00
|
|
|
if( bRoulette )
|
|
|
|
|
bUseSections = false;
|
|
|
|
|
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
if( bUseSections )
|
|
|
|
|
{
|
|
|
|
|
// make WheelItemDatas with sections
|
|
|
|
|
CString sLastSection = "";
|
|
|
|
|
D3DXCOLOR colorSection;
|
|
|
|
|
int iCurWheelItem = 0;
|
|
|
|
|
for( int i=0; i< arraySongs.GetSize(); i++ )
|
|
|
|
|
{
|
|
|
|
|
Song* pSong = arraySongs[i];
|
|
|
|
|
CString sThisSection = GetSectionNameFromSongAndSort( pSong, so );
|
|
|
|
|
int iSectionColorIndex = 0;
|
2002-07-28 16:20:46 +00:00
|
|
|
|
|
|
|
|
if( GAMESTATE->m_sPreferredGroup != "ALL MUSIC" && pSong->m_sGroupName != GAMESTATE->m_sPreferredGroup )
|
|
|
|
|
continue;
|
|
|
|
|
if( sThisSection != sLastSection) // new section, make a section item
|
2002-06-14 22:25:22 +00:00
|
|
|
{
|
2002-08-13 23:26:46 +00:00
|
|
|
colorSection = (so==SORT_GROUP) ? SONGMAN->GetGroupColor(pSong->m_sGroupName) : SECTION_COLORS(iSectionColorIndex);
|
2002-06-14 22:25:22 +00:00
|
|
|
iSectionColorIndex = (iSectionColorIndex+1) % NUM_SECTION_COLORS;
|
2002-07-27 19:29:51 +00:00
|
|
|
arrayWheelItemDatas.Add( WheelItemData(TYPE_SECTION, NULL, sThisSection, NULL, colorSection) );
|
2002-06-14 22:25:22 +00:00
|
|
|
sLastSection = sThisSection;
|
|
|
|
|
}
|
|
|
|
|
|
2002-08-27 23:31:41 +00:00
|
|
|
arrayWheelItemDatas.Add( WheelItemData( TYPE_SONG, pSong, sThisSection, NULL, SONGMAN->GetSongColor(pSong)) );
|
2002-06-14 22:25:22 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-07-27 19:29:51 +00:00
|
|
|
for( int i=0; i<arraySongs.GetSize(); i++ )
|
2002-06-14 22:25:22 +00:00
|
|
|
{
|
2002-07-27 19:29:51 +00:00
|
|
|
Song* pSong = arraySongs[i];
|
2002-07-28 16:20:46 +00:00
|
|
|
if( GAMESTATE->m_sPreferredGroup != "ALL MUSIC" && pSong->m_sGroupName != GAMESTATE->m_sPreferredGroup )
|
2002-07-27 19:29:51 +00:00
|
|
|
continue; // skip
|
2002-08-27 23:31:41 +00:00
|
|
|
arrayWheelItemDatas.Add( WheelItemData(TYPE_SONG, pSong, "", NULL, SONGMAN->GetSongColor(pSong)) );
|
2002-06-14 22:25:22 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
2002-02-09 04:30:27 +00:00
|
|
|
}
|
2002-06-14 22:25:22 +00:00
|
|
|
break;
|
|
|
|
|
case PLAY_MODE_ONI:
|
2002-08-01 20:30:40 +00:00
|
|
|
case PLAY_MODE_ENDLESS:
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2002-08-02 09:31:06 +00:00
|
|
|
int i;
|
|
|
|
|
|
2002-07-27 19:29:51 +00:00
|
|
|
CArray<Course*,Course*> apCourses;
|
2002-08-01 20:30:40 +00:00
|
|
|
switch( GAMESTATE->m_PlayMode )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2002-08-01 20:30:40 +00:00
|
|
|
case PLAY_MODE_ONI:
|
2002-08-02 09:31:06 +00:00
|
|
|
for( i=0; i<SONGMAN->m_aOniCourses.GetSize(); i++ )
|
2002-08-01 20:30:40 +00:00
|
|
|
apCourses.Add( &SONGMAN->m_aOniCourses[i] );
|
|
|
|
|
SortCoursePointerArrayByDifficulty( apCourses );
|
|
|
|
|
break;
|
|
|
|
|
case PLAY_MODE_ENDLESS:
|
2002-08-02 09:31:06 +00:00
|
|
|
for( i=0; i<SONGMAN->m_aEndlessCourses.GetSize(); i++ )
|
2002-08-01 20:30:40 +00:00
|
|
|
apCourses.Add( &SONGMAN->m_aEndlessCourses[i] );
|
|
|
|
|
break;
|
2002-04-16 17:31:00 +00:00
|
|
|
}
|
2002-07-29 03:06:55 +00:00
|
|
|
|
|
|
|
|
for( int c=0; c<apCourses.GetSize(); c++ ) // foreach course
|
|
|
|
|
{
|
|
|
|
|
Course* pCourse = apCourses[c];
|
2002-08-01 20:30:40 +00:00
|
|
|
|
|
|
|
|
// check that this course has at least one song playable in the current style
|
|
|
|
|
CArray<Song*,Song*> apSongs;
|
|
|
|
|
CArray<Notes*,Notes*> apNotes;
|
|
|
|
|
CStringArray asModifiers;
|
|
|
|
|
pCourse->GetSongAndNotesForCurrentStyle( apSongs, apNotes, asModifiers );
|
|
|
|
|
|
|
|
|
|
if( apNotes.GetSize() > 0 )
|
|
|
|
|
arrayWheelItemDatas.Add( WheelItemData(TYPE_COURSE, NULL, "", pCourse, pCourse->GetColor()) );
|
2002-07-29 03:06:55 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
2002-06-14 22:25:22 +00:00
|
|
|
default:
|
|
|
|
|
ASSERT(0); // invalid PlayMode
|
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;
|
2002-08-20 21:00:56 +00:00
|
|
|
if( pSong == NULL )
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
WheelItemData& WID = arrayWheelItemDatas[i];
|
|
|
|
|
bool bIsEasy = pSong->IsEasy( GAMESTATE->GetCurrentStyleDef()->m_NotesType );
|
|
|
|
|
WID.m_IconType = bIsEasy ? MusicStatusDisplay::easy : MusicStatusDisplay::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-08-20 21:00:56 +00:00
|
|
|
for( int i=0; i< min(3,arrayWheelItemDatas.GetSize()); i++ )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-08-20 21:00:56 +00:00
|
|
|
WheelItemData& WID = arrayWheelItemDatas[i];
|
|
|
|
|
WID.m_IconType = MusicStatusDisplay::IconType(MusicStatusDisplay::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-08-13 23:26:46 +00:00
|
|
|
arrayWheelItemDatas.Add( WheelItemData(TYPE_SECTION, NULL, "- EMPTY -", NULL, D3DXCOLOR(1,0,0,1)) );
|
2002-05-19 01:59:48 +00:00
|
|
|
}
|
2002-07-23 01:41:40 +00:00
|
|
|
else if( GAMESTATE->m_PlayMode == PLAY_MODE_ARCADE && !bRoulette )
|
2002-05-19 01:59:48 +00:00
|
|
|
{
|
2002-07-27 19:29:51 +00:00
|
|
|
arrayWheelItemDatas.Add( WheelItemData(TYPE_ROULETTE, NULL, "", 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-09-03 06:33:08 +00:00
|
|
|
return (float)roundf( fPosOffsetsFromMiddle*g_fItemSpacingY );
|
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-08-13 23:26:46 +00:00
|
|
|
return m_fTimeLeftInState / FADE_SECONDS;
|
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-08-13 23:26:46 +00:00
|
|
|
return 1 - (m_fTimeLeftInState / FADE_SECONDS);
|
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
|
|
|
|
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-07-23 01:41:40 +00:00
|
|
|
DifficultyClass dc = GAMESTATE->m_PreferredDifficultyClass[pn];
|
|
|
|
|
Song* pSong = GAMESTATE->m_pCurSong;
|
|
|
|
|
Notes* m_pNotes = GAMESTATE->m_pCurNotes[ pn ];
|
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-05-28 20:01:22 +00:00
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
2002-06-24 22:04:31 +00:00
|
|
|
case STATE_SELECTING_MUSIC:
|
|
|
|
|
case STATE_ROULETTE_SPINNING:
|
|
|
|
|
case STATE_ROULETTE_SLOWING_DOWN:
|
|
|
|
|
case STATE_LOCKED:
|
2002-05-28 20:01:22 +00:00
|
|
|
{
|
|
|
|
|
float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS_TO_DRAW/2 + m_fPositionOffsetFromSelection;
|
2002-05-01 19:14:55 +00:00
|
|
|
|
2002-05-28 20:01:22 +00:00
|
|
|
float fY = GetBannerY( fThisBannerPositionOffsetFromSelection );
|
|
|
|
|
if( fY < -SCREEN_HEIGHT/2 || fY > SCREEN_HEIGHT/2 )
|
|
|
|
|
continue; // skip
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-28 20:01:22 +00:00
|
|
|
float fX = GetBannerX( fThisBannerPositionOffsetFromSelection );
|
|
|
|
|
display.SetXY( fX, fY );
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
};
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-06-30 23:19:33 +00:00
|
|
|
if( m_WheelState == STATE_LOCKED && i != NUM_WHEEL_ITEMS_TO_DRAW/2 )
|
|
|
|
|
display.m_fPercentGray = 0.5f;
|
|
|
|
|
else
|
|
|
|
|
display.m_fPercentGray = 0;
|
|
|
|
|
|
2002-02-09 04:30:27 +00:00
|
|
|
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();
|
2002-08-26 05:53:48 +00:00
|
|
|
float fPercentItemsShowing = NUM_WHEEL_ITEMS_TO_DRAW / (float)GetCurWheelItemDatas().GetSize();
|
|
|
|
|
m_ScrollBar.SetPercentage( fScrollPercentage-fPercentItemsShowing/2, fScrollPercentage+fPercentItemsShowing/2 );
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
if( m_WheelState == STATE_ROULETTE_SPINNING )
|
|
|
|
|
{
|
2002-06-30 23:19:33 +00:00
|
|
|
NextMusic( false ); // spin as fast as possible
|
2002-06-24 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( m_fTimeLeftBeforePlayMusicSample > 0 )
|
|
|
|
|
{
|
|
|
|
|
m_fTimeLeftBeforePlayMusicSample -= fDeltaTime;
|
|
|
|
|
if( m_fTimeLeftBeforePlayMusicSample < 0 )
|
|
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_PlaySongSample, 0 );
|
2002-06-14 22:25:22 +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-18 21:19:05 +00:00
|
|
|
case STATE_FLYING_OFF_BEFORE_NEXT_SORT:
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-06-14 22:25:22 +00:00
|
|
|
m_WheelState = STATE_FLYING_ON_AFTER_NEXT_SORT;
|
2002-08-13 23:26:46 +00:00
|
|
|
m_fTimeLeftInState = FADE_SECONDS;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
Song* pPrevSelectedSong = GetCurWheelItemDatas()[m_iSelection].m_pSong;
|
|
|
|
|
CString sPrevSelectedSection = GetCurWheelItemDatas()[m_iSelection].m_sSectionName;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
// change the sort order
|
2002-08-13 23:26:46 +00:00
|
|
|
GAMESTATE->m_SongSortOrder = SongSortOrder( (GAMESTATE->m_SongSortOrder+1) % NUM_SORT_ORDERS );
|
2002-08-20 21:00:56 +00:00
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_SortOrderChanged, 0 );
|
2002-08-13 23:26:46 +00:00
|
|
|
m_sExpandedSectionName = GetSectionNameFromSongAndSort( pPrevSelectedSong, GAMESTATE->m_SongSortOrder );
|
2002-06-14 22:25:22 +00:00
|
|
|
//RebuildWheelItems();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
m_iSelection = 0;
|
2002-02-24 01:43:11 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
if( pPrevSelectedSong != NULL ) // the previous selected item was a song
|
2002-02-24 01:43:11 +00:00
|
|
|
{
|
2002-06-14 22:25:22 +00:00
|
|
|
// find the previously selected song, and select it
|
|
|
|
|
for( i=0; i<GetCurWheelItemDatas().GetSize(); i++ )
|
2002-02-24 01:43:11 +00:00
|
|
|
{
|
2002-06-14 22:25:22 +00:00
|
|
|
if( GetCurWheelItemDatas()[i].m_pSong == pPrevSelectedSong )
|
|
|
|
|
{
|
|
|
|
|
m_iSelection = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-02-24 01:43:11 +00:00
|
|
|
}
|
|
|
|
|
}
|
2002-06-14 22:25:22 +00:00
|
|
|
else // the previously selected item was a section
|
2002-02-24 01:43:11 +00:00
|
|
|
{
|
2002-06-14 22:25:22 +00:00
|
|
|
// find the previously selected song, and select it
|
|
|
|
|
for( i=0; i<GetCurWheelItemDatas().GetSize(); i++ )
|
2002-02-24 01:43:11 +00:00
|
|
|
{
|
2002-06-14 22:25:22 +00:00
|
|
|
if( GetCurWheelItemDatas()[i].m_sSectionName == sPrevSelectedSection )
|
|
|
|
|
{
|
|
|
|
|
m_iSelection = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-02-24 01:43:11 +00:00
|
|
|
}
|
|
|
|
|
}
|
2002-02-09 04:30:27 +00:00
|
|
|
|
2002-08-28 22:42:40 +00:00
|
|
|
// If changed sort to "BEST", put selection on most popular song
|
|
|
|
|
if( GAMESTATE->m_SongSortOrder == SORT_MOST_PLAYED )
|
|
|
|
|
{
|
|
|
|
|
for( i=0; i<GetCurWheelItemDatas().GetSize(); i++ )
|
|
|
|
|
{
|
|
|
|
|
if( GetCurWheelItemDatas()[i].m_pSong != NULL )
|
|
|
|
|
{
|
|
|
|
|
m_iSelection = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_SongChanged, 0 );
|
|
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
RebuildWheelItemDisplays();
|
2002-05-28 20:01:22 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
TweenOnScreen();
|
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-06-24 22:04:31 +00:00
|
|
|
m_WheelState = STATE_SELECTING_MUSIC; // now, wait for input
|
2002-01-16 10:01:32 +00:00
|
|
|
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_fTimeLeftInState = 0;
|
2002-07-31 04:06:34 +00:00
|
|
|
if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() )
|
|
|
|
|
{
|
2002-08-01 13:42:56 +00:00
|
|
|
// if ( m_bUseRandomExtra )
|
|
|
|
|
// {
|
|
|
|
|
// MUSIC->Stop();
|
|
|
|
|
// m_soundExpand.Play();
|
|
|
|
|
// m_WheelState = STATE_ROULETTE_SPINNING;
|
|
|
|
|
// m_SortOrder = SORT_GROUP;
|
2002-09-02 21:59:58 +00:00
|
|
|
// m_MusicSortDisplay.SetDiffuse( D3DXCOLOR(1,1,1,0) );
|
2002-08-01 13:42:56 +00:00
|
|
|
// m_MusicSortDisplay.SetEffectNone();
|
|
|
|
|
// BuildWheelItemDatas( m_WheelItemDatas[SORT_GROUP], SORT_GROUP, true );
|
|
|
|
|
// }
|
|
|
|
|
// else
|
2002-07-31 04:06:34 +00:00
|
|
|
{
|
|
|
|
|
m_WheelState = STATE_LOCKED;
|
|
|
|
|
m_soundStart.Play();
|
|
|
|
|
m_fLockedWheelVelocity = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_WheelState = STATE_SELECTING_MUSIC;
|
|
|
|
|
|
|
|
|
|
}
|
2002-01-18 21:19:05 +00:00
|
|
|
break;
|
|
|
|
|
case STATE_TWEENING_OFF_SCREEN:
|
|
|
|
|
m_WheelState = STATE_WAITING_OFF_SCREEN;
|
|
|
|
|
m_fTimeLeftInState = 0;
|
|
|
|
|
break;
|
2002-06-24 22:04:31 +00:00
|
|
|
case STATE_SELECTING_MUSIC:
|
2002-01-16 10:01:32 +00:00
|
|
|
m_fTimeLeftInState = 0;
|
|
|
|
|
break;
|
2002-06-24 22:04:31 +00:00
|
|
|
case STATE_ROULETTE_SPINNING:
|
|
|
|
|
break;
|
|
|
|
|
case STATE_WAITING_OFF_SCREEN:
|
|
|
|
|
break;
|
|
|
|
|
case STATE_LOCKED:
|
|
|
|
|
break;
|
2002-06-14 22:25:22 +00:00
|
|
|
case STATE_ROULETTE_SLOWING_DOWN:
|
2002-06-24 22:04:31 +00:00
|
|
|
if( m_iSwitchesLeftInSpinDown == 0 )
|
|
|
|
|
{
|
|
|
|
|
m_WheelState = STATE_LOCKED;
|
|
|
|
|
m_fTimeLeftInState = 0;
|
|
|
|
|
m_soundStart.Play();
|
|
|
|
|
m_fLockedWheelVelocity = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_iSwitchesLeftInSpinDown--;
|
|
|
|
|
switch( m_iSwitchesLeftInSpinDown )
|
|
|
|
|
{
|
|
|
|
|
case 4: m_fTimeLeftInState = 0.2f; break;
|
|
|
|
|
case 3: m_fTimeLeftInState = 0.4f; break;
|
|
|
|
|
case 2: m_fTimeLeftInState = 0.8f; break;
|
|
|
|
|
case 1: m_fTimeLeftInState = 1.3f; break;
|
|
|
|
|
case 0: m_fTimeLeftInState = 0.5f; break;
|
|
|
|
|
default: ASSERT(0);
|
|
|
|
|
}
|
|
|
|
|
|
2002-07-31 19:40:40 +00:00
|
|
|
LOG->Trace( "m_iSwitchesLeftInSpinDown id %d, m_fTimeLeftInState is %f", m_iSwitchesLeftInSpinDown, m_fTimeLeftInState );
|
2002-06-24 22:04:31 +00:00
|
|
|
|
|
|
|
|
if( m_iSwitchesLeftInSpinDown < 2 )
|
|
|
|
|
randomf(0,1) >= 0.5f ? NextMusic() : PrevMusic();
|
|
|
|
|
else
|
|
|
|
|
NextMusic();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
ASSERT(0); // all state changes should be handled explitily
|
2002-06-14 22:25:22 +00:00
|
|
|
break;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-01-20 08:59:38 +00:00
|
|
|
|
2002-06-24 22:04:31 +00:00
|
|
|
if( m_WheelState == STATE_LOCKED )
|
|
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection = clamp( m_fPositionOffsetFromSelection, -0.3f, +0.3f );
|
|
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
float fSpringForce = - m_fPositionOffsetFromSelection * LOCKED_INITIAL_VELOCITY;
|
2002-06-24 22:04:31 +00:00
|
|
|
m_fLockedWheelVelocity += fSpringForce;
|
|
|
|
|
|
|
|
|
|
float fDrag = -m_fLockedWheelVelocity * fDeltaTime*4;
|
|
|
|
|
m_fLockedWheelVelocity += fDrag;
|
|
|
|
|
|
|
|
|
|
m_fPositionOffsetFromSelection += m_fLockedWheelVelocity*fDeltaTime;
|
|
|
|
|
|
|
|
|
|
if( fabsf(m_fPositionOffsetFromSelection) < 0.01f && fabsf(m_fLockedWheelVelocity) < 0.01f )
|
|
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection = 0;
|
|
|
|
|
m_fLockedWheelVelocity = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-01-20 08:59:38 +00:00
|
|
|
else
|
|
|
|
|
{
|
2002-06-24 22:04:31 +00:00
|
|
|
// "rotate" wheel toward selected song
|
|
|
|
|
float fSpinSpeed;
|
|
|
|
|
if( m_WheelState == STATE_ROULETTE_SPINNING )
|
2002-08-13 23:26:46 +00:00
|
|
|
fSpinSpeed = 1.0f/ROULETTE_SWITCH_SECONDS;
|
2002-06-24 22:04:31 +00:00
|
|
|
else
|
2002-08-26 05:53:48 +00:00
|
|
|
fSpinSpeed = 0.2f + fabsf(m_fPositionOffsetFromSelection)/SWITCH_SECONDS;
|
2002-06-24 22:04:31 +00:00
|
|
|
|
|
|
|
|
if( m_fPositionOffsetFromSelection > 0 )
|
2002-06-29 11:59:09 +00:00
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection -= fSpinSpeed*fDeltaTime;
|
|
|
|
|
if( m_fPositionOffsetFromSelection < 0 )
|
|
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection = 0;
|
|
|
|
|
m_fTimeLeftBeforePlayMusicSample = SAMPLE_MUSIC_DELAY;
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-06-24 22:04:31 +00:00
|
|
|
else if( m_fPositionOffsetFromSelection < 0 )
|
2002-06-29 11:59:09 +00:00
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection += fSpinSpeed*fDeltaTime;
|
|
|
|
|
if( m_fPositionOffsetFromSelection > 0 )
|
|
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection = 0;
|
|
|
|
|
m_fTimeLeftBeforePlayMusicSample = SAMPLE_MUSIC_DELAY;
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-01-20 08:59:38 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-06-30 23:19:33 +00:00
|
|
|
void MusicWheel::PrevMusic( bool bSendSongChangedMessage )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-06-24 22:04:31 +00:00
|
|
|
if( m_WheelState == STATE_LOCKED )
|
|
|
|
|
{
|
2002-08-13 23:26:46 +00:00
|
|
|
m_fLockedWheelVelocity = LOCKED_INITIAL_VELOCITY;
|
2002-06-24 22:04:31 +00:00
|
|
|
m_soundLocked.Play();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( fabsf(m_fPositionOffsetFromSelection) > 0.5f ) // wheel is busy spinning
|
|
|
|
|
return;
|
|
|
|
|
|
2002-07-11 19:02:26 +00:00
|
|
|
m_fTimeLeftBeforePlayMusicSample = 0;
|
|
|
|
|
|
2002-01-20 07:51:09 +00:00
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
2002-06-24 22:04:31 +00:00
|
|
|
case STATE_SELECTING_MUSIC:
|
2002-06-14 22:25:22 +00:00
|
|
|
case STATE_ROULETTE_SPINNING:
|
|
|
|
|
case STATE_ROULETTE_SLOWING_DOWN:
|
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
|
|
|
|
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-06-14 22:25:22 +00:00
|
|
|
while( (GetCurWheelItemDatas()[m_iSelection].m_WheelItemType == TYPE_SONG || GetCurWheelItemDatas()[m_iSelection].m_WheelItemType == TYPE_COURSE)
|
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;
|
|
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
m_soundChangeMusic.Play();
|
2002-06-30 23:19:33 +00:00
|
|
|
|
|
|
|
|
if( bSendSongChangedMessage )
|
|
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_SongChanged, 0 );
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-06-30 23:19:33 +00:00
|
|
|
void MusicWheel::NextMusic( bool bSendSongChangedMessage )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-06-24 22:04:31 +00:00
|
|
|
if( m_WheelState == STATE_LOCKED )
|
|
|
|
|
{
|
2002-08-13 23:26:46 +00:00
|
|
|
m_fLockedWheelVelocity = -LOCKED_INITIAL_VELOCITY;
|
2002-06-24 22:04:31 +00:00
|
|
|
m_soundLocked.Play();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2002-07-11 19:02:26 +00:00
|
|
|
if( fabsf(m_fPositionOffsetFromSelection) > 0.5f ) // wheel is very busy spinning
|
2002-06-24 22:04:31 +00:00
|
|
|
return;
|
|
|
|
|
|
2002-07-11 19:02:26 +00:00
|
|
|
m_fTimeLeftBeforePlayMusicSample = 0;
|
|
|
|
|
|
2002-01-18 22:18:41 +00:00
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
2002-06-24 22:04:31 +00:00
|
|
|
case STATE_SELECTING_MUSIC:
|
2002-06-14 22:25:22 +00:00
|
|
|
case STATE_ROULETTE_SPINNING:
|
|
|
|
|
case STATE_ROULETTE_SLOWING_DOWN:
|
2002-08-30 21:51:40 +00:00
|
|
|
break; // fall through
|
|
|
|
|
// XXX fall through or not? -glenn
|
2002-01-18 22:18:41 +00:00
|
|
|
default:
|
2002-07-31 19:40:40 +00:00
|
|
|
LOG->Trace( "NextMusic() ignored" );
|
2002-01-18 22:18:41 +00:00
|
|
|
return; // don't continue
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
|
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-06-14 22:25:22 +00:00
|
|
|
while( (GetCurWheelItemDatas()[m_iSelection].m_WheelItemType == TYPE_SONG || GetCurWheelItemDatas()[m_iSelection].m_WheelItemType == TYPE_COURSE)
|
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;
|
|
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
m_soundChangeMusic.Play();
|
2002-06-30 23:19:33 +00:00
|
|
|
|
|
|
|
|
if( bSendSongChangedMessage )
|
|
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_SongChanged, 0 );
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-08-20 21:00:56 +00:00
|
|
|
bool MusicWheel::PrevSort()
|
2002-05-19 01:59:48 +00:00
|
|
|
{
|
2002-08-20 21:00:56 +00:00
|
|
|
return NextSort();
|
2002-05-19 01:59:48 +00:00
|
|
|
}
|
|
|
|
|
|
2002-08-20 21:00:56 +00:00
|
|
|
bool MusicWheel::NextSort()
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-01-18 22:18:41 +00:00
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
2002-06-24 22:04:31 +00:00
|
|
|
case STATE_SELECTING_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:
|
2002-08-20 21:00:56 +00:00
|
|
|
return false; // don't continue
|
2002-01-18 22:18:41 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
m_soundChangeSort.Play();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-28 20:01:22 +00:00
|
|
|
TweenOffScreen();
|
|
|
|
|
|
2002-01-18 21:19:05 +00:00
|
|
|
m_WheelState = STATE_FLYING_OFF_BEFORE_NEXT_SORT;
|
2002-08-13 23:26:46 +00:00
|
|
|
m_fTimeLeftInState = FADE_SECONDS;
|
2002-08-20 21:00:56 +00:00
|
|
|
return true;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
bool MusicWheel::Select() // return true of a playable item was chosen
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-07-31 19:40:40 +00:00
|
|
|
LOG->Trace( "MusicWheel::Select()" );
|
2002-06-24 22:04:31 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
if( m_WheelState == STATE_ROULETTE_SPINNING )
|
|
|
|
|
{
|
|
|
|
|
m_WheelState = STATE_ROULETTE_SLOWING_DOWN;
|
2002-08-13 23:26:46 +00:00
|
|
|
m_iSwitchesLeftInSpinDown = ROULETTE_SLOW_DOWN_SWITCHES/2+1 + rand()%(ROULETTE_SLOW_DOWN_SWITCHES/2);
|
2002-06-24 22:04:31 +00:00
|
|
|
m_fTimeLeftInState = 0.1f;
|
2002-06-14 22:25:22 +00:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
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:
|
2002-08-20 21:00:56 +00:00
|
|
|
StartRoulette();
|
2002-05-19 01:59:48 +00:00
|
|
|
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-08-20 21:00:56 +00:00
|
|
|
void MusicWheel::StartRoulette()
|
|
|
|
|
{
|
|
|
|
|
m_WheelState = STATE_ROULETTE_SPINNING;
|
|
|
|
|
GAMESTATE->m_SongSortOrder = SORT_GROUP;
|
|
|
|
|
BuildWheelItemDatas( m_WheelItemDatas[SORT_GROUP], SORT_GROUP, true );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool MusicWheel::IsRouletting()
|
|
|
|
|
{
|
|
|
|
|
return m_WheelState == STATE_ROULETTE_SPINNING;
|
|
|
|
|
}
|
|
|
|
|
|
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;
|
2002-08-13 23:26:46 +00:00
|
|
|
m_fTimeLeftInState = FADE_SECONDS;
|
2002-05-28 20:01:22 +00:00
|
|
|
|
|
|
|
|
|
2002-05-29 09:47:24 +00:00
|
|
|
float fX, fY;
|
|
|
|
|
|
|
|
|
|
fX = GetBannerX(0);
|
|
|
|
|
fY = GetBannerY(0);
|
2002-08-13 23:26:46 +00:00
|
|
|
m_sprSelectionOverlay.SetXY( fX+320, fY );
|
2002-09-02 21:59:58 +00:00
|
|
|
m_sprSelectionOverlay.BeginTweening( 0.5f ); // sleep
|
|
|
|
|
m_sprSelectionOverlay.BeginTweening( 0.4f, Actor::TWEEN_BIAS_BEGIN );
|
2002-08-13 23:26:46 +00:00
|
|
|
m_sprSelectionOverlay.SetTweenX( fX );
|
2002-05-29 09:47:24 +00:00
|
|
|
|
2002-08-31 06:43:28 +00:00
|
|
|
m_ScrollBar.SetX( SCROLL_BAR_X+30 );
|
2002-09-02 21:59:58 +00:00
|
|
|
m_ScrollBar.BeginTweening( 0.7f ); // sleep
|
|
|
|
|
m_ScrollBar.BeginTweening( 0.2f, Actor::TWEEN_BIAS_BEGIN );
|
2002-08-31 06:43:28 +00:00
|
|
|
m_ScrollBar.SetTweenX( SCROLL_BAR_X );
|
2002-05-28 20:01:22 +00:00
|
|
|
|
|
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS_TO_DRAW; i++ )
|
|
|
|
|
{
|
|
|
|
|
WheelItemDisplay& display = m_WheelItemDisplays[i];
|
|
|
|
|
float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS_TO_DRAW/2 + m_fPositionOffsetFromSelection;
|
|
|
|
|
|
|
|
|
|
float fX = GetBannerX(fThisBannerPositionOffsetFromSelection);
|
|
|
|
|
float fY = GetBannerY(fThisBannerPositionOffsetFromSelection);
|
|
|
|
|
display.SetXY( fX+320, fY );
|
2002-09-02 21:59:58 +00:00
|
|
|
display.BeginTweening( 0.04f*i ); // sleep
|
|
|
|
|
display.BeginTweening( 0.2f, Actor::TWEEN_BIAS_BEGIN );
|
2002-05-28 20:01:22 +00:00
|
|
|
display.SetTweenX( fX );
|
|
|
|
|
}
|
2002-02-07 02:16:14 +00:00
|
|
|
}
|
|
|
|
|
|
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;
|
2002-08-13 23:26:46 +00:00
|
|
|
m_fTimeLeftInState = FADE_SECONDS;
|
2002-05-28 20:01:22 +00:00
|
|
|
|
|
|
|
|
|
2002-05-29 09:47:24 +00:00
|
|
|
float fX, fY;
|
|
|
|
|
fX = GetBannerX(0);
|
|
|
|
|
fY = GetBannerY(0);
|
2002-08-13 23:26:46 +00:00
|
|
|
m_sprSelectionOverlay.SetXY( fX, fY );
|
2002-09-02 21:59:58 +00:00
|
|
|
m_sprSelectionOverlay.BeginTweening( 0 ); // sleep
|
|
|
|
|
m_sprSelectionOverlay.BeginTweening( 0.2f, Actor::TWEEN_BIAS_END );
|
2002-08-13 23:26:46 +00:00
|
|
|
m_sprSelectionOverlay.SetTweenX( fX+320 );
|
2002-05-29 09:47:24 +00:00
|
|
|
|
2002-09-02 21:59:58 +00:00
|
|
|
m_ScrollBar.BeginTweening( 0 );
|
|
|
|
|
m_ScrollBar.BeginTweening( 0.2f, Actor::TWEEN_BIAS_BEGIN );
|
2002-08-31 06:43:28 +00:00
|
|
|
m_ScrollBar.SetTweenX( SCROLL_BAR_X+30 );
|
2002-05-28 20:01:22 +00:00
|
|
|
|
|
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS_TO_DRAW; i++ )
|
|
|
|
|
{
|
|
|
|
|
WheelItemDisplay& display = m_WheelItemDisplays[i];
|
|
|
|
|
float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS_TO_DRAW/2 + m_fPositionOffsetFromSelection;
|
|
|
|
|
|
|
|
|
|
float fX = GetBannerX(fThisBannerPositionOffsetFromSelection);
|
|
|
|
|
float fY = GetBannerY(fThisBannerPositionOffsetFromSelection);
|
|
|
|
|
display.SetXY( fX, fY );
|
2002-09-02 21:59:58 +00:00
|
|
|
display.BeginTweening( 0.04f*i ); // sleep
|
|
|
|
|
display.BeginTweening( 0.2f, Actor::TWEEN_BIAS_END );
|
2002-05-28 20:01:22 +00:00
|
|
|
display.SetTweenX( fX+320 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2002-02-09 18:53:47 +00:00
|
|
|
|
2002-06-24 22:04:31 +00:00
|
|
|
}
|