2003-06-20 23:07:45 +00:00
|
|
|
#include "global.h"
|
|
|
|
|
/*
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
Class: ScreenSelectMaster
|
|
|
|
|
|
|
|
|
|
Desc: See header.
|
|
|
|
|
|
|
|
|
|
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
|
|
|
|
|
Chris Danford
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "ScreenSelectMaster.h"
|
|
|
|
|
#include "ScreenManager.h"
|
|
|
|
|
#include "PrefsManager.h"
|
|
|
|
|
#include "GameManager.h"
|
|
|
|
|
#include "ThemeManager.h"
|
2003-07-26 23:05:16 +00:00
|
|
|
#include "RageSounds.h"
|
2003-06-20 23:07:45 +00:00
|
|
|
#include "GameState.h"
|
|
|
|
|
#include "AnnouncerManager.h"
|
|
|
|
|
#include "ModeChoice.h"
|
|
|
|
|
#include "ActorUtil.h"
|
2003-11-05 18:49:57 +00:00
|
|
|
#include "RageLog.h"
|
2003-06-20 23:07:45 +00:00
|
|
|
|
2003-11-04 20:57:19 +00:00
|
|
|
#define NUM_ICON_PARTS THEME->GetMetricI(m_sName,"NumIconParts")
|
|
|
|
|
#define NUM_PREVIEW_PARTS THEME->GetMetricI(m_sName,"NumPreviewParts")
|
|
|
|
|
#define NUM_CURSOR_PARTS THEME->GetMetricI(m_sName,"NumCursorParts")
|
|
|
|
|
#define SHARED_PREVIEW_AND_CURSOR THEME->GetMetricB(m_sName,"SharedPreviewAndCursor")
|
|
|
|
|
#define NUM_CHOICES_ON_PAGE_1 THEME->GetMetricI(m_sName,"NumChoicesOnPage1")
|
|
|
|
|
#define CURSOR_OFFSET_X_FROM_ICON( p, part ) THEME->GetMetricF(m_sName,ssprintf("CursorPart%dP%dOffsetXFromIcon",part+1,p+1))
|
|
|
|
|
#define CURSOR_OFFSET_Y_FROM_ICON( p, part ) THEME->GetMetricF(m_sName,ssprintf("CursorPart%dP%dOffsetYFromIcon",part+1,p+1))
|
|
|
|
|
#define PRE_SWITCH_PAGE_SECONDS THEME->GetMetricF(m_sName,"PreSwitchPageSeconds")
|
|
|
|
|
#define POST_SWITCH_PAGE_SECONDS THEME->GetMetricF(m_sName,"PostSwitchPageSeconds")
|
2003-12-22 08:52:35 +00:00
|
|
|
#define EXTRA_SLEEP_AFTER_TWEEN_OFF_SECONDS THEME->GetMetricF(m_sName,"ExtraSleepAfterTweenOffSeconds")
|
2003-11-12 02:53:28 +00:00
|
|
|
#define OPTION_ORDER( dir ) THEME->GetMetric (m_sName,"OptionOrder"+CString(dir))
|
2004-01-17 23:14:56 +00:00
|
|
|
#define SHOW_SCROLLER THEME->GetMetricB(m_sName,"ShowScroller")
|
|
|
|
|
#define SCROLLER_SECONDS_PER_ITEM THEME->GetMetricF(m_sName,"ScrollerSecondsPerItem")
|
|
|
|
|
#define SCROLLER_SPACING_X THEME->GetMetricF(m_sName,"ScrollerSpacingX")
|
|
|
|
|
#define SCROLLER_SPACING_Y THEME->GetMetricF(m_sName,"ScrollerSpacingY")
|
2003-11-12 02:53:28 +00:00
|
|
|
|
|
|
|
|
/* OptionOrderLeft=0:1,1:2,2:3,3:4 */
|
|
|
|
|
const char *ScreenSelectMaster::dirs[NUM_DIRS] =
|
|
|
|
|
{
|
|
|
|
|
"Up", "Down", "Left", "Right", "Auto"
|
|
|
|
|
};
|
2003-06-20 23:07:45 +00:00
|
|
|
|
|
|
|
|
const ScreenMessage SM_PlayPostSwitchPage = (ScreenMessage)(SM_User+1);
|
|
|
|
|
|
2003-09-27 22:30:51 +00:00
|
|
|
ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sClassName )
|
2003-06-20 23:07:45 +00:00
|
|
|
{
|
|
|
|
|
int p, i;
|
|
|
|
|
|
|
|
|
|
for( p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
|
|
|
|
m_iChoice[p] = 0;
|
|
|
|
|
m_bChosen[p] = false;
|
|
|
|
|
}
|
|
|
|
|
|
2004-01-17 23:14:56 +00:00
|
|
|
// init cursor
|
2003-06-20 23:07:45 +00:00
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( i=0; i<NUM_CURSOR_PARTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
CString sFName = ssprintf("%s Cursor Part%d", m_sName.c_str(),i+1);
|
|
|
|
|
m_sprCursor[i][0].SetName( ssprintf("CursorPart%d",i+1) );
|
|
|
|
|
m_sprCursor[i][0].Load( THEME->GetPathToG(sFName) );
|
|
|
|
|
this->AddChild( &m_sprCursor[i][0] );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( i=0; i<NUM_CURSOR_PARTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
for( p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
|
|
|
|
if( !GAMESTATE->IsPlayerEnabled(p) )
|
|
|
|
|
continue; // skip
|
|
|
|
|
CString sFName = ssprintf("%s Cursor Part%d P%d", m_sName.c_str(),i+1,p+1);
|
|
|
|
|
m_sprCursor[i][p].SetName( ssprintf("CursorPart%dP%d",i+1,p+1) );
|
|
|
|
|
m_sprCursor[i][p].Load( THEME->GetPathToG(sFName) );
|
|
|
|
|
this->AddChild( &m_sprCursor[i][p] );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-01-17 23:14:56 +00:00
|
|
|
// init scroll
|
|
|
|
|
if( SHOW_SCROLLER )
|
|
|
|
|
{
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
2004-02-01 03:14:37 +00:00
|
|
|
m_Scroller[0].Load(
|
|
|
|
|
SCROLLER_SECONDS_PER_ITEM,
|
|
|
|
|
7,
|
|
|
|
|
RageVector3( 0, 0, 0 ),
|
|
|
|
|
RageVector3( 0, 0, 0 ),
|
|
|
|
|
RageVector3( SCROLLER_SPACING_X, SCROLLER_SPACING_Y, 0 ),
|
|
|
|
|
RageVector3( 0, 0, 0 ) );
|
2004-01-17 23:14:56 +00:00
|
|
|
m_Scroller[0].SetName( "Scroller" );
|
|
|
|
|
this->AddChild( &m_Scroller[0] );
|
|
|
|
|
|
|
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
|
|
|
|
{
|
|
|
|
|
// const ModeChoice& mc = m_aModeChoices[c];
|
|
|
|
|
|
|
|
|
|
CString sFName = ssprintf("%s Scroll Choice%d", m_sName.c_str(),c+1);
|
|
|
|
|
m_sprScroll[c][0].Load( THEME->GetPathToG(sFName) );
|
|
|
|
|
m_sprScroll[c][0]->SetName( ssprintf("Scroll") );
|
|
|
|
|
m_Scroller[0].AddChild( m_sprScroll[c][0] );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
|
|
|
|
if( !GAMESTATE->IsPlayerEnabled(p) )
|
|
|
|
|
continue; // skip
|
|
|
|
|
|
2004-02-01 03:14:37 +00:00
|
|
|
m_Scroller[p].Load(
|
|
|
|
|
SCROLLER_SECONDS_PER_ITEM,
|
|
|
|
|
7,
|
|
|
|
|
RageVector3( 0, 0, 0 ),
|
|
|
|
|
RageVector3( 0, 0, 0 ),
|
|
|
|
|
RageVector3( SCROLLER_SPACING_X, SCROLLER_SPACING_Y, 0 ),
|
|
|
|
|
RageVector3( 0, 0, 0 ) );
|
2004-01-17 23:14:56 +00:00
|
|
|
m_Scroller[p].SetName( ssprintf("ScrollerP%d",p+1) );
|
|
|
|
|
this->AddChild( &m_Scroller[p] );
|
|
|
|
|
|
|
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
|
|
|
|
{
|
|
|
|
|
// const ModeChoice& mc = m_aModeChoices[c];
|
|
|
|
|
|
|
|
|
|
CString sFName = ssprintf("%s Scroll Choice%d P%d", m_sName.c_str(),c+1,p+1);
|
|
|
|
|
m_sprScroll[c][p].Load( THEME->GetPathToG(sFName) );
|
|
|
|
|
m_sprScroll[c][p]->SetName( ssprintf("ScrollP%d",p+1) );
|
|
|
|
|
m_Scroller[p].AddChild( m_sprScroll[c][p] );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-06-20 23:07:45 +00:00
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
|
|
|
|
{
|
2003-06-24 20:06:42 +00:00
|
|
|
// const ModeChoice& mc = m_aModeChoices[c];
|
2003-06-20 23:07:45 +00:00
|
|
|
|
2004-01-17 23:14:56 +00:00
|
|
|
// init icon
|
2003-06-20 23:07:45 +00:00
|
|
|
for( i=0; i<NUM_ICON_PARTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
CString sFName = ssprintf("%s Icon Part%d Choice%d", m_sName.c_str(),i+1,c+1);
|
|
|
|
|
m_sprIcon[i][c].Load( THEME->GetPathToG(sFName) );
|
2003-11-05 04:09:10 +00:00
|
|
|
m_sprIcon[i][c]->SetName( ssprintf("IconPart%dChoice%d",i+1,c+1) );
|
|
|
|
|
this->AddChild( m_sprIcon[i][c] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
2004-01-17 23:14:56 +00:00
|
|
|
// init preview
|
2003-06-20 23:07:45 +00:00
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( i=0; i<NUM_PREVIEW_PARTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
CString sFName = ssprintf("%s Preview Part%d Choice%d", m_sName.c_str(),i+1,c+1);
|
|
|
|
|
m_sprPreview[i][c][0].Load( THEME->GetPathToG(sFName) );
|
2003-11-05 04:09:10 +00:00
|
|
|
m_sprPreview[i][c][0]->SetName( ssprintf("PreviewPart%d",i+1) );
|
|
|
|
|
this->AddChild( m_sprPreview[i][c][0] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2004-01-17 23:14:56 +00:00
|
|
|
for( p=0; p<NUM_PLAYERS; p++ )
|
2003-06-20 23:07:45 +00:00
|
|
|
{
|
2004-01-17 23:14:56 +00:00
|
|
|
if( !GAMESTATE->IsPlayerEnabled(p) )
|
|
|
|
|
continue; // skip
|
|
|
|
|
for( i=0; i<NUM_PREVIEW_PARTS; i++ )
|
2003-06-20 23:07:45 +00:00
|
|
|
{
|
|
|
|
|
CString sFName = ssprintf("%s Preview Part%d Choice%d P%d", m_sName.c_str(),i+1,c+1,p+1);
|
|
|
|
|
m_sprPreview[i][c][p].Load( THEME->GetPathToG(sFName) );
|
2003-11-05 04:09:10 +00:00
|
|
|
m_sprPreview[i][c][p]->SetName( ssprintf("PreviewPart%dP%d",i+1,p+1) );
|
|
|
|
|
this->AddChild( m_sprPreview[i][c][p] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-01-17 23:14:56 +00:00
|
|
|
|
2003-06-20 23:07:45 +00:00
|
|
|
for( int page=0; page<NUM_PAGES; page++ )
|
|
|
|
|
{
|
|
|
|
|
m_sprMore[page].SetName( ssprintf("MorePage%d",page+1) );
|
2003-11-04 21:07:36 +00:00
|
|
|
m_sprMore[page].Load( THEME->GetPathToG( ssprintf("%s more page%d",m_sName.c_str(), page+1) ) );
|
2003-06-20 23:07:45 +00:00
|
|
|
this->AddChild( &m_sprMore[page] );
|
|
|
|
|
|
2003-11-04 21:07:36 +00:00
|
|
|
m_sprExplanation[page].Load( THEME->GetPathToG( ssprintf("%s explanation page%d",m_sName.c_str(), page+1) ) );
|
2003-11-05 19:35:57 +00:00
|
|
|
m_sprExplanation[page]->SetName( ssprintf("ExplanationPage%d",page+1) );
|
|
|
|
|
this->AddChild( m_sprExplanation[page] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for( p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
|
|
|
|
CLAMP( m_iChoice[p], 0, (int)m_aModeChoices.size()-1 );
|
|
|
|
|
m_bChosen[p] = false;
|
|
|
|
|
}
|
|
|
|
|
|
2004-01-06 06:48:24 +00:00
|
|
|
m_soundChange.Load( THEME->GetPathToS( ssprintf("%s change", m_sName.c_str())), true );
|
2003-06-20 23:07:45 +00:00
|
|
|
m_soundSelect.Load( THEME->GetPathToS( "Common start") );
|
|
|
|
|
m_soundDifficult.Load( ANNOUNCER->GetPathTo("select difficulty challenge") );
|
|
|
|
|
|
2004-01-17 23:14:56 +00:00
|
|
|
// init m_Next order info
|
2003-11-12 02:53:28 +00:00
|
|
|
for( int dir = 0; dir < NUM_DIRS; ++dir )
|
|
|
|
|
{
|
|
|
|
|
const CString dirname = dirs[dir];
|
|
|
|
|
const CString order = OPTION_ORDER( dirname );
|
|
|
|
|
vector<CString> parts;
|
|
|
|
|
split( order, ",", parts, true );
|
|
|
|
|
|
|
|
|
|
if( parts.size() == 0 )
|
|
|
|
|
continue;
|
|
|
|
|
for( unsigned c = 0; c < m_aModeChoices.size(); ++c )
|
|
|
|
|
m_Next[dir][c] = -1;
|
|
|
|
|
|
|
|
|
|
for( unsigned part = 0; part < parts.size(); ++part )
|
|
|
|
|
{
|
|
|
|
|
unsigned from, to;
|
|
|
|
|
if( sscanf( parts[part], "%u:%u", &from, &to ) != 2 )
|
|
|
|
|
{
|
|
|
|
|
LOG->Warn( "%s::OptionOrder%s parse error", m_sName.c_str(), dirname.c_str() );
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
--from;
|
|
|
|
|
--to;
|
|
|
|
|
|
2003-12-01 00:28:48 +00:00
|
|
|
if( from >= m_aModeChoices.size() ||
|
|
|
|
|
to >= m_aModeChoices.size() )
|
2003-11-12 02:53:28 +00:00
|
|
|
{
|
|
|
|
|
LOG->Warn( "%s::OptionOrder%s out of range", m_sName.c_str(), dirname.c_str() );
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_Next[dir][from] = to;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-11-10 16:58:04 +00:00
|
|
|
this->UpdateSelectableChoices();
|
|
|
|
|
|
2004-02-01 03:14:37 +00:00
|
|
|
m_fLockInputSecs = this->GetTweenTimeLeft();
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenSelectMaster::Update( float fDelta )
|
|
|
|
|
{
|
|
|
|
|
ScreenSelect::Update( fDelta );
|
|
|
|
|
m_fLockInputSecs = max( 0, m_fLockInputSecs-fDelta );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenSelectMaster::HandleScreenMessage( const ScreenMessage SM )
|
|
|
|
|
{
|
|
|
|
|
ScreenSelect::HandleScreenMessage( SM );
|
|
|
|
|
|
|
|
|
|
switch( SM )
|
|
|
|
|
{
|
|
|
|
|
case SM_PlayPostSwitchPage:
|
|
|
|
|
{
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
m_sprCursor[i][0].SetXY( GetCursorX((PlayerNumber)0,i), GetCursorY((PlayerNumber)0,i) );
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprCursor[i][0], "PostSwitchPage" );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
|
|
|
|
{
|
|
|
|
|
m_sprCursor[i][p].SetXY( GetCursorX((PlayerNumber)p,i), GetCursorY((PlayerNumber)p,i) );
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprCursor[i][p], "PostSwitchPage" );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprPreview[i][m_iChoice[0]][0], "PostSwitchPage" );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprPreview[i][m_iChoice[p]][p], "PostSwitchPage" );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_fLockInputSecs = POST_SWITCH_PAGE_SECONDS;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SM_BeginFadingOut:
|
2004-02-01 03:14:37 +00:00
|
|
|
{
|
|
|
|
|
TweenOffScreen();
|
|
|
|
|
float fSecs = GetTweenTimeLeft();
|
|
|
|
|
/* This can be used to allow overlap between the main tween-off and the MenuElements
|
|
|
|
|
* tweenoff. */
|
|
|
|
|
fSecs += EXTRA_SLEEP_AFTER_TWEEN_OFF_SECONDS;
|
|
|
|
|
fSecs = max( fSecs, 0 );
|
|
|
|
|
SCREENMAN->PostMessageToTopScreen( SM_AllDoneChoosing, fSecs ); // nofify parent that we're finished
|
|
|
|
|
m_Menu.StopTimer();
|
|
|
|
|
}
|
2003-06-20 23:07:45 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ScreenSelectMaster::GetSelectionIndex( PlayerNumber pn )
|
|
|
|
|
{
|
|
|
|
|
return m_iChoice[pn];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenSelectMaster::UpdateSelectableChoices()
|
|
|
|
|
{
|
|
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
2003-11-10 21:18:26 +00:00
|
|
|
for( int i=0; i<NUM_ICON_PARTS; i++ )
|
|
|
|
|
COMMAND( m_sprIcon[i][c], m_aModeChoices[c].IsPlayable()? "Enabled":"Disabled" );
|
2003-06-20 23:07:45 +00:00
|
|
|
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
2003-11-10 16:58:04 +00:00
|
|
|
if( !GAMESTATE->IsHumanPlayer(p) )
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if( !m_aModeChoices[m_iChoice[p]].IsPlayable() )
|
2003-11-12 02:53:28 +00:00
|
|
|
Move( (PlayerNumber) p, DIR_AUTO );
|
2003-11-10 16:58:04 +00:00
|
|
|
ASSERT( m_aModeChoices[m_iChoice[p]].IsPlayable() );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-11-12 02:53:28 +00:00
|
|
|
bool ScreenSelectMaster::Move( PlayerNumber pn, Dirs dir )
|
2003-11-10 16:58:04 +00:00
|
|
|
{
|
2003-11-12 02:53:28 +00:00
|
|
|
const int start = m_iChoice[pn];
|
2003-11-10 16:58:04 +00:00
|
|
|
int iSwitchToIndex = m_iChoice[pn];
|
2003-11-10 19:05:04 +00:00
|
|
|
do
|
2003-11-10 16:58:04 +00:00
|
|
|
{
|
2003-11-12 02:53:28 +00:00
|
|
|
iSwitchToIndex = m_Next[dir][iSwitchToIndex];
|
|
|
|
|
if( iSwitchToIndex == -1 )
|
|
|
|
|
return false; // can't go that way
|
|
|
|
|
if( iSwitchToIndex == start )
|
|
|
|
|
return false; // went full circle and none found
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
2003-11-10 19:05:04 +00:00
|
|
|
while( !m_aModeChoices[iSwitchToIndex].IsPlayable() );
|
2003-11-10 16:58:04 +00:00
|
|
|
|
|
|
|
|
return ChangeSelection( pn, iSwitchToIndex );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenSelectMaster::MenuLeft( PlayerNumber pn )
|
|
|
|
|
{
|
2003-11-12 02:53:28 +00:00
|
|
|
if( m_fLockInputSecs > 0 || m_bChosen[pn] )
|
2003-06-20 23:07:45 +00:00
|
|
|
return;
|
2003-11-12 02:53:28 +00:00
|
|
|
if( Move(pn, DIR_LEFT) )
|
2003-11-10 16:58:04 +00:00
|
|
|
m_soundChange.Play();
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenSelectMaster::MenuRight( PlayerNumber pn )
|
|
|
|
|
{
|
2003-11-12 02:53:28 +00:00
|
|
|
if( m_fLockInputSecs > 0 || m_bChosen[pn] )
|
|
|
|
|
return;
|
|
|
|
|
if( Move(pn, DIR_RIGHT) )
|
|
|
|
|
m_soundChange.Play();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenSelectMaster::MenuUp( PlayerNumber pn )
|
|
|
|
|
{
|
|
|
|
|
if( m_fLockInputSecs > 0 || m_bChosen[pn] )
|
2003-06-20 23:07:45 +00:00
|
|
|
return;
|
2003-11-12 02:53:28 +00:00
|
|
|
if( Move(pn, DIR_UP) )
|
|
|
|
|
m_soundChange.Play();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenSelectMaster::MenuDown( PlayerNumber pn )
|
|
|
|
|
{
|
|
|
|
|
if( m_fLockInputSecs > 0 || m_bChosen[pn] )
|
2003-06-20 23:07:45 +00:00
|
|
|
return;
|
2003-11-12 02:53:28 +00:00
|
|
|
if( Move(pn, DIR_DOWN) )
|
2003-11-10 16:58:04 +00:00
|
|
|
m_soundChange.Play();
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
2003-11-10 16:58:04 +00:00
|
|
|
bool ScreenSelectMaster::ChangePage( int iNewChoice )
|
2003-06-20 23:07:45 +00:00
|
|
|
{
|
2003-11-10 16:58:04 +00:00
|
|
|
Page newPage = GetPage(iNewChoice);
|
|
|
|
|
|
2003-06-20 23:07:45 +00:00
|
|
|
// If anyone has already chosen, don't allow changing of pages
|
2003-06-21 15:58:19 +00:00
|
|
|
int p;
|
|
|
|
|
for( p=0; p<NUM_PLAYERS; p++ )
|
2003-06-20 23:07:45 +00:00
|
|
|
if( GAMESTATE->IsHumanPlayer(p) && m_bChosen[p] )
|
2003-11-10 16:58:04 +00:00
|
|
|
return false;
|
2003-06-20 23:07:45 +00:00
|
|
|
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprCursor[i][0], "PreSwitchPage" );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsHumanPlayer(p) )
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprCursor[i][p], "PreSwitchPage" );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const CString sIconAndExplanationCommand = ssprintf( "SwitchToPage%d", newPage+1 );
|
|
|
|
|
|
|
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
|
|
|
|
for( int i=0; i<NUM_ICON_PARTS; i++ )
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprIcon[i][c], sIconAndExplanationCommand );
|
2003-06-20 23:07:45 +00:00
|
|
|
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprPreview[i][m_iChoice[p]][0], "PreSwitchPage" );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprPreview[i][m_iChoice[p]][p], "PreSwitchPage" );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for( int page=0; page<NUM_PAGES; page++ )
|
|
|
|
|
{
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprExplanation[page], sIconAndExplanationCommand );
|
|
|
|
|
COMMAND( m_sprMore[page], sIconAndExplanationCommand );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if( newPage == PAGE_2 )
|
|
|
|
|
{
|
|
|
|
|
// XXX: only play this once (I thought we already did that?)
|
|
|
|
|
// DDR plays it on every change to page 2. -Chris
|
2003-11-04 20:57:19 +00:00
|
|
|
/* That sounds ugly if you go back and forth quickly. -g */
|
2004-01-17 23:14:56 +00:00
|
|
|
// DDR locks input while it's scrolling. Should we do the same? -Chris
|
2003-06-20 23:07:45 +00:00
|
|
|
m_soundDifficult.Stop();
|
|
|
|
|
m_soundDifficult.PlayRandom();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// change both players
|
|
|
|
|
for( p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
m_iChoice[p] = iNewChoice;
|
|
|
|
|
|
|
|
|
|
m_fLockInputSecs = PRE_SWITCH_PAGE_SECONDS;
|
|
|
|
|
this->PostScreenMessage( SM_PlayPostSwitchPage, PRE_SWITCH_PAGE_SECONDS );
|
2003-11-10 16:58:04 +00:00
|
|
|
return true;
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
2003-11-10 16:58:04 +00:00
|
|
|
bool ScreenSelectMaster::ChangeSelection( PlayerNumber pn, int iNewChoice )
|
2003-06-20 23:07:45 +00:00
|
|
|
{
|
2003-11-10 16:58:04 +00:00
|
|
|
if( GetPage(m_iChoice[pn]) != GetPage(iNewChoice) )
|
|
|
|
|
return ChangePage( iNewChoice );
|
|
|
|
|
|
2003-12-02 09:04:00 +00:00
|
|
|
bool bMoveAll = SHARED_PREVIEW_AND_CURSOR || GetCurrentPage()!=PAGE_1;
|
|
|
|
|
|
2003-06-20 23:07:45 +00:00
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
2004-01-21 02:11:23 +00:00
|
|
|
/* Set the new m_iChoice even for disabled players, since a player might
|
|
|
|
|
* join on a SHARED_PREVIEW_AND_CURSOR after the cursor has been moved. */
|
|
|
|
|
const int iOldChoice = m_iChoice[p];
|
|
|
|
|
m_iChoice[p] = iNewChoice;
|
|
|
|
|
|
2003-06-20 23:07:45 +00:00
|
|
|
if( !GAMESTATE->IsHumanPlayer(p) )
|
|
|
|
|
continue; // skip
|
|
|
|
|
|
2003-12-02 09:04:00 +00:00
|
|
|
if( !bMoveAll && p!=pn )
|
2003-06-20 23:07:45 +00:00
|
|
|
continue; // skip
|
|
|
|
|
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
COMMAND( m_sprPreview[i][iOldChoice][0], "LoseFocus" );
|
|
|
|
|
COMMAND( m_sprPreview[i][iNewChoice][0], "GainFocus" );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
COMMAND( m_sprPreview[i][iOldChoice][p], "LoseFocus" );
|
|
|
|
|
COMMAND( m_sprPreview[i][iNewChoice][p], "GainFocus" );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-11-05 04:09:10 +00:00
|
|
|
{
|
2003-11-05 18:49:57 +00:00
|
|
|
/* XXX: If !SharedPreviewAndCursor, this is incorrect. (Nothing uses
|
|
|
|
|
* both icon focus and !SharedPreviewAndCursor right now.) */
|
2003-11-10 16:58:04 +00:00
|
|
|
for( int i=0; i<NUM_ICON_PARTS; i++ )
|
2003-11-05 04:09:10 +00:00
|
|
|
{
|
|
|
|
|
COMMAND( m_sprIcon[i][iOldChoice], "LoseFocus" );
|
|
|
|
|
COMMAND( m_sprIcon[i][iNewChoice], "GainFocus" );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-06-20 23:07:45 +00:00
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
COMMAND( m_sprCursor[i][0], "Change" );
|
|
|
|
|
m_sprCursor[i][0].SetXY( GetCursorX((PlayerNumber)0,i), GetCursorY((PlayerNumber)0,i) );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
COMMAND( m_sprCursor[i][p], "Change" );
|
|
|
|
|
m_sprCursor[i][p].SetXY( GetCursorX((PlayerNumber)p,i), GetCursorY((PlayerNumber)p,i) );
|
|
|
|
|
}
|
|
|
|
|
}
|
2004-01-17 23:14:56 +00:00
|
|
|
|
|
|
|
|
if( SHOW_SCROLLER )
|
|
|
|
|
{
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
m_Scroller[0].SetDestinationItem( iNewChoice );
|
|
|
|
|
else
|
|
|
|
|
m_Scroller[p].SetDestinationItem( iNewChoice );
|
|
|
|
|
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
|
|
|
|
COMMAND( *m_sprScroll[c][0], int(c) == m_iChoice[0]? "GainFocus":"LoseFocus" );
|
|
|
|
|
else
|
|
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
|
|
|
|
COMMAND( *m_sprScroll[c][p], int(c) == m_iChoice[p]? "GainFocus":"LoseFocus" );
|
|
|
|
|
}
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
2004-01-17 23:14:56 +00:00
|
|
|
|
2003-11-10 16:58:04 +00:00
|
|
|
return true;
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
2003-11-10 21:18:26 +00:00
|
|
|
ScreenSelectMaster::Page ScreenSelectMaster::GetPage( int iChoiceIndex ) const
|
2003-06-20 23:07:45 +00:00
|
|
|
{
|
2003-11-10 21:18:26 +00:00
|
|
|
return iChoiceIndex < NUM_CHOICES_ON_PAGE_1? PAGE_1:PAGE_2;
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
2003-11-10 21:18:26 +00:00
|
|
|
ScreenSelectMaster::Page ScreenSelectMaster::GetCurrentPage() const
|
2003-06-20 23:07:45 +00:00
|
|
|
{
|
|
|
|
|
// Both players are guaranteed to be on the same page.
|
|
|
|
|
return GetPage( m_iChoice[GAMESTATE->m_MasterPlayerNumber] );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2004-02-01 03:14:37 +00:00
|
|
|
void ScreenSelectMaster::DoMenuStart( PlayerNumber pn )
|
2003-06-20 23:07:45 +00:00
|
|
|
{
|
|
|
|
|
if( m_bChosen[pn] == true )
|
2004-02-01 03:14:37 +00:00
|
|
|
return;
|
2003-06-20 23:07:45 +00:00
|
|
|
m_bChosen[pn] = true;
|
|
|
|
|
|
2003-11-10 18:57:29 +00:00
|
|
|
for( int page=0; page<NUM_PAGES; page++ )
|
2004-02-01 03:14:37 +00:00
|
|
|
OFF_COMMAND( m_sprMore[page] );
|
2003-06-20 23:07:45 +00:00
|
|
|
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( m_sprCursor[i][pn], "Choose");
|
2003-11-10 18:57:29 +00:00
|
|
|
}
|
2003-06-20 23:07:45 +00:00
|
|
|
|
2003-11-10 18:57:29 +00:00
|
|
|
void ScreenSelectMaster::MenuStart( PlayerNumber pn )
|
|
|
|
|
{
|
|
|
|
|
if( m_fLockInputSecs > 0 )
|
|
|
|
|
return;
|
2003-11-10 21:18:26 +00:00
|
|
|
if( m_bChosen[pn] == true )
|
|
|
|
|
return;
|
2003-11-10 18:57:29 +00:00
|
|
|
|
|
|
|
|
SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo(ssprintf("%s comment %s",m_sName.c_str(), m_aModeChoices[m_iChoice[pn]].m_sName.c_str())) );
|
|
|
|
|
m_soundSelect.Play();
|
2003-11-05 18:49:57 +00:00
|
|
|
|
2003-11-10 18:57:29 +00:00
|
|
|
bool bAllDone = true;
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR || GetCurrentPage() == PAGE_2 )
|
2003-11-05 18:49:57 +00:00
|
|
|
{
|
2003-11-10 18:57:29 +00:00
|
|
|
/* Only one player has to pick. Choose this for all the other players, too. */
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsHumanPlayer(p) )
|
|
|
|
|
{
|
|
|
|
|
ASSERT( !m_bChosen[p] );
|
2004-02-01 03:14:37 +00:00
|
|
|
DoMenuStart( (PlayerNumber)p );
|
2003-11-10 18:57:29 +00:00
|
|
|
}
|
2004-02-01 03:14:37 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DoMenuStart(pn);
|
2003-11-05 18:49:57 +00:00
|
|
|
// check to see if everyone has chosen
|
2003-11-10 18:57:29 +00:00
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
2003-11-05 18:49:57 +00:00
|
|
|
if( GAMESTATE->IsHumanPlayer((PlayerNumber)p) )
|
|
|
|
|
bAllDone &= m_bChosen[p];
|
|
|
|
|
}
|
|
|
|
|
|
2003-06-20 23:07:45 +00:00
|
|
|
if( bAllDone )
|
2004-02-01 03:14:37 +00:00
|
|
|
this->PostScreenMessage( SM_BeginFadingOut, GetTweenTimeLeft() );// tell our owner it's time to move on
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
2003-11-05 18:49:57 +00:00
|
|
|
/*
|
|
|
|
|
* We want all items to always run OnCommand and either GainFocus or LoseFocus on
|
|
|
|
|
* tween-in. If we only run OnCommand, then it has to contain a copy of either
|
|
|
|
|
* GainFocus or LoseFocus, which implies that the default setting is hard-coded in
|
|
|
|
|
* the theme. Always run both.
|
|
|
|
|
*
|
|
|
|
|
* However, the actual tween-in is OnCommand; we don't always want to actually run
|
|
|
|
|
* through the Gain/LoseFocus tweens during initial tween-in. So, we run the focus
|
|
|
|
|
* command first, do a FinishTweening to pop it in place, and then run OnCommand.
|
|
|
|
|
* This means that the focus command should be position neutral; eg. only use "addx",
|
|
|
|
|
* not "x".
|
|
|
|
|
*/
|
2004-02-01 03:14:37 +00:00
|
|
|
void ScreenSelectMaster::TweenOnScreen()
|
2003-06-20 23:07:45 +00:00
|
|
|
{
|
|
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_ICON_PARTS; i++ )
|
2003-11-05 04:09:10 +00:00
|
|
|
{
|
2003-11-05 18:49:57 +00:00
|
|
|
COMMAND( m_sprIcon[i][c], (int(c) == m_iChoice[0])? "GainFocus":"LoseFocus" );
|
|
|
|
|
m_sprIcon[i][c]->FinishTweening();
|
2004-02-01 03:14:37 +00:00
|
|
|
SET_XY_AND_ON_COMMAND( m_sprIcon[i][c] );
|
2003-11-05 04:09:10 +00:00
|
|
|
}
|
2003-06-20 23:07:45 +00:00
|
|
|
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
int p=0;
|
|
|
|
|
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
|
|
|
|
|
{
|
2003-11-05 18:49:57 +00:00
|
|
|
COMMAND( m_sprPreview[i][c][p], (int(c) == m_iChoice[p])? "GainFocus":"LoseFocus" );
|
|
|
|
|
m_sprPreview[i][c][p]->FinishTweening();
|
2004-02-01 03:14:37 +00:00
|
|
|
SET_XY_AND_ON_COMMAND( m_sprPreview[i][c][p] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
|
|
|
|
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
|
|
|
|
|
{
|
2003-11-05 18:49:57 +00:00
|
|
|
COMMAND( m_sprPreview[i][c][p], int(c) == m_iChoice[p]? "GainFocus":"LoseFocus" );
|
|
|
|
|
m_sprPreview[i][c][p]->FinishTweening();
|
2004-02-01 03:14:37 +00:00
|
|
|
SET_XY_AND_ON_COMMAND( m_sprPreview[i][c][p] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Need to SetXY of Cursor after Icons since it depends on the Icons' positions.
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
|
|
|
|
{
|
|
|
|
|
m_sprCursor[i][0].SetXY( GetCursorX((PlayerNumber)0,i), GetCursorY((PlayerNumber)0,i) );
|
2004-02-01 03:14:37 +00:00
|
|
|
ON_COMMAND( m_sprCursor[i][0] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
|
|
|
|
{
|
|
|
|
|
m_sprCursor[i][p].SetXY( GetCursorX((PlayerNumber)p,i), GetCursorY((PlayerNumber)p,i) );
|
2004-02-01 03:14:37 +00:00
|
|
|
ON_COMMAND( m_sprCursor[i][p] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-01-17 23:14:56 +00:00
|
|
|
if( SHOW_SCROLLER )
|
|
|
|
|
{
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
m_Scroller[0].SetCurrentAndDestinationItem( m_iChoice[0] );
|
2004-02-01 03:14:37 +00:00
|
|
|
SET_XY_AND_ON_COMMAND( m_Scroller[0] );
|
2004-01-17 23:14:56 +00:00
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( *m_sprScroll[c][0], int(c) == m_iChoice[0]? "GainFocus":"LoseFocus" );
|
2004-01-17 23:14:56 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
|
|
|
|
{
|
|
|
|
|
m_Scroller[p].SetCurrentAndDestinationItem( m_iChoice[p] );
|
2004-02-01 03:14:37 +00:00
|
|
|
SET_XY_AND_ON_COMMAND( m_Scroller[p] );
|
2004-01-17 23:14:56 +00:00
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
2004-02-01 03:14:37 +00:00
|
|
|
COMMAND( *m_sprScroll[c][p], int(c) == m_iChoice[p]? "GainFocus":"LoseFocus" );
|
2004-01-17 23:14:56 +00:00
|
|
|
}
|
|
|
|
|
}
|
2003-06-20 23:07:45 +00:00
|
|
|
|
2004-02-01 03:14:37 +00:00
|
|
|
SET_XY_AND_ON_COMMAND( m_sprExplanation[GetCurrentPage()] );
|
|
|
|
|
SET_XY_AND_ON_COMMAND( m_sprMore[GetCurrentPage()] );
|
2003-06-20 23:07:45 +00:00
|
|
|
|
|
|
|
|
this->SortByZ();
|
|
|
|
|
}
|
|
|
|
|
|
2004-02-01 03:14:37 +00:00
|
|
|
void ScreenSelectMaster::TweenOffScreen()
|
2003-06-20 23:07:45 +00:00
|
|
|
{
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
2004-02-01 03:14:37 +00:00
|
|
|
OFF_COMMAND( m_sprCursor[i][0] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
2004-02-01 03:14:37 +00:00
|
|
|
OFF_COMMAND( m_sprCursor[i][p] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for( unsigned c=0; c<m_aModeChoices.size(); c++ )
|
|
|
|
|
{
|
|
|
|
|
if( GetPage(c) != GetCurrentPage() )
|
|
|
|
|
continue; // skip
|
|
|
|
|
|
2003-11-05 21:34:14 +00:00
|
|
|
bool SelectedByEitherPlayer = false;
|
2003-11-24 03:59:09 +00:00
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
if( m_iChoice[0] == (int)c )
|
2003-11-05 21:34:14 +00:00
|
|
|
SelectedByEitherPlayer = true;
|
2003-11-24 03:59:09 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) && m_iChoice[p] == (int)c )
|
|
|
|
|
SelectedByEitherPlayer = true;
|
2003-11-05 21:34:14 +00:00
|
|
|
|
2003-06-20 23:07:45 +00:00
|
|
|
for( int i=0; i<NUM_ICON_PARTS; i++ )
|
2003-11-05 18:49:57 +00:00
|
|
|
{
|
2004-02-01 03:14:37 +00:00
|
|
|
OFF_COMMAND( m_sprIcon[i][c] );
|
|
|
|
|
COMMAND( m_sprIcon[i][c], SelectedByEitherPlayer? "OffFocused":"OffUnfocused" );
|
2003-11-05 18:49:57 +00:00
|
|
|
}
|
|
|
|
|
|
2003-06-20 23:07:45 +00:00
|
|
|
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
|
2003-11-05 21:34:14 +00:00
|
|
|
{
|
2004-02-01 03:14:37 +00:00
|
|
|
OFF_COMMAND( m_sprPreview[i][c][0] );
|
|
|
|
|
COMMAND( m_sprPreview[i][c][0], SelectedByEitherPlayer? "OffFocused":"OffUnfocused" );
|
2003-11-05 21:34:14 +00:00
|
|
|
}
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
if( GAMESTATE->IsPlayerEnabled(p) )
|
2003-11-05 21:34:14 +00:00
|
|
|
{
|
2004-02-01 03:14:37 +00:00
|
|
|
OFF_COMMAND( m_sprPreview[i][c][p] );
|
|
|
|
|
COMMAND( m_sprPreview[i][c][0], SelectedByEitherPlayer? "OffFocused":"OffUnfocused" );
|
2003-11-05 21:34:14 +00:00
|
|
|
}
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-01-17 23:14:56 +00:00
|
|
|
if( SHOW_SCROLLER )
|
|
|
|
|
{
|
|
|
|
|
if( SHARED_PREVIEW_AND_CURSOR )
|
2004-02-01 03:14:37 +00:00
|
|
|
OFF_COMMAND( m_Scroller[0] );
|
2004-01-17 23:14:56 +00:00
|
|
|
else
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
2004-02-01 03:14:37 +00:00
|
|
|
OFF_COMMAND( m_Scroller[p] );
|
2004-01-17 23:14:56 +00:00
|
|
|
}
|
|
|
|
|
|
2004-02-01 03:14:37 +00:00
|
|
|
OFF_COMMAND( m_sprExplanation[GetCurrentPage()] );
|
|
|
|
|
OFF_COMMAND( m_sprMore[GetCurrentPage()] );
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float ScreenSelectMaster::GetCursorX( PlayerNumber pn, int iPartIndex )
|
|
|
|
|
{
|
2003-11-05 04:09:10 +00:00
|
|
|
return m_sprIcon[0][m_iChoice[pn]]->GetX() + CURSOR_OFFSET_X_FROM_ICON(pn, iPartIndex);
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float ScreenSelectMaster::GetCursorY( PlayerNumber pn, int iPartIndex )
|
|
|
|
|
{
|
2003-11-05 04:09:10 +00:00
|
|
|
return m_sprIcon[0][m_iChoice[pn]]->GetY() + CURSOR_OFFSET_Y_FROM_ICON(pn, iPartIndex);
|
2003-06-20 23:07:45 +00:00
|
|
|
}
|