new grading scale

This commit is contained in:
Chris Danford
2004-01-20 03:32:48 +00:00
parent 8f7f94a718
commit fca912cb16
15 changed files with 175 additions and 105 deletions
+1 -1
View File
@@ -618,7 +618,7 @@ bool GameState::HasEarnedExtraStage()
if( PREFSMAN->m_bPickExtraStage && GAMESTATE->IsExtraStage() && !GAMESTATE->m_bAllow2ndExtraStage ) if( PREFSMAN->m_bPickExtraStage && GAMESTATE->IsExtraStage() && !GAMESTATE->m_bAllow2ndExtraStage )
continue; continue;
if( g_CurStageStats.GetGrade((PlayerNumber)p) >= GRADE_AA ) if( g_CurStageStats.GetGrade((PlayerNumber)p) >= GRADE_TIER_2 )
return true; return true;
} }
} }
+30 -20
View File
@@ -11,21 +11,17 @@
*/ */
#include "Grade.h" #include "Grade.h"
#include "RageUtil.h"
CString GradeToString( Grade g ) CString GradeToString( Grade g )
{ {
// string is meant to be human readable
switch( g ) switch( g )
{ {
case GRADE_AAAA: return "AAAA"; case GRADE_NO_DATA: return "NoData";
case GRADE_AAA: return "AAA"; case GRADE_FAILED: return "Failed";
case GRADE_AA: return "AA"; default:
case GRADE_A: return "A"; return ssprintf("%02d",g);
case GRADE_B: return "B";
case GRADE_C: return "C";
case GRADE_D: return "D";
case GRADE_E: return "E";
case GRADE_NO_DATA: return "N";
default: ASSERT( false ); return "N";
} }
}; };
@@ -33,14 +29,28 @@ Grade StringToGrade( const CString &sGrade )
{ {
CString s = sGrade; CString s = sGrade;
s.MakeUpper(); s.MakeUpper();
if ( s == "AAAA" ) return GRADE_AAAA;
else if( s == "AAA" ) return GRADE_AAA; // letters for backward compatibility
else if( s == "AA" ) return GRADE_AA; if ( s == "AAAA" ) return GRADE_TIER_1;
else if( s == "A" ) return GRADE_A; else if( s == "AAA" ) return GRADE_TIER_2;
else if( s == "B" ) return GRADE_B; else if( s == "AA" ) return GRADE_TIER_3;
else if( s == "C" ) return GRADE_C; else if( s == "A" ) return GRADE_TIER_4;
else if( s == "D" ) return GRADE_D; else if( s == "B" ) return GRADE_TIER_5;
else if( s == "E" ) return GRADE_E; else if( s == "C" ) return GRADE_TIER_6;
else if( s == "N" ) return GRADE_NO_DATA; else if( s == "D" ) return GRADE_TIER_7;
else ASSERT( false ); return GRADE_NO_DATA; // invalid grade string else if( s == "E" ) return GRADE_FAILED;
else if( s == "FAILED" ) return GRADE_FAILED;
else if( s == "NODATA" ) return GRADE_NO_DATA;
#define MY_IS_DIGIT( c ) (c>='0'&&c<='9')
// If the string is a two digit number...
if( s.length()==2 && MY_IS_DIGIT(s[0]) && MY_IS_DIGIT(s[1]) )
{
return (Grade)atoi(s);
}
ASSERT(0);
return GRADE_NO_DATA;
}; };
+27 -3
View File
@@ -13,9 +13,33 @@
#ifndef GRADE_H #ifndef GRADE_H
#define GRADE_H #define GRADE_H
enum Grade { GRADE_NO_DATA=0, #define NUM_GRADE_TIERS 20
GRADE_E, GRADE_D, GRADE_C, GRADE_B, GRADE_A, enum Grade
GRADE_AA,GRADE_AAA,GRADE_AAAA, NUM_GRADES }; {
GRADE_NO_DATA=0,
GRADE_TIER_1, // = AAAA
GRADE_TIER_2, // = AAA
GRADE_TIER_3, // = AA
GRADE_TIER_4, // = A
GRADE_TIER_5, // = B
GRADE_TIER_6, // = C
GRADE_TIER_7, // = D
GRADE_TIER_8,
GRADE_TIER_9,
GRADE_TIER_10,
GRADE_TIER_11,
GRADE_TIER_12,
GRADE_TIER_13,
GRADE_TIER_14,
GRADE_TIER_15,
GRADE_TIER_16,
GRADE_TIER_17,
GRADE_TIER_18,
GRADE_TIER_19,
GRADE_TIER_20,
GRADE_FAILED, // = E
NUM_GRADES
};
CString GradeToString( Grade g ); CString GradeToString( Grade g );
Grade StringToGrade( const CString &s ); Grade StringToGrade( const CString &s );
+9 -11
View File
@@ -96,17 +96,15 @@ int GradeDisplay::GetFrameNo( PlayerNumber pn, Grade g )
int iFrame; int iFrame;
switch( g ) switch( g )
{ {
case GRADE_AAAA: iFrame = 0; break; case GRADE_TIER_1: iFrame = 0; break;
case GRADE_AAA: iFrame = 1; break; case GRADE_TIER_2: iFrame = 1; break;
case GRADE_AA: iFrame = 2; break; case GRADE_TIER_3: iFrame = 2; break;
case GRADE_A: iFrame = 3; break; case GRADE_TIER_4: iFrame = 3; break;
case GRADE_B: iFrame = 4; break; case GRADE_TIER_5: iFrame = 4; break;
case GRADE_C: iFrame = 5; break; case GRADE_TIER_6: iFrame = 5; break;
case GRADE_D: iFrame = 6; break; case GRADE_TIER_7: iFrame = 6; break;
case GRADE_E: iFrame = 7; break; case GRADE_FAILED: iFrame = 7; break;
default: default: iFrame = 7; break;
ASSERT(0);
case GRADE_NO_DATA: iFrame = 0; break;
} }
iFrame *= iNumCols; iFrame *= iNumCols;
if( iNumCols==2 ) if( iNumCols==2 )
+4 -3
View File
@@ -14,8 +14,6 @@
MeterDisplay::MeterDisplay() MeterDisplay::MeterDisplay()
{ {
this->AddChild( &m_sprStream );
this->AddChild( &m_sprTip );
} }
void MeterDisplay::Load( CString sStreamPath, float fStreamWidth, CString sTipPath ) void MeterDisplay::Load( CString sStreamPath, float fStreamWidth, CString sTipPath )
@@ -27,6 +25,9 @@ void MeterDisplay::Load( CString sStreamPath, float fStreamWidth, CString sTipPa
m_sprTip.Load( sTipPath ); m_sprTip.Load( sTipPath );
this->AddChild( &m_sprStream );
this->AddChild( m_sprTip );
SetPercent( 0.5f ); SetPercent( 0.5f );
} }
@@ -36,5 +37,5 @@ void MeterDisplay::SetPercent( float fPercent )
m_sprStream.SetCropRight( 1-fPercent ); m_sprStream.SetCropRight( 1-fPercent );
m_sprTip.SetX( SCALE(fPercent, 0.f, 1.f, -m_fStreamWidth/2, m_fStreamWidth/2) ); m_sprTip->SetX( SCALE(fPercent, 0.f, 1.f, -m_fStreamWidth/2, m_fStreamWidth/2) );
} }
+2 -2
View File
@@ -13,7 +13,7 @@
#include "ActorFrame.h" #include "ActorFrame.h"
#include "Sprite.h" #include "Sprite.h"
#include "Quad.h" #include "ActorUtil.h"
class MeterDisplay : public ActorFrame class MeterDisplay : public ActorFrame
@@ -28,7 +28,7 @@ private:
float m_fStreamWidth; float m_fStreamWidth;
float m_fPercent; float m_fPercent;
Sprite m_sprStream; Sprite m_sprStream;
Sprite m_sprTip; AutoActor m_sprTip;
}; };
#endif #endif
+2
View File
@@ -332,6 +332,8 @@ NoteField::NoteDisplayCols *NoteField::SearchForBeat( float Beat )
{ {
NDMap::iterator it = m_BeatToNoteDisplays.lower_bound( Beat ); NDMap::iterator it = m_BeatToNoteDisplays.lower_bound( Beat );
/* The first entry should always be lower than any Beat we might receive. */ /* The first entry should always be lower than any Beat we might receive. */
// This assert is firing with Beat = -7408. -Chris
// Again with -4976.
RAGE_ASSERT_M( it != m_BeatToNoteDisplays.begin(), ssprintf("%f",Beat) ); RAGE_ASSERT_M( it != m_BeatToNoteDisplays.begin(), ssprintf("%f",Beat) );
--it; --it;
RAGE_ASSERT_M( it != m_BeatToNoteDisplays.end(), ssprintf("%f",Beat) ); RAGE_ASSERT_M( it != m_BeatToNoteDisplays.end(), ssprintf("%f",Beat) );
+22 -15
View File
@@ -115,11 +115,16 @@ PrefsManager::PrefsManager()
m_iGradeHitMineWeight = -8; m_iGradeHitMineWeight = -8;
m_iGradeOKWeight = 6; m_iGradeOKWeight = 6;
m_iGradeNGWeight = 0; m_iGradeNGWeight = 0;
m_fGradePercentAA = 0.93f; m_bGradeTier1IsAllMarvelouses = true;
m_fGradePercentA = 0.80f; m_bGradeTier2IsAllPerfects = true;
m_fGradePercentB = 0.65f; for( int i=0; i<NUM_GRADE_TIERS; i++ )
m_fGradePercentC = 0.45f; m_fGradePercentTier[i] = 0;
m_fGradePercentD = 0; m_fGradePercentTier[GRADE_TIER_1] = 1.0f;
m_fGradePercentTier[GRADE_TIER_2] = 1.0f;
m_fGradePercentTier[GRADE_TIER_3] = 0.93f; // AA
m_fGradePercentTier[GRADE_TIER_4] = 0.80f; // A
m_fGradePercentTier[GRADE_TIER_5] = 0.65f; // B
m_fGradePercentTier[GRADE_TIER_6] = 0.45f; // C
m_fSuperMeterMarvelousPercentChange = +0.05f; m_fSuperMeterMarvelousPercentChange = +0.05f;
m_fSuperMeterPerfectPercentChange = +0.04f; m_fSuperMeterPerfectPercentChange = +0.04f;
@@ -364,11 +369,12 @@ void PrefsManager::ReadGlobalPrefsFromDisk()
ini.GetValue( "Options", "GradeHitMineWeight", m_iGradeHitMineWeight ); ini.GetValue( "Options", "GradeHitMineWeight", m_iGradeHitMineWeight );
ini.GetValue( "Options", "GradeOKWeight", m_iGradeOKWeight ); ini.GetValue( "Options", "GradeOKWeight", m_iGradeOKWeight );
ini.GetValue( "Options", "GradeNGWeight", m_iGradeNGWeight ); ini.GetValue( "Options", "GradeNGWeight", m_iGradeNGWeight );
ini.GetValue( "Options", "GradePercentAA", m_fGradePercentAA ); for( int g=0; g<NUM_GRADE_TIERS; g++ )
ini.GetValue( "Options", "GradePercentA", m_fGradePercentA ); {
ini.GetValue( "Options", "GradePercentB", m_fGradePercentB ); Grade grade = (Grade)g;
ini.GetValue( "Options", "GradePercentC", m_fGradePercentC ); CString s = GradeToString( grade );
ini.GetValue( "Options", "GradePercentD", m_fGradePercentD ); ini.GetValue( "Options", "GradePercentTier"+s, m_fGradePercentTier[g] );
}
ini.GetValue( "Options", "SuperMeterMarvelousPercentChange",m_fSuperMeterMarvelousPercentChange ); ini.GetValue( "Options", "SuperMeterMarvelousPercentChange",m_fSuperMeterMarvelousPercentChange );
ini.GetValue( "Options", "SuperMeterPerfectPercentChange", m_fSuperMeterPerfectPercentChange ); ini.GetValue( "Options", "SuperMeterPerfectPercentChange", m_fSuperMeterPerfectPercentChange );
@@ -569,11 +575,12 @@ void PrefsManager::SaveGlobalPrefsToDisk() const
ini.SetValue( "Options", "GradeHitMineWeight", m_iGradeHitMineWeight ); ini.SetValue( "Options", "GradeHitMineWeight", m_iGradeHitMineWeight );
ini.SetValue( "Options", "GradeOKWeight", m_iGradeOKWeight ); ini.SetValue( "Options", "GradeOKWeight", m_iGradeOKWeight );
ini.SetValue( "Options", "GradeNGWeight", m_iGradeNGWeight ); ini.SetValue( "Options", "GradeNGWeight", m_iGradeNGWeight );
ini.SetValue( "Options", "GradePercentAA", m_fGradePercentAA ); for( int g=0; g<NUM_GRADE_TIERS; g++ )
ini.SetValue( "Options", "GradePercentA", m_fGradePercentA ); {
ini.SetValue( "Options", "GradePercentB", m_fGradePercentB ); Grade grade = (Grade)g;
ini.SetValue( "Options", "GradePercentC", m_fGradePercentC ); CString s = GradeToString( grade );
ini.SetValue( "Options", "GradePercentD", m_fGradePercentD ); ini.SetValue( "Options", "GradePercentTier"+s, m_fGradePercentTier[g] );
}
ini.SetValue( "Options", "SuperMeterMarvelousPercentChange",m_fSuperMeterMarvelousPercentChange ); ini.SetValue( "Options", "SuperMeterMarvelousPercentChange",m_fSuperMeterMarvelousPercentChange );
ini.SetValue( "Options", "SuperMeterPerfectPercentChange", m_fSuperMeterPerfectPercentChange ); ini.SetValue( "Options", "SuperMeterPerfectPercentChange", m_fSuperMeterPerfectPercentChange );
+4 -5
View File
@@ -12,6 +12,7 @@
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#include "PlayerNumber.h" #include "PlayerNumber.h"
#include "Grade.h" // for NUM_GRADE_TIERS
class PrefsManager class PrefsManager
{ {
@@ -111,11 +112,9 @@ public:
int m_iGradeHitMineWeight; int m_iGradeHitMineWeight;
int m_iGradeOKWeight; int m_iGradeOKWeight;
int m_iGradeNGWeight; int m_iGradeNGWeight;
float m_fGradePercentAA; bool m_bGradeTier1IsAllMarvelouses;
float m_fGradePercentA; bool m_bGradeTier2IsAllPerfects;
float m_fGradePercentB; float m_fGradePercentTier[NUM_GRADE_TIERS];
float m_fGradePercentC;
float m_fGradePercentD;
float m_fSuperMeterMarvelousPercentChange; float m_fSuperMeterMarvelousPercentChange;
float m_fSuperMeterPerfectPercentChange; float m_fSuperMeterPerfectPercentChange;
+2 -2
View File
@@ -36,13 +36,13 @@ bool EvaluateCondition( CString sCondition )
if( as.size()==3 && as[0].CompareNoCase("topgrade")==0 ) if( as.size()==3 && as[0].CompareNoCase("topgrade")==0 )
{ {
Grade top_grade = GRADE_E; Grade top_grade = GRADE_FAILED;
vector<Song*> vSongs; vector<Song*> vSongs;
StageStats stats; StageStats stats;
GAMESTATE->GetFinalEvalStatsAndSongs( stats, vSongs ); GAMESTATE->GetFinalEvalStatsAndSongs( stats, vSongs );
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
if( GAMESTATE->IsHumanPlayer(p) ) if( GAMESTATE->IsHumanPlayer(p) )
top_grade = max( top_grade, stats.GetGrade((PlayerNumber)p) ); top_grade = min( top_grade, stats.GetGrade((PlayerNumber)p) );
CString &sOp = as[1]; CString &sOp = as[1];
+15 -5
View File
@@ -191,7 +191,7 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName ) : Screen(sClassName)
if( GAMESTATE->IsPlayerEnabled(p) ) if( GAMESTATE->IsPlayerEnabled(p) )
grade[p] = stageStats.GetGrade( (PlayerNumber)p ); grade[p] = stageStats.GetGrade( (PlayerNumber)p );
else else
grade[p] = GRADE_E; grade[p] = GRADE_FAILED;
if (PREFSMAN->m_iScoringType == PrefsManager::SCORING_5TH) if (PREFSMAN->m_iScoringType == PrefsManager::SCORING_5TH)
{ {
@@ -209,7 +209,7 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName ) : Screen(sClassName)
// if its extra stage, update # passed stages // if its extra stage, update # passed stages
if (PREFSMAN->m_bUseUnlockSystem && if (PREFSMAN->m_bUseUnlockSystem &&
(GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) && (GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) &&
grade[p] > GRADE_E && grade[p] > GRADE_FAILED &&
m_Type != summary) m_Type != summary)
UNLOCKSYS->UnlockClearExtraStage(); UNLOCKSYS->UnlockClearExtraStage();
} }
@@ -434,6 +434,10 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName ) : Screen(sClassName)
// //
if( SHOW_GRADE_AREA ) if( SHOW_GRADE_AREA )
{ {
// ugly: Touch all possible grade files to make sure their all present
for( int g=GRADE_TIER_1; g<NUM_GRADES; g++ )
THEME->GetPathToG( "ScreenEvaluation grade "+ GradeToString((Grade)g) );
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) ) if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
@@ -451,6 +455,11 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName ) : Screen(sClassName)
if( SPIN_GRADES ) if( SPIN_GRADES )
m_Grades[p].Spin(); m_Grades[p].Spin();
this->AddChild( &m_Grades[p] ); this->AddChild( &m_Grades[p] );
m_sprGrade[p].Load( THEME->GetPathToG( "ScreenEvaluation grade "+ GradeToString(grade[p]) ) );
m_sprGrade[p]->SetName( ssprintf("GradeP%d",p+1) );
SET_XY_AND_ON_COMMAND( m_sprGrade[p] );
this->AddChild( m_sprGrade[p] );
} }
} }
@@ -828,9 +837,9 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName ) : Screen(sClassName)
switch( max_grade ) switch( max_grade )
{ {
case GRADE_AA: case GRADE_TIER_1:
case GRADE_AAA: case GRADE_TIER_2:
case GRADE_AAAA: case GRADE_TIER_3:
this->PostScreenMessage( SM_PlayCheer, CHEER_DELAY_SECONDS ); this->PostScreenMessage( SM_PlayCheer, CHEER_DELAY_SECONDS );
break; break;
} }
@@ -1002,6 +1011,7 @@ void ScreenEvaluation::TweenOffScreen()
continue; continue;
OFF_COMMAND( m_sprGradeFrame[p] ); OFF_COMMAND( m_sprGradeFrame[p] );
OFF_COMMAND( m_Grades[p] ); OFF_COMMAND( m_Grades[p] );
OFF_COMMAND( m_sprGrade[p] );
} }
if( SHOW_GRAPH_AREA ) if( SHOW_GRAPH_AREA )
+1
View File
@@ -84,6 +84,7 @@ protected:
// grade area // grade area
Sprite m_sprGradeFrame[NUM_PLAYERS]; Sprite m_sprGradeFrame[NUM_PLAYERS];
GradeDisplay m_Grades[NUM_PLAYERS]; GradeDisplay m_Grades[NUM_PLAYERS];
AutoActor m_sprGrade[NUM_PLAYERS];
// graph area // graph area
Sprite m_sprGraphFrame[NUM_PLAYERS]; Sprite m_sprGraphFrame[NUM_PLAYERS];
+4 -7
View File
@@ -82,7 +82,7 @@ ScreenNameEntryTraditional::ScreenNameEntryTraditional( CString sClassName ) : S
st.iActualDancePoints[i] = 985; st.iActualDancePoints[i] = 985;
Steps::MemCardData::HighScore hs; Steps::MemCardData::HighScore hs;
hs.grade = GRADE_A; hs.grade = GRADE_TIER_3;
hs.iScore = 42; hs.iScore = 42;
int a, b; int a, b;
GAMESTATE->m_pCurNotes[i]->AddHighScore( (PlayerNumber)i, hs, a, b ); GAMESTATE->m_pCurNotes[i]->AddHighScore( (PlayerNumber)i, hs, a, b );
@@ -388,18 +388,15 @@ void ScreenNameEntryTraditional::HandleScreenMessage( const ScreenMessage SM )
break; break;
} }
Grade max_grade = GRADE_E; Grade max_grade = GRADE_FAILED;
vector<Song*> vSongs; vector<Song*> vSongs;
StageStats stats; StageStats stats;
GAMESTATE->GetFinalEvalStatsAndSongs( stats, vSongs ); GAMESTATE->GetFinalEvalStatsAndSongs( stats, vSongs );
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
if( GAMESTATE->IsHumanPlayer(p) ) if( GAMESTATE->IsHumanPlayer(p) )
max_grade = max( max_grade, stats.GetGrade((PlayerNumber)p) ); max_grade = min( max_grade, stats.GetGrade((PlayerNumber)p) );
// if( max_grade >= GRADE_AA )
// SCREENMAN->SetNewScreen( "ScreenCredits" );
// else
// SCREENMAN->SetNewScreen( "ScreenMusicScroll" );
SCREENMAN->SetNewScreen( NEXT_SCREEN ); SCREENMAN->SetNewScreen( NEXT_SCREEN );
} }
break; break;
+21 -22
View File
@@ -140,7 +140,7 @@ Grade StageStats::GetGrade( PlayerNumber pn ) const
ASSERT( GAMESTATE->IsPlayerEnabled(pn) ); // shouldn't be calling this is player isn't joined! ASSERT( GAMESTATE->IsPlayerEnabled(pn) ); // shouldn't be calling this is player isn't joined!
if( bFailedEarlier[pn] ) if( bFailedEarlier[pn] )
return GRADE_E; return GRADE_FAILED;
/* XXX: This entire calculation should be in ScoreKeeper, but final evaluation /* XXX: This entire calculation should be in ScoreKeeper, but final evaluation
* is tricky since at that point the ScoreKeepers no longer exist. * is tricky since at that point the ScoreKeepers no longer exist.
@@ -184,7 +184,8 @@ Grade StageStats::GetGrade( PlayerNumber pn ) const
/* check for "AAAA". Check DP == 100%: if we're using eg. "LITTLE", we might have all /* check for "AAAA". Check DP == 100%: if we're using eg. "LITTLE", we might have all
* marvelouses but still not qualify for a AAAA. */ * marvelouses but still not qualify for a AAAA. */
if( fPercentDancePoints > .9999 && if( PREFSMAN->m_bGradeTier1IsAllMarvelouses &&
fPercentDancePoints > .9999 &&
iTapNoteScores[pn][TNS_MARVELOUS] > 0 && iTapNoteScores[pn][TNS_MARVELOUS] > 0 &&
iTapNoteScores[pn][TNS_PERFECT] == 0 && iTapNoteScores[pn][TNS_PERFECT] == 0 &&
iTapNoteScores[pn][TNS_GREAT] == 0 && iTapNoteScores[pn][TNS_GREAT] == 0 &&
@@ -192,35 +193,33 @@ Grade StageStats::GetGrade( PlayerNumber pn ) const
iTapNoteScores[pn][TNS_BOO] == 0 && iTapNoteScores[pn][TNS_BOO] == 0 &&
iTapNoteScores[pn][TNS_MISS] == 0 && iTapNoteScores[pn][TNS_MISS] == 0 &&
iHoldNoteScores[pn][HNS_NG] == 0 ) iHoldNoteScores[pn][HNS_NG] == 0 )
return GRADE_AAAA; return GRADE_TIER_1;
if( fPercentDancePoints > .9999 && if( PREFSMAN->m_bGradeTier2IsAllPerfects &&
fPercentDancePoints > .9999 &&
iTapNoteScores[pn][TNS_PERFECT] > 0 && iTapNoteScores[pn][TNS_PERFECT] > 0 &&
iTapNoteScores[pn][TNS_GREAT] == 0 && iTapNoteScores[pn][TNS_GREAT] == 0 &&
iTapNoteScores[pn][TNS_GOOD] == 0 && iTapNoteScores[pn][TNS_GOOD] == 0 &&
iTapNoteScores[pn][TNS_BOO] == 0 && iTapNoteScores[pn][TNS_BOO] == 0 &&
iTapNoteScores[pn][TNS_MISS] == 0 && iTapNoteScores[pn][TNS_MISS] == 0 &&
iHoldNoteScores[pn][HNS_NG] == 0 ) iHoldNoteScores[pn][HNS_NG] == 0 )
return GRADE_AAA; return GRADE_TIER_2;
/* 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
*/
if( fPercentDancePoints >= 0.93 ) return GRADE_AA; // Start checking at TIER_3 if m_bGradeTier2IsAllPerfects is true.
else if( fPercentDancePoints >= 0.80 ) return GRADE_A; // Start checking at TIER_2 if m_bGradeTier1IsAllMarvelouses is true.
else if( fPercentDancePoints >= 0.65 ) return GRADE_B; int g;
else if( fPercentDancePoints >= 0.45 ) return GRADE_C; if( PREFSMAN->m_bGradeTier2IsAllPerfects )
else if( fPercentDancePoints >= 0 ) return GRADE_D; g = 2;
else return GRADE_E; else if( PREFSMAN->m_bGradeTier1IsAllMarvelouses )
g = 1;
else
g = 0;
for( ; g<NUM_GRADE_TIERS; g++ )
if( fPercentDancePoints >= PREFSMAN->m_fGradePercentTier[g] )
return (Grade)(GRADE_TIER_1+g);
return (Grade)(GRADE_TIER_1+NUM_GRADE_TIERS-1);
} }
bool StageStats::OnePassed() const bool StageStats::OnePassed() const
+29 -7
View File
@@ -425,13 +425,25 @@ float UnlockSystem::UnlockAddAP(float credit)
return ArcadePoints; return ArcadePoints;
} }
float UnlockSystem::UnlockAddAP(Grade credit) float UnlockSystem::UnlockAddAP(Grade grade)
{ {
ReadValues( MEMCARD_PATH ); ReadValues( MEMCARD_PATH );
if (credit != GRADE_E && credit != GRADE_D) switch( grade )
ArcadePoints += 1; {
if (credit == GRADE_AAA) case GRADE_FAILED:
; // no points
break;
case GRADE_TIER_1:
case GRADE_TIER_2:
ArcadePoints += 9; ArcadePoints += 9;
break;
case GRADE_NO_DATA:
ASSERT(0);
break;
default:
ArcadePoints += 1;
break;
}
WriteValues( MEMCARD_PATH ); WriteValues( MEMCARD_PATH );
return ArcadePoints; return ArcadePoints;
@@ -457,12 +469,22 @@ float UnlockSystem::UnlockAddSP(float credit)
return SongPoints; return SongPoints;
} }
float UnlockSystem::UnlockAddSP(Grade credit) float UnlockSystem::UnlockAddSP( Grade grade )
{ {
ReadValues( MEMCARD_PATH ); ReadValues( MEMCARD_PATH );
const float SongPointsVals[NUM_GRADES] = { -1 /* unused */, 0, 1, 2, 3, 4, 5, 10, 20 };
SongPoints += SongPointsVals[credit]; // TODO: move these to PREFS
switch( grade )
{
case GRADE_TIER_1:/*AAAA*/ SongPoints += 20; break;
case GRADE_TIER_2:/*AAA*/ SongPoints += 10; break;
case GRADE_TIER_3:/*AA*/ SongPoints += 5; break;
case GRADE_TIER_4:/*A*/ SongPoints += 4; break;
case GRADE_TIER_5:/*B*/ SongPoints += 3; break;
case GRADE_TIER_6:/*C*/ SongPoints += 2; break;
case GRADE_TIER_7:/*D*/ SongPoints += 1; break;
}
WriteValues( MEMCARD_PATH ); WriteValues( MEMCARD_PATH );
return SongPoints; return SongPoints;