2003-10-14 09:51:16 +00:00
|
|
|
#include "global.h"
|
|
|
|
|
#include "ScreenNameEntryTraditional.h"
|
|
|
|
|
#include "SongManager.h"
|
|
|
|
|
#include "ScreenManager.h"
|
|
|
|
|
#include "GameConstantsAndTypes.h"
|
|
|
|
|
#include "RageUtil.h"
|
|
|
|
|
#include "PrefsManager.h"
|
|
|
|
|
#include "GameManager.h"
|
|
|
|
|
#include "RageLog.h"
|
|
|
|
|
#include "GameState.h"
|
2004-07-08 00:10:34 +00:00
|
|
|
#include "GameSoundManager.h"
|
2003-10-14 09:51:16 +00:00
|
|
|
#include "ThemeManager.h"
|
|
|
|
|
#include "ScreenRanking.h"
|
|
|
|
|
#include "Course.h"
|
|
|
|
|
#include "ActorUtil.h"
|
2003-10-15 21:09:22 +00:00
|
|
|
#include "FontCharAliases.h"
|
2003-11-01 07:25:22 +00:00
|
|
|
#include "AnnouncerManager.h"
|
2003-11-07 20:24:44 +00:00
|
|
|
#include "song.h"
|
2003-12-18 03:40:57 +00:00
|
|
|
#include "Steps.h"
|
2003-11-09 10:14:52 +00:00
|
|
|
#include "ProfileManager.h"
|
2003-12-23 00:26:00 +00:00
|
|
|
#include "StageStats.h"
|
2004-03-08 02:50:46 +00:00
|
|
|
#include "RageDisplay.h"
|
2004-08-29 04:51:24 +00:00
|
|
|
#include "Foreach.h"
|
2004-09-12 05:56:24 +00:00
|
|
|
#include "Style.h"
|
2004-09-21 06:07:12 +00:00
|
|
|
#include "ScreenDimensions.h"
|
2003-10-14 09:51:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Defines specific to ScreenNameEntryTraditional
|
|
|
|
|
//
|
2004-03-08 02:50:46 +00:00
|
|
|
#define FOV THEME->GetMetricF(m_sName,"FOV")
|
2003-10-15 01:09:29 +00:00
|
|
|
#define ALPHABET_GAP_X THEME->GetMetricF(m_sName,"AlphabetGapX")
|
|
|
|
|
#define NUM_ALPHABET_DISPLAYED THEME->GetMetricI(m_sName,"NumAlphabetDisplayed")
|
|
|
|
|
#define MAX_RANKING_NAME_LENGTH THEME->GetMetricI(m_sName,"MaxRankingNameLength")
|
2003-10-15 04:29:06 +00:00
|
|
|
#define FEAT_INTERVAL THEME->GetMetricF(m_sName,"FeatInterval")
|
2004-03-08 02:21:22 +00:00
|
|
|
#define KEYBOARD_LETTERS THEME->GetMetric (m_sName,"KeyboardLetters")
|
2003-11-03 23:29:43 +00:00
|
|
|
#define NEXT_SCREEN THEME->GetMetric(m_sName,"NextScreen")
|
2003-10-15 04:29:06 +00:00
|
|
|
|
|
|
|
|
#define COMMAND_OPTIONAL( actor, command_name ) \
|
|
|
|
|
if( !actor.GetName().empty() ) \
|
|
|
|
|
COMMAND( actor, command_name );
|
2003-10-14 09:51:16 +00:00
|
|
|
|
2003-10-15 04:29:06 +00:00
|
|
|
const ScreenMessage SM_ChangeDisplayedFeat = ScreenMessage(SM_User+0);
|
|
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
static const int CHAR_OK = -1;
|
2003-10-15 21:23:23 +00:00
|
|
|
static const int CHAR_BACK = -2;
|
2003-10-14 09:51:16 +00:00
|
|
|
|
|
|
|
|
|
2004-03-08 02:21:22 +00:00
|
|
|
void HighScoreWheelItem::Load( int iRankIndex, const HighScore& hs )
|
|
|
|
|
{
|
|
|
|
|
SetName( "HighScoreWheelItem" );
|
|
|
|
|
|
|
|
|
|
m_textRank.SetName( "Rank" );
|
|
|
|
|
m_textRank.LoadFromFont( THEME->GetPathF(m_sName,"rank") );
|
|
|
|
|
m_textRank.SetText( ssprintf("%d", iRankIndex+1) );
|
2004-03-17 06:01:17 +00:00
|
|
|
m_textRank.SetShadowLength( 2 );
|
2004-03-08 02:21:22 +00:00
|
|
|
this->AddChild( &m_textRank );
|
|
|
|
|
SET_XY_AND_ON_COMMAND( m_textRank );
|
|
|
|
|
|
|
|
|
|
m_textName.SetName( "Name" );
|
|
|
|
|
m_textName.LoadFromFont( THEME->GetPathF(m_sName,"name") );
|
2004-03-08 02:50:46 +00:00
|
|
|
m_textName.SetText( hs.GetDisplayName() );
|
2004-03-17 06:01:17 +00:00
|
|
|
m_textName.SetShadowLength( 2 );
|
2004-03-08 02:21:22 +00:00
|
|
|
this->AddChild( &m_textName );
|
|
|
|
|
SET_XY_AND_ON_COMMAND( m_textName );
|
|
|
|
|
|
|
|
|
|
m_textScore.SetName( "Score" );
|
|
|
|
|
m_textScore.LoadFromFont( THEME->GetPathF(m_sName,"score") );
|
|
|
|
|
if( PREFSMAN->m_bPercentageScoring )
|
|
|
|
|
m_textScore.SetText( ssprintf("%.2f%%", hs.fPercentDP*100) );
|
|
|
|
|
else
|
|
|
|
|
m_textScore.SetText( ssprintf("%i", hs.iScore) );
|
2004-03-17 06:01:17 +00:00
|
|
|
m_textScore.SetShadowLength( 2 );
|
2004-03-08 02:21:22 +00:00
|
|
|
this->AddChild( &m_textScore );
|
|
|
|
|
SET_XY_AND_ON_COMMAND( m_textScore );
|
|
|
|
|
}
|
|
|
|
|
|
2004-03-08 02:50:46 +00:00
|
|
|
void HighScoreWheelItem::LoadBlank( int iRankIndex )
|
|
|
|
|
{
|
|
|
|
|
HighScore hs;
|
|
|
|
|
Load( iRankIndex, hs );
|
|
|
|
|
}
|
|
|
|
|
|
2004-03-08 02:21:22 +00:00
|
|
|
void HighScoreWheelItem::ShowFocus()
|
|
|
|
|
{
|
|
|
|
|
CString sCommand = "diffuseshift;EffectColor1,1,1,0,1;EffectColor2,0,1,1,1";
|
|
|
|
|
m_textRank.Command( sCommand );
|
|
|
|
|
m_textName.Command( sCommand );
|
|
|
|
|
m_textScore.Command( sCommand );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HighScoreWheel::Load( const HighScoreList& hsl, int iIndexToFocus )
|
|
|
|
|
{
|
2004-05-28 04:46:43 +00:00
|
|
|
m_Items.resize( PREFSMAN->m_iMaxHighScoresPerListForMachine );
|
|
|
|
|
for( int i=0; i<PREFSMAN->m_iMaxHighScoresPerListForMachine; i++ )
|
2004-03-08 02:21:22 +00:00
|
|
|
{
|
2004-03-09 01:40:56 +00:00
|
|
|
if( unsigned(i) < hsl.vHighScores.size() )
|
2004-03-08 02:50:46 +00:00
|
|
|
m_Items[i].Load( i, hsl.vHighScores[i] );
|
|
|
|
|
else
|
|
|
|
|
m_Items[i].LoadBlank( i );
|
2004-03-08 02:21:22 +00:00
|
|
|
this->AddChild( &m_Items[i] );
|
|
|
|
|
}
|
|
|
|
|
m_iIndexToFocus = iIndexToFocus;
|
|
|
|
|
|
2004-03-09 01:40:56 +00:00
|
|
|
if( m_iIndexToFocus >= 0 && m_iIndexToFocus < int(hsl.vHighScores.size()) )
|
2004-03-08 02:21:22 +00:00
|
|
|
m_Items[m_iIndexToFocus].ShowFocus();
|
|
|
|
|
|
|
|
|
|
ActorScroller::Load(
|
|
|
|
|
0.2f, // fSecondsPerItem
|
|
|
|
|
8, // iNumItemsToDraw
|
|
|
|
|
RageVector3(18,0,0), // vRotationDegrees
|
|
|
|
|
RageVector3(0,0,90), // vTranslateTerm0
|
|
|
|
|
RageVector3(0,0,0), // vTranslateTerm1
|
|
|
|
|
RageVector3(0,0,0) // vTranslateTerm2
|
|
|
|
|
);
|
|
|
|
|
Scroll();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float HighScoreWheel::Scroll()
|
|
|
|
|
{
|
|
|
|
|
SetCurrentAndDestinationItem( m_SubActors.size()+5 );
|
|
|
|
|
int iIndexToFocus = max( m_iIndexToFocus, 3 );
|
|
|
|
|
SetDestinationItem( iIndexToFocus );
|
|
|
|
|
return GetTweenTimeLeft();
|
|
|
|
|
}
|
|
|
|
|
|
2004-05-01 23:19:33 +00:00
|
|
|
ScreenNameEntryTraditional::ScreenNameEntryTraditional( CString sClassName ) : ScreenWithMenuElements( sClassName )
|
2003-10-14 09:51:16 +00:00
|
|
|
{
|
|
|
|
|
LOG->Trace( "ScreenNameEntryTraditional::ScreenNameEntryTraditional()" );
|
|
|
|
|
|
2003-12-18 21:16:43 +00:00
|
|
|
if( PREFSMAN->m_bScreenTestMode )
|
2003-10-15 04:29:06 +00:00
|
|
|
{
|
2003-12-18 21:16:43 +00:00
|
|
|
GAMESTATE->m_bSideIsJoined[PLAYER_1] = true;
|
|
|
|
|
GAMESTATE->m_bSideIsJoined[PLAYER_2] = true;
|
|
|
|
|
GAMESTATE->m_MasterPlayerNumber = PLAYER_1;
|
2004-06-11 06:05:35 +00:00
|
|
|
GAMESTATE->m_PlayMode = PLAY_MODE_REGULAR;
|
2004-07-25 04:27:20 +00:00
|
|
|
GAMESTATE->m_pCurStyle = GAMEMAN->GameAndStringToStyle( GAMEMAN->GetDefaultGame(), "versus" );
|
2004-05-24 03:32:56 +00:00
|
|
|
StageStats ss;
|
2003-12-18 21:16:43 +00:00
|
|
|
for( int z = 0; z < 3; ++z )
|
2003-10-15 04:29:06 +00:00
|
|
|
{
|
2004-08-30 04:09:23 +00:00
|
|
|
ss.vpSongs.push_back( SONGMAN->GetRandomSong() );
|
2004-05-24 03:32:56 +00:00
|
|
|
ss.iPossibleDancePoints[PLAYER_1] = 100;
|
|
|
|
|
ss.iActualDancePoints[PLAYER_1] = 100;
|
|
|
|
|
ss.iScore[PLAYER_1] = 100;
|
|
|
|
|
ss.iPossibleDancePoints[PLAYER_2] = 100;
|
|
|
|
|
ss.iActualDancePoints[PLAYER_2] = 100;
|
|
|
|
|
ss.iScore[PLAYER_2] = 100;
|
2004-08-30 04:09:23 +00:00
|
|
|
ASSERT( ss.vpSongs[0]->GetAllSteps().size() );
|
2004-05-24 03:32:56 +00:00
|
|
|
FOREACH_PlayerNumber( p )
|
2003-12-18 21:16:43 +00:00
|
|
|
{
|
2004-08-30 04:09:23 +00:00
|
|
|
ss.vpSteps[p].push_back( ss.vpSongs[0]->GetAllSteps()[0] );
|
|
|
|
|
GAMESTATE->m_pCurSteps[p] = ss.vpSteps[p][0];
|
2004-05-24 03:32:56 +00:00
|
|
|
ss.iPossibleDancePoints[p] = 1000;
|
|
|
|
|
ss.iActualDancePoints[p] = 985;
|
2003-12-18 21:16:43 +00:00
|
|
|
|
2004-02-09 06:26:13 +00:00
|
|
|
HighScore hs;
|
2004-01-20 03:32:48 +00:00
|
|
|
hs.grade = GRADE_TIER_3;
|
2004-08-30 04:09:23 +00:00
|
|
|
hs.fPercentDP = ss.GetPercentDancePoints(p);
|
2004-05-24 03:32:56 +00:00
|
|
|
hs.iScore = ss.iScore[p];
|
2004-06-28 07:26:00 +00:00
|
|
|
StepsType st = GAMESTATE->GetCurrentStyle()->m_StepsType;
|
2003-12-18 21:16:43 +00:00
|
|
|
int a, b;
|
2004-08-30 04:09:23 +00:00
|
|
|
PROFILEMAN->AddStepsScore( ss.vpSongs[0], GAMESTATE->m_pCurSteps[p], p, hs, a, b );
|
|
|
|
|
PROFILEMAN->AddStepsScore( ss.vpSongs[0], GAMESTATE->m_pCurSteps[p], p, hs, a, b );
|
|
|
|
|
PROFILEMAN->AddStepsScore( ss.vpSongs[0], GAMESTATE->m_pCurSteps[p], p, hs, a, b );
|
|
|
|
|
PROFILEMAN->AddStepsScore( ss.vpSongs[0], GAMESTATE->m_pCurSteps[p], p, hs, a, b );
|
|
|
|
|
PROFILEMAN->AddStepsScore( ss.vpSongs[0], GAMESTATE->m_pCurSteps[p], p, hs, a, b );
|
2004-05-24 03:32:56 +00:00
|
|
|
PROFILEMAN->AddCategoryScore( st, RANKING_A, p, hs, a, b );
|
2003-12-18 21:16:43 +00:00
|
|
|
}
|
|
|
|
|
|
2004-05-24 03:32:56 +00:00
|
|
|
g_vPlayedStageStats.push_back( ss );
|
2003-10-15 04:29:06 +00:00
|
|
|
}
|
2003-10-15 01:09:29 +00:00
|
|
|
|
|
|
|
|
}
|
2003-10-14 09:51:16 +00:00
|
|
|
|
2003-10-14 17:06:30 +00:00
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
// Find out if players deserve to enter their name
|
2004-03-24 03:32:32 +00:00
|
|
|
FOREACH_PlayerNumber( p )
|
2003-10-14 17:06:30 +00:00
|
|
|
{
|
2004-03-08 02:21:22 +00:00
|
|
|
vector<GameState::RankingFeat> aFeats;
|
2004-08-30 04:09:23 +00:00
|
|
|
GAMESTATE->GetRankingFeats( p, aFeats );
|
2004-03-08 02:21:22 +00:00
|
|
|
m_bStillEnteringName[p] = aFeats.size()>0;
|
2004-03-24 03:32:32 +00:00
|
|
|
m_CurFeat[p] = 0;
|
2003-10-14 09:51:16 +00:00
|
|
|
}
|
|
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
//
|
|
|
|
|
// init keyboards
|
|
|
|
|
//
|
2003-10-14 09:51:16 +00:00
|
|
|
{
|
2004-03-24 03:32:32 +00:00
|
|
|
FOREACH_HumanPlayer( p )
|
|
|
|
|
{
|
|
|
|
|
// don't show keyboard if didn't make any high scores
|
|
|
|
|
if( !m_bStillEnteringName[p] )
|
2004-03-24 03:48:42 +00:00
|
|
|
{
|
|
|
|
|
m_sprOutOfRanking[p].Load( THEME->GetPathG( "ScreenNameEntryTraditional",ssprintf("OutOfRankingP%i",p+1)) );
|
|
|
|
|
m_sprOutOfRanking[p]->SetName( ssprintf("OutOfRankingP%i",p+1) );
|
|
|
|
|
SET_XY_AND_ON_COMMAND( m_sprOutOfRanking[p] );
|
|
|
|
|
this->AddChild( m_sprOutOfRanking[p] );
|
|
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
continue; // skip
|
2004-03-24 03:48:42 +00:00
|
|
|
}
|
2004-03-24 03:32:32 +00:00
|
|
|
|
|
|
|
|
m_sprNameFrame[p].SetName( ssprintf("EntryFrameP%i",p+1) );
|
|
|
|
|
m_sprNameFrame[p].Load( THEME->GetPathToG( ssprintf("ScreenNameEntryTraditional name frame p%i",p+1) ) );
|
|
|
|
|
SET_XY_AND_ON_COMMAND( m_sprNameFrame[p] );
|
|
|
|
|
this->AddChild( &m_sprNameFrame[p] );
|
|
|
|
|
|
|
|
|
|
m_Keyboard[p].SetName( ssprintf("KeyboardP%i",p+1) );
|
|
|
|
|
SET_XY_AND_ON_COMMAND( m_Keyboard[p] );
|
|
|
|
|
this->AddChild( &m_Keyboard[p] );
|
|
|
|
|
|
|
|
|
|
/* Add letters to m_Keyboard. */
|
|
|
|
|
const CString fontpath = THEME->GetPathToF("ScreenNameEntryTraditional letters");
|
|
|
|
|
const wstring Chars = CStringToWstring(KEYBOARD_LETTERS);
|
|
|
|
|
for( unsigned ch = 0; ch < Chars.size(); ++ch )
|
|
|
|
|
{
|
|
|
|
|
BitmapText *Letter = new BitmapText;
|
|
|
|
|
Letter->SetName( ssprintf("LetterP%i",p+1) );
|
|
|
|
|
Letter->LoadFromFont( fontpath );
|
|
|
|
|
Letter->SetText( ssprintf("%lc", Chars[ch]) );
|
|
|
|
|
m_textAlphabet[p].push_back( Letter );
|
|
|
|
|
m_Keyboard[p].AddChild( Letter );
|
|
|
|
|
Letter->Command( THEME->GetMetric("ScreenNameEntryTraditional","AlphabetInitCommand") );
|
|
|
|
|
|
|
|
|
|
m_AlphabetLetter[p].push_back( Chars[ch] );
|
|
|
|
|
}
|
2003-10-14 09:51:16 +00:00
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
/* Add "<-". */
|
|
|
|
|
{
|
|
|
|
|
BitmapText *Letter = new BitmapText;
|
|
|
|
|
Letter->SetName( ssprintf("LetterP%i",p+1) );
|
|
|
|
|
Letter->LoadFromFont( fontpath );
|
|
|
|
|
CString text = "←";
|
|
|
|
|
FontCharAliases::ReplaceMarkers( text );
|
|
|
|
|
Letter->SetText( text );
|
|
|
|
|
m_textAlphabet[p].push_back( Letter );
|
|
|
|
|
m_Keyboard[p].AddChild( Letter );
|
|
|
|
|
|
|
|
|
|
m_AlphabetLetter[p].push_back( CHAR_BACK );
|
|
|
|
|
Letter->Command( THEME->GetMetric("ScreenNameEntryTraditional","OKInitCommand") );
|
|
|
|
|
}
|
2003-10-14 09:51:16 +00:00
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
/* Add "OK". */
|
|
|
|
|
{
|
|
|
|
|
BitmapText *Letter = new BitmapText;
|
|
|
|
|
Letter->SetName( ssprintf("LetterP%i",p+1) );
|
|
|
|
|
Letter->LoadFromFont( fontpath );
|
|
|
|
|
CString text = "&ok;";
|
|
|
|
|
FontCharAliases::ReplaceMarkers( text );
|
|
|
|
|
Letter->SetText( text );
|
|
|
|
|
m_textAlphabet[p].push_back( Letter );
|
|
|
|
|
m_Keyboard[p].AddChild( Letter );
|
|
|
|
|
|
|
|
|
|
m_AlphabetLetter[p].push_back( CHAR_OK );
|
|
|
|
|
Letter->Command( THEME->GetMetric("ScreenNameEntryTraditional","OKInitCommand") );
|
|
|
|
|
}
|
2003-10-14 09:51:16 +00:00
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
m_sprCursor[p].SetName( ssprintf("CursorP%i",p+1) );
|
|
|
|
|
m_sprCursor[p].Load( THEME->GetPathToG( ssprintf("ScreenNameEntryTraditional cursor p%i",p+1) ) );
|
|
|
|
|
m_Keyboard[p].AddChild( &m_sprCursor[p] );
|
2003-10-15 21:23:23 +00:00
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
m_textSelection[p].SetName( ssprintf("SelectionP%i",p+1) );
|
|
|
|
|
m_textSelection[p].LoadFromFont( THEME->GetPathToF("ScreenNameEntryTraditional entry") );
|
|
|
|
|
SET_XY_AND_ON_COMMAND( m_textSelection[p] );
|
|
|
|
|
this->AddChild( &m_textSelection[p] );
|
2003-10-14 09:51:16 +00:00
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
m_SelectedChar[p] = 0;
|
|
|
|
|
PositionCharsAndCursor( p );
|
2003-10-14 09:51:16 +00:00
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
// load last used ranking name if any
|
2004-08-30 04:09:23 +00:00
|
|
|
const Profile* pProfile = PROFILEMAN->GetProfile(p);
|
2004-03-24 03:32:32 +00:00
|
|
|
if( pProfile && !pProfile->m_sLastUsedHighScoreName.empty() )
|
|
|
|
|
{
|
|
|
|
|
m_sSelection[p] = CStringToWstring( pProfile->m_sLastUsedHighScoreName );
|
|
|
|
|
if( (int) m_sSelection[p].size() > MAX_RANKING_NAME_LENGTH )
|
|
|
|
|
m_sSelection[p].erase( MAX_RANKING_NAME_LENGTH );
|
|
|
|
|
ASSERT( (int) m_sSelection[p].size() <= MAX_RANKING_NAME_LENGTH );
|
|
|
|
|
if( m_sSelection[p].size() )
|
2004-08-30 04:09:23 +00:00
|
|
|
SelectChar( p, CHAR_OK );
|
2004-03-24 03:32:32 +00:00
|
|
|
}
|
2003-10-14 09:51:16 +00:00
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
UpdateSelectionText( p );
|
2004-02-22 22:44:39 +00:00
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
/* Don't tween to the initial position. */
|
|
|
|
|
unsigned i;
|
|
|
|
|
for( i = 0; i < m_textAlphabet[p].size(); ++i )
|
|
|
|
|
m_textAlphabet[p][i]->FinishTweening();
|
2004-02-22 22:44:39 +00:00
|
|
|
}
|
2003-10-15 04:29:06 +00:00
|
|
|
}
|
|
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
//
|
|
|
|
|
// init feat displays
|
|
|
|
|
//
|
2004-05-06 06:29:33 +00:00
|
|
|
FOREACH_HumanPlayer( p )
|
2004-03-24 03:32:32 +00:00
|
|
|
{
|
2004-05-06 06:29:33 +00:00
|
|
|
/* Show feat 0, hide others without tweening. Run the ON command for
|
|
|
|
|
* all actors, even if we're going to hide it anyway, so any style commands
|
|
|
|
|
* are run. */
|
|
|
|
|
#define SET_ON( actor ) \
|
|
|
|
|
SET_XY_AND_ON_COMMAND( actor ); \
|
2004-05-06 08:47:44 +00:00
|
|
|
if( m_FeatDisplay[p].size()>1 ) \
|
2004-05-06 06:29:33 +00:00
|
|
|
{ \
|
|
|
|
|
COMMAND( actor, "On" ); \
|
|
|
|
|
actor.FinishTweening(); \
|
|
|
|
|
COMMAND( actor, "Hide" ); \
|
|
|
|
|
actor.FinishTweening(); \
|
|
|
|
|
}
|
|
|
|
|
|
2004-05-07 02:53:51 +00:00
|
|
|
m_FeatDisplay[p].reserve( g_vPlayedStageStats.size() );
|
|
|
|
|
|
2004-05-06 06:29:33 +00:00
|
|
|
for( unsigned i = 0; i < g_vPlayedStageStats.size(); ++i )
|
2003-10-15 04:29:06 +00:00
|
|
|
{
|
2004-05-06 06:29:33 +00:00
|
|
|
StageStats &ss = g_vPlayedStageStats[i];
|
2004-08-30 04:09:23 +00:00
|
|
|
Song* pSong = ss.vpSongs[0];
|
|
|
|
|
Steps* pSteps = ss.vpSteps[p][0];
|
2004-05-06 06:29:33 +00:00
|
|
|
Course* pCourse = GAMESTATE->m_pCurCourse;
|
2004-06-03 08:22:02 +00:00
|
|
|
Trail* pTrail = GAMESTATE->m_pCurTrail[p];
|
2004-05-23 09:17:10 +00:00
|
|
|
|
2004-05-06 06:29:33 +00:00
|
|
|
int iHighScoreIndex = -1; // -1 means "out of ranking"
|
|
|
|
|
Grade grade = ss.GetGrade( p );
|
|
|
|
|
int iScore = ss.iScore[p];
|
2004-05-07 02:53:51 +00:00
|
|
|
float fPercentDP = ss.GetPercentDancePoints( p );
|
2004-05-06 06:29:33 +00:00
|
|
|
|
|
|
|
|
// If this is a SHOW_NEVER song, then it's probably a training.
|
|
|
|
|
// Don't show a high score
|
|
|
|
|
if( pSong->m_SelectionDisplay == Song::SHOW_NEVER )
|
|
|
|
|
continue; // skip
|
2004-03-24 03:32:32 +00:00
|
|
|
|
2004-05-06 06:29:33 +00:00
|
|
|
m_FeatDisplay[p].resize( m_FeatDisplay[p].size()+1 );
|
2004-05-06 08:47:44 +00:00
|
|
|
FeatDisplay &display = m_FeatDisplay[p].back();
|
2003-10-15 04:29:06 +00:00
|
|
|
|
2004-05-06 06:29:33 +00:00
|
|
|
const HighScoreList& hsl =
|
|
|
|
|
GAMESTATE->IsCourseMode() ?
|
2004-06-03 08:22:02 +00:00
|
|
|
PROFILEMAN->GetMachineProfile()->GetCourseHighScoreList(pCourse,pTrail) :
|
2004-05-06 06:29:33 +00:00
|
|
|
PROFILEMAN->GetMachineProfile()->GetStepsHighScoreList(pSong,pSteps);
|
2003-10-15 04:29:06 +00:00
|
|
|
|
2004-05-06 06:29:33 +00:00
|
|
|
for( unsigned h=0; h<hsl.vHighScores.size(); h++ )
|
|
|
|
|
{
|
|
|
|
|
const HighScore &hs = hsl.vHighScores[h];
|
|
|
|
|
if( hs.sName == RANKING_TO_FILL_IN_MARKER[p] &&
|
|
|
|
|
hs.fPercentDP == fPercentDP &&
|
|
|
|
|
hs.iScore == iScore )
|
2004-03-24 03:32:32 +00:00
|
|
|
{
|
2004-05-06 06:29:33 +00:00
|
|
|
iHighScoreIndex = h;
|
|
|
|
|
break;
|
2004-03-24 03:32:32 +00:00
|
|
|
}
|
2004-05-06 06:29:33 +00:00
|
|
|
}
|
|
|
|
|
|
2004-05-06 08:47:44 +00:00
|
|
|
display.m_Wheel.SetName( ssprintf("WheelP%i",p+1) );
|
|
|
|
|
display.m_Wheel.Load( hsl, iHighScoreIndex );
|
|
|
|
|
SET_ON( display.m_Wheel );
|
|
|
|
|
this->AddChild( &display.m_Wheel );
|
2004-05-06 06:29:33 +00:00
|
|
|
|
|
|
|
|
CString sBanner;
|
|
|
|
|
if( GAMESTATE->IsCourseMode() )
|
|
|
|
|
sBanner = pCourse->m_sBannerPath;
|
|
|
|
|
else
|
|
|
|
|
sBanner = pSong->GetBannerPath();
|
|
|
|
|
if( !sBanner.empty() )
|
|
|
|
|
{
|
2004-05-06 08:47:44 +00:00
|
|
|
display.m_sprBanner.SetName( ssprintf("BannerP%i",p+1) );
|
|
|
|
|
display.m_sprBanner.Load( sBanner );
|
|
|
|
|
SET_ON( display.m_sprBanner );
|
|
|
|
|
this->AddChild( &display.m_sprBanner );
|
2004-05-06 06:29:33 +00:00
|
|
|
}
|
2003-10-15 04:29:06 +00:00
|
|
|
|
2004-05-06 06:29:33 +00:00
|
|
|
if( grade != GRADE_NO_DATA )
|
|
|
|
|
{
|
2004-05-06 08:47:44 +00:00
|
|
|
display.m_Grade.SetName( ssprintf("GradeP%i",p+1) );
|
|
|
|
|
display.m_Grade.Load( THEME->GetPathToG("ScreenNameEntryTraditional grades") );
|
2004-06-03 08:22:02 +00:00
|
|
|
display.m_Grade.SetGrade( p, grade );
|
2004-05-06 08:47:44 +00:00
|
|
|
SET_ON( display.m_Grade );
|
|
|
|
|
this->AddChild( &display.m_Grade );
|
2004-03-24 03:32:32 +00:00
|
|
|
}
|
2004-05-06 06:29:33 +00:00
|
|
|
|
2004-05-06 08:47:44 +00:00
|
|
|
display.m_Difficulty.SetName( ssprintf("DifficultyP%i",p+1) );
|
|
|
|
|
display.m_Difficulty.Load( THEME->GetPathToG("ScreenNameEntryTraditional difficulty icons") );
|
2004-05-06 06:29:33 +00:00
|
|
|
if( GAMESTATE->IsCourseMode() )
|
2004-06-03 08:22:02 +00:00
|
|
|
display.m_Difficulty.SetFromTrail( p, pTrail );
|
2004-05-06 06:29:33 +00:00
|
|
|
else
|
2004-06-03 08:22:02 +00:00
|
|
|
display.m_Difficulty.SetFromSteps( p, pSteps );
|
2004-05-06 08:47:44 +00:00
|
|
|
SET_ON( display.m_Difficulty );
|
|
|
|
|
this->AddChild( &display.m_Difficulty );
|
2004-05-06 06:29:33 +00:00
|
|
|
|
2004-05-06 08:47:44 +00:00
|
|
|
display.m_textScore.SetName( "ScreenNameEntryTraditional Percent" );
|
2004-06-03 08:22:02 +00:00
|
|
|
display.m_textScore.Load( p, &ss, false );
|
2004-05-06 08:47:44 +00:00
|
|
|
display.m_textScore.SetName( ssprintf("ScoreP%i",p+1) );
|
|
|
|
|
SET_ON( display.m_textScore );
|
|
|
|
|
this->AddChild( &display.m_textScore );
|
2004-05-06 06:29:33 +00:00
|
|
|
|
|
|
|
|
// if( feat.Feat != "" )
|
|
|
|
|
// {
|
2004-05-06 08:47:44 +00:00
|
|
|
// display.m_textCategory.SetName( ssprintf("CategoryP%i", p+1) );
|
|
|
|
|
// display.m_textCategory.LoadFromFont( THEME->GetPathToF("ScreenNameEntryTraditional category") );
|
|
|
|
|
// display.m_textCategory.SetText( feat.Feat );
|
|
|
|
|
// SET_ON( display.m_textCategory );
|
|
|
|
|
// this->AddChild( &display.m_textCategory );
|
2004-05-06 06:29:33 +00:00
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
/* We always show the banner frame (if any), because fading from a graphic to
|
|
|
|
|
* itself is ugly. */
|
2004-05-06 08:47:44 +00:00
|
|
|
display.m_sprBannerFrame.SetName( ssprintf("BannerFrameP%i",p+1) );
|
|
|
|
|
display.m_sprBannerFrame.Load( THEME->GetPathToG(ssprintf("ScreenNameEntryTraditional banner frame p%i",p+1)) );
|
|
|
|
|
SET_XY_AND_ON_COMMAND( display.m_sprBannerFrame );
|
|
|
|
|
this->AddChild( &display.m_sprBannerFrame );
|
2004-03-08 02:21:22 +00:00
|
|
|
}
|
2004-05-06 06:29:33 +00:00
|
|
|
#undef SET_ON
|
2003-10-14 09:51:16 +00:00
|
|
|
}
|
|
|
|
|
|
2003-10-15 04:29:06 +00:00
|
|
|
this->PostScreenMessage( SM_ChangeDisplayedFeat, FEAT_INTERVAL );
|
|
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
m_soundKey.Load( THEME->GetPathToS("ScreenNameEntryTraditional key") );
|
2003-10-15 04:29:06 +00:00
|
|
|
m_soundChange.Load( THEME->GetPathToS("ScreenNameEntryTraditional change",true) );
|
2004-02-23 01:57:24 +00:00
|
|
|
m_soundInvalid.Load( THEME->GetPathToS("ScreenNameEntryTraditional invalid",true) );
|
2003-10-14 09:51:16 +00:00
|
|
|
|
|
|
|
|
SOUND->PlayMusic( THEME->GetPathToS("ScreenNameEntryTraditional music") );
|
2004-05-02 09:57:28 +00:00
|
|
|
|
|
|
|
|
this->SortByDrawOrder();
|
2003-10-14 09:51:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline int wrapn( int x, int n )
|
|
|
|
|
{
|
|
|
|
|
wrap( x, n );
|
|
|
|
|
return x;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenNameEntryTraditional::PositionCharsAndCursor( int pn )
|
|
|
|
|
{
|
|
|
|
|
const int Selected = m_SelectedChar[pn];
|
|
|
|
|
const int NumDisplayed = NUM_ALPHABET_DISPLAYED;
|
|
|
|
|
|
|
|
|
|
const int TotalDisplayed = (int)m_textAlphabet[pn].size();
|
|
|
|
|
const int Start = wrapn( Selected - TotalDisplayed/2, TotalDisplayed );
|
|
|
|
|
|
|
|
|
|
const int First = -NumDisplayed/2;
|
|
|
|
|
const int Last = NumDisplayed/2;
|
|
|
|
|
for( int i = 0; i < (int)m_textAlphabet[pn].size(); ++i )
|
|
|
|
|
{
|
|
|
|
|
const int Num = wrapn( Start+i, (int) m_textAlphabet[pn].size() );
|
|
|
|
|
BitmapText *bt = m_textAlphabet[pn][Num];
|
|
|
|
|
|
|
|
|
|
const int Pos = i - TotalDisplayed/2;
|
|
|
|
|
const bool hidden = ( Pos < First || Pos > Last );
|
|
|
|
|
const int ActualPos = clamp( Pos, First-1, Last+1 );
|
|
|
|
|
|
2003-10-15 01:09:29 +00:00
|
|
|
bt->Command("stoptweening;decelerate,.12");
|
2003-10-14 09:51:16 +00:00
|
|
|
bt->SetX( ActualPos * ALPHABET_GAP_X );
|
|
|
|
|
bt->SetDiffuseAlpha( hidden? 0.0f:1.0f );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_sprCursor[pn].SetXY( 0,0 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ScreenNameEntryTraditional::AnyStillEntering() const
|
|
|
|
|
{
|
2004-05-24 06:10:11 +00:00
|
|
|
FOREACH_PlayerNumber( p )
|
2003-10-14 09:51:16 +00:00
|
|
|
if( m_bStillEnteringName[p] )
|
|
|
|
|
return true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ScreenNameEntryTraditional::~ScreenNameEntryTraditional()
|
|
|
|
|
{
|
|
|
|
|
LOG->Trace( "ScreenNameEntryTraditional::~ScreenNameEntryTraditional()" );
|
|
|
|
|
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; ++p )
|
|
|
|
|
{
|
|
|
|
|
for( unsigned i=0; i < m_textAlphabet[p].size(); ++i )
|
|
|
|
|
delete m_textAlphabet[p][i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenNameEntryTraditional::Update( float fDelta )
|
|
|
|
|
{
|
2003-11-01 07:25:22 +00:00
|
|
|
if( m_bFirstUpdate )
|
|
|
|
|
SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo("name entry") );
|
|
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
Screen::Update(fDelta);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenNameEntryTraditional::DrawPrimitives()
|
|
|
|
|
{
|
2004-03-08 02:50:46 +00:00
|
|
|
DISPLAY->CameraPushMatrix();
|
|
|
|
|
DISPLAY->LoadMenuPerspective( FOV, CENTER_X, CENTER_Y );
|
|
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
Screen::DrawPrimitives();
|
2004-03-08 02:50:46 +00:00
|
|
|
|
|
|
|
|
DISPLAY->CameraPopMatrix();
|
2003-10-14 09:51:16 +00:00
|
|
|
}
|
|
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
void ScreenNameEntryTraditional::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )
|
|
|
|
|
{
|
2004-05-01 23:19:33 +00:00
|
|
|
if( IsTransitioning() )
|
2004-03-24 03:32:32 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
Screen::Input( DeviceI, type, GameI, MenuI, StyleI );
|
|
|
|
|
}
|
|
|
|
|
|
2003-10-15 04:29:06 +00:00
|
|
|
void ScreenNameEntryTraditional::ChangeDisplayedFeat()
|
|
|
|
|
{
|
2004-03-24 02:23:55 +00:00
|
|
|
CHECKPOINT;
|
|
|
|
|
|
|
|
|
|
LOG->Trace( "ScreenNameEntryTraditional::ChangeDisplayedFeat" );
|
|
|
|
|
|
2004-03-24 03:02:24 +00:00
|
|
|
FOREACH_HumanPlayer( pn )
|
2003-10-15 04:29:06 +00:00
|
|
|
{
|
2004-05-06 06:29:33 +00:00
|
|
|
if( m_FeatDisplay[pn].size() < 2 )
|
2003-10-15 04:29:06 +00:00
|
|
|
continue;
|
|
|
|
|
|
2004-05-06 06:29:33 +00:00
|
|
|
int NewFeat = (m_CurFeat[pn]+1) % m_FeatDisplay[pn].size();
|
2003-10-15 04:29:06 +00:00
|
|
|
int OldFeat = m_CurFeat[pn];
|
|
|
|
|
m_CurFeat[pn] = NewFeat;
|
|
|
|
|
|
2004-03-08 02:21:22 +00:00
|
|
|
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][OldFeat].m_Wheel, "Hide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][NewFeat].m_Wheel, "Unhide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][OldFeat].m_Grade, "Hide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][NewFeat].m_Grade, "Unhide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][OldFeat].m_Difficulty, "Hide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][NewFeat].m_Difficulty, "Unhide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][OldFeat].m_sprBanner, "Hide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][NewFeat].m_sprBanner, "Unhide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][OldFeat].m_textScore, "Hide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][NewFeat].m_textScore, "Unhide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][OldFeat].m_textCategory, "Hide" );
|
|
|
|
|
COMMAND_OPTIONAL( m_FeatDisplay[pn][NewFeat].m_textCategory, "Unhide" );
|
|
|
|
|
|
2004-03-12 05:43:39 +00:00
|
|
|
m_FeatDisplay[pn][NewFeat].m_Wheel.Scroll();
|
2003-10-15 04:29:06 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
void ScreenNameEntryTraditional::HandleScreenMessage( const ScreenMessage SM )
|
|
|
|
|
{
|
2004-03-24 02:23:55 +00:00
|
|
|
LOG->Trace( "ScreenNameEntryTraditional::HandleScreenMessage( %d )", SM );
|
|
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
switch( SM )
|
|
|
|
|
{
|
|
|
|
|
case SM_MenuTimer:
|
2004-05-01 23:19:33 +00:00
|
|
|
if( !m_Out.IsTransitioning() )
|
2003-10-14 09:51:16 +00:00
|
|
|
{
|
2004-05-24 06:10:11 +00:00
|
|
|
FOREACH_PlayerNumber( p )
|
2004-08-30 04:09:23 +00:00
|
|
|
Finish( p );
|
2004-03-24 06:38:14 +00:00
|
|
|
MenuStart( PLAYER_INVALID, IET_FIRST_PRESS );
|
2003-10-14 09:51:16 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2003-10-15 04:29:06 +00:00
|
|
|
case SM_ChangeDisplayedFeat:
|
|
|
|
|
ChangeDisplayedFeat();
|
|
|
|
|
this->PostScreenMessage( SM_ChangeDisplayedFeat, FEAT_INTERVAL );
|
|
|
|
|
break;
|
|
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
case SM_GoToNextScreen:
|
2004-05-22 21:23:17 +00:00
|
|
|
SCREENMAN->SetNewScreen( NEXT_SCREEN );
|
2003-10-14 09:51:16 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenNameEntryTraditional::Finish( PlayerNumber pn )
|
|
|
|
|
{
|
|
|
|
|
if( !m_bStillEnteringName[pn] )
|
|
|
|
|
return;
|
|
|
|
|
m_bStillEnteringName[pn] = false;
|
|
|
|
|
|
2003-10-15 01:09:29 +00:00
|
|
|
UpdateSelectionText( pn ); /* hide NAME_ cursor */
|
|
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
CString selection = WStringToCString( m_sSelection[pn] );
|
|
|
|
|
|
2003-11-09 10:14:52 +00:00
|
|
|
// save last used ranking name
|
|
|
|
|
Profile* pProfile = PROFILEMAN->GetProfile(pn);
|
|
|
|
|
if( pProfile )
|
|
|
|
|
pProfile->m_sLastUsedHighScoreName = selection;
|
|
|
|
|
|
2004-05-24 09:40:26 +00:00
|
|
|
TrimRight( selection, " " );
|
|
|
|
|
TrimLeft( selection, " " );
|
|
|
|
|
|
|
|
|
|
GAMESTATE->StoreRankingName( pn, selection );
|
|
|
|
|
|
2003-10-15 04:29:06 +00:00
|
|
|
OFF_COMMAND( m_Keyboard[pn] );
|
|
|
|
|
for( int i = 0; i < (int)m_textAlphabet[pn].size(); ++i )
|
|
|
|
|
OFF_COMMAND( m_textAlphabet[pn][i] );
|
|
|
|
|
OFF_COMMAND( m_sprCursor[pn] );
|
|
|
|
|
|
2004-03-24 03:32:32 +00:00
|
|
|
if( !AnyStillEntering() )
|
2004-05-04 02:00:15 +00:00
|
|
|
AllFinished();
|
2003-10-14 09:51:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenNameEntryTraditional::UpdateSelectionText( int pn )
|
|
|
|
|
{
|
|
|
|
|
wstring text = m_sSelection[pn];
|
2003-10-15 01:09:29 +00:00
|
|
|
if( m_bStillEnteringName[pn] && (int) text.size() < MAX_RANKING_NAME_LENGTH )
|
2003-10-14 09:51:16 +00:00
|
|
|
text += L"_";
|
|
|
|
|
|
|
|
|
|
m_textSelection[pn].SetText( WStringToCString(text) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenNameEntryTraditional::MenuStart( PlayerNumber pn, const InputEventType type )
|
|
|
|
|
{
|
2004-03-24 03:32:32 +00:00
|
|
|
if( !AnyStillEntering() )
|
2004-03-24 06:38:14 +00:00
|
|
|
{
|
2004-05-04 02:00:15 +00:00
|
|
|
AllFinished();
|
2004-03-24 06:38:14 +00:00
|
|
|
return;
|
|
|
|
|
}
|
2004-03-24 03:32:32 +00:00
|
|
|
|
|
|
|
|
if( !m_bStillEnteringName[pn] )
|
|
|
|
|
return; // ignore
|
|
|
|
|
if( type != IET_FIRST_PRESS )
|
2003-10-14 09:51:16 +00:00
|
|
|
return; // ignore
|
|
|
|
|
|
|
|
|
|
const int CurrentSelection = m_SelectedChar[pn];
|
|
|
|
|
const int SelectedLetter = m_AlphabetLetter[pn][CurrentSelection];
|
|
|
|
|
switch( SelectedLetter )
|
|
|
|
|
{
|
|
|
|
|
case CHAR_OK:
|
|
|
|
|
m_soundKey.Play();
|
|
|
|
|
Finish( pn );
|
2003-10-15 21:23:23 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CHAR_BACK:
|
|
|
|
|
if( !m_sSelection[pn].size() )
|
|
|
|
|
{
|
2004-02-23 01:57:24 +00:00
|
|
|
m_soundInvalid.Play();
|
2003-10-15 21:23:23 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_sSelection[pn].erase( m_sSelection[pn].size()-1, 1 );
|
|
|
|
|
UpdateSelectionText( pn );
|
|
|
|
|
m_soundKey.Play();
|
2003-10-14 09:51:16 +00:00
|
|
|
|
|
|
|
|
break;
|
2003-10-15 21:23:23 +00:00
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
default:
|
|
|
|
|
/* If we have room, add a new character. */
|
|
|
|
|
if( (int) m_sSelection[pn].size() == MAX_RANKING_NAME_LENGTH )
|
|
|
|
|
{
|
2004-02-23 01:57:24 +00:00
|
|
|
m_soundInvalid.Play();
|
2004-08-29 04:51:24 +00:00
|
|
|
SelectChar( pn, CHAR_BACK );
|
2003-10-14 09:51:16 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
m_sSelection[pn] += wchar_t(SelectedLetter);
|
|
|
|
|
UpdateSelectionText( pn );
|
|
|
|
|
m_soundKey.Play();
|
|
|
|
|
|
|
|
|
|
/* If that filled the string, set the cursor on OK. */
|
|
|
|
|
if( (int) m_sSelection[pn].size() == MAX_RANKING_NAME_LENGTH )
|
2004-02-22 22:44:39 +00:00
|
|
|
SelectChar( pn, CHAR_OK );
|
2003-10-14 09:51:16 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-02-22 22:44:39 +00:00
|
|
|
void ScreenNameEntryTraditional::SelectChar( PlayerNumber pn, int c )
|
|
|
|
|
{
|
2004-08-29 04:51:24 +00:00
|
|
|
FOREACH( int, m_AlphabetLetter[pn], letter )
|
|
|
|
|
{
|
|
|
|
|
if( *letter == c ) // character found
|
|
|
|
|
{
|
|
|
|
|
m_SelectedChar[pn] = letter - m_AlphabetLetter[pn].begin();
|
|
|
|
|
PositionCharsAndCursor( pn );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
ASSERT( false ); // character not found
|
2004-02-22 22:44:39 +00:00
|
|
|
}
|
|
|
|
|
|
2003-10-14 09:51:16 +00:00
|
|
|
void ScreenNameEntryTraditional::MenuLeft( PlayerNumber pn, const InputEventType type )
|
|
|
|
|
{
|
2004-05-01 23:19:33 +00:00
|
|
|
if( !m_bStillEnteringName[pn] || IsTransitioning() )
|
2003-10-15 01:09:29 +00:00
|
|
|
return;
|
2003-10-14 09:51:16 +00:00
|
|
|
|
|
|
|
|
--m_SelectedChar[pn];
|
|
|
|
|
wrap( m_SelectedChar[pn], m_textAlphabet[pn].size() );
|
|
|
|
|
PositionCharsAndCursor( pn );
|
2003-10-15 04:29:06 +00:00
|
|
|
m_soundChange.Play();
|
2003-10-14 09:51:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenNameEntryTraditional::MenuRight( PlayerNumber pn, const InputEventType type )
|
|
|
|
|
{
|
2004-05-01 23:19:33 +00:00
|
|
|
if( !m_bStillEnteringName[pn] || IsTransitioning() )
|
2003-10-15 01:09:29 +00:00
|
|
|
return;
|
2003-10-14 09:51:16 +00:00
|
|
|
|
|
|
|
|
++m_SelectedChar[pn];
|
|
|
|
|
wrap( m_SelectedChar[pn], m_textAlphabet[pn].size() );
|
|
|
|
|
PositionCharsAndCursor( pn );
|
2003-10-15 04:29:06 +00:00
|
|
|
m_soundChange.Play();
|
2003-10-14 09:51:16 +00:00
|
|
|
}
|
2004-05-04 02:00:15 +00:00
|
|
|
|
|
|
|
|
void ScreenNameEntryTraditional::AllFinished()
|
|
|
|
|
{
|
|
|
|
|
StartTransitioning( SM_GoToNextScreen );
|
|
|
|
|
|
|
|
|
|
FOREACH_HumanPlayer( pn )
|
|
|
|
|
{
|
|
|
|
|
OFF_COMMAND( m_sprOutOfRanking[pn] );
|
|
|
|
|
OFF_COMMAND( m_sprNameFrame[pn] );
|
|
|
|
|
OFF_COMMAND( m_textSelection[pn] );
|
|
|
|
|
}
|
2004-05-04 03:16:51 +00:00
|
|
|
}
|
2004-06-08 05:22:33 +00:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* (c) 2001-2004 Glenn Maynard, Chris Danford
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
|
* copy of this software and associated documentation files (the
|
|
|
|
|
* "Software"), to deal in the Software without restriction, including
|
|
|
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
|
|
|
|
* whom the Software is furnished to do so, provided that the above
|
|
|
|
|
* copyright notice(s) and this permission notice appear in all copies of
|
|
|
|
|
* the Software and that both the above copyright notice(s) and this
|
|
|
|
|
* permission notice appear in supporting documentation.
|
|
|
|
|
*
|
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
|
|
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
|
|
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
|
|
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
|
|
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
|
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
|
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
*/
|