Fix DP calculation when using transforms

This commit is contained in:
Glenn Maynard
2003-08-13 19:51:53 +00:00
parent 6e4e3b2f1d
commit 5a231e9cd4
3 changed files with 33 additions and 8 deletions
+29 -5
View File
@@ -21,9 +21,10 @@
#include "UnlockSystem.h"
#include "SDL_utils.h"
#include "SongManager.h"
#include "NoteDataUtil.h"
ScoreKeeperMAX2::ScoreKeeperMAX2( const vector<Steps*>& apNotes_, PlayerNumber pn_ ):
ScoreKeeperMAX2::ScoreKeeperMAX2( const vector<Steps*>& apNotes_, const CStringArray &asModifiers, PlayerNumber pn_ ):
ScoreKeeper(pn_), apNotes(apNotes_)
{
//
@@ -36,11 +37,27 @@ ScoreKeeperMAX2::ScoreKeeperMAX2( const vector<Steps*>& apNotes_, PlayerNumber p
NoteData notedata;
pSteps->GetNoteData( &notedata );
/* We might have been given lots of songs; don't keep them in memory uncompressed. */
pSteps->Compress();
const StyleDef* pStyleDef = GAMESTATE->GetCurrentStyleDef();
NoteData playerNoteData;
pStyleDef->GetTransformedNoteDataForStyle( pn_, &notedata, &playerNoteData );
iTotalPossibleDancePoints += this->GetPossibleDancePoints( &notedata );
/* Apply transforms to find out how the notes will really look.
*
* XXX: This is brittle: if we end up combining mods for a song differently
* than ScreenGameplay, we'll end up with the wrong data. We should probably
* have eg. GAMESTATE->GetOptionsForCourse(po,so,pn) to get options based on
* the last call to StoreSelectedOptions and the modifiers list, but that'd
* mean moving the queues in ScreenGameplay to GameState ... */
PlayerOptions ModsForThisSong( GAMESTATE->m_PlayerOptions[pn_] );
ModsForThisSong.FromString( asModifiers[i] );
NoteData playerNoteDataPostModifiers(playerNoteData);
NoteDataUtil::TransformNoteData( playerNoteData, ModsForThisSong, GAMESTATE->GetCurrentStyleDef()->m_StepsType );
iTotalPossibleDancePoints += this->GetPossibleDancePoints( playerNoteData, playerNoteDataPostModifiers );
}
GAMESTATE->m_CurStageStats.iPossibleDancePoints[pn_] = iTotalPossibleDancePoints;
@@ -411,12 +428,19 @@ void ScoreKeeperMAX2::HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tap
}
int ScoreKeeperMAX2::GetPossibleDancePoints( const NoteData* pNoteData )
int ScoreKeeperMAX2::GetPossibleDancePoints( const NoteData &preNoteData, const NoteData &postNoteData )
{
/* Note that, if Marvelous timing is disabled or not active (not course mode),
* PERFECT will be used instead. */
return pNoteData->GetNumRowsWithTaps()*TapNoteScoreToDancePoints(TNS_MARVELOUS)+
pNoteData->GetNumHoldNotes()*HoldNoteScoreToDancePoints(HNS_OK);
/*
* The logic here is that if you use a modifier that adds notes, you should have to
* hit the new notes to get a high grade. However, if you use one that removes notes,
* they should simply be counted as misses. */
int NumTaps = max( preNoteData.GetNumRowsWithTaps(), postNoteData.GetNumRowsWithTaps() );
int NumHolds = max( preNoteData.GetNumHoldNotes(), postNoteData.GetNumHoldNotes() );
return NumTaps*TapNoteScoreToDancePoints(TNS_MARVELOUS)+
NumHolds*HoldNoteScoreToDancePoints(HNS_OK);
}
+3 -2
View File
@@ -33,7 +33,7 @@ class ScoreKeeperMAX2: public ScoreKeeper
void AddScore( TapNoteScore score );
public:
ScoreKeeperMAX2( const vector<Steps*>& apNotes, PlayerNumber pn);
ScoreKeeperMAX2( const vector<Steps*>& apNotes, const CStringArray &asModifiers, PlayerNumber pn);
// before a song plays (called multiple times if course)
void OnNextSong( int iSongInCourseIndex, Steps* pNotes, NoteData* pNoteData );
@@ -41,9 +41,10 @@ public:
void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow, int iNumAdditions );
void HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore );
private:
int TapNoteScoreToDancePoints( TapNoteScore tns );
int HoldNoteScoreToDancePoints( HoldNoteScore hns );
int GetPossibleDancePoints( const NoteData* pNoteData );
int GetPossibleDancePoints( const NoteData &preNoteData, const NoteData &postNoteData );
};
#endif
+1 -1
View File
@@ -188,7 +188,7 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) : Screen("ScreenGameplay")
switch( PREFSMAN->m_iScoringType )
{
case PrefsManager::SCORING_MAX2:
m_pPrimaryScoreKeeper[p] = new ScoreKeeperMAX2( m_apNotesQueue[p], (PlayerNumber)p );
m_pPrimaryScoreKeeper[p] = new ScoreKeeperMAX2( m_apNotesQueue[p], m_asModifiersQueue[p], (PlayerNumber)p );
break;
case PrefsManager::SCORING_5TH:
m_pPrimaryScoreKeeper[p] = new ScoreKeeper5th( m_apNotesQueue[p], (PlayerNumber)p );