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);
}