2003-02-16 04:01:45 +00:00
|
|
|
#include "global.h"
|
2002-01-16 10:01:32 +00:00
|
|
|
/*
|
|
|
|
|
-----------------------------------------------------------------------------
|
2003-02-10 05:30:12 +00:00
|
|
|
Class: MusicWheelItem
|
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
|
|
|
|
2003-02-03 04:50:37 +00:00
|
|
|
Copyright (c) 2001-2003 by the person(s) listed below. All rights reserved.
|
2002-05-01 19:14:55 +00:00
|
|
|
Chris Danford
|
2003-02-03 04:50:37 +00:00
|
|
|
Chris Gomez
|
2003-02-10 05:30:12 +00:00
|
|
|
Glenn Maynard
|
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-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"
|
2003-07-04 18:03:20 +00:00
|
|
|
#include "RageMath.h"
|
2002-11-11 04:53:31 +00:00
|
|
|
#include "ThemeManager.h"
|
2003-04-03 21:29:14 +00:00
|
|
|
#include "song.h"
|
2003-03-31 23:06:15 +00:00
|
|
|
#include "Course.h"
|
2003-04-02 04:41:49 +00:00
|
|
|
#include "RageDisplay.h"
|
2003-04-19 18:51:13 +00:00
|
|
|
#include "RageTextureManager.h"
|
2003-04-19 22:22:31 +00:00
|
|
|
#include "Banner.h"
|
2003-08-03 00:13:55 +00:00
|
|
|
#include "Steps.h"
|
2003-07-07 22:21:31 +00:00
|
|
|
#include "UnlockSystem.h"
|
2003-07-20 08:54:31 +00:00
|
|
|
#include "ModeChoice.h"
|
2003-11-18 18:07:37 +00:00
|
|
|
#include "ActorUtil.h"
|
2004-04-18 07:34:37 +00:00
|
|
|
#include "SongUtil.h"
|
2004-04-18 08:36:04 +00:00
|
|
|
#include "CourseUtil.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
|
|
|
#define FADE_SECONDS THEME->GetMetricF("MusicWheel","FadeSeconds")
|
2003-11-05 04:57:47 +00:00
|
|
|
CachedThemeMetricF SWITCH_SECONDS ("MusicWheel","SwitchSeconds");
|
2002-08-13 23:26:46 +00:00
|
|
|
#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")
|
2003-03-26 19:15:38 +00:00
|
|
|
CachedThemeMetricF ITEM_CURVE_X ("MusicWheel","ItemCurveX");
|
2003-10-08 00:17:17 +00:00
|
|
|
#define USE_LINEAR_WHEEL THEME->GetMetricB("MusicWheel","NoCurving")
|
2003-03-26 19:15:38 +00:00
|
|
|
CachedThemeMetricF ITEM_SPACING_Y ("MusicWheel","ItemSpacingY");
|
2003-11-17 06:20:35 +00:00
|
|
|
CachedThemeMetricF WHEEL_3D_RADIUS ("MusicWheel","Wheel3DRadius");
|
|
|
|
|
CachedThemeMetricF CIRCLE_PERCENT ("MusicWheel","CirclePercent");
|
2002-09-03 06:33:08 +00:00
|
|
|
#define NUM_SECTION_COLORS THEME->GetMetricI("MusicWheel","NumSectionColors")
|
|
|
|
|
#define SECTION_COLORS( i ) THEME->GetMetricC("MusicWheel",ssprintf("SectionColor%d",i+1))
|
2003-02-12 20:55:51 +00:00
|
|
|
#define SONG_REAL_EXTRA_COLOR THEME->GetMetricC("MusicWheel","SongRealExtraColor")
|
2003-10-27 21:50:50 +00:00
|
|
|
#define SORT_MENU_COLOR THEME->GetMetricC("MusicWheel","SortMenuColor")
|
2003-03-13 23:58:30 +00:00
|
|
|
#define SHOW_ROULETTE THEME->GetMetricB("MusicWheel","ShowRoulette")
|
|
|
|
|
#define SHOW_RANDOM THEME->GetMetricB("MusicWheel","ShowRandom")
|
2004-04-26 06:47:03 +00:00
|
|
|
#define SHOW_LEAP THEME->GetMetricB("MusicWheel","ShowLeap")
|
2003-04-02 04:41:49 +00:00
|
|
|
CachedThemeMetricB USE_3D ("MusicWheel","Use3D");
|
2003-06-30 00:34:18 +00:00
|
|
|
CachedThemeMetricI NUM_WHEEL_ITEMS_METRIC ("MusicWheel","NumWheelItems");
|
|
|
|
|
#define NUM_WHEEL_ITEMS min( MAX_WHEEL_ITEMS, (int) NUM_WHEEL_ITEMS_METRIC )
|
2004-02-14 03:31:34 +00:00
|
|
|
#define MOST_PLAYED_SONGS_TO_SHOW THEME->GetMetricI("MusicWheel","MostPlayedSongsToShow")
|
2004-01-11 08:15:44 +00:00
|
|
|
#define SORT_MENU_NAMES THEME->GetMetric ("MusicWheel","SortMenuNames")
|
|
|
|
|
#define SORT_MENU_ACTIONS THEME->GetMetric ("MusicWheel","SortMenuActions")
|
|
|
|
|
#define MODE_MENU_NAMES THEME->GetMetric ("MusicWheel","ModeMenuNames")
|
|
|
|
|
#define MODE_MENU_ACTIONS THEME->GetMetric ("MusicWheel","ModeMenuActions")
|
2003-11-18 18:47:17 +00:00
|
|
|
#define WHEEL_ITEM_ON_DELAY_CENTER THEME->GetMetricF("MusicWheel","WheelItemOnDelayCenter")
|
|
|
|
|
#define WHEEL_ITEM_ON_DELAY_OFFSET THEME->GetMetricF("MusicWheel","WheelItemOnDelayOffset")
|
|
|
|
|
#define WHEEL_ITEM_OFF_DELAY_CENTER THEME->GetMetricF("MusicWheel","WheelItemOffDelayCenter")
|
|
|
|
|
#define WHEEL_ITEM_OFF_DELAY_OFFSET THEME->GetMetricF("MusicWheel","WheelItemOffDelayOffset")
|
2003-09-07 14:29:59 +00:00
|
|
|
// leaving this one under ScreenSelectMusic because that is the only place it takes effect anyway.
|
|
|
|
|
#define DEFAULT_SORT THEME->GetMetric ("ScreenSelectMusic","DefaultSort")
|
|
|
|
|
|
2003-07-20 08:54:31 +00:00
|
|
|
|
2003-01-21 07:04:53 +00:00
|
|
|
const int MAX_WHEEL_SOUND_SPEED = 15;
|
2002-09-03 06:33:08 +00:00
|
|
|
|
2003-02-17 20:38:57 +00:00
|
|
|
|
2004-03-12 08:31:40 +00:00
|
|
|
static const SortOrder SORT_ORDERS[] =
|
2003-06-30 07:09:13 +00:00
|
|
|
{
|
|
|
|
|
SORT_GROUP,
|
|
|
|
|
SORT_TITLE,
|
|
|
|
|
SORT_BPM,
|
|
|
|
|
SORT_MOST_PLAYED,
|
|
|
|
|
SORT_ARTIST,
|
|
|
|
|
};
|
2004-01-11 08:15:44 +00:00
|
|
|
// use ARRAYSIZE(SortOrder)
|
2003-06-30 07:09:13 +00:00
|
|
|
|
2002-01-16 10:01:32 +00:00
|
|
|
MusicWheel::MusicWheel()
|
2004-02-06 03:57:47 +00:00
|
|
|
{
|
|
|
|
|
// update theme metric cache
|
|
|
|
|
SWITCH_SECONDS.Refresh();
|
|
|
|
|
ITEM_CURVE_X.Refresh();
|
|
|
|
|
ITEM_SPACING_Y.Refresh();
|
|
|
|
|
USE_3D.Refresh();
|
|
|
|
|
NUM_WHEEL_ITEMS_METRIC.Refresh();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MusicWheel::Load()
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-07-31 19:40:40 +00:00
|
|
|
LOG->Trace( "MusicWheel::MusicWheel()" );
|
2003-01-27 07:25:29 +00:00
|
|
|
if (GAMESTATE->m_pCurSong != NULL)
|
2003-04-25 00:27:30 +00:00
|
|
|
LOG->Trace( "Current Song: %s", GAMESTATE->m_pCurSong->GetSongDir().c_str() );
|
2003-01-27 07:25:29 +00:00
|
|
|
else
|
|
|
|
|
LOG->Trace( "Current Song: NULL" );
|
2002-09-03 06:33:08 +00:00
|
|
|
|
2003-09-29 02:23:44 +00:00
|
|
|
SONGMAN->UpdateRankingCourses();
|
|
|
|
|
|
2003-11-17 06:20:35 +00:00
|
|
|
if( USE_3D )
|
|
|
|
|
{
|
|
|
|
|
WHEEL_3D_RADIUS.Refresh();
|
|
|
|
|
CIRCLE_PERCENT.Refresh();
|
|
|
|
|
}
|
|
|
|
|
|
2002-05-28 20:01:22 +00:00
|
|
|
// for debugging
|
2003-01-30 07:18:33 +00:00
|
|
|
if( GAMESTATE->m_CurStyle == STYLE_INVALID )
|
2002-07-23 01:41:40 +00:00
|
|
|
GAMESTATE->m_CurStyle = STYLE_DANCE_SINGLE;
|
2002-05-28 20:01:22 +00:00
|
|
|
|
2003-11-26 00:16:50 +00:00
|
|
|
m_sprSelectionOverlay.SetName( "Highlight" );
|
2003-04-12 17:39:27 +00:00
|
|
|
m_sprSelectionOverlay.Load( THEME->GetPathToG("MusicWheel highlight") );
|
2003-11-26 00:16:50 +00:00
|
|
|
this->AddChild( &m_sprSelectionOverlay );
|
|
|
|
|
UtilOnCommand( &m_sprSelectionOverlay, "MusicWheel" );
|
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
|
|
|
|
2003-01-21 02:45:35 +00:00
|
|
|
/* We play a lot of this one, so precache it. */
|
2003-04-12 17:39:27 +00:00
|
|
|
m_soundChangeMusic.Load( THEME->GetPathToS("MusicWheel change"), true );
|
|
|
|
|
m_soundChangeSort.Load( THEME->GetPathToS("MusicWheel sort") );
|
|
|
|
|
m_soundExpand.Load( THEME->GetPathToS("MusicWheel expand") );
|
2004-01-26 03:23:12 +00:00
|
|
|
m_soundLocked.Load( THEME->GetPathToS("MusicWheel locked"), true );
|
2002-06-24 22:04:31 +00:00
|
|
|
|
2002-01-16 10:01:32 +00:00
|
|
|
|
|
|
|
|
m_iSelection = 0;
|
2004-03-12 08:31:40 +00:00
|
|
|
m_LastSortOrder = SORT_INVALID;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
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;
|
2003-02-25 21:10:07 +00:00
|
|
|
m_Moving = 0;
|
|
|
|
|
|
2003-02-01 05:39:48 +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.
|
2003-02-25 00:33:42 +00:00
|
|
|
if( GAMESTATE->m_sPreferredGroup==GROUP_ALL_MUSIC && !PREFSMAN->m_bPickExtraStage )
|
2003-04-23 07:29:03 +00:00
|
|
|
{
|
|
|
|
|
ASSERT(GAMESTATE->m_pCurSong);
|
2002-08-01 13:42:56 +00:00
|
|
|
GAMESTATE->m_sPreferredGroup = GAMESTATE->m_pCurSong->m_sGroupName;
|
2003-04-23 07:29:03 +00:00
|
|
|
}
|
2002-08-01 13:42:56 +00:00
|
|
|
|
|
|
|
|
Song* pSong;
|
2004-05-24 03:41:39 +00:00
|
|
|
Steps* pSteps;
|
2002-08-01 13:42:56 +00:00
|
|
|
PlayerOptions po;
|
|
|
|
|
SongOptions so;
|
|
|
|
|
SONGMAN->GetExtraStageInfo(
|
|
|
|
|
GAMESTATE->IsExtraStage2(),
|
2002-09-06 08:56:28 +00:00
|
|
|
GAMESTATE->GetCurrentStyleDef(),
|
2002-08-01 13:42:56 +00:00
|
|
|
pSong,
|
2004-05-24 03:41:39 +00:00
|
|
|
pSteps,
|
2002-08-01 13:42:56 +00:00
|
|
|
po,
|
|
|
|
|
so );
|
|
|
|
|
GAMESTATE->m_pCurSong = pSong;
|
2004-05-24 06:10:11 +00:00
|
|
|
FOREACH_PlayerNumber( p )
|
2002-07-31 04:06:34 +00:00
|
|
|
{
|
2003-04-10 05:46:31 +00:00
|
|
|
if( GAMESTATE->IsHumanPlayer(p) )
|
2002-07-31 04:06:34 +00:00
|
|
|
{
|
2004-05-24 06:12:17 +00:00
|
|
|
GAMESTATE->m_pCurSteps[p] = pSteps;
|
2002-08-01 13:42:56 +00:00
|
|
|
GAMESTATE->m_PlayerOptions[p] = po;
|
2004-05-24 03:41:39 +00:00
|
|
|
GAMESTATE->m_PreferredDifficulty[p] = pSteps->GetDifficulty();
|
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
|
|
|
}
|
|
|
|
|
|
2004-04-02 01:24:23 +00:00
|
|
|
/* Never start in the sort or mode menu. We won't have a valid m_LastSortOrder
|
|
|
|
|
* and some elements may not initialize correctly. */
|
|
|
|
|
switch( GAMESTATE->m_SortOrder )
|
|
|
|
|
{
|
|
|
|
|
case SORT_SORT_MENU:
|
|
|
|
|
case SORT_MODE_MENU:
|
|
|
|
|
GAMESTATE->m_SortOrder = SORT_INVALID;
|
|
|
|
|
}
|
|
|
|
|
|
2004-03-13 22:18:09 +00:00
|
|
|
switch( GAMESTATE->m_PlayMode )
|
2003-06-30 07:09:13 +00:00
|
|
|
{
|
2004-03-13 22:18:09 +00:00
|
|
|
// in course modes, force a particular sort
|
|
|
|
|
case PLAY_MODE_ONI: GAMESTATE->m_SortOrder = SORT_ONI_COURSES; break;
|
|
|
|
|
case PLAY_MODE_NONSTOP: GAMESTATE->m_SortOrder = SORT_NONSTOP_COURSES; break;
|
|
|
|
|
case PLAY_MODE_ENDLESS: GAMESTATE->m_SortOrder = SORT_ENDLESS_COURSES; break;
|
|
|
|
|
default:
|
|
|
|
|
// if no player preferred sort, fall back to theme default
|
|
|
|
|
if( GAMESTATE->m_SortOrder == SORT_INVALID )
|
2003-07-20 08:54:31 +00:00
|
|
|
{
|
2004-03-13 22:18:09 +00:00
|
|
|
GAMESTATE->m_SortOrder = StringToSortOrder( DEFAULT_SORT );
|
|
|
|
|
ASSERT( GAMESTATE->m_SortOrder != SORT_INVALID );
|
2003-07-20 08:54:31 +00:00
|
|
|
}
|
2004-03-13 22:18:09 +00:00
|
|
|
|
|
|
|
|
break;
|
2003-06-30 07:09:13 +00:00
|
|
|
}
|
2003-05-17 23:04:14 +00:00
|
|
|
|
2003-07-21 21:47:50 +00:00
|
|
|
/* Update for SORT_MOST_PLAYED. */
|
2004-02-27 21:29:31 +00:00
|
|
|
SONGMAN->UpdateBest();
|
|
|
|
|
|
|
|
|
|
/* Sort SONGMAN's songs by CompareSongPointersByTitle, so we can do other sorts (with
|
|
|
|
|
* stable_sort) from its output, and title will be the secondary sort, without having
|
|
|
|
|
* to re-sort by title each time. */
|
|
|
|
|
SONGMAN->SortSongs();
|
2003-07-21 21:47:50 +00:00
|
|
|
|
2003-12-12 04:46:46 +00:00
|
|
|
RageTimer timer;
|
|
|
|
|
CString times;
|
|
|
|
|
/* Build all of the wheel item data. Do this after selecting
|
2002-08-30 21:51:40 +00:00
|
|
|
* the extra stage, so it knows to always display it. */
|
|
|
|
|
for( int so=0; so<NUM_SORT_ORDERS; so++ )
|
2003-12-12 04:46:46 +00:00
|
|
|
{
|
2004-03-12 08:31:40 +00:00
|
|
|
BuildWheelItemDatas( m_WheelItemDatas[so], SortOrder(so) );
|
2003-12-12 04:46:46 +00:00
|
|
|
times += ssprintf( "%i:%.3f ", so, timer.GetDeltaTime() );
|
|
|
|
|
}
|
|
|
|
|
LOG->Trace( "took: %s", times.c_str() );
|
2002-08-30 21:51:40 +00:00
|
|
|
|
2003-08-07 02:35:08 +00:00
|
|
|
// HACK: invalidate currently selected song in the case that it
|
|
|
|
|
// cannot be played due to lack of stages remaining
|
2003-08-08 20:37:17 +00:00
|
|
|
// checking for event mode shouldn't be necessary here
|
|
|
|
|
// but someone mentioned it does it sometimes.
|
2003-08-07 07:19:45 +00:00
|
|
|
if( GAMESTATE->m_pCurSong != NULL &&
|
|
|
|
|
SongManager::GetNumStagesForSong( GAMESTATE->m_pCurSong ) + GAMESTATE->m_iCurrentStageIndex > PREFSMAN->m_iNumArcadeStages
|
2003-08-08 20:37:17 +00:00
|
|
|
&& !PREFSMAN->m_bEventMode
|
2003-08-07 07:19:45 +00:00
|
|
|
&& !GAMESTATE->IsExtraStage() && !GAMESTATE->IsExtraStage2() )
|
|
|
|
|
GAMESTATE->m_pCurSong = NULL;
|
2003-08-07 02:35:08 +00:00
|
|
|
|
2002-08-01 05:11:11 +00:00
|
|
|
// Select the the previously selected song (if any)
|
2004-02-18 23:53:43 +00:00
|
|
|
if( !SelectSongOrCourse() )
|
|
|
|
|
SetOpenGroup("");
|
2003-01-02 02:59:25 +00:00
|
|
|
|
|
|
|
|
// rebuild the WheelItems that appear on screen
|
2003-03-31 23:06:15 +00:00
|
|
|
RebuildMusicWheelItems();
|
2003-01-02 02:59:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MusicWheel::~MusicWheel()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2004-02-18 23:53:43 +00:00
|
|
|
/* If a song or course is set in GAMESTATE and avaialble, select it. Otherwise, choose the
|
|
|
|
|
* first available song or course. Return true if an item was set, false if no items are
|
|
|
|
|
* available. */
|
|
|
|
|
bool MusicWheel::SelectSongOrCourse()
|
|
|
|
|
{
|
|
|
|
|
if( GAMESTATE->m_pCurSong && SelectSong( GAMESTATE->m_pCurSong ) )
|
|
|
|
|
return true;
|
|
|
|
|
if( GAMESTATE->m_pCurCourse && SelectCourse( GAMESTATE->m_pCurCourse ) )
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
// Select the first selectable song based on the sort order...
|
2004-03-12 08:31:40 +00:00
|
|
|
vector<WheelItemData> &wiWheelItems = m_WheelItemDatas[GAMESTATE->m_SortOrder];
|
2004-02-18 23:53:43 +00:00
|
|
|
for( unsigned i = 0; i < wiWheelItems.size(); i++ )
|
|
|
|
|
{
|
|
|
|
|
if( wiWheelItems[i].m_pSong )
|
|
|
|
|
return SelectSong( wiWheelItems[i].m_pSong );
|
|
|
|
|
else if ( wiWheelItems[i].m_pCourse )
|
|
|
|
|
return SelectCourse( wiWheelItems[i].m_pCourse );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOG->Trace( "MusicWheel::MusicWheel() - No selectable songs or courses found in WheelData" );
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool MusicWheel::SelectSong( Song *p )
|
2003-01-02 02:59:25 +00:00
|
|
|
{
|
|
|
|
|
if(p == NULL)
|
|
|
|
|
return false;
|
|
|
|
|
|
2004-02-18 23:53:43 +00:00
|
|
|
GAMESTATE->m_pCurSong = p;
|
|
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
unsigned i;
|
2004-03-12 08:31:40 +00:00
|
|
|
vector<WheelItemData> &from = m_WheelItemDatas[GAMESTATE->m_SortOrder];
|
2003-01-02 02:59:25 +00:00
|
|
|
for( i=0; i<from.size(); i++ )
|
2002-01-20 09:03:37 +00:00
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
if( from[i].m_pSong == p )
|
2002-02-09 18:53:47 +00:00
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
// make its group the currently expanded group
|
|
|
|
|
SetOpenGroup(from[i].m_sSectionName);
|
|
|
|
|
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
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
if(i == from.size())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
for( i=0; i<m_CurWheelItemData.size(); i++ )
|
2002-08-01 05:11:11 +00:00
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
if( m_CurWheelItemData[i]->m_pSong == p )
|
|
|
|
|
m_iSelection = i; // select it
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2004-02-18 23:53:43 +00:00
|
|
|
bool MusicWheel::SelectCourse( Course *p )
|
2003-01-02 02:59:25 +00:00
|
|
|
{
|
|
|
|
|
if(p == NULL)
|
|
|
|
|
return false;
|
|
|
|
|
|
2004-02-18 23:53:43 +00:00
|
|
|
GAMESTATE->m_pCurCourse = p;
|
|
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
unsigned i;
|
2004-03-12 08:31:40 +00:00
|
|
|
vector<WheelItemData> &from = m_WheelItemDatas[GAMESTATE->m_SortOrder];
|
2003-01-02 02:59:25 +00:00
|
|
|
for( i=0; i<from.size(); i++ )
|
|
|
|
|
{
|
|
|
|
|
if( from[i].m_pCourse == p )
|
2002-08-01 05:11:11 +00:00
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
// make its group the currently expanded group
|
|
|
|
|
SetOpenGroup(from[i].m_sSectionName);
|
|
|
|
|
break;
|
2002-08-01 05:11:11 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
if(i == from.size())
|
|
|
|
|
return false;
|
2002-02-06 05:13:39 +00:00
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
for( i=0; i<m_CurWheelItemData.size(); i++ )
|
|
|
|
|
{
|
|
|
|
|
if( m_CurWheelItemData[i]->m_pCourse == p )
|
|
|
|
|
m_iSelection = i; // select it
|
|
|
|
|
}
|
2002-08-13 23:26:46 +00:00
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
return true;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2004-03-12 08:31:40 +00:00
|
|
|
bool MusicWheel::SelectSort( SortOrder so )
|
2003-06-16 17:28:58 +00:00
|
|
|
{
|
|
|
|
|
if(so == SORT_INVALID)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
unsigned i;
|
2004-03-12 08:31:40 +00:00
|
|
|
vector<WheelItemData> &from = m_WheelItemDatas[GAMESTATE->m_SortOrder];
|
2003-06-16 17:28:58 +00:00
|
|
|
for( i=0; i<from.size(); i++ )
|
|
|
|
|
{
|
2004-03-12 08:31:40 +00:00
|
|
|
if( from[i].m_SortOrder != so )
|
2003-07-20 08:54:31 +00:00
|
|
|
continue;
|
2003-09-27 19:24:21 +00:00
|
|
|
if( !from[i].m_Action.DescribesCurrentModeForAllPlayers() )
|
2003-07-20 08:54:31 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
// make its group the currently expanded group
|
|
|
|
|
SetOpenGroup(from[i].m_sSectionName);
|
|
|
|
|
break;
|
2003-06-16 17:28:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(i == from.size())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
for( i=0; i<m_CurWheelItemData.size(); i++ )
|
|
|
|
|
{
|
2004-03-12 08:31:40 +00:00
|
|
|
if( m_CurWheelItemData[i]->m_SortOrder != so )
|
2003-07-20 08:54:31 +00:00
|
|
|
continue;
|
2003-09-27 19:24:21 +00:00
|
|
|
if( !m_CurWheelItemData[i]->m_Action.DescribesCurrentModeForAllPlayers() )
|
2003-07-20 08:54:31 +00:00
|
|
|
continue;
|
|
|
|
|
m_iSelection = i; // select it
|
|
|
|
|
break;
|
2003-06-16 17:28:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2004-03-12 08:31:40 +00:00
|
|
|
void MusicWheel::GetSongList(vector<Song*> &arraySongs, SortOrder so, CString sPreferredGroup )
|
2003-01-03 03:24:00 +00:00
|
|
|
{
|
2003-02-03 05:53:59 +00:00
|
|
|
vector<Song*> apAllSongs;
|
2003-05-17 23:04:14 +00:00
|
|
|
// if( so==SORT_PREFERRED && GAMESTATE->m_sPreferredGroup!=GROUP_ALL_MUSIC)
|
|
|
|
|
// SONGMAN->GetSongs( apAllSongs, GAMESTATE->m_sPreferredGroup, GAMESTATE->GetNumStagesLeft() );
|
|
|
|
|
// else
|
|
|
|
|
// SONGMAN->GetSongs( apAllSongs, GAMESTATE->GetNumStagesLeft() );
|
2004-03-07 00:22:03 +00:00
|
|
|
if( so == SORT_MOST_PLAYED )
|
|
|
|
|
SONGMAN->GetBestSongs( apAllSongs, GAMESTATE->m_sPreferredGroup, GAMESTATE->GetNumStagesLeft() );
|
|
|
|
|
else
|
|
|
|
|
SONGMAN->GetSongs( apAllSongs, GAMESTATE->m_sPreferredGroup, GAMESTATE->GetNumStagesLeft() );
|
2003-02-03 05:53:59 +00:00
|
|
|
|
2003-08-03 00:13:55 +00:00
|
|
|
// copy only songs that have at least one Steps for the current GameMode
|
2003-02-03 05:53:59 +00:00
|
|
|
for( unsigned i=0; i<apAllSongs.size(); i++ )
|
2003-01-03 03:24:00 +00:00
|
|
|
{
|
2003-02-03 05:53:59 +00:00
|
|
|
Song* pSong = apAllSongs[i];
|
2003-01-03 03:24:00 +00:00
|
|
|
|
2004-01-25 16:24:34 +00:00
|
|
|
/* If we're on an extra stage, and this song is selected, ignore #SELECTABLE. */
|
2003-01-03 03:24:00 +00:00
|
|
|
if( pSong != GAMESTATE->m_pCurSong ||
|
2004-02-26 20:35:46 +00:00
|
|
|
(!GAMESTATE->IsExtraStage() && !GAMESTATE->IsExtraStage2()) )
|
|
|
|
|
{
|
2003-01-03 03:24:00 +00:00
|
|
|
/* Hide songs that asked to be hidden via #SELECTABLE. */
|
2003-04-19 18:51:13 +00:00
|
|
|
if( so!=SORT_ROULETTE && !pSong->NormallyDisplayed() )
|
2003-01-03 03:24:00 +00:00
|
|
|
continue;
|
2004-02-26 20:35:46 +00:00
|
|
|
if( so!=SORT_ROULETTE && UNLOCKMAN->SongIsRouletteOnly( pSong ) )
|
|
|
|
|
continue;
|
|
|
|
|
/* Don't show in roulette if #SELECTABLE:NO. */
|
|
|
|
|
if( so==SORT_ROULETTE && !pSong->RouletteDisplayed() )
|
2003-07-07 10:22:53 +00:00
|
|
|
continue;
|
2003-01-03 03:24:00 +00:00
|
|
|
}
|
|
|
|
|
|
2003-07-18 08:04:47 +00:00
|
|
|
// If we're using unlocks, check it here to prevent from being shown
|
2004-02-21 01:06:35 +00:00
|
|
|
if( so!=SORT_ROULETTE && UNLOCKMAN->SongIsLocked(pSong) )
|
2003-07-18 08:04:47 +00:00
|
|
|
continue;
|
|
|
|
|
|
2003-08-03 00:13:55 +00:00
|
|
|
vector<Steps*> arraySteps;
|
2004-02-27 21:29:31 +00:00
|
|
|
pSong->GetSteps( arraySteps, GAMESTATE->GetCurrentStyleDef()->m_StepsType, DIFFICULTY_INVALID, -1, -1, "", 1 );
|
2003-01-03 03:24:00 +00:00
|
|
|
|
|
|
|
|
if( !arraySteps.empty() )
|
|
|
|
|
arraySongs.push_back( pSong );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-06-19 06:24:41 +00:00
|
|
|
|
|
|
|
|
|
2003-02-11 23:52:18 +00:00
|
|
|
|
2004-03-12 08:31:40 +00:00
|
|
|
void MusicWheel::BuildWheelItemDatas( vector<WheelItemData> &arrayWheelItemDatas, SortOrder so )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-10-31 02:46:42 +00:00
|
|
|
unsigned i;
|
2002-02-09 04:30:27 +00:00
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
switch( so )
|
2002-02-09 18:53:47 +00:00
|
|
|
{
|
2004-01-11 08:15:44 +00:00
|
|
|
case SORT_SORT_MENU:
|
|
|
|
|
case SORT_MODE_MENU:
|
2003-07-20 08:54:31 +00:00
|
|
|
{
|
2003-07-20 05:13:45 +00:00
|
|
|
arrayWheelItemDatas.clear(); // clear out the previous wheel items
|
2004-01-11 08:15:44 +00:00
|
|
|
CString sNames = so==SORT_SORT_MENU ? SORT_MENU_NAMES : MODE_MENU_NAMES;
|
|
|
|
|
CString sActions = so==SORT_SORT_MENU ? SORT_MENU_ACTIONS : MODE_MENU_ACTIONS;
|
2003-07-20 08:54:31 +00:00
|
|
|
vector<CString> Names, Actions;
|
2003-10-28 21:10:57 +00:00
|
|
|
split( sNames, ":", Names );
|
|
|
|
|
split( sActions, ":", Actions );
|
2003-07-20 08:54:31 +00:00
|
|
|
if( Names.size() != Actions.size() )
|
|
|
|
|
RageException::Throw("MusicWheel::MenuNames and MusicWheel::MenuActions must have the same number of components");
|
|
|
|
|
|
|
|
|
|
for( i=0; i<Names.size(); ++i )
|
2002-06-14 22:25:22 +00:00
|
|
|
{
|
2003-07-20 08:54:31 +00:00
|
|
|
/* Look for sort names. */
|
|
|
|
|
vector<CString> parts;
|
2003-10-28 21:10:57 +00:00
|
|
|
split( Actions[i], ";", parts );
|
2003-07-20 08:54:31 +00:00
|
|
|
|
2004-03-12 08:31:40 +00:00
|
|
|
SortOrder so = SORT_GROUP;
|
2003-10-28 21:10:57 +00:00
|
|
|
for( unsigned j = 0; j < parts.size(); ++j )
|
|
|
|
|
{
|
|
|
|
|
CStringArray asBits;
|
|
|
|
|
split( parts[j], ",", asBits );
|
|
|
|
|
if( !asBits[0].CompareNoCase("sort") )
|
2004-03-12 08:31:40 +00:00
|
|
|
so = StringToSortOrder( asBits[1] );
|
2003-10-28 21:10:57 +00:00
|
|
|
}
|
2003-07-20 08:54:31 +00:00
|
|
|
|
2003-10-27 21:50:50 +00:00
|
|
|
WheelItemData wid( TYPE_SORT, NULL, "", NULL, SORT_MENU_COLOR, so );
|
2003-07-20 08:54:31 +00:00
|
|
|
wid.m_sLabel = Names[i];
|
2003-09-25 05:56:38 +00:00
|
|
|
wid.m_Action.Load( i, Actions[i] );
|
2003-07-20 08:54:31 +00:00
|
|
|
|
2003-07-20 09:15:46 +00:00
|
|
|
switch( so )
|
|
|
|
|
{
|
|
|
|
|
case SORT_ALL_COURSES:
|
|
|
|
|
case SORT_NONSTOP_COURSES:
|
|
|
|
|
case SORT_ONI_COURSES:
|
|
|
|
|
case SORT_ENDLESS_COURSES:
|
|
|
|
|
/* Don't display course modes after the first stage. */
|
|
|
|
|
if( !PREFSMAN->m_bEventMode && GAMESTATE->m_iCurrentStageIndex )
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2004-03-20 18:11:58 +00:00
|
|
|
if( !wid.m_Action.IsPlayable() )
|
|
|
|
|
continue;
|
|
|
|
|
|
2003-07-20 08:54:31 +00:00
|
|
|
arrayWheelItemDatas.push_back( wid );
|
|
|
|
|
}
|
2003-07-20 05:13:45 +00:00
|
|
|
break;
|
2003-07-20 08:54:31 +00:00
|
|
|
}
|
2003-07-20 05:13:45 +00:00
|
|
|
case SORT_PREFERRED:
|
|
|
|
|
case SORT_ROULETTE:
|
|
|
|
|
case SORT_GROUP:
|
|
|
|
|
case SORT_TITLE:
|
|
|
|
|
case SORT_BPM:
|
|
|
|
|
case SORT_MOST_PLAYED:
|
|
|
|
|
case SORT_GRADE:
|
|
|
|
|
case SORT_ARTIST:
|
|
|
|
|
case SORT_EASY_METER:
|
|
|
|
|
case SORT_MEDIUM_METER:
|
|
|
|
|
case SORT_HARD_METER:
|
2004-01-27 05:37:43 +00:00
|
|
|
case SORT_CHALLENGE_METER:
|
2003-07-20 05:13:45 +00:00
|
|
|
{
|
|
|
|
|
///////////////////////////////////
|
|
|
|
|
// Make an array of Song*, then sort them
|
|
|
|
|
///////////////////////////////////
|
|
|
|
|
vector<Song*> arraySongs;
|
|
|
|
|
|
|
|
|
|
GetSongList(arraySongs, so, GAMESTATE->m_sPreferredGroup );
|
2002-02-09 18:53:47 +00:00
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
bool bUseSections = true;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
// sort the songs
|
|
|
|
|
switch( so )
|
|
|
|
|
{
|
|
|
|
|
case SORT_PREFERRED:
|
|
|
|
|
case SORT_ROULETTE:
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayByGroupAndDifficulty( arraySongs );
|
2003-07-20 05:13:45 +00:00
|
|
|
bUseSections = false;
|
|
|
|
|
break;
|
|
|
|
|
case SORT_GROUP:
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayByGroupAndTitle( arraySongs );
|
2003-07-20 05:13:45 +00:00
|
|
|
bUseSections = GAMESTATE->m_sPreferredGroup == GROUP_ALL_MUSIC;
|
|
|
|
|
break;
|
|
|
|
|
case SORT_TITLE:
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayByTitle( arraySongs );
|
2003-07-20 05:13:45 +00:00
|
|
|
break;
|
|
|
|
|
case SORT_BPM:
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayByBPM( arraySongs );
|
2003-07-20 05:13:45 +00:00
|
|
|
break;
|
|
|
|
|
case SORT_MOST_PLAYED:
|
2004-03-07 00:22:03 +00:00
|
|
|
if( (int) arraySongs.size() > MOST_PLAYED_SONGS_TO_SHOW )
|
|
|
|
|
arraySongs.erase( arraySongs.begin()+MOST_PLAYED_SONGS_TO_SHOW, arraySongs.end() );
|
2003-07-20 05:13:45 +00:00
|
|
|
bUseSections = false;
|
|
|
|
|
break;
|
|
|
|
|
case SORT_GRADE:
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayByGrade( arraySongs );
|
2003-07-20 05:13:45 +00:00
|
|
|
break;
|
|
|
|
|
case SORT_ARTIST:
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayByArtist( arraySongs );
|
2003-07-20 05:13:45 +00:00
|
|
|
break;
|
|
|
|
|
case SORT_EASY_METER:
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_EASY );
|
2003-07-20 05:13:45 +00:00
|
|
|
break;
|
|
|
|
|
case SORT_MEDIUM_METER:
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_MEDIUM );
|
2003-07-20 05:13:45 +00:00
|
|
|
break;
|
|
|
|
|
case SORT_HARD_METER:
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_HARD );
|
2003-07-20 05:13:45 +00:00
|
|
|
break;
|
2004-01-27 05:37:43 +00:00
|
|
|
case SORT_CHALLENGE_METER:
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayByMeter( arraySongs, DIFFICULTY_CHALLENGE );
|
2004-01-27 05:37:43 +00:00
|
|
|
break;
|
2003-07-20 05:13:45 +00:00
|
|
|
default:
|
|
|
|
|
ASSERT(0); // unhandled SortOrder
|
|
|
|
|
}
|
2002-02-09 04:30:27 +00:00
|
|
|
|
2002-04-16 17:31:00 +00:00
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
///////////////////////////////////
|
|
|
|
|
// Build an array of WheelItemDatas from the sorted list of Song*'s
|
|
|
|
|
///////////////////////////////////
|
|
|
|
|
arrayWheelItemDatas.clear(); // clear out the previous wheel items
|
2003-12-12 03:54:26 +00:00
|
|
|
arrayWheelItemDatas.reserve( arraySongs.size() );
|
2002-06-30 23:19:33 +00:00
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
if( PREFSMAN->m_MusicWheelUsesSections == PrefsManager::NEVER || (so != SORT_TITLE && PREFSMAN->m_MusicWheelUsesSections == PrefsManager::ABC_ONLY ))
|
|
|
|
|
bUseSections = false;
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
if( bUseSections )
|
|
|
|
|
{
|
|
|
|
|
// Sorting twice isn't necessary. Instead, modify the compatator functions
|
|
|
|
|
// in Song.cpp to have the desired effect. -Chris
|
|
|
|
|
/* Keeping groups together with the sorts is tricky and brittle; we
|
|
|
|
|
* keep getting OTHER split up without this. However, it puts the
|
|
|
|
|
* Grade and BPM sorts in the wrong order, and they're already correct,
|
|
|
|
|
* so don't re-sort for them. */
|
2003-06-16 20:23:07 +00:00
|
|
|
// /* We're using sections, so use the section name as the top-level
|
|
|
|
|
// * sort. */
|
2004-03-07 07:03:37 +00:00
|
|
|
if( so != SORT_GRADE && so != SORT_BPM )
|
2004-04-18 07:34:37 +00:00
|
|
|
SongUtil::SortSongPointerArrayBySectionName(arraySongs, so);
|
2003-02-11 23:52:18 +00:00
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
// make WheelItemDatas with sections
|
|
|
|
|
CString sLastSection = "";
|
2004-01-11 21:53:36 +00:00
|
|
|
int iSectionColorIndex = 0;
|
2003-07-20 05:13:45 +00:00
|
|
|
for( unsigned i=0; i< arraySongs.size(); i++ )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2003-07-20 05:13:45 +00:00
|
|
|
Song* pSong = arraySongs[i];
|
2004-04-18 07:34:37 +00:00
|
|
|
CString sThisSection = SongUtil::GetSectionNameFromSongAndSort( pSong, so );
|
2003-07-20 05:13:45 +00:00
|
|
|
|
|
|
|
|
if( sThisSection != sLastSection) // new section, make a section item
|
2002-06-14 22:25:22 +00:00
|
|
|
{
|
2004-01-11 21:53:36 +00:00
|
|
|
RageColor colorSection = (so==SORT_GROUP) ? SONGMAN->GetGroupColor(pSong->m_sGroupName) : SECTION_COLORS(iSectionColorIndex);
|
2003-07-20 05:13:45 +00:00
|
|
|
iSectionColorIndex = (iSectionColorIndex+1) % NUM_SECTION_COLORS;
|
|
|
|
|
arrayWheelItemDatas.push_back( WheelItemData(TYPE_SECTION, NULL, sThisSection, NULL, colorSection, SORT_INVALID) );
|
|
|
|
|
sLastSection = sThisSection;
|
2002-06-14 22:25:22 +00:00
|
|
|
}
|
2002-10-09 06:57:37 +00:00
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
arrayWheelItemDatas.push_back( WheelItemData( TYPE_SONG, pSong, sThisSection, NULL, SONGMAN->GetSongColor(pSong), SORT_INVALID) );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( unsigned i=0; i<arraySongs.size(); i++ )
|
2003-02-25 00:33:42 +00:00
|
|
|
{
|
2003-07-20 05:13:45 +00:00
|
|
|
Song* pSong = arraySongs[i];
|
|
|
|
|
arrayWheelItemDatas.push_back( WheelItemData(TYPE_SONG, pSong, "", NULL, SONGMAN->GetSongColor(pSong), SORT_INVALID) );
|
2003-02-25 00:33:42 +00:00
|
|
|
}
|
2003-07-20 05:13:45 +00:00
|
|
|
}
|
2002-10-10 04:11:30 +00:00
|
|
|
|
2004-04-26 06:47:03 +00:00
|
|
|
if( so != SORT_ROULETTE )
|
|
|
|
|
{
|
|
|
|
|
if( SHOW_ROULETTE )
|
|
|
|
|
arrayWheelItemDatas.push_back( WheelItemData(TYPE_ROULETTE, NULL, "", NULL, RageColor(1,0,0,1), SORT_INVALID) );
|
|
|
|
|
if( SHOW_RANDOM )
|
|
|
|
|
arrayWheelItemDatas.push_back( WheelItemData(TYPE_RANDOM, NULL, "", NULL, RageColor(1,0,0,1), SORT_INVALID) );
|
|
|
|
|
if( SHOW_LEAP )
|
|
|
|
|
arrayWheelItemDatas.push_back( WheelItemData(TYPE_LEAP, NULL, "", NULL, RageColor(1,0,0,1), SORT_INVALID) );
|
|
|
|
|
}
|
2003-02-25 00:33:42 +00:00
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
// HACK: Add extra stage item if it isn't already present on the music wheel
|
|
|
|
|
if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() )
|
|
|
|
|
{
|
|
|
|
|
Song* pSong;
|
2004-05-24 03:41:39 +00:00
|
|
|
Steps* pSteps;
|
2003-07-20 05:13:45 +00:00
|
|
|
PlayerOptions po;
|
|
|
|
|
SongOptions so;
|
2004-05-24 03:41:39 +00:00
|
|
|
SONGMAN->GetExtraStageInfo( GAMESTATE->IsExtraStage2(), GAMESTATE->GetCurrentStyleDef(), pSong, pSteps, po, so );
|
2003-07-20 05:13:45 +00:00
|
|
|
|
|
|
|
|
bool bFoundExtraSong = false;
|
|
|
|
|
|
|
|
|
|
for( unsigned i=0; i<arrayWheelItemDatas.size(); i++ )
|
|
|
|
|
{
|
|
|
|
|
if( arrayWheelItemDatas[i].m_pSong == pSong )
|
2002-10-10 04:11:30 +00:00
|
|
|
{
|
2003-07-20 05:13:45 +00:00
|
|
|
/* Change the song color. */
|
|
|
|
|
arrayWheelItemDatas[i].m_color = SONG_REAL_EXTRA_COLOR;
|
|
|
|
|
bFoundExtraSong = true;
|
|
|
|
|
break;
|
2002-10-10 04:11:30 +00:00
|
|
|
}
|
2003-02-25 00:33:42 +00:00
|
|
|
}
|
2003-07-20 05:13:45 +00:00
|
|
|
|
|
|
|
|
if( !bFoundExtraSong )
|
|
|
|
|
arrayWheelItemDatas.push_back( WheelItemData(TYPE_SONG, pSong, "", NULL, SONG_REAL_EXTRA_COLOR, SORT_INVALID) );
|
2002-10-09 06:57:37 +00:00
|
|
|
}
|
2002-06-14 22:25:22 +00:00
|
|
|
break;
|
2003-07-20 05:13:45 +00:00
|
|
|
}
|
2003-07-20 08:54:31 +00:00
|
|
|
case SORT_ALL_COURSES:
|
|
|
|
|
case SORT_NONSTOP_COURSES:
|
|
|
|
|
case SORT_ONI_COURSES:
|
|
|
|
|
case SORT_ENDLESS_COURSES:
|
2003-07-20 05:13:45 +00:00
|
|
|
{
|
|
|
|
|
vector<Course*> apCourses;
|
2003-07-20 08:54:31 +00:00
|
|
|
switch( so )
|
2002-04-16 17:31:00 +00:00
|
|
|
{
|
2003-07-20 08:54:31 +00:00
|
|
|
case SORT_NONSTOP_COURSES: SONGMAN->GetNonstopCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break;
|
|
|
|
|
case SORT_ONI_COURSES: SONGMAN->GetOniCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break;
|
|
|
|
|
case SORT_ENDLESS_COURSES: SONGMAN->GetEndlessCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break;
|
|
|
|
|
case SORT_ALL_COURSES: SONGMAN->GetAllCourses( apCourses, PREFSMAN->m_bAutogenGroupCourses ); break;
|
|
|
|
|
default: ASSERT(0); break;
|
2003-07-20 05:13:45 +00:00
|
|
|
}
|
2002-07-29 03:06:55 +00:00
|
|
|
|
2003-12-12 03:54:26 +00:00
|
|
|
if (PREFSMAN->m_iCourseSortOrder == PrefsManager::COURSE_SORT_SONGS)
|
2004-04-18 08:36:04 +00:00
|
|
|
CourseUtil::SortCoursePointerArrayByDifficulty( apCourses );
|
2003-12-12 03:54:26 +00:00
|
|
|
else
|
2003-07-27 14:10:47 +00:00
|
|
|
{
|
2003-07-27 18:39:34 +00:00
|
|
|
if (PREFSMAN->m_iCourseSortOrder == PrefsManager::COURSE_SORT_METER)
|
2004-04-18 08:36:04 +00:00
|
|
|
CourseUtil::SortCoursePointerArrayByAvgDifficulty( apCourses );
|
2003-07-27 14:10:47 +00:00
|
|
|
|
2003-07-27 18:39:34 +00:00
|
|
|
if (PREFSMAN->m_iCourseSortOrder == PrefsManager::COURSE_SORT_METER_SUM)
|
2004-04-18 08:36:04 +00:00
|
|
|
CourseUtil::SortCoursePointerArrayByTotalDifficulty( apCourses );
|
2003-07-27 14:10:47 +00:00
|
|
|
|
2003-07-27 18:39:34 +00:00
|
|
|
if (PREFSMAN->m_iCourseSortOrder == PrefsManager::COURSE_SORT_RANK)
|
2004-04-18 08:36:04 +00:00
|
|
|
CourseUtil::SortCoursePointerArrayByRanking( apCourses );
|
2003-08-12 23:18:19 +00:00
|
|
|
|
|
|
|
|
// since we can't agree, make it an option
|
|
|
|
|
if (PREFSMAN->m_bMoveRandomToEnd)
|
2004-04-18 08:36:04 +00:00
|
|
|
CourseUtil::MoveRandomToEnd( apCourses );
|
2003-07-27 14:10:47 +00:00
|
|
|
}
|
|
|
|
|
|
2003-07-20 08:54:31 +00:00
|
|
|
if( so == SORT_ALL_COURSES )
|
2004-04-18 08:36:04 +00:00
|
|
|
CourseUtil::SortCoursePointerArrayByType( apCourses );
|
2003-07-20 08:54:31 +00:00
|
|
|
|
|
|
|
|
arrayWheelItemDatas.clear(); // clear out the previous wheel items
|
|
|
|
|
|
|
|
|
|
CString sLastSection = "";
|
|
|
|
|
int iSectionColorIndex = 0;
|
2003-07-20 05:13:45 +00:00
|
|
|
for( unsigned c=0; c<apCourses.size(); c++ ) // foreach course
|
|
|
|
|
{
|
|
|
|
|
Course* pCourse = apCourses[c];
|
2002-08-01 20:30:40 +00:00
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
// if unlocks are on, make sure it is unlocked
|
2004-02-21 01:06:35 +00:00
|
|
|
if ( UNLOCKMAN->CourseIsLocked(pCourse) )
|
2003-07-20 05:13:45 +00:00
|
|
|
continue;
|
2003-07-10 11:24:16 +00:00
|
|
|
|
2003-07-20 08:54:31 +00:00
|
|
|
CString sThisSection = "";
|
|
|
|
|
if( so == SORT_ALL_COURSES )
|
|
|
|
|
switch( pCourse->GetPlayMode() )
|
|
|
|
|
{
|
|
|
|
|
case PLAY_MODE_ONI: sThisSection = "Oni"; break;
|
|
|
|
|
case PLAY_MODE_NONSTOP: sThisSection = "Nonstop"; break;
|
|
|
|
|
case PLAY_MODE_ENDLESS: sThisSection = "Endless"; break;
|
|
|
|
|
}
|
|
|
|
|
|
2003-07-20 05:13:45 +00:00
|
|
|
// check that this course has at least one song playable in the current style
|
2003-08-07 06:36:34 +00:00
|
|
|
if( !pCourse->IsPlayableIn(GAMESTATE->GetCurrentStyleDef()->m_StepsType) )
|
2003-07-20 08:54:31 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if( sThisSection != sLastSection ) // new section, make a section item
|
|
|
|
|
{
|
|
|
|
|
RageColor c = SECTION_COLORS(iSectionColorIndex);
|
|
|
|
|
iSectionColorIndex = (iSectionColorIndex+1) % NUM_SECTION_COLORS;
|
|
|
|
|
arrayWheelItemDatas.push_back( WheelItemData(TYPE_SECTION, NULL, sThisSection, NULL, c, SORT_INVALID) );
|
|
|
|
|
sLastSection = sThisSection;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
arrayWheelItemDatas.push_back( WheelItemData(TYPE_COURSE, NULL, sThisSection, pCourse, pCourse->GetColor(), SORT_INVALID) );
|
2002-07-29 03:06:55 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2003-07-20 05:13:45 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2003-02-10 05:30:12 +00:00
|
|
|
// init music status icons
|
2002-10-31 02:46:42 +00:00
|
|
|
for( i=0; i<arrayWheelItemDatas.size(); i++ )
|
2002-02-10 06:25:12 +00:00
|
|
|
{
|
|
|
|
|
Song* pSong = arrayWheelItemDatas[i].m_pSong;
|
2002-08-20 21:00:56 +00:00
|
|
|
if( pSong == NULL )
|
|
|
|
|
continue;
|
|
|
|
|
|
2002-09-06 10:13:46 +00:00
|
|
|
WheelItemData& WID = arrayWheelItemDatas[i];
|
2003-08-07 06:16:17 +00:00
|
|
|
WID.m_Flags.bHasBeginnerOr1Meter = pSong->IsEasy( STEPS_TYPE_DANCE_SINGLE );
|
|
|
|
|
WID.m_Flags.bEdits = pSong->HasEdits( STEPS_TYPE_DANCE_SINGLE );
|
2003-02-10 05:30:12 +00:00
|
|
|
WID.m_Flags.iStagesForSong = SongManager::GetNumStagesForSong( pSong );
|
2002-02-10 06:25:12 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2003-02-10 05:30:12 +00:00
|
|
|
// init crowns
|
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-10-31 02:46:42 +00:00
|
|
|
for( i=0; i< min(3u,arrayWheelItemDatas.size()); i++ )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2002-08-20 21:00:56 +00:00
|
|
|
WheelItemData& WID = arrayWheelItemDatas[i];
|
2003-02-10 05:30:12 +00:00
|
|
|
WID.m_Flags.iPlayersBestNumber = i+1;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-10-31 02:46:42 +00:00
|
|
|
if( arrayWheelItemDatas.empty() )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2003-06-16 17:28:58 +00:00
|
|
|
arrayWheelItemDatas.push_back( WheelItemData(TYPE_SECTION, NULL, "- EMPTY -", NULL, RageColor(1,0,0,1), SORT_INVALID) );
|
2002-05-19 01:59:48 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2003-04-02 04:41:49 +00:00
|
|
|
void MusicWheel::GetItemPosition( float fPosOffsetsFromMiddle, float& fX_out, float& fY_out, float& fZ_out, float& fRotationX_out )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2003-04-02 04:41:49 +00:00
|
|
|
if( USE_3D )
|
|
|
|
|
{
|
2003-11-17 06:20:35 +00:00
|
|
|
const float curve = CIRCLE_PERCENT*2*PI;
|
|
|
|
|
fRotationX_out = SCALE(fPosOffsetsFromMiddle,-NUM_WHEEL_ITEMS/2.0f,+NUM_WHEEL_ITEMS/2.0f,-curve/2.f,+curve/2.f);
|
2004-02-23 04:53:22 +00:00
|
|
|
fX_out = (1-cosf(fPosOffsetsFromMiddle/PI))*ITEM_CURVE_X;
|
2003-11-17 06:20:35 +00:00
|
|
|
fY_out = WHEEL_3D_RADIUS*sinf(fRotationX_out);
|
|
|
|
|
fZ_out = -100+WHEEL_3D_RADIUS*cosf(fRotationX_out);
|
|
|
|
|
fRotationX_out *= 180.f/PI; // to degrees
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2003-07-05 05:34:16 +00:00
|
|
|
// printf( "fRotationX_out = %f\n", fRotationX_out );
|
2003-04-02 04:41:49 +00:00
|
|
|
}
|
2003-11-02 09:17:15 +00:00
|
|
|
else if(!USE_LINEAR_WHEEL)
|
|
|
|
|
{
|
|
|
|
|
fX_out = (1-cosf(fPosOffsetsFromMiddle/PI))*ITEM_CURVE_X;
|
|
|
|
|
fY_out = fPosOffsetsFromMiddle*ITEM_SPACING_Y;
|
|
|
|
|
fZ_out = 0;
|
|
|
|
|
fRotationX_out = 0;
|
|
|
|
|
|
|
|
|
|
fX_out = roundf( fX_out );
|
|
|
|
|
fY_out = roundf( fY_out );
|
|
|
|
|
fZ_out = roundf( fZ_out );
|
|
|
|
|
}
|
2003-04-02 04:41:49 +00:00
|
|
|
else
|
|
|
|
|
{
|
2003-11-02 09:17:15 +00:00
|
|
|
fX_out = fPosOffsetsFromMiddle*ITEM_CURVE_X;
|
|
|
|
|
fY_out = fPosOffsetsFromMiddle*ITEM_SPACING_Y;
|
|
|
|
|
fZ_out = 0;
|
|
|
|
|
fRotationX_out = 0;
|
|
|
|
|
|
|
|
|
|
fX_out = roundf( fX_out );
|
|
|
|
|
fY_out = roundf( fY_out );
|
|
|
|
|
fZ_out = roundf( fZ_out );
|
2003-04-02 04:41:49 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2003-11-18 18:07:37 +00:00
|
|
|
void MusicWheel::SetItemPosition( Actor &item, float fPosOffsetsFromMiddle )
|
|
|
|
|
{
|
|
|
|
|
float fX, fY, fZ, fRotationX;
|
|
|
|
|
GetItemPosition( fPosOffsetsFromMiddle, fX, fY, fZ, fRotationX );
|
|
|
|
|
item.SetXY( fX, fY );
|
|
|
|
|
item.SetZ( fZ );
|
|
|
|
|
item.SetRotationX( fRotationX );
|
|
|
|
|
}
|
|
|
|
|
|
2003-03-31 23:06:15 +00:00
|
|
|
void MusicWheel::RebuildMusicWheelItems()
|
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;
|
2003-01-02 02:59:25 +00:00
|
|
|
if( m_iSelection > int(m_CurWheelItemData.size()-1) )
|
2002-02-10 06:25:12 +00:00
|
|
|
m_iSelection = 0;
|
2002-11-16 08:55:46 +00:00
|
|
|
|
2003-03-26 19:15:38 +00:00
|
|
|
iIndex -= NUM_WHEEL_ITEMS/2;
|
2003-03-14 22:55:06 +00:00
|
|
|
|
|
|
|
|
ASSERT(m_CurWheelItemData.size());
|
2003-01-02 02:59:25 +00:00
|
|
|
while(iIndex < 0)
|
|
|
|
|
iIndex += m_CurWheelItemData.size();
|
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
|
2003-03-26 19:15:38 +00:00
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
|
2002-02-09 04:30:27 +00:00
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
WheelItemData *data = m_CurWheelItemData[iIndex];
|
2003-03-31 23:06:15 +00:00
|
|
|
MusicWheelItem& display = m_MusicWheelItems[i];
|
2002-02-06 05:13:39 +00:00
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
display.LoadFromWheelItemData( data );
|
2002-02-09 04:30:27 +00:00
|
|
|
|
|
|
|
|
// increment iIndex
|
2003-01-02 02:59:25 +00:00
|
|
|
iIndex++;
|
|
|
|
|
if( iIndex > int(m_CurWheelItemData.size()-1) )
|
|
|
|
|
iIndex = 0;
|
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
|
|
|
|
|
{
|
2003-03-26 19:15:38 +00:00
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
|
2002-04-28 20:42:32 +00:00
|
|
|
{
|
2003-03-31 23:06:15 +00:00
|
|
|
MusicWheelItem& display = m_MusicWheelItems[i];
|
2002-04-28 20:42:32 +00:00
|
|
|
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
|
|
|
{
|
2003-04-02 04:41:49 +00:00
|
|
|
if( USE_3D )
|
|
|
|
|
{
|
2003-04-23 05:54:56 +00:00
|
|
|
// DISPLAY->PushMatrix();
|
|
|
|
|
// DISPLAY->EnterPerspective(45, false);
|
2003-04-02 04:41:49 +00:00
|
|
|
|
|
|
|
|
// construct view and project matrix
|
2003-04-23 05:54:56 +00:00
|
|
|
// RageVector3 Up( 0.0f, 1.0f, 0.0f );
|
|
|
|
|
// RageVector3 Eye( CENTER_X, CENTER_Y, 550 );
|
|
|
|
|
// RageVector3 At( CENTER_X, CENTER_Y, 0 );
|
2003-04-02 04:41:49 +00:00
|
|
|
|
2003-04-23 05:54:56 +00:00
|
|
|
// DISPLAY->LookAt(Eye, At, Up);
|
2003-04-02 04:41:49 +00:00
|
|
|
}
|
|
|
|
|
|
2003-04-23 05:54:56 +00:00
|
|
|
// draw outside->inside
|
|
|
|
|
int i;
|
|
|
|
|
for( i=0; i<NUM_WHEEL_ITEMS/2; i++ )
|
|
|
|
|
DrawItem( i );
|
|
|
|
|
for( i=NUM_WHEEL_ITEMS-1; i>=NUM_WHEEL_ITEMS/2; i-- )
|
|
|
|
|
DrawItem( i );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ActorFrame::DrawPrimitives();
|
|
|
|
|
|
|
|
|
|
if( USE_3D )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2003-04-23 05:54:56 +00:00
|
|
|
// DISPLAY->ExitPerspective();
|
|
|
|
|
// DISPLAY->PopMatrix();
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2002-05-01 19:14:55 +00:00
|
|
|
|
2003-04-23 05:54:56 +00:00
|
|
|
void MusicWheel::DrawItem( int i )
|
|
|
|
|
{
|
|
|
|
|
MusicWheelItem& display = m_MusicWheelItems[i];
|
2003-04-02 04:41:49 +00:00
|
|
|
|
2003-04-23 05:54:56 +00:00
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
|
|
|
|
case STATE_SELECTING_MUSIC:
|
|
|
|
|
case STATE_ROULETTE_SPINNING:
|
|
|
|
|
case STATE_ROULETTE_SLOWING_DOWN:
|
|
|
|
|
case STATE_RANDOM_SPINNING:
|
|
|
|
|
case STATE_LOCKED:
|
|
|
|
|
{
|
2003-11-18 18:07:37 +00:00
|
|
|
const float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection;
|
|
|
|
|
SetItemPosition( display, fThisBannerPositionOffsetFromSelection );
|
2003-04-23 05:54:56 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2003-04-23 05:54:56 +00:00
|
|
|
if( m_WheelState == STATE_LOCKED && i != NUM_WHEEL_ITEMS/2 )
|
|
|
|
|
display.m_fPercentGray = 0.5f;
|
|
|
|
|
else
|
|
|
|
|
display.m_fPercentGray = 0;
|
|
|
|
|
|
|
|
|
|
display.Draw();
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2003-04-23 05:54:56 +00:00
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
void MusicWheel::UpdateScrollbar()
|
|
|
|
|
{
|
|
|
|
|
int total_num_items = m_CurWheelItemData.size();
|
|
|
|
|
float item_at=m_iSelection - m_fPositionOffsetFromSelection;
|
|
|
|
|
|
2003-04-20 02:02:58 +00:00
|
|
|
if(NUM_WHEEL_ITEMS >= total_num_items) {
|
2003-01-02 02:59:25 +00:00
|
|
|
m_ScrollBar.SetPercentage( 0, 1 );
|
|
|
|
|
} else {
|
2003-03-26 19:15:38 +00:00
|
|
|
float size = float(NUM_WHEEL_ITEMS) / total_num_items;
|
2003-01-02 02:59:25 +00:00
|
|
|
float center = item_at / total_num_items;
|
|
|
|
|
size *= 0.5f;
|
|
|
|
|
|
|
|
|
|
m_ScrollBar.SetPercentage( center - size, center + size );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-01-16 10:01:32 +00:00
|
|
|
void MusicWheel::Update( float fDeltaTime )
|
|
|
|
|
{
|
|
|
|
|
ActorFrame::Update( fDeltaTime );
|
|
|
|
|
|
2002-10-31 02:46:42 +00:00
|
|
|
unsigned i;
|
2003-03-26 21:32:48 +00:00
|
|
|
for( i=0; i<unsigned(NUM_WHEEL_ITEMS); i++ )
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2003-03-31 23:06:15 +00:00
|
|
|
MusicWheelItem& display = m_MusicWheelItems[i];
|
2002-02-09 04:30:27 +00:00
|
|
|
|
|
|
|
|
display.Update( fDeltaTime );
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
UpdateScrollbar();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
if( m_Moving )
|
2002-06-14 22:25:22 +00:00
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
m_TimeBeforeMovingBegins -= fDeltaTime;
|
|
|
|
|
m_TimeBeforeMovingBegins = max(m_TimeBeforeMovingBegins, 0);
|
2002-06-24 22:04:31 +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
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
Song* pPrevSelectedSong = m_CurWheelItemData[m_iSelection]->m_pSong;
|
2003-02-03 04:50:37 +00:00
|
|
|
|
2003-03-25 21:17:29 +00:00
|
|
|
SCREENMAN->PostMessageToTopScreen( SM_SortOrderChanged, 0 );
|
2003-06-16 17:28:58 +00:00
|
|
|
|
2004-04-18 07:34:37 +00:00
|
|
|
SetOpenGroup(SongUtil::GetSectionNameFromSongAndSort( pPrevSelectedSong, GAMESTATE->m_SortOrder ));
|
2003-01-02 02:59:25 +00:00
|
|
|
|
2002-06-14 22:25:22 +00:00
|
|
|
m_iSelection = 0;
|
2002-02-24 01:43:11 +00:00
|
|
|
|
2004-02-06 04:01:08 +00:00
|
|
|
//
|
|
|
|
|
// Select the previously selected item
|
|
|
|
|
//
|
2004-03-12 08:31:40 +00:00
|
|
|
switch( GAMESTATE->m_SortOrder )
|
2002-02-24 01:43:11 +00:00
|
|
|
{
|
2004-02-18 23:53:43 +00:00
|
|
|
default:
|
2003-06-16 17:28:58 +00:00
|
|
|
// Look for the last selected song or course
|
2004-02-18 23:53:43 +00:00
|
|
|
SelectSongOrCourse();
|
2003-06-16 17:28:58 +00:00
|
|
|
break;
|
2004-01-11 08:15:44 +00:00
|
|
|
case SORT_SORT_MENU:
|
|
|
|
|
case SORT_MODE_MENU:
|
2004-03-12 08:31:40 +00:00
|
|
|
SelectSort( m_LastSortOrder );
|
2003-06-16 17:28:58 +00:00
|
|
|
break;
|
2002-08-28 22:42:40 +00:00
|
|
|
}
|
|
|
|
|
|
2004-02-06 04:01:08 +00:00
|
|
|
//
|
2003-06-27 08:06:22 +00:00
|
|
|
// Change difficulty for sorts by meter
|
2004-02-06 04:01:08 +00:00
|
|
|
//
|
2004-01-27 05:37:43 +00:00
|
|
|
Difficulty dc = DIFFICULTY_INVALID;
|
2004-03-12 08:31:40 +00:00
|
|
|
switch( GAMESTATE->m_SortOrder )
|
2003-06-27 08:06:22 +00:00
|
|
|
{
|
2004-01-27 05:37:43 +00:00
|
|
|
case SORT_EASY_METER: dc = DIFFICULTY_EASY; break;
|
|
|
|
|
case SORT_MEDIUM_METER: dc = DIFFICULTY_MEDIUM; break;
|
|
|
|
|
case SORT_HARD_METER: dc = DIFFICULTY_HARD; break;
|
|
|
|
|
case SORT_CHALLENGE_METER: dc = DIFFICULTY_CHALLENGE; break;
|
2003-06-27 08:06:22 +00:00
|
|
|
}
|
2004-01-27 05:37:43 +00:00
|
|
|
if( dc != DIFFICULTY_INVALID )
|
2004-02-06 04:01:08 +00:00
|
|
|
{
|
2004-05-24 06:10:11 +00:00
|
|
|
FOREACH_PlayerNumber( p )
|
2004-01-27 05:37:43 +00:00
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
|
|
|
|
GAMESTATE->m_PreferredDifficulty[p] = dc;
|
2004-02-06 04:01:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Unselect the current song if this is a course mode.
|
|
|
|
|
// Unselect the current course if this is a song sort.
|
|
|
|
|
//
|
2004-02-18 23:53:43 +00:00
|
|
|
/* If we do this, then switching to course mode and back will put you
|
|
|
|
|
* back on the default song. From the CVS commit, this looks like it
|
|
|
|
|
* was originally to fix ScreenOptionsMaster difficulty display, and
|
|
|
|
|
* isn't needed anymore ... -glenn */
|
2004-03-12 08:31:40 +00:00
|
|
|
/* switch( GAMESTATE->m_SortOrder )
|
2004-02-06 04:01:08 +00:00
|
|
|
{
|
|
|
|
|
case SORT_PREFERRED:
|
|
|
|
|
case SORT_GROUP:
|
|
|
|
|
case SORT_TITLE:
|
|
|
|
|
case SORT_BPM:
|
|
|
|
|
case SORT_GRADE:
|
|
|
|
|
case SORT_ARTIST:
|
|
|
|
|
case SORT_MOST_PLAYED:
|
|
|
|
|
case SORT_ROULETTE:
|
|
|
|
|
case SORT_EASY_METER:
|
|
|
|
|
case SORT_MEDIUM_METER:
|
|
|
|
|
case SORT_HARD_METER:
|
|
|
|
|
case SORT_CHALLENGE_METER:
|
|
|
|
|
GAMESTATE->m_pCurCourse = NULL;
|
|
|
|
|
break;
|
|
|
|
|
case SORT_ALL_COURSES:
|
|
|
|
|
case SORT_NONSTOP_COURSES:
|
|
|
|
|
case SORT_ONI_COURSES:
|
|
|
|
|
case SORT_ENDLESS_COURSES:
|
|
|
|
|
GAMESTATE->m_pCurSong = NULL;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2004-02-18 23:53:43 +00:00
|
|
|
*/
|
2003-06-27 08:06:22 +00:00
|
|
|
|
2003-03-25 21:17:29 +00:00
|
|
|
SCREENMAN->PostMessageToTopScreen( SM_SongChanged, 0 );
|
2003-03-31 23:06:15 +00:00
|
|
|
RebuildMusicWheelItems();
|
2003-01-02 02:59:25 +00:00
|
|
|
TweenOnScreen(true);
|
2003-01-03 03:24:00 +00:00
|
|
|
m_WheelState = STATE_FLYING_ON_AFTER_NEXT_SORT;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2003-01-03 03:24:00 +00:00
|
|
|
|
2002-01-18 21:19:05 +00:00
|
|
|
case STATE_FLYING_ON_AFTER_NEXT_SORT:
|
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;
|
2003-01-03 03:24:00 +00:00
|
|
|
|
2002-01-18 21:19:05 +00:00
|
|
|
case STATE_TWEENING_ON_SCREEN:
|
|
|
|
|
m_fTimeLeftInState = 0;
|
2003-02-01 05:39:48 +00:00
|
|
|
if( (GAMESTATE->IsExtraStage() && !PREFSMAN->m_bPickExtraStage) || GAMESTATE->IsExtraStage2() )
|
2002-07-31 04:06:34 +00:00
|
|
|
{
|
2003-07-20 20:10:54 +00:00
|
|
|
m_WheelState = STATE_LOCKED;
|
2004-05-01 23:28:53 +00:00
|
|
|
SCREENMAN->PlayStartSound();
|
2003-07-20 20:10:54 +00:00
|
|
|
m_fLockedWheelVelocity = 0;
|
2002-07-31 04:06:34 +00:00
|
|
|
}
|
|
|
|
|
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:
|
2003-01-03 03:24:00 +00:00
|
|
|
case STATE_RANDOM_SPINNING:
|
2002-06-24 22:04:31 +00:00
|
|
|
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;
|
2004-05-01 23:28:53 +00:00
|
|
|
SCREENMAN->PlayStartSound();
|
2002-06-24 22:04:31 +00:00
|
|
|
m_fLockedWheelVelocity = 0;
|
2003-01-02 02:59:25 +00:00
|
|
|
|
|
|
|
|
/* Send this again so the screen starts sample music. */
|
2003-03-25 21:17:29 +00:00
|
|
|
SCREENMAN->PostMessageToTopScreen( SM_SongChanged, 0 );
|
2002-06-24 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_iSwitchesLeftInSpinDown--;
|
2002-09-10 02:37:17 +00:00
|
|
|
const float SwitchTimes[] = { 0.5f, 1.3f, 0.8f, 0.4f, 0.2f };
|
|
|
|
|
ASSERT(m_iSwitchesLeftInSpinDown >= 0 && m_iSwitchesLeftInSpinDown <= 4);
|
|
|
|
|
m_fTimeLeftInState = SwitchTimes[m_iSwitchesLeftInSpinDown];
|
|
|
|
|
|
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 )
|
2003-01-21 07:04:53 +00:00
|
|
|
ChangeMusic(randomf(0,1) >= 0.5f? 1:-1);
|
2002-06-24 22:04:31 +00:00
|
|
|
else
|
2003-01-21 07:04:53 +00:00
|
|
|
ChangeMusic(1);
|
2002-06-24 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2003-09-27 22:32:13 +00:00
|
|
|
ASSERT(0); // all state changes should be handled explicitly
|
2002-06-14 22:25:22 +00:00
|
|
|
break;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-06-24 22:04:31 +00:00
|
|
|
if( m_WheelState == STATE_LOCKED )
|
|
|
|
|
{
|
2003-01-03 03:24:00 +00:00
|
|
|
/* Do this in at most .1 sec chunks, so we don't get weird if we
|
|
|
|
|
* stop for some reason (and so it behaves the same when being
|
|
|
|
|
* single stepped). */
|
|
|
|
|
float tm = fDeltaTime;
|
|
|
|
|
while(tm > 0)
|
|
|
|
|
{
|
|
|
|
|
float t = min(tm, 0.1f);
|
|
|
|
|
tm -= t;
|
2002-06-24 22:04:31 +00:00
|
|
|
|
2003-01-03 03:24:00 +00:00
|
|
|
m_fPositionOffsetFromSelection = clamp( m_fPositionOffsetFromSelection, -0.3f, +0.3f );
|
2002-06-24 22:04:31 +00:00
|
|
|
|
2003-01-03 03:24:00 +00:00
|
|
|
float fSpringForce = - m_fPositionOffsetFromSelection * LOCKED_INITIAL_VELOCITY;
|
|
|
|
|
m_fLockedWheelVelocity += fSpringForce;
|
2002-06-24 22:04:31 +00:00
|
|
|
|
2003-01-03 03:24:00 +00:00
|
|
|
float fDrag = -m_fLockedWheelVelocity * t*4;
|
|
|
|
|
m_fLockedWheelVelocity += fDrag;
|
|
|
|
|
|
|
|
|
|
m_fPositionOffsetFromSelection += m_fLockedWheelVelocity*t;
|
|
|
|
|
|
|
|
|
|
if( fabsf(m_fPositionOffsetFromSelection) < 0.01f && fabsf(m_fLockedWheelVelocity) < 0.01f )
|
|
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection = 0;
|
|
|
|
|
m_fLockedWheelVelocity = 0;
|
|
|
|
|
}
|
2002-06-24 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
}
|
2003-01-21 07:04:53 +00:00
|
|
|
else if( IsMoving() )
|
|
|
|
|
{
|
|
|
|
|
/* We're automatically moving. Move linearly, and don't clamp
|
|
|
|
|
* to the selection. */
|
|
|
|
|
float fSpinSpeed = m_SpinSpeed*m_Moving;
|
|
|
|
|
m_fPositionOffsetFromSelection -= fSpinSpeed*fDeltaTime;
|
|
|
|
|
|
|
|
|
|
/* Make sure that we don't go further than 1 away, in case the
|
|
|
|
|
* speed is very high or we miss a lot of frames. */
|
|
|
|
|
m_fPositionOffsetFromSelection = clamp(m_fPositionOffsetFromSelection, -1.0f, 1.0f);
|
|
|
|
|
|
|
|
|
|
/* If it passed the selection, move again. */
|
|
|
|
|
if((m_Moving == -1 && m_fPositionOffsetFromSelection >= 0) ||
|
|
|
|
|
(m_Moving == 1 && m_fPositionOffsetFromSelection <= 0))
|
|
|
|
|
{
|
|
|
|
|
ChangeMusic(m_Moving);
|
|
|
|
|
|
|
|
|
|
if(PREFSMAN->m_iMusicWheelSwitchSpeed < MAX_WHEEL_SOUND_SPEED)
|
|
|
|
|
m_soundChangeMusic.Play();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(PREFSMAN->m_iMusicWheelSwitchSpeed >= MAX_WHEEL_SOUND_SPEED &&
|
|
|
|
|
m_MovingSoundTimer.PeekDeltaTime() >= 1.0f / MAX_WHEEL_SOUND_SPEED)
|
|
|
|
|
{
|
|
|
|
|
m_MovingSoundTimer.GetDeltaTime();
|
|
|
|
|
m_soundChangeMusic.Play();
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-01-20 08:59:38 +00:00
|
|
|
else
|
|
|
|
|
{
|
2002-06-24 22:04:31 +00:00
|
|
|
// "rotate" wheel toward selected song
|
2003-01-21 07:04:53 +00:00
|
|
|
float 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;
|
|
|
|
|
}
|
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;
|
|
|
|
|
}
|
2002-01-20 08:59:38 +00:00
|
|
|
}
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2003-01-21 07:04:53 +00:00
|
|
|
void MusicWheel::ChangeMusic(int dist)
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2003-01-21 07:04:53 +00:00
|
|
|
m_iSelection += dist;
|
2003-01-02 02:59:25 +00:00
|
|
|
if( m_iSelection < 0 )
|
|
|
|
|
m_iSelection = m_CurWheelItemData.size()-1;
|
2003-01-21 07:04:53 +00:00
|
|
|
else if( m_iSelection > int(m_CurWheelItemData.size()-1) )
|
|
|
|
|
m_iSelection = 0;
|
2002-02-06 05:13:39 +00:00
|
|
|
|
2003-03-31 23:06:15 +00:00
|
|
|
RebuildMusicWheelItems();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2003-01-21 07:04:53 +00:00
|
|
|
m_fPositionOffsetFromSelection += dist;
|
2002-06-30 23:19:33 +00:00
|
|
|
|
2003-03-25 21:17:29 +00:00
|
|
|
SCREENMAN->PostMessageToTopScreen( SM_SongChanged, 0 );
|
2002-06-24 22:04:31 +00:00
|
|
|
|
2003-01-21 07:04:53 +00:00
|
|
|
/* If we're moving automatically, don't play this; it'll be called in Update. */
|
|
|
|
|
if(!IsMoving())
|
2003-01-19 00:47:06 +00:00
|
|
|
m_soundChangeMusic.Play();
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
|
2004-03-12 08:31:40 +00:00
|
|
|
bool MusicWheel::ChangeSort( SortOrder new_so ) // return true if change successful
|
2002-01-16 10:01:32 +00:00
|
|
|
{
|
2003-07-20 08:54:31 +00:00
|
|
|
ASSERT( new_so < NUM_SORT_ORDERS );
|
2004-03-12 08:31:40 +00:00
|
|
|
if( GAMESTATE->m_SortOrder == new_so )
|
2003-06-19 19:31:46 +00:00
|
|
|
return false;
|
|
|
|
|
|
2004-03-20 18:19:36 +00:00
|
|
|
/* Don't change to SORT_SORT_MENU or SORT_MODE_MENU if they don't have at least
|
|
|
|
|
* two choices. */
|
|
|
|
|
switch( new_so )
|
|
|
|
|
{
|
|
|
|
|
case SORT_SORT_MENU:
|
|
|
|
|
case SORT_MODE_MENU:
|
|
|
|
|
if( m_WheelItemDatas[new_so].size() < 2 )
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
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
|
|
|
|
2003-07-20 08:54:31 +00:00
|
|
|
SCREENMAN->PostMessageToTopScreen( SM_SortOrderChanging, 0 );
|
|
|
|
|
|
2002-04-28 20:42:32 +00:00
|
|
|
m_soundChangeSort.Play();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
TweenOffScreen(true);
|
2002-05-28 20:01:22 +00:00
|
|
|
|
2004-03-12 08:31:40 +00:00
|
|
|
m_LastSortOrder = GAMESTATE->m_SortOrder;
|
|
|
|
|
GAMESTATE->m_SortOrder = new_so;
|
|
|
|
|
|
2002-01-18 21:19:05 +00:00
|
|
|
m_WheelState = STATE_FLYING_OFF_BEFORE_NEXT_SORT;
|
2002-08-20 21:00:56 +00:00
|
|
|
return true;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
2003-06-16 17:28:58 +00:00
|
|
|
|
|
|
|
|
bool MusicWheel::NextSort() // return true if change successful
|
|
|
|
|
{
|
2004-01-11 08:15:44 +00:00
|
|
|
// don't allow NextSort when on the sort menu or mode menu
|
2004-03-12 08:31:40 +00:00
|
|
|
switch( GAMESTATE->m_SortOrder )
|
2004-01-11 08:15:44 +00:00
|
|
|
{
|
|
|
|
|
case SORT_SORT_MENU:
|
|
|
|
|
case SORT_MODE_MENU:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// find the index of the current sort
|
2003-06-30 06:53:21 +00:00
|
|
|
int cur = 0;
|
2004-03-12 08:31:40 +00:00
|
|
|
while( cur < int(ARRAYSIZE(SORT_ORDERS)) && SORT_ORDERS[cur] != GAMESTATE->m_SortOrder )
|
2003-06-30 06:53:21 +00:00
|
|
|
++cur;
|
2003-06-16 17:28:58 +00:00
|
|
|
|
2004-01-11 08:15:44 +00:00
|
|
|
// move to the next sort with wrapping
|
|
|
|
|
++cur;
|
2004-03-12 08:31:40 +00:00
|
|
|
wrap( cur, ARRAYSIZE(SORT_ORDERS) );
|
2003-06-16 17:28:58 +00:00
|
|
|
|
2004-01-11 08:15:44 +00:00
|
|
|
// apply new sort
|
2004-03-12 08:31:40 +00:00
|
|
|
SortOrder soNew = SORT_ORDERS[cur];
|
2004-01-11 08:15:44 +00:00
|
|
|
return ChangeSort( soNew );
|
2003-06-16 17:28:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool MusicWheel::Select() // return true if this selection ends the screen
|
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
|
|
|
|
2003-01-03 03:24:00 +00:00
|
|
|
if( m_WheelState == STATE_ROULETTE_SLOWING_DOWN )
|
|
|
|
|
return false;
|
|
|
|
|
|
2003-01-22 01:30:07 +00:00
|
|
|
m_Moving = 0;
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2003-01-22 01:30:07 +00:00
|
|
|
|
2003-01-19 00:47:06 +00:00
|
|
|
if( m_WheelState == STATE_RANDOM_SPINNING )
|
|
|
|
|
{
|
|
|
|
|
m_fPositionOffsetFromSelection = max(m_fPositionOffsetFromSelection, 0.3f);
|
|
|
|
|
m_WheelState = STATE_LOCKED;
|
2004-05-01 23:28:53 +00:00
|
|
|
SCREENMAN->PlayStartSound();
|
2003-01-19 00:47:06 +00:00
|
|
|
m_fLockedWheelVelocity = 0;
|
2003-03-25 21:17:29 +00:00
|
|
|
SCREENMAN->PostMessageToTopScreen( SM_SongChanged, 0 );
|
2003-01-19 00:47:06 +00:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2003-03-31 23:06:15 +00:00
|
|
|
switch( m_CurWheelItemData[m_iSelection]->m_Type )
|
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
|
|
|
{
|
2003-06-16 17:28:58 +00:00
|
|
|
CString sThisItemSectionName = m_CurWheelItemData[m_iSelection]->m_sSectionName;
|
|
|
|
|
if( m_sExpandedSectionName == sThisItemSectionName ) // already expanded
|
|
|
|
|
m_sExpandedSectionName = ""; // collapse it
|
|
|
|
|
else // already collapsed
|
|
|
|
|
m_sExpandedSectionName = sThisItemSectionName; // expand it
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2003-06-16 17:28:58 +00:00
|
|
|
m_soundExpand.Play();
|
2002-01-16 10:01:32 +00:00
|
|
|
|
2003-06-16 17:28:58 +00:00
|
|
|
SetOpenGroup(m_sExpandedSectionName);
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
return false;
|
2003-07-09 11:38:50 +00:00
|
|
|
case TYPE_ROULETTE:
|
2002-08-20 21:00:56 +00:00
|
|
|
StartRoulette();
|
2002-05-19 01:59:48 +00:00
|
|
|
return false;
|
2003-01-03 03:24:00 +00:00
|
|
|
case TYPE_RANDOM:
|
2003-01-19 00:47:06 +00:00
|
|
|
StartRandom();
|
2003-01-03 03:24:00 +00:00
|
|
|
return false;
|
2004-04-26 06:47:03 +00:00
|
|
|
case TYPE_LEAP:
|
|
|
|
|
StartLeap();
|
|
|
|
|
return false;
|
2002-04-16 17:31:00 +00:00
|
|
|
case TYPE_SONG:
|
2004-01-25 16:24:34 +00:00
|
|
|
if( !GAMESTATE->IsExtraStage() && !GAMESTATE->IsExtraStage2() )
|
2004-02-21 01:06:35 +00:00
|
|
|
UNLOCKMAN->UnlockSong( m_CurWheelItemData[m_iSelection]->m_pSong );
|
2004-01-25 16:24:34 +00:00
|
|
|
return true;
|
2003-06-16 17:28:58 +00:00
|
|
|
case TYPE_COURSE:
|
2002-01-16 10:01:32 +00:00
|
|
|
return true;
|
2003-06-16 17:28:58 +00:00
|
|
|
case TYPE_SORT:
|
2003-07-20 08:54:31 +00:00
|
|
|
m_CurWheelItemData[m_iSelection]->m_Action.ApplyToAllPlayers();
|
2004-03-12 08:31:40 +00:00
|
|
|
LOG->Trace("New sort order selected: %s - %d", m_CurWheelItemData[m_iSelection]->m_sLabel.c_str(), m_CurWheelItemData[m_iSelection]->m_SortOrder );
|
|
|
|
|
ChangeSort( m_CurWheelItemData[m_iSelection]->m_SortOrder );
|
2003-06-16 17:28:58 +00:00
|
|
|
return false;
|
|
|
|
|
default:
|
|
|
|
|
ASSERT(0);
|
|
|
|
|
return false;
|
2002-01-16 10:01:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2002-08-20 21:00:56 +00:00
|
|
|
void MusicWheel::StartRoulette()
|
|
|
|
|
{
|
|
|
|
|
m_WheelState = STATE_ROULETTE_SPINNING;
|
2003-01-02 02:59:25 +00:00
|
|
|
m_Moving = 1;
|
|
|
|
|
m_TimeBeforeMovingBegins = 0;
|
|
|
|
|
m_SpinSpeed = 1.0f/ROULETTE_SWITCH_SECONDS;
|
2004-03-12 08:31:40 +00:00
|
|
|
SetOpenGroup("", SortOrder(SORT_ROULETTE));
|
2003-01-02 02:59:25 +00:00
|
|
|
}
|
|
|
|
|
|
2003-01-19 00:47:06 +00:00
|
|
|
void MusicWheel::StartRandom()
|
|
|
|
|
{
|
2004-04-26 06:47:03 +00:00
|
|
|
/* Shuffle the roulette wheel. */
|
|
|
|
|
RandomGen rnd;
|
|
|
|
|
random_shuffle( m_WheelItemDatas[SORT_ROULETTE].begin(), m_WheelItemDatas[SORT_ROULETTE].end(), rnd );
|
2003-09-26 08:44:10 +00:00
|
|
|
|
2004-04-26 06:47:03 +00:00
|
|
|
SetOpenGroup("", SortOrder(SORT_ROULETTE));
|
2003-09-26 08:44:10 +00:00
|
|
|
|
2004-04-26 06:47:03 +00:00
|
|
|
m_Moving = -1;
|
|
|
|
|
m_TimeBeforeMovingBegins = 0;
|
|
|
|
|
m_SpinSpeed = 1.0f/ROULETTE_SWITCH_SECONDS;
|
|
|
|
|
m_SpinSpeed *= 20.0f; /* faster! */
|
|
|
|
|
m_WheelState = STATE_RANDOM_SPINNING;
|
2003-02-12 06:25:51 +00:00
|
|
|
|
2004-04-26 06:47:03 +00:00
|
|
|
this->Select();
|
|
|
|
|
RebuildMusicWheelItems();
|
|
|
|
|
}
|
2004-03-26 21:36:14 +00:00
|
|
|
|
2004-04-26 06:47:03 +00:00
|
|
|
void MusicWheel::StartLeap()
|
|
|
|
|
{
|
|
|
|
|
/* If we're in SORT_SORT_MENU or SORT_MODE_MENU, then the timer probably ran
|
|
|
|
|
* out. Make sure we're in a sort with actual selections. */
|
|
|
|
|
switch( GAMESTATE->m_SortOrder )
|
|
|
|
|
{
|
|
|
|
|
case SORT_SORT_MENU:
|
|
|
|
|
case SORT_MODE_MENU:
|
|
|
|
|
SetOpenGroup("", SortOrder(m_LastSortOrder));
|
2004-02-29 04:41:05 +00:00
|
|
|
}
|
2004-04-26 06:47:03 +00:00
|
|
|
|
2004-05-03 02:44:56 +00:00
|
|
|
// probe to find a song
|
|
|
|
|
for( int i=0; i<20; i++ )
|
|
|
|
|
{
|
|
|
|
|
m_iSelection = rand() % m_CurWheelItemData.size();
|
|
|
|
|
if( m_CurWheelItemData[m_iSelection]->m_Type == TYPE_SONG )
|
|
|
|
|
break; // done searching
|
|
|
|
|
}
|
|
|
|
|
|
2004-04-26 06:47:03 +00:00
|
|
|
m_fPositionOffsetFromSelection = 0;
|
|
|
|
|
m_WheelState = STATE_SELECTING_MUSIC;
|
2004-05-01 23:28:53 +00:00
|
|
|
SCREENMAN->PlayStartSound();
|
2004-04-26 06:47:03 +00:00
|
|
|
SCREENMAN->PostMessageToTopScreen( SM_SongChanged, 0 );
|
|
|
|
|
RebuildMusicWheelItems();
|
2003-01-19 00:47:06 +00:00
|
|
|
}
|
|
|
|
|
|
2004-03-12 08:31:40 +00:00
|
|
|
void MusicWheel::SetOpenGroup(CString group, SortOrder so)
|
2003-01-02 02:59:25 +00:00
|
|
|
{
|
2003-06-16 17:28:58 +00:00
|
|
|
if( so == SORT_INVALID)
|
2004-03-12 08:31:40 +00:00
|
|
|
so = GAMESTATE->m_SortOrder;
|
2003-01-03 03:24:00 +00:00
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
m_sExpandedSectionName = group;
|
|
|
|
|
|
|
|
|
|
WheelItemData *old = NULL;
|
|
|
|
|
if(!m_CurWheelItemData.empty())
|
|
|
|
|
old = m_CurWheelItemData[m_iSelection];
|
|
|
|
|
|
|
|
|
|
m_CurWheelItemData.clear();
|
2003-01-03 03:24:00 +00:00
|
|
|
vector<WheelItemData> &from = m_WheelItemDatas[so];
|
2003-01-02 02:59:25 +00:00
|
|
|
unsigned i;
|
|
|
|
|
for(i = 0; i < from.size(); ++i)
|
|
|
|
|
{
|
2003-03-31 23:06:15 +00:00
|
|
|
if((from[i].m_Type == TYPE_SONG ||
|
|
|
|
|
from[i].m_Type == TYPE_COURSE) &&
|
2003-01-02 02:59:25 +00:00
|
|
|
!from[i].m_sSectionName.empty() &&
|
|
|
|
|
from[i].m_sSectionName != group)
|
|
|
|
|
continue;
|
|
|
|
|
m_CurWheelItemData.push_back(&from[i]);
|
|
|
|
|
}
|
|
|
|
|
|
2003-06-16 17:28:58 +00:00
|
|
|
|
|
|
|
|
//
|
2004-01-11 08:15:44 +00:00
|
|
|
// Try to select the item that was selected before changing groups
|
2003-06-16 17:28:58 +00:00
|
|
|
//
|
2003-01-02 02:59:25 +00:00
|
|
|
m_iSelection = 0;
|
2003-06-16 17:28:58 +00:00
|
|
|
|
|
|
|
|
for( i=0; i<m_CurWheelItemData.size(); i++ )
|
2003-01-02 02:59:25 +00:00
|
|
|
{
|
2003-06-16 17:28:58 +00:00
|
|
|
if( m_CurWheelItemData[i] == old )
|
|
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
m_iSelection=i;
|
2003-06-16 17:28:58 +00:00
|
|
|
break;
|
|
|
|
|
}
|
2003-01-02 02:59:25 +00:00
|
|
|
}
|
2003-01-03 03:24:00 +00:00
|
|
|
|
2003-03-31 23:06:15 +00:00
|
|
|
RebuildMusicWheelItems();
|
2002-08-20 21:00:56 +00:00
|
|
|
}
|
|
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
bool MusicWheel::IsRouletting() const
|
2002-08-20 21:00:56 +00:00
|
|
|
{
|
2003-01-03 03:24:00 +00:00
|
|
|
return m_WheelState == STATE_ROULETTE_SPINNING || m_WheelState == STATE_ROULETTE_SLOWING_DOWN ||
|
|
|
|
|
m_WheelState == STATE_RANDOM_SPINNING;
|
2002-08-20 21:00:56 +00:00
|
|
|
}
|
|
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
int MusicWheel::IsMoving() const
|
2002-02-09 04:30:27 +00:00
|
|
|
{
|
2003-01-21 07:04:53 +00:00
|
|
|
return m_Moving && m_TimeBeforeMovingBegins == 0;
|
2003-01-02 02:59:25 +00:00
|
|
|
}
|
2002-05-28 20:01:22 +00:00
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
void MusicWheel::TweenOnScreen(bool changing_sort)
|
|
|
|
|
{
|
|
|
|
|
m_WheelState = STATE_TWEENING_ON_SCREEN;
|
|
|
|
|
|
2003-11-18 18:07:37 +00:00
|
|
|
SetItemPosition( m_sprSelectionOverlay, 0 );
|
2003-01-02 02:59:25 +00:00
|
|
|
|
2003-11-26 00:16:50 +00:00
|
|
|
COMMAND( m_sprSelectionOverlay, "StartOn");
|
|
|
|
|
if( changing_sort )
|
|
|
|
|
{
|
|
|
|
|
const float delay = fabsf(NUM_WHEEL_ITEMS/2-WHEEL_ITEM_ON_DELAY_CENTER) * WHEEL_ITEM_ON_DELAY_OFFSET;
|
|
|
|
|
m_sprSelectionOverlay.BeginTweening( delay ); // sleep
|
|
|
|
|
COMMAND( m_sprSelectionOverlay, "FinishOnSort");
|
2003-01-02 02:59:25 +00:00
|
|
|
} else {
|
2003-11-26 00:16:50 +00:00
|
|
|
COMMAND( m_sprSelectionOverlay, "FinishOn");
|
2003-01-02 02:59:25 +00:00
|
|
|
}
|
2002-05-29 09:47:24 +00:00
|
|
|
|
2003-11-18 18:47:17 +00:00
|
|
|
m_ScrollBar.SetX( SCROLL_BAR_X );
|
|
|
|
|
m_ScrollBar.Command( "addx,+30" );
|
2003-01-02 02:59:25 +00:00
|
|
|
if(changing_sort)
|
2003-11-18 17:53:18 +00:00
|
|
|
m_ScrollBar.BeginTweening( 0.2f ); // sleep
|
2003-01-02 02:59:25 +00:00
|
|
|
else
|
2003-11-18 17:53:18 +00:00
|
|
|
m_ScrollBar.BeginTweening( 0.7f ); // sleep
|
|
|
|
|
m_ScrollBar.BeginTweening( 0.2f , Actor::TWEEN_ACCELERATE );
|
2003-11-18 18:47:17 +00:00
|
|
|
m_ScrollBar.Command( "addx,-30" );
|
2002-05-28 20:01:22 +00:00
|
|
|
|
2003-03-26 19:15:38 +00:00
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
|
2002-05-28 20:01:22 +00:00
|
|
|
{
|
2003-03-31 23:06:15 +00:00
|
|
|
MusicWheelItem& display = m_MusicWheelItems[i];
|
2003-03-26 19:15:38 +00:00
|
|
|
float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection;
|
2003-11-18 18:07:37 +00:00
|
|
|
SetItemPosition( display, fThisBannerPositionOffsetFromSelection );
|
2003-11-18 17:53:18 +00:00
|
|
|
|
2003-11-18 18:47:17 +00:00
|
|
|
COMMAND( display, "StartOn");
|
|
|
|
|
const float delay = fabsf(i-WHEEL_ITEM_ON_DELAY_CENTER) * WHEEL_ITEM_ON_DELAY_OFFSET;
|
2003-11-26 00:16:50 +00:00
|
|
|
display.BeginTweening( delay ); // sleep
|
|
|
|
|
COMMAND( display, "FinishOn");
|
2003-11-18 17:53:18 +00:00
|
|
|
if( changing_sort )
|
|
|
|
|
display.HurryTweening( 0.25f );
|
2002-05-28 20:01:22 +00:00
|
|
|
}
|
2003-01-02 02:59:25 +00:00
|
|
|
|
2003-11-18 17:53:18 +00:00
|
|
|
if( changing_sort )
|
|
|
|
|
HurryTweening( 0.25f );
|
|
|
|
|
|
2003-03-02 01:43:33 +00:00
|
|
|
m_fTimeLeftInState = GetTweenTimeLeft() + 0.100f;
|
2002-02-07 02:16:14 +00:00
|
|
|
}
|
|
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
void MusicWheel::TweenOffScreen(bool changing_sort)
|
2002-02-09 04:30:27 +00:00
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
m_WheelState = STATE_TWEENING_OFF_SCREEN;
|
2002-05-28 20:01:22 +00:00
|
|
|
|
2003-11-18 18:07:37 +00:00
|
|
|
SetItemPosition( m_sprSelectionOverlay, 0 );
|
2003-01-02 02:59:25 +00:00
|
|
|
|
2003-11-26 00:16:50 +00:00
|
|
|
COMMAND( m_sprSelectionOverlay, "StartOff");
|
|
|
|
|
if(changing_sort)
|
|
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
/* When changing sort, tween the overlay with the item in the center;
|
|
|
|
|
* having it separate looks messy when we're moving fast. */
|
2003-11-26 00:16:50 +00:00
|
|
|
const float delay = fabsf(NUM_WHEEL_ITEMS/2-WHEEL_ITEM_ON_DELAY_CENTER) * WHEEL_ITEM_ON_DELAY_OFFSET;
|
|
|
|
|
m_sprSelectionOverlay.BeginTweening( delay ); // sleep
|
|
|
|
|
COMMAND( m_sprSelectionOverlay, "FinishOffSort");
|
2003-01-02 02:59:25 +00:00
|
|
|
} else {
|
2003-11-26 00:16:50 +00:00
|
|
|
COMMAND( m_sprSelectionOverlay, "FinishOff");
|
2003-01-02 02:59:25 +00:00
|
|
|
}
|
2003-11-26 00:16:50 +00:00
|
|
|
COMMAND( m_sprSelectionOverlay, "FinishOff");
|
2002-05-29 09:47:24 +00:00
|
|
|
|
2002-09-02 21:59:58 +00:00
|
|
|
m_ScrollBar.BeginTweening( 0 );
|
2003-11-18 17:53:18 +00:00
|
|
|
m_ScrollBar.BeginTweening( 0.2f, Actor::TWEEN_ACCELERATE );
|
2003-04-12 06:16:12 +00:00
|
|
|
m_ScrollBar.SetX( SCROLL_BAR_X+30 );
|
2002-05-28 20:01:22 +00:00
|
|
|
|
2003-03-26 19:15:38 +00:00
|
|
|
for( int i=0; i<NUM_WHEEL_ITEMS; i++ )
|
2002-05-28 20:01:22 +00:00
|
|
|
{
|
2003-03-31 23:06:15 +00:00
|
|
|
MusicWheelItem& display = m_MusicWheelItems[i];
|
2003-03-26 19:15:38 +00:00
|
|
|
float fThisBannerPositionOffsetFromSelection = i - NUM_WHEEL_ITEMS/2 + m_fPositionOffsetFromSelection;
|
2003-11-18 18:07:37 +00:00
|
|
|
SetItemPosition( display, fThisBannerPositionOffsetFromSelection );
|
2003-11-18 18:47:17 +00:00
|
|
|
|
|
|
|
|
COMMAND( display, "StartOff");
|
|
|
|
|
const float delay = fabsf(i-WHEEL_ITEM_OFF_DELAY_CENTER) * WHEEL_ITEM_OFF_DELAY_OFFSET;
|
|
|
|
|
display.BeginTweening( delay ); // sleep
|
|
|
|
|
COMMAND( display, "FinishOff");
|
2003-11-18 17:53:18 +00:00
|
|
|
if( changing_sort )
|
|
|
|
|
display.HurryTweening( 0.25f );
|
2002-05-28 20:01:22 +00:00
|
|
|
}
|
|
|
|
|
|
2003-11-18 17:53:18 +00:00
|
|
|
if( changing_sort )
|
|
|
|
|
HurryTweening( 0.25f );
|
|
|
|
|
|
2003-03-02 01:43:33 +00:00
|
|
|
m_fTimeLeftInState = GetTweenTimeLeft() + 0.100f;
|
2002-06-24 22:04:31 +00:00
|
|
|
}
|
2002-12-30 21:57:54 +00:00
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
void MusicWheel::Move(int n)
|
2002-12-30 22:40:34 +00:00
|
|
|
{
|
2003-01-02 02:59:25 +00:00
|
|
|
if(n == m_Moving)
|
|
|
|
|
return;
|
2002-12-30 22:40:34 +00:00
|
|
|
|
2003-01-21 07:04:53 +00:00
|
|
|
if( m_WheelState == STATE_LOCKED )
|
|
|
|
|
{
|
|
|
|
|
if(n)
|
|
|
|
|
{
|
2003-03-24 21:37:13 +00:00
|
|
|
int iSign = n/abs(n);
|
|
|
|
|
m_fLockedWheelVelocity = iSign*LOCKED_INITIAL_VELOCITY;
|
2003-01-21 07:04:53 +00:00
|
|
|
m_soundLocked.Play();
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
2003-01-02 02:59:25 +00:00
|
|
|
|
2003-01-21 07:04:53 +00:00
|
|
|
/* If we're not selecting, discard this. We won't ignore it; we'll
|
|
|
|
|
* get called again every time the key is repeated. */
|
2004-01-11 09:42:37 +00:00
|
|
|
/* Still process Move(0) so we sometimes continue moving immediate
|
|
|
|
|
* after the sort change finished and before the repeat event causes a
|
|
|
|
|
* Move(0). -Chris */
|
|
|
|
|
switch( m_WheelState )
|
|
|
|
|
{
|
|
|
|
|
case STATE_SELECTING_MUSIC:
|
2004-01-11 20:41:48 +00:00
|
|
|
break;
|
2004-01-11 09:42:37 +00:00
|
|
|
case STATE_FLYING_OFF_BEFORE_NEXT_SORT:
|
|
|
|
|
case STATE_FLYING_ON_AFTER_NEXT_SORT:
|
2004-01-11 20:41:48 +00:00
|
|
|
if( n!= 0 )
|
|
|
|
|
return;
|
2004-01-11 09:42:37 +00:00
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
return; // don't continue
|
|
|
|
|
}
|
2003-01-02 02:59:25 +00:00
|
|
|
|
2003-01-21 07:04:53 +00:00
|
|
|
if(m_Moving != 0 && n == 0 && m_TimeBeforeMovingBegins == 0)
|
2003-01-02 02:59:25 +00:00
|
|
|
{
|
2003-01-21 07:04:53 +00:00
|
|
|
/* We were moving, and now we're stopping. If we're really close to
|
|
|
|
|
* the selection, move to the next one, so we have a chance to spin down
|
|
|
|
|
* smoothly. */
|
|
|
|
|
if(fabsf(m_fPositionOffsetFromSelection) < 0.25f )
|
|
|
|
|
ChangeMusic(m_Moving);
|
|
|
|
|
|
2003-01-02 02:59:25 +00:00
|
|
|
/* Make sure the user always gets an SM_SongChanged when
|
2003-01-21 07:04:53 +00:00
|
|
|
* Moving() is 0, so the final banner, etc. always gets set. */
|
2003-03-25 21:17:29 +00:00
|
|
|
SCREENMAN->PostMessageToTopScreen( SM_SongChanged, 0 );
|
2003-01-02 02:59:25 +00:00
|
|
|
}
|
2003-01-21 07:04:53 +00:00
|
|
|
|
2003-11-25 22:51:34 +00:00
|
|
|
m_TimeBeforeMovingBegins = 1/4.0f;
|
2003-01-21 07:04:53 +00:00
|
|
|
m_SpinSpeed = float(PREFSMAN->m_iMusicWheelSwitchSpeed);
|
|
|
|
|
m_Moving = n;
|
|
|
|
|
|
|
|
|
|
if(m_Moving)
|
|
|
|
|
ChangeMusic(m_Moving);
|
2002-12-30 22:40:34 +00:00
|
|
|
}
|