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 )
continue;
if( g_CurStageStats.GetGrade((PlayerNumber)p) >= GRADE_AA )
if( g_CurStageStats.GetGrade((PlayerNumber)p) >= GRADE_TIER_2 )
return true;
}
}
+30 -20
View File
@@ -11,21 +11,17 @@
*/
#include "Grade.h"
#include "RageUtil.h"
CString GradeToString( Grade g )
{
// string is meant to be human readable
switch( g )
{
case GRADE_AAAA: return "AAAA";
case GRADE_AAA: return "AAA";
case GRADE_AA: return "AA";
case GRADE_A: return "A";
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";
case GRADE_NO_DATA: return "NoData";
case GRADE_FAILED: return "Failed";
default:
return ssprintf("%02d",g);
}
};
@@ -33,14 +29,28 @@ Grade StringToGrade( const CString &sGrade )
{
CString s = sGrade;
s.MakeUpper();
if ( s == "AAAA" ) return GRADE_AAAA;
else if( s == "AAA" ) return GRADE_AAA;
else if( s == "AA" ) return GRADE_AA;
else if( s == "A" ) return GRADE_A;
else if( s == "B" ) return GRADE_B;
else if( s == "C" ) return GRADE_C;
else if( s == "D" ) return GRADE_D;
else if( s == "E" ) return GRADE_E;
else if( s == "N" ) return GRADE_NO_DATA;
else ASSERT( false ); return GRADE_NO_DATA; // invalid grade string
// letters for backward compatibility
if ( s == "AAAA" ) return GRADE_TIER_1;
else if( s == "AAA" ) return GRADE_TIER_2;
else if( s == "AA" ) return GRADE_TIER_3;
else if( s == "A" ) return GRADE_TIER_4;
else if( s == "B" ) return GRADE_TIER_5;
else if( s == "C" ) return GRADE_TIER_6;
else if( s == "D" ) return GRADE_TIER_7;
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
#define GRADE_H
enum Grade { GRADE_NO_DATA=0,
GRADE_E, GRADE_D, GRADE_C, GRADE_B, GRADE_A,
GRADE_AA,GRADE_AAA,GRADE_AAAA, NUM_GRADES };
#define NUM_GRADE_TIERS 20
enum Grade
{
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 );
Grade StringToGrade( const CString &s );
+9 -11
View File
@@ -96,17 +96,15 @@ int GradeDisplay::GetFrameNo( PlayerNumber pn, Grade g )
int iFrame;
switch( g )
{
case GRADE_AAAA: iFrame = 0; break;
case GRADE_AAA: iFrame = 1; break;
case GRADE_AA: iFrame = 2; break;
case GRADE_A: iFrame = 3; break;
case GRADE_B: iFrame = 4; break;
case GRADE_C: iFrame = 5; break;
case GRADE_D: iFrame = 6; break;
case GRADE_E: iFrame = 7; break;
default:
ASSERT(0);
case GRADE_NO_DATA: iFrame = 0; break;
case GRADE_TIER_1: iFrame = 0; break;
case GRADE_TIER_2: iFrame = 1; break;
case GRADE_TIER_3: iFrame = 2; break;
case GRADE_TIER_4: iFrame = 3; break;
case GRADE_TIER_5: iFrame = 4; break;
case GRADE_TIER_6: iFrame = 5; break;
case GRADE_TIER_7: iFrame = 6; break;
case GRADE_FAILED: iFrame = 7; break;
default: iFrame = 7; break;
}
iFrame *= iNumCols;
if( iNumCols==2 )
+4 -3
View File
@@ -14,8 +14,6 @@
MeterDisplay::MeterDisplay()
{
this->AddChild( &m_sprStream );
this->AddChild( &m_sprTip );
}
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 );
this->AddChild( &m_sprStream );
this->AddChild( m_sprTip );
SetPercent( 0.5f );
}
@@ -36,5 +37,5 @@ void MeterDisplay::SetPercent( float 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 "Sprite.h"
#include "Quad.h"
#include "ActorUtil.h"
class MeterDisplay : public ActorFrame
@@ -28,7 +28,7 @@ private:
float m_fStreamWidth;
float m_fPercent;
Sprite m_sprStream;
Sprite m_sprTip;
AutoActor m_sprTip;
};
#endif
+3 -1
View File
@@ -332,7 +332,9 @@ NoteField::NoteDisplayCols *NoteField::SearchForBeat( float Beat )
{
NDMap::iterator it = m_BeatToNoteDisplays.lower_bound( Beat );
/* The first entry should always be lower than any Beat we might receive. */
RAGE_ASSERT_M( it != m_BeatToNoteDisplays.begin(), ssprintf("%f",Beat) );
// This assert is firing with Beat = -7408. -Chris
// Again with -4976.
RAGE_ASSERT_M( it != m_BeatToNoteDisplays.begin(), ssprintf("%f",Beat) );
--it;
RAGE_ASSERT_M( it != m_BeatToNoteDisplays.end(), ssprintf("%f",Beat) );
+22 -15
View File
@@ -115,11 +115,16 @@ PrefsManager::PrefsManager()
m_iGradeHitMineWeight = -8;
m_iGradeOKWeight = 6;
m_iGradeNGWeight = 0;
m_fGradePercentAA = 0.93f;
m_fGradePercentA = 0.80f;
m_fGradePercentB = 0.65f;
m_fGradePercentC = 0.45f;
m_fGradePercentD = 0;
m_bGradeTier1IsAllMarvelouses = true;
m_bGradeTier2IsAllPerfects = true;
for( int i=0; i<NUM_GRADE_TIERS; i++ )
m_fGradePercentTier[i] = 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_fSuperMeterPerfectPercentChange = +0.04f;
@@ -364,11 +369,12 @@ void PrefsManager::ReadGlobalPrefsFromDisk()
ini.GetValue( "Options", "GradeHitMineWeight", m_iGradeHitMineWeight );
ini.GetValue( "Options", "GradeOKWeight", m_iGradeOKWeight );
ini.GetValue( "Options", "GradeNGWeight", m_iGradeNGWeight );
ini.GetValue( "Options", "GradePercentAA", m_fGradePercentAA );
ini.GetValue( "Options", "GradePercentA", m_fGradePercentA );
ini.GetValue( "Options", "GradePercentB", m_fGradePercentB );
ini.GetValue( "Options", "GradePercentC", m_fGradePercentC );
ini.GetValue( "Options", "GradePercentD", m_fGradePercentD );
for( int g=0; g<NUM_GRADE_TIERS; g++ )
{
Grade grade = (Grade)g;
CString s = GradeToString( grade );
ini.GetValue( "Options", "GradePercentTier"+s, m_fGradePercentTier[g] );
}
ini.GetValue( "Options", "SuperMeterMarvelousPercentChange",m_fSuperMeterMarvelousPercentChange );
ini.GetValue( "Options", "SuperMeterPerfectPercentChange", m_fSuperMeterPerfectPercentChange );
@@ -569,11 +575,12 @@ void PrefsManager::SaveGlobalPrefsToDisk() const
ini.SetValue( "Options", "GradeHitMineWeight", m_iGradeHitMineWeight );
ini.SetValue( "Options", "GradeOKWeight", m_iGradeOKWeight );
ini.SetValue( "Options", "GradeNGWeight", m_iGradeNGWeight );
ini.SetValue( "Options", "GradePercentAA", m_fGradePercentAA );
ini.SetValue( "Options", "GradePercentA", m_fGradePercentA );
ini.SetValue( "Options", "GradePercentB", m_fGradePercentB );
ini.SetValue( "Options", "GradePercentC", m_fGradePercentC );
ini.SetValue( "Options", "GradePercentD", m_fGradePercentD );
for( int g=0; g<NUM_GRADE_TIERS; g++ )
{
Grade grade = (Grade)g;
CString s = GradeToString( grade );
ini.SetValue( "Options", "GradePercentTier"+s, m_fGradePercentTier[g] );
}
ini.SetValue( "Options", "SuperMeterMarvelousPercentChange",m_fSuperMeterMarvelousPercentChange );
ini.SetValue( "Options", "SuperMeterPerfectPercentChange", m_fSuperMeterPerfectPercentChange );
+4 -5
View File
@@ -12,6 +12,7 @@
-----------------------------------------------------------------------------
*/
#include "PlayerNumber.h"
#include "Grade.h" // for NUM_GRADE_TIERS
class PrefsManager
{
@@ -111,11 +112,9 @@ public:
int m_iGradeHitMineWeight;
int m_iGradeOKWeight;
int m_iGradeNGWeight;
float m_fGradePercentAA;
float m_fGradePercentA;
float m_fGradePercentB;
float m_fGradePercentC;
float m_fGradePercentD;
bool m_bGradeTier1IsAllMarvelouses;
bool m_bGradeTier2IsAllPerfects;
float m_fGradePercentTier[NUM_GRADE_TIERS];
float m_fSuperMeterMarvelousPercentChange;
float m_fSuperMeterPerfectPercentChange;
+2 -2
View File
@@ -36,13 +36,13 @@ bool EvaluateCondition( CString sCondition )
if( as.size()==3 && as[0].CompareNoCase("topgrade")==0 )
{
Grade top_grade = GRADE_E;
Grade top_grade = GRADE_FAILED;
vector<Song*> vSongs;
StageStats stats;
GAMESTATE->GetFinalEvalStatsAndSongs( stats, vSongs );
for( int p=0; p<NUM_PLAYERS; 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];
+15 -5
View File
@@ -191,7 +191,7 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName ) : Screen(sClassName)
if( GAMESTATE->IsPlayerEnabled(p) )
grade[p] = stageStats.GetGrade( (PlayerNumber)p );
else
grade[p] = GRADE_E;
grade[p] = GRADE_FAILED;
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 (PREFSMAN->m_bUseUnlockSystem &&
(GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) &&
grade[p] > GRADE_E &&
grade[p] > GRADE_FAILED &&
m_Type != summary)
UNLOCKSYS->UnlockClearExtraStage();
}
@@ -434,6 +434,10 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName ) : Screen(sClassName)
//
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++ )
{
if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
@@ -451,6 +455,11 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName ) : Screen(sClassName)
if( SPIN_GRADES )
m_Grades[p].Spin();
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 )
{
case GRADE_AA:
case GRADE_AAA:
case GRADE_AAAA:
case GRADE_TIER_1:
case GRADE_TIER_2:
case GRADE_TIER_3:
this->PostScreenMessage( SM_PlayCheer, CHEER_DELAY_SECONDS );
break;
}
@@ -1002,6 +1011,7 @@ void ScreenEvaluation::TweenOffScreen()
continue;
OFF_COMMAND( m_sprGradeFrame[p] );
OFF_COMMAND( m_Grades[p] );
OFF_COMMAND( m_sprGrade[p] );
}
if( SHOW_GRAPH_AREA )
+1
View File
@@ -84,6 +84,7 @@ protected:
// grade area
Sprite m_sprGradeFrame[NUM_PLAYERS];
GradeDisplay m_Grades[NUM_PLAYERS];
AutoActor m_sprGrade[NUM_PLAYERS];
// graph area
Sprite m_sprGraphFrame[NUM_PLAYERS];
+5 -8
View File
@@ -82,7 +82,7 @@ ScreenNameEntryTraditional::ScreenNameEntryTraditional( CString sClassName ) : S
st.iActualDancePoints[i] = 985;
Steps::MemCardData::HighScore hs;
hs.grade = GRADE_A;
hs.grade = GRADE_TIER_3;
hs.iScore = 42;
int a, b;
GAMESTATE->m_pCurNotes[i]->AddHighScore( (PlayerNumber)i, hs, a, b );
@@ -388,19 +388,16 @@ void ScreenNameEntryTraditional::HandleScreenMessage( const ScreenMessage SM )
break;
}
Grade max_grade = GRADE_E;
Grade max_grade = GRADE_FAILED;
vector<Song*> vSongs;
StageStats stats;
GAMESTATE->GetFinalEvalStatsAndSongs( stats, vSongs );
for( int p=0; p<NUM_PLAYERS; p++ )
if( GAMESTATE->IsHumanPlayer(p) )
max_grade = max( max_grade, stats.GetGrade((PlayerNumber)p) );
// if( max_grade >= GRADE_AA )
// SCREENMAN->SetNewScreen( "ScreenCredits" );
// else
// SCREENMAN->SetNewScreen( "ScreenMusicScroll" );
SCREENMAN->SetNewScreen( NEXT_SCREEN );
max_grade = min( max_grade, stats.GetGrade((PlayerNumber)p) );
SCREENMAN->SetNewScreen( NEXT_SCREEN );
}
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!
if( bFailedEarlier[pn] )
return GRADE_E;
return GRADE_FAILED;
/* XXX: This entire calculation should be in ScoreKeeper, but final evaluation
* 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
* 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_PERFECT] == 0 &&
iTapNoteScores[pn][TNS_GREAT] == 0 &&
@@ -192,35 +193,33 @@ Grade StageStats::GetGrade( PlayerNumber pn ) const
iTapNoteScores[pn][TNS_BOO] == 0 &&
iTapNoteScores[pn][TNS_MISS] == 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_GREAT] == 0 &&
iTapNoteScores[pn][TNS_GOOD] == 0 &&
iTapNoteScores[pn][TNS_BOO] == 0 &&
iTapNoteScores[pn][TNS_MISS] == 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;
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 if( fPercentDancePoints >= 0 ) return GRADE_D;
else return GRADE_E;
// Start checking at TIER_3 if m_bGradeTier2IsAllPerfects is true.
// Start checking at TIER_2 if m_bGradeTier1IsAllMarvelouses is true.
int g;
if( PREFSMAN->m_bGradeTier2IsAllPerfects )
g = 2;
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
+29 -7
View File
@@ -425,13 +425,25 @@ float UnlockSystem::UnlockAddAP(float credit)
return ArcadePoints;
}
float UnlockSystem::UnlockAddAP(Grade credit)
float UnlockSystem::UnlockAddAP(Grade grade)
{
ReadValues( MEMCARD_PATH );
if (credit != GRADE_E && credit != GRADE_D)
ArcadePoints += 1;
if (credit == GRADE_AAA)
switch( grade )
{
case GRADE_FAILED:
; // no points
break;
case GRADE_TIER_1:
case GRADE_TIER_2:
ArcadePoints += 9;
break;
case GRADE_NO_DATA:
ASSERT(0);
break;
default:
ArcadePoints += 1;
break;
}
WriteValues( MEMCARD_PATH );
return ArcadePoints;
@@ -457,12 +469,22 @@ float UnlockSystem::UnlockAddSP(float credit)
return SongPoints;
}
float UnlockSystem::UnlockAddSP(Grade credit)
float UnlockSystem::UnlockAddSP( Grade grade )
{
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 );
return SongPoints;