diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 5a5736cce8..078d4a7748 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -103,6 +103,7 @@ PlayerInfo::PlayerInfo() m_mp = MultiPlayer_Invalid; m_bIsDummy = false; m_iDummyIndex = 0; + m_difficultyForced = Difficulty_Invalid; m_pLifeMeter = NULL; m_ptextCourseSongNumber = NULL; m_ptextStepsDescription = NULL; @@ -117,7 +118,7 @@ PlayerInfo::PlayerInfo() m_pDifficultyIcon = NULL; } -void PlayerInfo::Load( PlayerNumber pn, MultiPlayer mp, bool bShowNoteField ) +void PlayerInfo::Load( PlayerNumber pn, MultiPlayer mp, bool bShowNoteField, Difficulty dcForced ) { m_pn = pn; m_mp = mp; @@ -190,12 +191,13 @@ void PlayerInfo::Load( PlayerNumber pn, MultiPlayer mp, bool bShowNoteField ) } } -void PlayerInfo::LoadDummyP1( int iDummyIndex ) +void PlayerInfo::LoadDummyP1( int iDummyIndex, Difficulty dcForced ) { m_pn = PLAYER_1; m_bPlayerEnabled = IsEnabled(); m_bIsDummy = true; m_iDummyIndex = iDummyIndex; + m_difficultyForced = dcForced; // don't init any of the scoring objects m_pPlayer = new Player( m_NoteData, true ); @@ -236,11 +238,10 @@ PlayerState *PlayerInfo::GetPlayerState() PlayerStageStats *PlayerInfo::GetPlayerStageStats() { - if( m_bIsDummy ) + // multiplayer chooses the PlayerStageStats with the highest score on StageFinalized + if( m_bIsDummy || IsMultiPlayer() ) return &m_PlayerStageStatsDummy; - return IsMultiPlayer() ? - &STATSMAN->m_CurStageStats.m_multiPlayer[ GetPlayerStateAndStageStatsIndex() ] : - &STATSMAN->m_CurStageStats.m_player[ GetPlayerStateAndStageStatsIndex() ]; + return &STATSMAN->m_CurStageStats.m_player[ GetPlayerStateAndStageStatsIndex() ]; } bool PlayerInfo::IsEnabled() @@ -885,22 +886,9 @@ void ScreenGameplay::SetupSong( int iSongIndex ) * once in Player::Load, then again in Player::ApplyActiveAttacks. This * is very bad for transforms like AddMines. */ + if( pi->m_difficultyForced != Difficulty_Invalid ) + pSteps = SongUtil::GetOneSteps( GAMESTATE->m_pCurSong, pSteps->m_StepsType, pi->m_difficultyForced ); NoteData originalNoteData; - if( pi->m_bIsDummy ) - { - switch( pi->m_iDummyIndex ) - { - //case 0: - // pSteps = SongUtil::GetOneSteps( GAMESTATE->m_pCurSong, pSteps->m_StepsType, Difficulty_Easy ); - // break; - case 1: - pSteps = SongUtil::GetOneSteps( GAMESTATE->m_pCurSong, pSteps->m_StepsType, Difficulty_Medium ); - break; - case 2: - pSteps = SongUtil::GetOneSteps( GAMESTATE->m_pCurSong, pSteps->m_StepsType, Difficulty_Hard ); - break; - } - } pSteps->GetNoteData( originalNoteData ); const Style* pStyle = GAMESTATE->GetCurrentStyle(); @@ -2185,8 +2173,14 @@ void ScreenGameplay::Input( const InputEventPlus &input ) if( GAMESTATE->m_bMultiplayer ) { - if( input.mp != MultiPlayer_Invalid && GAMESTATE->IsMultiPlayerEnabled(input.mp) ) - m_vPlayerInfo[input.mp].m_pPlayer->Step( iCol, -1, input.DeviceI.ts, false, bRelease ); + if( input.mp != MultiPlayer_Invalid && GAMESTATE->IsMultiPlayerEnabled(input.mp) && iCol != -1 ) + { + FOREACH( PlayerInfo, m_vPlayerInfo, pi ) + { + if( input.mp == pi->m_mp ) + pi->m_pPlayer->Step( iCol, -1, input.DeviceI.ts, false, bRelease ); + } + } } else { @@ -2506,7 +2500,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) else if( SM == SM_DoPrevScreen ) { SongFinished(); - StageFinished( true ); + this->StageFinished( true ); m_sNextScreen = GetPrevScreen(); @@ -2518,7 +2512,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) else if( SM == SM_DoNextScreen ) { SongFinished(); - StageFinished( false ); + this->StageFinished( false ); //SaveReplay(); if( AdjustSync::IsSyncDataChanged() ) diff --git a/stepmania/src/ScreenGameplay.h b/stepmania/src/ScreenGameplay.h index af773f833e..16f664bf51 100644 --- a/stepmania/src/ScreenGameplay.h +++ b/stepmania/src/ScreenGameplay.h @@ -43,8 +43,8 @@ public: PlayerInfo(); ~PlayerInfo(); - void Load( PlayerNumber pn, MultiPlayer mp, bool bShowNoteField ); - void LoadDummyP1( int iDummyIndex ); + void Load( PlayerNumber pn, MultiPlayer mp, bool bShowNoteField, Difficulty dcForced ); + void LoadDummyP1( int iDummyIndex, Difficulty dcForced ); void ShowOniGameOver(); MultiPlayer GetPlayerStateAndStageStatsIndex() { return m_pn == PLAYER_INVALID ? m_mp : (MultiPlayer)m_pn; } @@ -72,6 +72,7 @@ public: MultiPlayer m_mp; bool m_bIsDummy; int m_iDummyIndex; + Difficulty m_difficultyForced; // force use of Steps with this Difficulty bool m_bPlayerEnabled; // IsEnabled cache for iterators PlayerState m_PlayerStateDummy; PlayerStageStats m_PlayerStageStatsDummy; @@ -171,7 +172,7 @@ protected: void UpdateLyrics( float fDeltaTime ); void SongFinished(); virtual void SaveStats(); - void StageFinished( bool bBackedOut ); + virtual void StageFinished( bool bBackedOut ); void SaveReplay(); bool AllAreFailing(); diff --git a/stepmania/src/ScreenGameplayNormal.cpp b/stepmania/src/ScreenGameplayNormal.cpp index c46d306537..02bb2a6611 100644 --- a/stepmania/src/ScreenGameplayNormal.cpp +++ b/stepmania/src/ScreenGameplayNormal.cpp @@ -8,7 +8,7 @@ void ScreenGameplayNormal::FillPlayerInfo( vector &vPlayerInfoOut ) { vPlayerInfoOut.resize( NUM_PLAYERS ); FOREACH_PlayerNumber( p ) - vPlayerInfoOut[p].Load( p, MultiPlayer_Invalid, true ); + vPlayerInfoOut[p].Load( p, MultiPlayer_Invalid, true, Difficulty_Invalid ); }; // lua end