From 18d61edb5252c1bd140c58159d757a62c5ccb5ed Mon Sep 17 00:00:00 2001 From: Andrew Wong Date: Thu, 14 Aug 2003 19:46:22 +0000 Subject: [PATCH] fix percentages regarding oni mode fix crash in oni mode when using 5th mix scoring --- stepmania/src/ScoreKeeper5th.cpp | 39 +++++++++++++++++++++++------- stepmania/src/ScoreKeeper5th.h | 4 +-- stepmania/src/ScoreKeeperMAX2.cpp | 6 ++++- stepmania/src/ScreenEvaluation.cpp | 3 +++ stepmania/src/ScreenGameplay.cpp | 2 +- 5 files changed, 41 insertions(+), 13 deletions(-) diff --git a/stepmania/src/ScoreKeeper5th.cpp b/stepmania/src/ScoreKeeper5th.cpp index 03707a185a..4cff53ea2e 100644 --- a/stepmania/src/ScoreKeeper5th.cpp +++ b/stepmania/src/ScoreKeeper5th.cpp @@ -21,9 +21,10 @@ #include "UnlockSystem.h" #include "SDL_utils.h" #include "SongManager.h" +#include "NoteDataUtil.h" -ScoreKeeper5th::ScoreKeeper5th( const vector& apNotes_, PlayerNumber pn_ ): +ScoreKeeper5th::ScoreKeeper5th( const vector& apNotes_, const CStringArray &asModifiers, PlayerNumber pn_ ): ScoreKeeper(pn_), apNotes(apNotes_) { // @@ -32,15 +33,31 @@ ScoreKeeper5th::ScoreKeeper5th( const vector& apNotes_, PlayerNumber pn_ int iTotalPossibleDancePoints = 0; for( unsigned i=0; iGetNoteData( ¬edata ); + /* 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_, ¬edata, &playerNoteData ); - iTotalPossibleDancePoints += this->GetPossibleDancePoints( ¬edata ); + /* 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; @@ -433,19 +450,23 @@ void ScoreKeeper5th::HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapS } -int ScoreKeeper5th::GetPossibleDancePoints( const NoteData* pNoteData ) +int ScoreKeeper5th::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. */ - TapNoteScore maxPossibleTapScore = - (GAMESTATE->ShowMarvelous() ) ? TNS_MARVELOUS : TNS_PERFECT; - - return pNoteData->GetNumRowsWithTaps()*TapNoteScoreToDancePoints(maxPossibleTapScore)+ - 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); } + int ScoreKeeper5th::TapNoteScoreToDancePoints( TapNoteScore tns ) { if(!GAMESTATE->ShowMarvelous() && tns == TNS_MARVELOUS) diff --git a/stepmania/src/ScoreKeeper5th.h b/stepmania/src/ScoreKeeper5th.h index 9525e09e07..46ef3e41aa 100644 --- a/stepmania/src/ScoreKeeper5th.h +++ b/stepmania/src/ScoreKeeper5th.h @@ -34,7 +34,7 @@ class ScoreKeeper5th: public ScoreKeeper void AddScore( TapNoteScore score ); public: - ScoreKeeper5th( const vector& apNotes, PlayerNumber pn); + ScoreKeeper5th( const vector& apNotes_, const CStringArray &asModifiers, PlayerNumber pn_ ); // before a song plays (called multiple times if course) void OnNextSong( int iSongInCourseIndex, Steps* pNotes, NoteData* pNoteData ); @@ -44,7 +44,7 @@ public: int TapNoteScoreToDancePoints( TapNoteScore tns ); int HoldNoteScoreToDancePoints( HoldNoteScore hns ); - int GetPossibleDancePoints( const NoteData* pNoteData ); + int GetPossibleDancePoints( const NoteData &preNoteData, const NoteData &postNoteData ); }; #endif diff --git a/stepmania/src/ScoreKeeperMAX2.cpp b/stepmania/src/ScoreKeeperMAX2.cpp index 7547149fb2..014349aa7d 100644 --- a/stepmania/src/ScoreKeeperMAX2.cpp +++ b/stepmania/src/ScoreKeeperMAX2.cpp @@ -33,7 +33,11 @@ ScoreKeeperMAX2::ScoreKeeperMAX2( const vector& apNotes_, const CStringA int iTotalPossibleDancePoints = 0; for( unsigned i=0; iGetNoteData( ¬edata ); diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index 507fa14f31..9748c64268 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -826,6 +826,9 @@ void ScreenEvaluation::Update( float fDeltaTime ) if (GAMESTATE->m_CurStageStats.iBonus[p] == 0) continue; + if (GAMESTATE->IsCourseMode()) + continue; + // wait a few seconds before adding bonus if ( RageTimer::GetTimeSinceStart() - m_fScreenCreateTime < 1.5f) continue; diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 66d88068fe..494a14e0cc 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -191,7 +191,7 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) : Screen("ScreenGameplay") 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 ); + m_pPrimaryScoreKeeper[p] = new ScoreKeeper5th( m_apNotesQueue[p], m_asModifiersQueue[p], (PlayerNumber)p ); break; default: ASSERT(0); }