diff --git a/stepmania/src/PlayerStageStats.cpp b/stepmania/src/PlayerStageStats.cpp index 32b2938aaf..45714a30d3 100644 --- a/stepmania/src/PlayerStageStats.cpp +++ b/stepmania/src/PlayerStageStats.cpp @@ -137,15 +137,20 @@ Grade PlayerStageStats::GetGrade() const /* XXX: This entire calculation should be in ScoreKeeper, but final evaluation * is tricky since at that point the ScoreKeepers no longer exist. */ float fActual = 0; + + bool bIsBeginner = false; + if( vpPlayedSteps.size() && !GAMESTATE->IsCourseMode() ) + bIsBeginner = vpPlayedSteps[0]->GetDifficulty() == DIFFICULTY_BEGINNER; + FOREACH_TapNoteScore( tns ) { - int iTapScoreValue = ScoreKeeperMAX2::TapNoteScoreToGradePoints( tns ); + int iTapScoreValue = ScoreKeeperMAX2::TapNoteScoreToGradePoints( tns, bIsBeginner ); fActual += iTapNoteScores[tns] * iTapScoreValue; } FOREACH_HoldNoteScore( hns ) { - int iHoldScoreValue = ScoreKeeperMAX2::HoldNoteScoreToGradePoints( hns ); + int iHoldScoreValue = ScoreKeeperMAX2::HoldNoteScoreToGradePoints( hns, bIsBeginner ); fActual += iHoldNoteScores[hns] * iHoldScoreValue; } diff --git a/stepmania/src/ScoreKeeperMAX2.cpp b/stepmania/src/ScoreKeeperMAX2.cpp index 67551b4d67..d51780723b 100644 --- a/stepmania/src/ScoreKeeperMAX2.cpp +++ b/stepmania/src/ScoreKeeperMAX2.cpp @@ -183,6 +183,10 @@ void ScoreKeeperMAX2::OnNextSong( int iSongInCourseIndex, const Steps* pSteps, c m_iPointBonus = m_iMaxPossiblePoints; m_pPlayerStageStats->iMaxScore = m_iMaxScoreSoFar; + /* MercifulBeginner shouldn't clamp weights in course mode, even if a beginner song + * is in a course, since that makes PlayerStageStats::GetGrade hard. */ + m_bIsBeginner = pSteps->GetDifficulty() == DIFFICULTY_BEGINNER && !GAMESTATE->IsCourseMode(); + ASSERT( m_iPointBonus >= 0 ); m_iTapNotesHit = 0; @@ -461,9 +465,9 @@ int ScoreKeeperMAX2::GetPossibleDancePoints( const RadarValues& radars ) int NumHolds = int(radars[RADAR_NUM_HOLDS]); int NumRolls = int(radars[RADAR_NUM_ROLLS]); return - NumTaps*TapNoteScoreToDancePoints(TNS_MARVELOUS)+ - NumHolds*HoldNoteScoreToDancePoints(HNS_OK) + - NumRolls*HoldNoteScoreToDancePoints(HNS_OK); + NumTaps*TapNoteScoreToDancePoints(TNS_MARVELOUS, false)+ + NumHolds*HoldNoteScoreToDancePoints(HNS_OK, false) + + NumRolls*HoldNoteScoreToDancePoints(HNS_OK, false); } int ScoreKeeperMAX2::GetPossibleDancePoints( const RadarValues& fOriginalRadars, const RadarValues& fPostRadars ) @@ -486,9 +490,9 @@ int ScoreKeeperMAX2::GetPossibleGradePoints( const RadarValues& radars ) int NumHolds = int(radars[RADAR_NUM_HOLDS]); int NumRolls = int(radars[RADAR_NUM_ROLLS]); return - NumTaps*TapNoteScoreToGradePoints(TNS_MARVELOUS)+ - NumHolds*HoldNoteScoreToGradePoints(HNS_OK) + - NumRolls*HoldNoteScoreToGradePoints(HNS_OK); + NumTaps*TapNoteScoreToGradePoints(TNS_MARVELOUS, false)+ + NumHolds*HoldNoteScoreToGradePoints(HNS_OK, false) + + NumRolls*HoldNoteScoreToGradePoints(HNS_OK, false); } int ScoreKeeperMAX2::GetPossibleGradePoints( const RadarValues& fOriginalRadars, const RadarValues& fPostRadars ) @@ -502,8 +506,26 @@ int ScoreKeeperMAX2::GetPossibleGradePoints( const RadarValues& fOriginalRadars, GetPossibleGradePoints(fPostRadars) ); } +int ScoreKeeperMAX2::TapNoteScoreToDancePoints( TapNoteScore tns ) const +{ + return TapNoteScoreToDancePoints( tns, m_bIsBeginner ); +} -int ScoreKeeperMAX2::TapNoteScoreToDancePoints( TapNoteScore tns ) +int ScoreKeeperMAX2::HoldNoteScoreToDancePoints( HoldNoteScore hns ) const +{ + return HoldNoteScoreToDancePoints( hns, m_bIsBeginner ); +} + +int ScoreKeeperMAX2::TapNoteScoreToGradePoints( TapNoteScore tns ) const +{ + return TapNoteScoreToGradePoints( tns, m_bIsBeginner ); +} +int ScoreKeeperMAX2::HoldNoteScoreToGradePoints( HoldNoteScore hns ) const +{ + return HoldNoteScoreToGradePoints( hns, m_bIsBeginner ); +} + +int ScoreKeeperMAX2::TapNoteScoreToDancePoints( TapNoteScore tns, bool bBeginner ) { if( !GAMESTATE->ShowMarvelous() && tns == TNS_MARVELOUS ) tns = TNS_PERFECT; @@ -523,12 +545,12 @@ int ScoreKeeperMAX2::TapNoteScoreToDancePoints( TapNoteScore tns ) case TNS_MARVELOUS: iWeight = PREFSMAN->m_iPercentScoreWeightMarvelous; break; default: FAIL_M( ssprintf("%i", tns) ); } - if( PREFSMAN->m_bMercifulBeginner ) + if( bBeginner && PREFSMAN->m_bMercifulBeginner ) iWeight = max( 0, iWeight ); return iWeight; } -int ScoreKeeperMAX2::HoldNoteScoreToDancePoints( HoldNoteScore hns ) +int ScoreKeeperMAX2::HoldNoteScoreToDancePoints( HoldNoteScore hns, bool bBeginner ) { int iWeight = 0; switch( hns ) @@ -538,12 +560,12 @@ int ScoreKeeperMAX2::HoldNoteScoreToDancePoints( HoldNoteScore hns ) case HNS_OK: iWeight = PREFSMAN->m_iPercentScoreWeightOK; break; default: FAIL_M( ssprintf("%i", hns) ); } - if( PREFSMAN->m_bMercifulBeginner ) + if( bBeginner && PREFSMAN->m_bMercifulBeginner ) iWeight = max( 0, iWeight ); return iWeight; } -int ScoreKeeperMAX2::TapNoteScoreToGradePoints( TapNoteScore tns ) +int ScoreKeeperMAX2::TapNoteScoreToGradePoints( TapNoteScore tns, bool bBeginner ) { if( !GAMESTATE->ShowMarvelous() && tns == TNS_MARVELOUS ) tns = TNS_PERFECT; @@ -564,12 +586,12 @@ int ScoreKeeperMAX2::TapNoteScoreToGradePoints( TapNoteScore tns ) case TNS_MARVELOUS: iWeight = PREFSMAN->m_iGradeWeightMarvelous;break; default: FAIL_M( ssprintf("%i", tns) ); } - if( PREFSMAN->m_bMercifulBeginner ) + if( bBeginner && PREFSMAN->m_bMercifulBeginner ) iWeight = max( 0, iWeight ); return iWeight; } -int ScoreKeeperMAX2::HoldNoteScoreToGradePoints( HoldNoteScore hns ) +int ScoreKeeperMAX2::HoldNoteScoreToGradePoints( HoldNoteScore hns, bool bBeginner ) { int iWeight = 0; switch( hns ) @@ -579,7 +601,7 @@ int ScoreKeeperMAX2::HoldNoteScoreToGradePoints( HoldNoteScore hns ) case HNS_OK: iWeight = PREFSMAN->m_iGradeWeightOK; break; default: FAIL_M( ssprintf("%i", hns) ); } - if( PREFSMAN->m_bMercifulBeginner ) + if( bBeginner && PREFSMAN->m_bMercifulBeginner ) iWeight = max( 0, iWeight ); return iWeight; } diff --git a/stepmania/src/ScoreKeeperMAX2.h b/stepmania/src/ScoreKeeperMAX2.h index eb29ff53d0..34ea3be4b3 100644 --- a/stepmania/src/ScoreKeeperMAX2.h +++ b/stepmania/src/ScoreKeeperMAX2.h @@ -20,6 +20,7 @@ class ScoreKeeperMAX2: public ScoreKeeper int m_iPointBonus; // the difference to award at the end int m_iCurToastyCombo; bool m_bIsLastSongInCourse; + bool m_bIsBeginner; vector m_apSteps; @@ -55,10 +56,14 @@ public: static int GetPossibleGradePoints( const RadarValues& fRadars ); static int GetPossibleGradePoints( const RadarValues& fOriginalRadars, const RadarValues& fPostRadars ); - static int TapNoteScoreToDancePoints( TapNoteScore tns ); - static int HoldNoteScoreToDancePoints( HoldNoteScore hns ); - static int TapNoteScoreToGradePoints( TapNoteScore tns ); - static int HoldNoteScoreToGradePoints( HoldNoteScore hns ); + int TapNoteScoreToDancePoints( TapNoteScore tns ) const; + int HoldNoteScoreToDancePoints( HoldNoteScore hns ) const; + int TapNoteScoreToGradePoints( TapNoteScore tns ) const; + int HoldNoteScoreToGradePoints( HoldNoteScore hns ) const; + static int TapNoteScoreToDancePoints( TapNoteScore tns, bool bBeginner ); + static int HoldNoteScoreToDancePoints( HoldNoteScore hns, bool bBeginner ); + static int TapNoteScoreToGradePoints( TapNoteScore tns, bool bBeginner ); + static int HoldNoteScoreToGradePoints( HoldNoteScore hns, bool bBeginner ); }; #endif diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index 13283491f8..fa7c8af41d 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -161,7 +161,7 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName ) : ScreenWithMenuElement STATSMAN->m_CurStageStats.m_player[p].iTapNoteScores[TNS_MARVELOUS] = rand()%3; STATSMAN->m_CurStageStats.m_player[p].iTapNoteScores[TNS_PERFECT] = rand()%3; STATSMAN->m_CurStageStats.m_player[p].iTapNoteScores[TNS_GREAT] = rand()%3; - STATSMAN->m_CurStageStats.m_player[p].iPossibleGradePoints = 4*ScoreKeeperMAX2::TapNoteScoreToGradePoints(TNS_MARVELOUS); + STATSMAN->m_CurStageStats.m_player[p].iPossibleGradePoints = 4*ScoreKeeperMAX2::TapNoteScoreToGradePoints(TNS_MARVELOUS, false); STATSMAN->m_CurStageStats.m_player[p].fLifeRemainingSeconds = randomf( 90, 580 ); }