grading error fixes, ranking calculation and display fixes, set default difficulty back to same level as 3.0 final
This commit is contained in:
@@ -358,7 +358,7 @@ StatusIconsX=320
|
||||
StatusIconsY=400
|
||||
SecondsBetweenComments=10
|
||||
DemonstrationSeconds=30
|
||||
TickEarlySeconds=0.058
|
||||
TickEarlySeconds=0.05
|
||||
|
||||
[ScreenEvaluation]
|
||||
SongSelectScreen=ScreenSelectMusic
|
||||
@@ -450,6 +450,7 @@ GradesGlowColor2=1,1,1,0.3
|
||||
ScrollDelay=0.2
|
||||
ScrollSpeed=1.0
|
||||
TextZoom=0.8
|
||||
NextScreen=ScreenRanking
|
||||
|
||||
[ScreenEditMenu]
|
||||
ExplanationX=320
|
||||
@@ -813,7 +814,7 @@ VersionX=590
|
||||
VersionY=20
|
||||
SongsX=20
|
||||
SongsY=20
|
||||
SecondsToShow=5
|
||||
SecondsToShow=10
|
||||
NextScreen=ScreenDemonstration
|
||||
|
||||
[ScreenDemonstration]
|
||||
|
||||
@@ -41,8 +41,6 @@ float ArrowGetYOffset( PlayerNumber pn, float fNoteBeat )
|
||||
*/
|
||||
/* Boost and wave can no longer be used at the same time. -Chris */
|
||||
|
||||
if( fYOffset < 0 )
|
||||
return fYOffset; // don't mess with it after crossing the receptors
|
||||
|
||||
switch( GAMESTATE->m_PlayerOptions[pn].m_AccelType )
|
||||
{
|
||||
@@ -50,7 +48,8 @@ float ArrowGetYOffset( PlayerNumber pn, float fNoteBeat )
|
||||
fYOffset *= 1.5f / ((fYOffset+SCREEN_HEIGHT/1.2f)/SCREEN_HEIGHT);
|
||||
break;
|
||||
case PlayerOptions::ACCEL_LAND:
|
||||
fYOffset *= SCALE( fYOffset, 0.f, SCREEN_HEIGHT, 0.25f, 1.5f );
|
||||
if( fYOffset > 0 ) // speed the arrows back to normal after they cross 0
|
||||
fYOffset *= SCALE( fYOffset, 0.f, SCREEN_HEIGHT, 0.25f, 1.5f );
|
||||
break;
|
||||
case PlayerOptions::ACCEL_WAVE:
|
||||
fYOffset += 20.0f*sinf( fYOffset/38.0f );
|
||||
|
||||
@@ -43,6 +43,8 @@ GameState::GameState()
|
||||
m_CurGame = GAME_DANCE;
|
||||
m_iCoins = 0;
|
||||
Reset();
|
||||
|
||||
ResetLastRanking();
|
||||
}
|
||||
|
||||
GameState::~GameState()
|
||||
@@ -83,8 +85,11 @@ void GameState::Reset()
|
||||
for( p=0; p<NUM_PLAYERS; p++ )
|
||||
m_PlayerOptions[p] = PlayerOptions();
|
||||
m_SongOptions = SongOptions();
|
||||
}
|
||||
|
||||
for( p=0; p<NUM_PLAYERS; p++ )
|
||||
void GameState::ResetLastRanking()
|
||||
{
|
||||
for( int p=0; p<NUM_PLAYERS; p++ )
|
||||
{
|
||||
m_LastRankingCategory[p] = (RankingCategory)-1;
|
||||
m_iLastRankingIndex[p] = -1;
|
||||
@@ -197,47 +202,6 @@ bool GameState::IsPlayerEnabled( PlayerNumber pn )
|
||||
}
|
||||
}
|
||||
|
||||
Grade GameState::GetCurrentGrade( PlayerNumber pn )
|
||||
{
|
||||
ASSERT( GAMESTATE->IsPlayerEnabled(pn) ); // should be calling this is player isn't joined!
|
||||
|
||||
if( m_CurStageStats.bFailed[pn] )
|
||||
return GRADE_E;
|
||||
|
||||
/* Based on the percentage of your total "Dance Points" to the maximum
|
||||
* possible number, the following rank is assigned:
|
||||
*
|
||||
* 100% - AAA
|
||||
* 93% - AA
|
||||
* 80% - A
|
||||
* 65% - B
|
||||
* 45% - C
|
||||
* Less - D
|
||||
* Fail - E
|
||||
*/
|
||||
float fPercentDancePoints = m_CurStageStats.iActualDancePoints[pn] / (float)m_CurStageStats.iPossibleDancePoints[pn];
|
||||
fPercentDancePoints = max( 0, fPercentDancePoints );
|
||||
LOG->Trace( "iActualDancePoints: %i", m_CurStageStats.iActualDancePoints[pn] );
|
||||
LOG->Trace( "iPossibleDancePoints: %i", m_CurStageStats.iPossibleDancePoints[pn] );
|
||||
LOG->Trace( "fPercentDancePoints: %f", fPercentDancePoints );
|
||||
|
||||
// check for "AAAA"
|
||||
if( m_CurStageStats.iTapNoteScores[pn][TNS_MARVELOUS] > 0 &&
|
||||
m_CurStageStats.iTapNoteScores[pn][TNS_PERFECT] == 0 &&
|
||||
m_CurStageStats.iTapNoteScores[pn][TNS_GREAT] == 0 &&
|
||||
m_CurStageStats.iTapNoteScores[pn][TNS_GOOD] == 0 &&
|
||||
m_CurStageStats.iTapNoteScores[pn][TNS_BOO] == 0 &&
|
||||
m_CurStageStats.iTapNoteScores[pn][TNS_MISS] == 0 )
|
||||
return GRADE_AAAA;
|
||||
|
||||
if ( fPercentDancePoints == 1.00 ) return GRADE_AAA;
|
||||
else if( fPercentDancePoints >= 0.93 ) return GRADE_AA;
|
||||
else if( fPercentDancePoints >= 0.80 ) return GRADE_A;
|
||||
else if( fPercentDancePoints >= 0.65 ) return GRADE_B;
|
||||
else if( fPercentDancePoints >= 0.45 ) return GRADE_C;
|
||||
else return GRADE_D;
|
||||
}
|
||||
|
||||
bool GameState::HasEarnedExtraStage()
|
||||
{
|
||||
if( (GAMESTATE->IsFinalStage() || GAMESTATE->IsExtraStage()) )
|
||||
@@ -247,7 +211,7 @@ bool GameState::HasEarnedExtraStage()
|
||||
if( !GAMESTATE->IsPlayerEnabled(p) )
|
||||
continue; // skip
|
||||
|
||||
if( GAMESTATE->m_pCurNotes[p]->GetDifficulty()==DIFFICULTY_HARD && GetCurrentGrade((PlayerNumber)p)==GRADE_AA )
|
||||
if( GAMESTATE->m_pCurNotes[p]->GetDifficulty()==DIFFICULTY_HARD && m_CurStageStats.GetGrade((PlayerNumber)p)==GRADE_AA )
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ public:
|
||||
GameState();
|
||||
~GameState();
|
||||
void Reset();
|
||||
void ResetLastRanking();
|
||||
|
||||
//
|
||||
// Main State Info
|
||||
@@ -106,7 +107,6 @@ public:
|
||||
// A song is only inserted here if at least one player passed.
|
||||
// StageStats are added by the Evaluation screen
|
||||
void GetFinalEvalStatsAndSongs( StageStats& statsOut, vector<Song*>& vSongsOut ); // shown on arcade final evaluation
|
||||
Grade GetCurrentGrade( PlayerNumber pn ); // grade so far
|
||||
|
||||
|
||||
PlayerOptions m_PlayerOptions[NUM_PLAYERS]; // The currently active options
|
||||
|
||||
@@ -44,7 +44,7 @@ void GrayArrow::Update( float fDeltaTime )
|
||||
int OnState = (GetNumStates() == 3)? 1: 0;
|
||||
int OffState = (GetNumStates() == 3)? 2: 1;
|
||||
|
||||
if( GAMESTATE->m_fSongBeat<0 )
|
||||
if( !GAMESTATE->m_bPastHereWeGo )
|
||||
{
|
||||
SetState( IdleState );
|
||||
return;
|
||||
|
||||
@@ -32,7 +32,6 @@ void GroupList::DoneAddingGroups()
|
||||
{
|
||||
m_screenLabels[i].LoadFromFont( THEME->GetPathTo("Fonts","select group button label") );
|
||||
m_screenLabels[i].SetXY( BUTTON_X, BUTTON_START_Y + i*BUTTON_SPACING_Y );
|
||||
m_screenLabels[i].SetZoom( 0.8f );
|
||||
m_screenLabels[i].SetShadowLength( 2 );
|
||||
|
||||
CString sGroupName = m_textLabels[i];
|
||||
@@ -48,7 +47,14 @@ void GroupList::SetLabels()
|
||||
{
|
||||
CString &label = m_textLabels[m_iTop+i];
|
||||
m_screenLabels[i].SetText( SONGMAN->ShortenGroupName( label ) );
|
||||
|
||||
float fTextWidth = (float)m_screenLabels[i].GetWidestLineWidthInSourcePixels();
|
||||
float fButtonWidth = m_sprButton[i].GetZoomedWidth();
|
||||
|
||||
float fZoom = fButtonWidth/fTextWidth;
|
||||
fZoom = min( fZoom, 0.8f );
|
||||
m_screenLabels[i].SetZoomX( fZoom );
|
||||
m_screenLabels[i].SetZoomY( 0.8f );
|
||||
|
||||
if( m_iTop+i == 0 ) m_screenLabels[i].TurnRainbowOn();
|
||||
else {
|
||||
m_screenLabels[i].TurnRainbowOff();
|
||||
|
||||
@@ -52,22 +52,21 @@ MusicBannerWheel::MusicBannerWheel()
|
||||
|
||||
if( 0 == stricmp(GAMESTATE->m_sPreferredGroup, "All Music") )
|
||||
{
|
||||
arraySongs = SONGMAN->m_pSongs;
|
||||
SONGMAN->GetAllSongs( arraySongs );
|
||||
}
|
||||
else // Get the Group They Want
|
||||
{
|
||||
for( unsigned i=0; i< SONGMAN->m_pSongs.size(); i++ )
|
||||
vector<Song*> apAllSongs;
|
||||
SONGMAN->GetAllSongs( apAllSongs );
|
||||
|
||||
for( unsigned i=0; i<apAllSongs.size(); i++ )
|
||||
{
|
||||
Song* pSong = SONGMAN->m_pSongs[i];
|
||||
Song* pSong = apAllSongs[i];
|
||||
|
||||
if( GAMESTATE->m_sPreferredGroup != "ALL MUSIC" && pSong->m_sGroupName != GAMESTATE->m_sPreferredGroup )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
arraySongs.push_back(pSong);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -330,7 +330,8 @@ MusicWheel::MusicWheel()
|
||||
|
||||
// init m_mapGroupNameToBannerColor
|
||||
|
||||
vector<Song*> arraySongs = SONGMAN->m_pSongs;
|
||||
vector<Song*> arraySongs;
|
||||
SONGMAN->GetAllSongs( arraySongs );
|
||||
SortSongPointerArrayByGroup( arraySongs );
|
||||
|
||||
m_iSelection = 0;
|
||||
@@ -477,10 +478,13 @@ bool MusicWheel::SelectCourse( const Course *p )
|
||||
|
||||
void MusicWheel::GetSongList(vector<Song*> &arraySongs, bool bRoulette )
|
||||
{
|
||||
vector<Song*> apAllSongs;
|
||||
SONGMAN->GetAllSongs( apAllSongs );
|
||||
|
||||
// copy only songs that have at least one Notes for the current GameMode
|
||||
for( unsigned i=0; i<SONGMAN->m_pSongs.size(); i++ )
|
||||
for( unsigned i=0; i<apAllSongs.size(); i++ )
|
||||
{
|
||||
Song* pSong = SONGMAN->m_pSongs[i];
|
||||
Song* pSong = apAllSongs[i];
|
||||
|
||||
/* If we're on an extra stage, and this song is selected, ignore
|
||||
* #SELECTABLE. */
|
||||
|
||||
@@ -40,7 +40,7 @@ OptionIcon::OptionIcon()
|
||||
|
||||
void OptionIcon::Load( PlayerNumber pn, CString sText, bool bHeader )
|
||||
{
|
||||
static CString sStopWords[] = { "OFF", "VISIBLE", "VIVID", "STANDARD", "X1" };
|
||||
static CString sStopWords[] = { "OFF", "VISIBLE", "VIVID", "STANDARD", "X1", "HOLDS" };
|
||||
const int iNumStopWords = sizeof(sStopWords)/sizeof(sStopWords[0]);
|
||||
|
||||
for( int i=0; i<iNumStopWords; i++ )
|
||||
|
||||
@@ -55,11 +55,11 @@ PrefsManager::PrefsManager()
|
||||
m_iNumArcadeStages = 3;
|
||||
m_bAutoPlay = false;
|
||||
m_fJudgeWindowScale = 1.0f;
|
||||
m_fJudgeWindowMarvelousSeconds = 0.025f;
|
||||
m_fJudgeWindowPerfectSeconds = 0.05f;
|
||||
m_fJudgeWindowGreatSeconds = 0.10f;
|
||||
m_fJudgeWindowGoodSeconds = 0.15f;
|
||||
m_fJudgeWindowBooSeconds = 0.2f;
|
||||
m_fJudgeWindowMarvelousSeconds = 0.02f;
|
||||
m_fJudgeWindowPerfectSeconds = 0.04f;
|
||||
m_fJudgeWindowGreatSeconds = 0.08f;
|
||||
m_fJudgeWindowGoodSeconds = 0.12f;
|
||||
m_fJudgeWindowBooSeconds = 0.16f;
|
||||
m_fLifeDifficultyScale = 1.0f;
|
||||
m_iMovieDecodeMS = 2;
|
||||
m_bUseBGIfNoBanner = false;
|
||||
|
||||
@@ -258,6 +258,7 @@ void ScreenDemonstration::HandleScreenMessage( const ScreenMessage SM )
|
||||
m_Fade.CloseWipingRight( SM_GoToNextScreen );
|
||||
return;
|
||||
case SM_GoToNextScreen:
|
||||
m_soundMusic.Stop();
|
||||
SCREENMAN->SetNewScreen( NEXT_SCREEN );
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -232,10 +232,10 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
|
||||
Grade grade[NUM_PLAYERS];
|
||||
for( p=0; p<NUM_PLAYERS; p++ )
|
||||
{
|
||||
if( !GAMESTATE->IsPlayerEnabled(p) || GAMESTATE->m_CurStageStats.bFailed[p] )
|
||||
grade[p] = GRADE_E;
|
||||
if( GAMESTATE->IsPlayerEnabled(p) )
|
||||
grade[p] = stageStats.GetGrade( (PlayerNumber)p );
|
||||
else
|
||||
grade[p] = GAMESTATE->GetCurrentGrade( (PlayerNumber)p );
|
||||
grade[p] = GRADE_E;
|
||||
}
|
||||
|
||||
Grade max_grade = GRADE_NO_DATA;
|
||||
@@ -832,7 +832,22 @@ void ScreenEvaluation::MenuStart( PlayerNumber pn )
|
||||
m_Menu.TweenOffScreenToBlack( SM_GoToGameFinished, false );
|
||||
}
|
||||
|
||||
GAMESTATE->m_iCurrentStageIndex++; // Increment the stage counter.
|
||||
GAMESTATE->m_vPassedStageStats.push_back( GAMESTATE->m_CurStageStats ); // Save this stage's stats
|
||||
switch( m_ResultMode )
|
||||
{
|
||||
case RM_ARCADE_STAGE:
|
||||
GAMESTATE->m_iCurrentStageIndex++; // Increment the stage counter.
|
||||
|
||||
// add current stage stats to accumulated total only if this song was passed
|
||||
{
|
||||
bool bOnePassed = false;
|
||||
for( int p=0; p<NUM_PLAYERS; p++ )
|
||||
if( GAMESTATE->IsPlayerEnabled(p) )
|
||||
bOnePassed |= !GAMESTATE->m_CurStageStats.bFailed[p];
|
||||
|
||||
if( bOnePassed )
|
||||
GAMESTATE->m_vPassedStageStats.push_back( GAMESTATE->m_CurStageStats ); // Save this stage's stats
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
#define PREVIEWMUSICMODE THEME->GetMetricI("ScreenEz2SelectMusic","PreviewMusicMode")
|
||||
#define DIFFICULTYRATING_X THEME->GetMetricF("ScreenEz2SelectMusic","DifficultyRatingX")
|
||||
#define DIFFICULTYRATING_Y THEME->GetMetricF("ScreenEz2SelectMusic","DifficultyRatingY")
|
||||
#define DIFFICULTYRATING_ORIENTATION THEME->GetMetricF("ScreenEz2SelectMusic","DifficultyRatingOrientation")
|
||||
#define DIFFICULTYRATING_ORIENTATION THEME->GetMetricI("ScreenEz2SelectMusic","DifficultyRatingOrientation")
|
||||
#define INFOFRAME_X THEME->GetMetricF("ScreenEz2SelectMusic","InfoFrameX")
|
||||
#define INFOFRAME_Y THEME->GetMetricF("ScreenEz2SelectMusic","InfoFrameY")
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ ScreenLogo::ScreenLogo() : ScreenAttract("ScreenLogo","logo")
|
||||
|
||||
m_textSongs.LoadFromFont( THEME->GetPathTo("Fonts","normal") );
|
||||
m_textSongs.SetHorizAlign( Actor::align_left );
|
||||
m_textSongs.SetText( ssprintf("Found %u Songs", SONGMAN->m_pSongs.size()) );
|
||||
m_textSongs.SetText( ssprintf("%d songs in %d groups", SONGMAN->GetNumSongs(), SONGMAN->GetNumGroups()) );
|
||||
m_textSongs.SetDiffuse( RageColor(0.6f,0.6f,0.6f,1) ); // light gray
|
||||
m_textSongs.SetXY( SONGS_X, SONGS_Y );
|
||||
m_textSongs.SetZoom( 0.5f );
|
||||
|
||||
@@ -26,8 +26,7 @@
|
||||
#define SCROLL_DELAY THEME->GetMetricF("ScreenMusicScroll","ScrollDelay")
|
||||
#define SCROLL_SPEED THEME->GetMetricF("ScreenMusicScroll","ScrollSpeed")
|
||||
#define TEXT_ZOOM THEME->GetMetricF("ScreenMusicScroll","TextZoom")
|
||||
|
||||
const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 1);
|
||||
#define NEXT_SCREEN THEME->GetMetric("ScreenMusicScroll","NextScreen")
|
||||
|
||||
|
||||
const CString CREDIT_LINES[] =
|
||||
@@ -150,7 +149,8 @@ ScreenMusicScroll::ScreenMusicScroll()
|
||||
this->AddChild( &m_Background );
|
||||
|
||||
|
||||
vector<Song*> arraySongs = SONGMAN->m_pSongs;
|
||||
vector<Song*> arraySongs;
|
||||
SONGMAN->GetAllSongs( arraySongs );
|
||||
SortSongPointerArrayByTitle( arraySongs );
|
||||
|
||||
m_iNumLines = 0;
|
||||
@@ -183,7 +183,7 @@ ScreenMusicScroll::ScreenMusicScroll()
|
||||
m_textLines[i].SetTweenXY( CENTER_X, SCREEN_TOP - 40 );
|
||||
}
|
||||
|
||||
this->SendScreenMessage( SM_StartFadingOut, 0.2f * i + 3.0f );
|
||||
this->SendScreenMessage( SM_BeginFadingOut, 0.2f * i + 3.0f );
|
||||
|
||||
this->AddChild( &m_Fade );
|
||||
|
||||
@@ -233,12 +233,12 @@ void ScreenMusicScroll::HandleScreenMessage( const ScreenMessage SM )
|
||||
{
|
||||
switch( SM )
|
||||
{
|
||||
case SM_StartFadingOut:
|
||||
case SM_BeginFadingOut:
|
||||
m_Fade.CloseWipingRight( SM_GoToNextScreen );
|
||||
break;
|
||||
case SM_GoToNextScreen:
|
||||
SONGMAN->SaveMachineScoresToDisk();
|
||||
SCREENMAN->SetNewScreen( "ScreenCompany" );
|
||||
SCREENMAN->SetNewScreen( NEXT_SCREEN );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,16 +59,15 @@ ScreenRanking::ScreenRanking() : ScreenAttract("ScreenRanking","ranking")
|
||||
{
|
||||
m_sprBullets[i].Load( THEME->GetPathTo("Graphics",("ranking bullets 1x5")) );
|
||||
m_sprBullets[i].SetXY( BULLETS_START_X+LINE_SPACING_X*i, BULLETS_START_Y+LINE_SPACING_Y*i );
|
||||
m_sprBullets[i].SetDiffuse( RageColor(1,1,1,0) );
|
||||
m_sprBullets[i].StopAnimating();
|
||||
m_sprBullets[i].SetState(i);
|
||||
m_sprBullets[i].SetDiffuse( RageColor(1,1,1,0) );
|
||||
this->AddChild( &m_sprBullets[i] );
|
||||
|
||||
m_textNames[i].LoadFromFont( THEME->GetPathTo("Fonts","ranking") );
|
||||
m_textNames[i].TurnShadowOff();
|
||||
m_textNames[i].SetXY( NAMES_START_X+LINE_SPACING_X*i, NAMES_START_Y+LINE_SPACING_Y*i );
|
||||
m_textNames[i].SetZoom( NAMES_ZOOM );
|
||||
m_textNames[i].SetDiffuse( NAMES_COLOR );
|
||||
m_textNames[i].SetHorizAlign( Actor::align_left );
|
||||
this->AddChild( &m_textNames[i] );
|
||||
|
||||
@@ -76,7 +75,6 @@ ScreenRanking::ScreenRanking() : ScreenAttract("ScreenRanking","ranking")
|
||||
m_textScores[i].TurnShadowOff();
|
||||
m_textScores[i].SetXY( SCORES_START_X+LINE_SPACING_X*i, SCORES_START_Y+LINE_SPACING_Y*i );
|
||||
m_textScores[i].SetZoom( SCORES_ZOOM );
|
||||
m_textScores[i].SetDiffuse( SCORES_COLOR );
|
||||
m_textScores[i].SetHorizAlign( Actor::align_right );
|
||||
this->AddChild( &m_textScores[i] );
|
||||
}
|
||||
@@ -177,30 +175,38 @@ void ScreenRanking::SetPage( PageToShow pts )
|
||||
{
|
||||
case PageToShow::TYPE_CATEGORY:
|
||||
{
|
||||
m_textCategory.SetDiffuse( RageColor(1,1,1,1) );
|
||||
m_textCategory.SetText( ssprintf("Type %c", 'A'+pts.category) );
|
||||
m_textType.SetDiffuse( RageColor(1,1,1,1) );
|
||||
m_textType.SetText( GameManager::NotesTypeToString(pts.nt) );
|
||||
for( int l=0; l<NUM_RANKING_LINES; l++ )
|
||||
{
|
||||
m_sprBullets[l].SetDiffuse( RageColor(1,1,1,1) );
|
||||
CString sName = SONGMAN->m_MachineScores[pts.nt][pts.category][l].sName;
|
||||
float fScore = SONGMAN->m_MachineScores[pts.nt][pts.category][l].fScore;
|
||||
m_textNames[l].SetText( sName );
|
||||
m_textScores[l].SetText( ssprintf("%.0f",fScore) );
|
||||
m_textNames[l].SetDiffuse( NAMES_COLOR );
|
||||
m_textScores[l].SetDiffuse( SCORES_COLOR );
|
||||
|
||||
bool bRecentHighScore = false;
|
||||
for( int p=0; p<NUM_PLAYERS; p++ )
|
||||
{
|
||||
if( pts.nt == GAMESTATE->m_LastRankingNotesType &&
|
||||
bRecentHighScore |=
|
||||
pts.nt == GAMESTATE->m_LastRankingNotesType &&
|
||||
GAMESTATE->m_LastRankingCategory[p] == pts.category &&
|
||||
GAMESTATE->m_iLastRankingIndex[p] == l )
|
||||
{
|
||||
m_textNames[l].SetEffectBlinking();
|
||||
m_textScores[l].SetEffectBlinking();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_textNames[l].SetEffectNone();
|
||||
m_textScores[l].SetEffectNone();
|
||||
}
|
||||
GAMESTATE->m_iLastRankingIndex[p] == l;
|
||||
}
|
||||
|
||||
if( bRecentHighScore )
|
||||
{
|
||||
m_textNames[l].SetEffectBlinking( 10, NAMES_COLOR, RageColor(1,1,1,1) );
|
||||
m_textScores[l].SetEffectBlinking( 10, SCORES_COLOR, RageColor(1,1,1,1) );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_textNames[l].SetEffectNone();
|
||||
m_textScores[l].SetEffectNone();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -242,18 +248,13 @@ void ScreenRanking::SetPage( PageToShow pts )
|
||||
|
||||
void ScreenRanking::TweenPageOnScreen()
|
||||
{
|
||||
m_textCategory.SetDiffuse( RageColor(1,1,1,1) );
|
||||
m_textCategory.FadeOn(0,"bounce right",0.5f);
|
||||
m_textType.SetDiffuse( RageColor(1,1,1,1) );
|
||||
m_textType.FadeOn(0.1f,"bounce right",0.5f);
|
||||
|
||||
for( int l=0; l<NUM_RANKING_LINES; l++ )
|
||||
{
|
||||
m_sprBullets[l].SetDiffuse( RageColor(1,1,1,1) );
|
||||
m_sprBullets[l].FadeOn(0.2f+l*0.1f,"bounce right far",1.f);
|
||||
m_textNames[l].SetDiffuse( RageColor(1,1,1,1) );
|
||||
m_textNames[l].FadeOn(0.2f+l*0.1f,"bounce right far",1.f);
|
||||
m_textScores[l].SetDiffuse( RageColor(1,1,1,1) );
|
||||
m_textScores[l].FadeOn(0.2f+l*0.1f,"bounce right far",1.f);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,7 +82,8 @@ ScreenSelectGroup::ScreenSelectGroup()
|
||||
// This will simply the code a bit, and fix a weird case that
|
||||
// causes a crash when there are duplicate song names.
|
||||
|
||||
vector<Song*> aAllSongs = SONGMAN->m_pSongs;
|
||||
vector<Song*> aAllSongs;
|
||||
SONGMAN->GetAllSongs( aAllSongs );
|
||||
|
||||
// Filter out Songs that can't be played by the current Style
|
||||
for( j=aAllSongs.size()-1; j>=0; j-- ) // foreach Song, back to front
|
||||
|
||||
@@ -199,6 +199,9 @@ void ScreenTitleMenu::Input( const DeviceInput& DeviceI, const InputEventType ty
|
||||
// fall through
|
||||
case PrefsManager::COIN_HOME:
|
||||
case PrefsManager::COIN_FREE:
|
||||
if( m_Fade.IsClosing() )
|
||||
break;
|
||||
|
||||
GAMESTATE->m_bSideIsJoined[MenuI.player] = true;
|
||||
GAMESTATE->m_MasterPlayerNumber = MenuI.player;
|
||||
GAMESTATE->m_bPlayersCanJoin = false;
|
||||
@@ -209,17 +212,18 @@ void ScreenTitleMenu::Input( const DeviceInput& DeviceI, const InputEventType ty
|
||||
case CHOICE_SELECT_GAME:
|
||||
case CHOICE_MAP_KEY_JOY:
|
||||
case CHOICE_OPTIONS:
|
||||
case CHOICE_JUKEBOX:
|
||||
#ifdef _DEBUG
|
||||
case CHOICE_SANDBOX:
|
||||
#endif
|
||||
m_soundSelect.PlayRandom();
|
||||
m_Fade.CloseWipingRight( SM_GoToNextScreen );
|
||||
break;
|
||||
case CHOICE_JUKEBOX:
|
||||
case CHOICE_EDIT:
|
||||
if( SONGMAN->m_pSongs.empty() )
|
||||
if( SONGMAN->GetNumSongs() == 0 )
|
||||
{
|
||||
m_soundInvalid.PlayRandom();
|
||||
SCREENMAN->SystemMessage( "No songs are installed" );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -38,14 +38,15 @@ const int COURSE_TOP_SCORE_VERSION = 1;
|
||||
#define GROUP_COLOR( i ) THEME->GetMetricC("SongManager",ssprintf("GroupColor%d",i+1))
|
||||
#define EXTRA_COLOR THEME->GetMetricC("SongManager","ExtraColor")
|
||||
|
||||
RageColor g_GroupColors[30];
|
||||
vector<RageColor> g_vGroupColors;
|
||||
RageColor g_ExtraColor;
|
||||
|
||||
|
||||
SongManager::SongManager( LoadingWindow *ld )
|
||||
{
|
||||
g_vGroupColors.clear();
|
||||
for( int i=0; i<NUM_GROUP_COLORS; i++ )
|
||||
g_GroupColors[i] = GROUP_COLOR( i );
|
||||
g_vGroupColors.push_back( GROUP_COLOR(i) );
|
||||
g_ExtraColor = EXTRA_COLOR;
|
||||
|
||||
InitSongArrayFromDisk( ld );
|
||||
@@ -285,7 +286,7 @@ void SongManager::SaveMachineScoresToDisk()
|
||||
FILE* fp = fopen( CATEGORY_TOP_SCORE_FILE, "w" );
|
||||
if( fp )
|
||||
{
|
||||
fprintf(fp,"%d",CATEGORY_TOP_SCORE_VERSION);
|
||||
fprintf(fp,"%d\n",CATEGORY_TOP_SCORE_VERSION);
|
||||
for( int i=0; i<NUM_NOTES_TYPES; i++ )
|
||||
for( int j=0; j<NUM_RANKING_CATEGORIES; j++ )
|
||||
for( int k=0; k<NUM_RANKING_LINES; k++ )
|
||||
@@ -351,7 +352,7 @@ RageColor SongManager::GetGroupColor( const CString &sGroupName )
|
||||
}
|
||||
ASSERT( i != m_arrayGroupNames.size() ); // this is not a valid group
|
||||
|
||||
return g_GroupColors[i%NUM_GROUP_COLORS];
|
||||
return g_vGroupColors[i%g_vGroupColors.size()];
|
||||
}
|
||||
|
||||
RageColor SongManager::GetSongColor( const Song* pSong )
|
||||
@@ -368,8 +369,15 @@ RageColor SongManager::GetSongColor( const Song* pSong )
|
||||
}
|
||||
|
||||
|
||||
void SongManager::GetAllSongs( vector<Song*> &AddTo )
|
||||
{
|
||||
AddTo = m_pSongs;
|
||||
}
|
||||
|
||||
void SongManager::GetSongsInGroup( const CString sGroupName, vector<Song*> &AddTo )
|
||||
{
|
||||
AddTo.clear();
|
||||
|
||||
for( unsigned i=0; i<m_pSongs.size(); i++ )
|
||||
{
|
||||
Song* pSong = m_pSongs[i];
|
||||
@@ -378,6 +386,16 @@ void SongManager::GetSongsInGroup( const CString sGroupName, vector<Song*> &AddT
|
||||
}
|
||||
}
|
||||
|
||||
int SongManager::GetNumSongs()
|
||||
{
|
||||
return m_pSongs.size();
|
||||
}
|
||||
|
||||
int SongManager::GetNumGroups()
|
||||
{
|
||||
return m_arrayGroupNames.size();
|
||||
}
|
||||
|
||||
CString SongManager::ShortenGroupName( const CString &sOrigGroupName )
|
||||
{
|
||||
CString sShortName = sOrigGroupName;
|
||||
@@ -678,7 +696,7 @@ void SongManager::AddMachineRecords( NotesType nt, RankingCategory hsc[NUM_PLAYE
|
||||
if( newHS.fScore > machineScores[i].fScore )
|
||||
{
|
||||
// We found the insert point. Shift down.
|
||||
for( int j=i+1; j<NUM_RANKING_LINES; j++ )
|
||||
for( int j=NUM_RANKING_LINES-1; j>i; j-- )
|
||||
machineScores[j] = machineScores[j-1];
|
||||
// insert
|
||||
machineScores[i].fScore = newHS.fScore;
|
||||
@@ -689,3 +707,5 @@ void SongManager::AddMachineRecords( NotesType nt, RankingCategory hsc[NUM_PLAYE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -26,8 +26,6 @@ public:
|
||||
SongManager( LoadingWindow *ld );
|
||||
~SongManager();
|
||||
|
||||
vector<Song*> m_pSongs; // all songs that can be played
|
||||
|
||||
void InitSongArrayFromDisk( LoadingWindow *ld );
|
||||
void FreeSongArray();
|
||||
void ReloadSongArray();
|
||||
@@ -54,7 +52,10 @@ public:
|
||||
|
||||
|
||||
// Lookup
|
||||
void GetAllSongs( vector<Song*> &AddTo );
|
||||
void GetSongsInGroup( const CString sGroupName, vector<Song*> &AddTo );
|
||||
int GetNumSongs();
|
||||
int GetNumGroups();
|
||||
Song* GetRandomSong();
|
||||
|
||||
void GetNonstopCourses( vector<Course*> &AddTo ); // add to if life meter type is BAR.
|
||||
@@ -95,6 +96,7 @@ protected:
|
||||
void SanityCheckGroupDir( CString sDir ) const;
|
||||
void AddGroup( CString sDir, CString sGroupDirName );
|
||||
|
||||
vector<Song*> m_pSongs; // all songs that can be played
|
||||
CStringArray m_arrayGroupNames;
|
||||
CStringArray m_GroupBannerPaths; // each song group has a banner associated with it
|
||||
};
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
*/
|
||||
|
||||
#include "StageStats.h"
|
||||
#include "GameState.h"
|
||||
#include "RageLog.h"
|
||||
|
||||
|
||||
StageStats::StageStats()
|
||||
{
|
||||
@@ -28,12 +31,12 @@ void StageStats::operator+=( const StageStats& other )
|
||||
fAliveSeconds[p] += other.fAliveSeconds[p];
|
||||
bFailed[p] |= other.bFailed[p];
|
||||
iPossibleDancePoints[p] += other.iPossibleDancePoints[p];
|
||||
iActualDancePoints[p] += other.iPossibleDancePoints[p];
|
||||
iActualDancePoints[p] += other.iActualDancePoints[p];
|
||||
|
||||
for( int t=0; t<NUM_TAP_NOTE_SCORES; t++ )
|
||||
iTapNoteScores[p][t] += other.iTapNoteScores[p][t];
|
||||
for( int h=0; h<NUM_HOLD_NOTE_SCORES; h++ )
|
||||
iHoldNoteScores[p][h] += iHoldNoteScores[p][h];
|
||||
iHoldNoteScores[p][h] += other.iHoldNoteScores[p][h];
|
||||
iMaxCombo[p] += other.iMaxCombo[p];
|
||||
fScore[p] += other.fScore[p];
|
||||
for( int r=0; r<NUM_RADAR_CATEGORIES; r++ )
|
||||
@@ -46,3 +49,43 @@ void StageStats::operator+=( const StageStats& other )
|
||||
}
|
||||
}
|
||||
|
||||
Grade StageStats::GetGrade( PlayerNumber pn )
|
||||
{
|
||||
ASSERT( GAMESTATE->IsPlayerEnabled(pn) ); // should be calling this is player isn't joined!
|
||||
|
||||
if( bFailed[pn] )
|
||||
return GRADE_E;
|
||||
|
||||
/* Based on the percentage of your total "Dance Points" to the maximum
|
||||
* possible number, the following rank is assigned:
|
||||
*
|
||||
* 100% - AAA
|
||||
* 93% - AA
|
||||
* 80% - A
|
||||
* 65% - B
|
||||
* 45% - C
|
||||
* Less - D
|
||||
* Fail - E
|
||||
*/
|
||||
float fPercentDancePoints = iActualDancePoints[pn] / (float)iPossibleDancePoints[pn];
|
||||
fPercentDancePoints = max( 0.f, fPercentDancePoints );
|
||||
LOG->Trace( "iActualDancePoints: %i", iActualDancePoints[pn] );
|
||||
LOG->Trace( "iPossibleDancePoints: %i", iPossibleDancePoints[pn] );
|
||||
LOG->Trace( "fPercentDancePoints: %f", fPercentDancePoints );
|
||||
|
||||
// check for "AAAA"
|
||||
if( iTapNoteScores[pn][TNS_MARVELOUS] > 0 &&
|
||||
iTapNoteScores[pn][TNS_PERFECT] == 0 &&
|
||||
iTapNoteScores[pn][TNS_GREAT] == 0 &&
|
||||
iTapNoteScores[pn][TNS_GOOD] == 0 &&
|
||||
iTapNoteScores[pn][TNS_BOO] == 0 &&
|
||||
iTapNoteScores[pn][TNS_MISS] == 0 )
|
||||
return GRADE_AAAA;
|
||||
|
||||
if ( fPercentDancePoints == 1.00 ) return GRADE_AAA;
|
||||
else if( fPercentDancePoints >= 0.93 ) return GRADE_AA;
|
||||
else if( fPercentDancePoints >= 0.80 ) return GRADE_A;
|
||||
else if( fPercentDancePoints >= 0.65 ) return GRADE_B;
|
||||
else if( fPercentDancePoints >= 0.45 ) return GRADE_C;
|
||||
else return GRADE_D;
|
||||
}
|
||||
|
||||
@@ -11,14 +11,18 @@
|
||||
-----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#include "GameConstantsAndTypes.h" // for NUM_PLAYERS
|
||||
#include "Grade.h"
|
||||
|
||||
class Song;
|
||||
|
||||
|
||||
struct StageStats
|
||||
{
|
||||
StageStats();
|
||||
void operator+=( const StageStats& other ); // accumulate
|
||||
Grade GetGrade( PlayerNumber pn );
|
||||
|
||||
Song* pSong;
|
||||
int iMeter[NUM_PLAYERS];
|
||||
|
||||
@@ -422,7 +422,11 @@ static void HandleInputEvents(float fDeltaTime)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_F5))
|
||||
/* Hitting F5, then waiting 5 seconds while my monitor is black
|
||||
* is really making me angry.
|
||||
* Do any users even know about this hotkey or think it's useful?
|
||||
* Probably not... -Chris
|
||||
/* else if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_F5))
|
||||
{
|
||||
if(type != IET_FIRST_PRESS) continue;
|
||||
|
||||
@@ -439,6 +443,7 @@ static void HandleInputEvents(float fDeltaTime)
|
||||
}
|
||||
ApplyGraphicOptions();
|
||||
}
|
||||
*/
|
||||
else if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_F6))
|
||||
{
|
||||
if(type != IET_FIRST_PRESS) continue;
|
||||
|
||||
Reference in New Issue
Block a user