diff --git a/stepmania/Themes/default/Languages/en.ini b/stepmania/Themes/default/Languages/en.ini index 5df07b42f5..f9182af604 100644 --- a/stepmania/Themes/default/Languages/en.ini +++ b/stepmania/Themes/default/Languages/en.ini @@ -358,6 +358,7 @@ OsMountPlayer2= Persp=Persp Player1Profile= Player2Profile= +PlayerAutoPlay=PlayerAutoPlay PreloadSounds=If YES, preload most sounds in advance. This increases load times, and should normally be left OFF. Premium=Premium Profile= @@ -824,6 +825,7 @@ Play mods from course=Play mods from course Play selection=Play selection Player1Profile=Player1 Profile Player2Profile=Player2 Profile +PlayerAutoPlay=Player AutoPlay Predicted Meter=Predicted Meter Preferences=Preferences PreloadSounds=Preload Sounds diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index 90d8e640e9..46360414db 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -3468,7 +3468,7 @@ NextScreen=ScreenPlayerOptionsNext() PlayMusic=false TimerSeconds=30 ShowStyleIcon=false -LineNames="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16" +LineNames="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17" Line1="list,Speed" Line2="list,Accel" Line3="list,Effect" @@ -3480,11 +3480,12 @@ Line8="list,NoteSkins" Line9="list,Holds" Line10="list,Mines" Line11="list,Attacks" -Line12="list,Hide" -Line13="list,Persp" -Line14="list,ScoreDisplay" -Line15="list,Steps" -Line16="list,Characters" +Line12="list,PlayerAutoPlay" +Line13="list,Hide" +Line14="list,Persp" +Line15="list,ScoreDisplay" +Line16="list,Steps" +Line17="list,Characters" [ScreenRaveOptions] Fallback="ScreenOptions" @@ -3689,6 +3690,10 @@ AttacksDefault="mod,no randomattacks,no songattacks" Attacks,1="name,Off" Attacks,2="mod,randomattacks;name,RandomAttacks" Attacks,3="mod,songattacks;name,SongAttacks" +PlayerAutoPlay="2" +PlayerAutoPlayDefault="mod,no playerautoplay" +PlayerAutoPlay,1="name,Off" +PlayerAutoPlay,2="mod,playerautoplay;name,On" Hide="3" HideDefault="mod,no dark,no blind" Hide,1="name,Off" diff --git a/stepmania/src/PlayerOptions.cpp b/stepmania/src/PlayerOptions.cpp index 4257aabaec..44e2099ca1 100644 --- a/stepmania/src/PlayerOptions.cpp +++ b/stepmania/src/PlayerOptions.cpp @@ -29,6 +29,7 @@ void PlayerOptions::Init() m_fCover = 0; m_SpeedfCover = 1.0f; m_fRandAttack = 0; m_SpeedfRandAttack = 1.0f; m_fSongAttack = 0; m_SpeedfSongAttack = 1.0f; + m_fPlayerAutoPlay = 0; m_SpeedfPlayerAutoPlay = 1.0f; m_bSetTiltOrSkew = false; m_fPerspectiveTilt = 0; m_SpeedfPerspectiveTilt = 1.0f; m_fSkew = 0; m_SpeedfSkew = 1.0f; @@ -65,6 +66,7 @@ void PlayerOptions::Approach( const PlayerOptions& other, float fDeltaSeconds ) APPROACH( fCover ); APPROACH( fRandAttack ); APPROACH( fSongAttack ); + APPROACH( fPlayerAutoPlay ); APPROACH( fPerspectiveTilt ); APPROACH( fSkew ); APPROACH( fPassmark ); @@ -167,8 +169,9 @@ void PlayerOptions::GetMods( vector &AddTo, bool bForceNoteSkin ) const AddPart( AddTo, m_fBlind, "Blind" ); AddPart( AddTo, m_fCover, "Cover" ); - AddPart( AddTo, m_fRandAttack, "RandomAttacks" ); - AddPart( AddTo, m_fSongAttack, "SongAttacks" ); + AddPart( AddTo, m_fRandAttack, "RandomAttacks" ); + AddPart( AddTo, m_fSongAttack, "SongAttacks" ); + AddPart( AddTo, m_fPlayerAutoPlay, "PlayerAutoPlay" ); AddPart( AddTo, m_fPassmark, "Passmark" ); @@ -384,6 +387,7 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut else if( sBit == "cover" ) SET_FLOAT( fCover ) else if( sBit == "randomattacks" ) SET_FLOAT( fRandAttack ) else if( sBit == "songattacks" ) SET_FLOAT( fSongAttack ) + else if( sBit == "playerautoplay" ) SET_FLOAT( fPlayerAutoPlay ) else if( sBit == "passmark" ) SET_FLOAT( fPassmark ) else if( sBit == "overhead" ) { m_bSetTiltOrSkew = true; m_fSkew = 0; m_fPerspectiveTilt = 0; m_SpeedfSkew = m_SpeedfPerspectiveTilt = speed; } else if( sBit == "incoming" ) { m_bSetTiltOrSkew = true; m_fSkew = level; m_fPerspectiveTilt = -level; m_SpeedfSkew = m_SpeedfPerspectiveTilt = speed; } @@ -624,6 +628,7 @@ bool PlayerOptions::operator==( const PlayerOptions &other ) const COMPARE(m_fCover); COMPARE(m_fRandAttack); COMPARE(m_fSongAttack); + COMPARE(m_fPlayerAutoPlay); COMPARE(m_fPerspectiveTilt); COMPARE(m_fSkew); COMPARE(m_sNoteSkin); @@ -674,6 +679,7 @@ bool PlayerOptions::IsEasierForSongAndSteps( Song* pSong, Steps* pSteps, PlayerN if( m_bTransforms[TRANSFORM_ECHO] ) return true; if( m_fCover ) return true; + if( m_fPlayerAutoPlay ) return true; return false; } diff --git a/stepmania/src/PlayerOptions.h b/stepmania/src/PlayerOptions.h index f42d06c028..0fbf386689 100644 --- a/stepmania/src/PlayerOptions.h +++ b/stepmania/src/PlayerOptions.h @@ -135,6 +135,7 @@ public: float m_fCover, m_SpeedfCover; // hide the background per-player--can't think of a good name float m_fRandAttack, m_SpeedfRandAttack; float m_fSongAttack, m_SpeedfSongAttack; + float m_fPlayerAutoPlay, m_SpeedfPlayerAutoPlay; bool m_bSetTiltOrSkew; // true if the tilt or skew was set by FromString float m_fPerspectiveTilt, m_SpeedfPerspectiveTilt; // -1 = near, 0 = overhead, +1 = space float m_fSkew, m_SpeedfSkew; // 0 = vanish point is in center of player, 1 = vanish point is in center of screen diff --git a/stepmania/src/ScoreKeeperNormal.cpp b/stepmania/src/ScoreKeeperNormal.cpp index 823ea57977..45a10c448e 100644 --- a/stepmania/src/ScoreKeeperNormal.cpp +++ b/stepmania/src/ScoreKeeperNormal.cpp @@ -654,7 +654,8 @@ void ScoreKeeperNormal::HandleTapRowScore( const NoteData &nd, int iRow ) // handle combo logic // #ifndef DEBUG - if( GamePreferences::m_AutoPlay != PC_HUMAN && !GAMESTATE->m_bDemonstrationOrJukebox ) // cheaters never prosper + if( (GamePreferences::m_AutoPlay != PC_HUMAN || m_pPlayerState->m_PlayerOptions.GetCurrent().m_fPlayerAutoPlay != 0) + && !GAMESTATE->m_bDemonstrationOrJukebox ) // cheaters never prosper { m_iCurToastyCombo = 0; return; diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index 7fb33fb144..dbd3ccd3d0 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -2084,7 +2084,7 @@ void ScreenEdit::InputPlay( const InputEventPlus &input, EditButton EditB ) GameButtonType gbt = GAMESTATE->m_pCurGame->GetPerButtonInfo(input.GameI.button)->m_gbt; - if( GamePreferences::m_AutoPlay == PC_HUMAN ) + if( GamePreferences::m_AutoPlay == PC_HUMAN && GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetCurrent().m_fPlayerAutoPlay == 0 ) { const int iCol = GAMESTATE->GetCurrentStyle()->GameInputToColumn( input.GameI ); bool bRelease = input.type == IET_RELEASE; @@ -2291,7 +2291,11 @@ m_pSoundMusic->StopPlaying(); SetupCourseAttacks(); m_Player.Load( m_NoteDataEdit ); - GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerController = GamePreferences::m_AutoPlay; + + if( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetCurrent().m_fPlayerAutoPlay != 0 ) + GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerController = PC_AUTOPLAY; + else + GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerController = GamePreferences::m_AutoPlay; if( g_bEditorShowBGChangesPlay ) { diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 2ed678988f..dbcbee9812 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -1113,7 +1113,10 @@ void ScreenGameplay::LoadNextSong() } else { - pi->GetPlayerState()->m_PlayerController = GamePreferences::m_AutoPlay; + if( pi->GetPlayerState()->m_PlayerOptions.GetCurrent().m_fPlayerAutoPlay != 0 ) + pi->GetPlayerState()->m_PlayerController = PC_AUTOPLAY; + else + pi->GetPlayerState()->m_PlayerController = GamePreferences::m_AutoPlay; } } } @@ -2238,7 +2241,7 @@ void ScreenGameplay::Input( const InputEventPlus &input ) { AbortGiveUp( true ); - if( GamePreferences::m_AutoPlay == PC_HUMAN ) + if( GamePreferences::m_AutoPlay == PC_HUMAN && GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetCurrent().m_fPlayerAutoPlay == 0 ) { PlayerInfo& pi = GetPlayerInfoForInput( input ); diff --git a/stepmania/src/ScreenGameplayLesson.cpp b/stepmania/src/ScreenGameplayLesson.cpp index a2a66e82a9..778fc1226e 100644 --- a/stepmania/src/ScreenGameplayLesson.cpp +++ b/stepmania/src/ScreenGameplayLesson.cpp @@ -167,7 +167,15 @@ void ScreenGameplayLesson::ChangeLessonPage( int iDir ) // Change back to the current autoplay setting (in most cases, human controlled). FOREACH_EnabledPlayerInfo( m_vPlayerInfo, pi ) - pi->GetPlayerState()->m_PlayerController = GamePreferences::m_AutoPlay; + { + /* Mike: I'm not sure if you can actually have the player options enabled in this mode, + * but I'm putting the check here anyways to play it safe. If it's unnecessary, then it + * should be removed. */ + if( pi->GetPlayerState()->m_PlayerOptions.GetCurrent().m_fPlayerAutoPlay != 0 ) + pi->GetPlayerState()->m_PlayerController = PC_AUTOPLAY; + else + pi->GetPlayerState()->m_PlayerController = GamePreferences::m_AutoPlay; + } } else {