void ScoreKeeperNormal::Load( const vector<Song*>& apSongs, const vector<Steps*>& apSteps, const vector<AttackArray> &asModifiers ) { m_apSteps = apSteps; ASSERT( apSongs.size() == apSteps.size() ); ASSERT( apSongs.size() == asModifiers.size() ); // True if a jump is one to combo, false if combo is purely based on tap count. m_ComboIsPerRow.Load( "Gameplay", "ComboIsPerRow" ); m_MissComboIsPerRow.Load( "Gameplay", "MissComboIsPerRow" ); m_MinScoreToContinueCombo.Load( "Gameplay", "MinScoreToContinueCombo" ); m_MinScoreToMaintainCombo.Load( "Gameplay", "MinScoreToMaintainCombo" ); m_MaxScoreToIncrementMissCombo.Load( "Gameplay", "MaxScoreToIncrementMissCombo" ); m_MineHitIncrementsMissCombo.Load( "Gameplay", "MineHitIncrementsMissCombo" ); m_AvoidMineIncrementsCombo.Load( "Gameplay", "AvoidMineIncrementsCombo" ); m_UseInternalScoring.Load( "Gameplay", "UseInternalScoring" ); // This can be a function or a number, the type is checked when needed. // -Kyz m_toasty_trigger.Load("Gameplay", "ToastyTriggersAt"); m_toasty_min_tns.Load("Gameplay", "ToastyMinTNS"); // Fill in STATSMAN->m_CurStageStats, calculate multiplier int iTotalPossibleDancePoints = 0; int iTotalPossibleGradePoints = 0; for( unsigned i=0; i<apSteps.size(); i++ ) { Song* pSong = apSongs[i]; ASSERT( pSong != NULL ); Steps* pSteps = apSteps[i]; ASSERT( pSteps != NULL ); const AttackArray &aa = asModifiers[i]; NoteData ndTemp; pSteps->GetNoteData( ndTemp ); // We might have been given lots of songs; don't keep them in memory uncompressed. pSteps->Compress(); const Style* pStyle = GAMESTATE->GetCurrentStyle(m_pPlayerState->m_PlayerNumber); NoteData ndPre; pStyle->GetTransformedNoteDataForStyle( m_pPlayerState->m_PlayerNumber, ndTemp, ndPre ); /* Compute RadarValues before applying any user-selected mods. Apply * Course mods and count them in the "pre" RadarValues because they're * forced and not chosen by the user. */ NoteDataUtil::TransformNoteData(ndPre, *(pSteps->GetTimingData()), aa, pSteps->m_StepsType, pSong ); /* Apply user 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 ... */ NoteData ndPost = ndPre; NoteDataUtil::TransformNoteData(ndPost, *(pSteps->GetTimingData()), m_pPlayerState->m_PlayerOptions.GetStage(), pSteps->m_StepsType); GAMESTATE->SetProcessedTimingData(pSteps->GetTimingData()); // XXX: Not sure why but NoteDataUtil::CalculateRadarValues segfaults without this iTotalPossibleDancePoints += this->GetPossibleDancePoints( &ndPre, &ndPost, pSteps->GetTimingData(), pSong->m_fMusicLengthSeconds ); iTotalPossibleGradePoints += this->GetPossibleGradePoints( &ndPre, &ndPost, pSteps->GetTimingData(), pSong->m_fMusicLengthSeconds ); GAMESTATE->SetProcessedTimingData(NULL); } m_pPlayerStageStats->m_iPossibleDancePoints = iTotalPossibleDancePoints; m_pPlayerStageStats->m_iPossibleGradePoints = iTotalPossibleGradePoints; m_iScoreRemainder = 0; m_cur_toasty_combo = 0; m_cur_toasty_level= 0; // Initialize m_next_toasty_at to 0 so that CalcNextToastyAt just needs to // add the value. -Kyz m_next_toasty_at= 0; m_next_toasty_at= CalcNextToastyAt(m_cur_toasty_level); m_iMaxScoreSoFar = 0; m_iPointBonus = 0; m_iNumTapsAndHolds = 0; m_iNumNotesHitThisRow = 0; m_bIsLastSongInCourse = false; Message msg( "ScoreChanged" ); msg.SetParam( "PlayerNumber", m_pPlayerState->m_PlayerNumber ); msg.SetParam( "MultiPlayer", m_pPlayerState->m_mp ); MESSAGEMAN->Broadcast( msg ); memset( m_ComboBonusFactor, 0, sizeof(m_ComboBonusFactor) ); m_iRoundTo = 1; }
void ScoreKeeperMAX2::Load( const vector<Song*>& apSongs, const vector<Steps*>& apSteps, const vector<AttackArray> &asModifiers ) { m_apSteps = apSteps; ASSERT( apSongs.size() == apSteps.size() ); ASSERT( apSongs.size() == asModifiers.size() ); /* True if a jump is one to combo, false if combo is purely based on tap count. */ m_bComboIsPerRow = THEME->GetMetricB( "Gameplay", "ComboIsPerRow" ); m_MinScoreToContinueCombo = (TapNoteScore) THEME->GetMetricI( "Gameplay", "MinScoreToContinueCombo" ); m_MinScoreToMaintainCombo = (TapNoteScore) THEME->GetMetricI( "Gameplay", "MinScoreToMaintainCombo" ); // // Fill in STATSMAN->m_CurStageStats, calculate multiplier // int iTotalPossibleDancePoints = 0; int iTotalPossibleGradePoints = 0; for( unsigned i=0; i<apSteps.size(); i++ ) { Song* pSong = apSongs[i]; ASSERT( pSong ); Steps* pSteps = apSteps[i]; ASSERT( pSteps ); const AttackArray &aa = asModifiers[i]; NoteData ndTemp; pSteps->GetNoteData( ndTemp ); /* We might have been given lots of songs; don't keep them in memory uncompressed. */ pSteps->Compress(); const Style* pStyle = GAMESTATE->GetCurrentStyle(); NoteData nd; pStyle->GetTransformedNoteDataForStyle( m_pPlayerState->m_PlayerNumber, ndTemp, nd ); /* Compute RadarValues before applying any user-selected mods. Apply * Course mods and count them in the "pre" RadarValues because they're * forced and not chosen by the user. */ NoteDataUtil::TransformNoteData( nd, aa, pSteps->m_StepsType, pSong ); RadarValues rvPre; NoteDataUtil::CalculateRadarValues( nd, pSong->m_fMusicLengthSeconds, rvPre ); /* Apply user 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 ... */ NoteDataUtil::TransformNoteData( nd, m_pPlayerState->m_PlayerOptions, pSteps->m_StepsType ); RadarValues rvPost; NoteDataUtil::CalculateRadarValues( nd, pSong->m_fMusicLengthSeconds, rvPost ); iTotalPossibleDancePoints += this->GetPossibleDancePoints( rvPre, rvPost ); iTotalPossibleGradePoints += this->GetPossibleGradePoints( rvPre, rvPost ); } m_pPlayerStageStats->iPossibleDancePoints = iTotalPossibleDancePoints; m_pPlayerStageStats->iPossibleGradePoints = iTotalPossibleGradePoints; m_iScoreRemainder = 0; m_iCurToastyCombo = 0; m_iMaxScoreSoFar = 0; m_iPointBonus = 0; m_iNumTapsAndHolds = 0; m_bIsLastSongInCourse = false; memset( m_ComboBonusFactor, 0, sizeof(m_ComboBonusFactor) ); switch( PREFSMAN->m_ScoringType ) { case PrefsManager::SCORING_MAX2: m_iRoundTo = 1; break; case PrefsManager::SCORING_5TH: m_iRoundTo = 5; if (!GAMESTATE->IsCourseMode()) { m_ComboBonusFactor[TNS_MARVELOUS] = 55; m_ComboBonusFactor[TNS_PERFECT] = 55; m_ComboBonusFactor[TNS_GREAT] = 33; } break; default: ASSERT(0); } }