diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index 0a28e3d6e5..ce1299c456 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -4043,10 +4043,11 @@ Rate,15=mod,1.7xmusic;name,1.7x Rate,16=mod,1.8xmusic;name,1.8x Rate,17=mod,1.9xmusic;name,1.9x Rate,18=mod,2.0xmusic;name,2.0x -AutoAdjust=2;together +AutoAdjust=3;together AutoAdjustDefault= AutoAdjust,1=mod,no autosync;name,Off -AutoAdjust,2=mod,autosync;name,On +AutoAdjust,2=mod,autosyncsong;name,Sync Song +AutoAdjust,3=mod,autosyncmachine;name,Sync Machine SaveScores=2;together SaveScoresDefault= SaveScores,1=mod,no savescore;name,Off diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index 529298cd61..92ae9084d0 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -1008,21 +1008,36 @@ void Player::HandleStep( int col, const RageTimer &tm, bool bHeld ) void Player::HandleAutosync(float fNoteOffset) { - if( !GAMESTATE->m_SongOptions.m_bAutoSync ) + if( GAMESTATE->m_SongOptions.m_AutosyncType == SongOptions::AUTOSYNC_OFF ) return; m_fOffset[m_iOffsetSample++] = fNoteOffset; - if (m_iOffsetSample < SAMPLE_COUNT) + if( m_iOffsetSample < SAMPLE_COUNT ) return; /* need more */ - const float mean = calc_mean(m_fOffset, m_fOffset+SAMPLE_COUNT); - const float stddev = calc_stddev(m_fOffset, m_fOffset+SAMPLE_COUNT); + const float mean = calc_mean( m_fOffset, m_fOffset+SAMPLE_COUNT ); + const float stddev = calc_stddev( m_fOffset, m_fOffset+SAMPLE_COUNT ); + + if( stddev < .03 && stddev < fabsf(mean) ) // If they stepped with less than .03 error + { + switch( GAMESTATE->m_SongOptions.m_AutosyncType ) + { + case SongOptions::AUTOSYNC_SONG: + GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds += mean; + break; + case SongOptions::AUTOSYNC_MACHINE: + PREFSMAN->m_fGlobalOffsetSeconds = PREFSMAN->m_fGlobalOffsetSeconds + mean; + break; + default: + ASSERT(0); + } - if (stddev < .03 && stddev < fabsf(mean)) { //If they stepped with less than .03 error - GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds += mean; LOG->Trace("Offset corrected by %f. Error in steps: %f seconds.", mean, stddev); - } else + } + else + { LOG->Trace("Offset NOT corrected. Average offset: %f seconds. Error: %f seconds.", mean, stddev); + } m_iOffsetSample = 0; } diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index e396ada40b..352e4b55d1 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -205,7 +205,7 @@ void ScreenGameplay::Init() } } - m_bChangedOffsetOrBPM = GAMESTATE->m_SongOptions.m_bAutoSync; + m_bChangedOffsetOrBPM = GAMESTATE->m_SongOptions.m_AutosyncType == SongOptions::AUTOSYNC_SONG; m_DancingState = STATE_INTRO; @@ -1800,9 +1800,20 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ this->HandleScreenMessage( SM_NotesEnded ); break; case KEY_F6: - m_bChangedOffsetOrBPM = true; - GAMESTATE->m_SongOptions.m_bAutoSync = !GAMESTATE->m_SongOptions.m_bAutoSync; // toggle - UpdateAutoPlayText(); + { + bool bHoldingShift = + INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT)) || + INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT)); + + // toggle + if( GAMESTATE->m_SongOptions.m_AutosyncType != SongOptions::AUTOSYNC_OFF ) + GAMESTATE->m_SongOptions.m_AutosyncType = SongOptions::AUTOSYNC_OFF; + else + GAMESTATE->m_SongOptions.m_AutosyncType = bHoldingShift ? SongOptions::AUTOSYNC_MACHINE : SongOptions::AUTOSYNC_SONG; + + m_bChangedOffsetOrBPM |= !bHoldingShift; + UpdateAutoPlayText(); + } break; case KEY_F7: GAMESTATE->m_SongOptions.m_bAssistTick ^= 1; @@ -1934,8 +1945,13 @@ void ScreenGameplay::UpdateAutoPlayText() if( PREFSMAN->m_bAutoPlay ) sText += "AutoPlay "; - if( GAMESTATE->m_SongOptions.m_bAutoSync ) - sText += "AutoSync "; + switch( GAMESTATE->m_SongOptions.m_AutosyncType ) + { + case SongOptions::AUTOSYNC_OFF: break; + case SongOptions::AUTOSYNC_SONG: sText += "AutosyncSong "; break; + case SongOptions::AUTOSYNC_MACHINE: sText += "AutosyncMachine "; break; + default: ASSERT(0); + } if( sText.length() > 0 ) sText.resize( sText.length()-5 ); diff --git a/stepmania/src/SongOptions.cpp b/stepmania/src/SongOptions.cpp index 267f8e4df6..d0fdd8c205 100644 --- a/stepmania/src/SongOptions.cpp +++ b/stepmania/src/SongOptions.cpp @@ -11,7 +11,7 @@ void SongOptions::Init() m_FailType = FAIL_IMMEDIATE; m_bAssistTick = false; m_fMusicRate = 1.0f; - m_bAutoSync = false; + m_AutosyncType = AUTOSYNC_OFF; m_bSaveScore = true; } @@ -32,6 +32,7 @@ CString SongOptions::GetString() const case LIFE_BATTERY: sReturn += ssprintf( "%dLives, ", m_iBatteryLives ); break; + default: ASSERT(0); } @@ -41,6 +42,7 @@ CString SongOptions::GetString() const case FAIL_COMBO_OF_30_MISSES: sReturn += "Fail30Misses, "; break; case FAIL_END_OF_SONG: sReturn += "FailEndOfSong, "; break; case FAIL_OFF: sReturn += "FailOff, "; break; + default: ASSERT(0); } if( m_fMusicRate != 1 ) @@ -51,8 +53,13 @@ CString SongOptions::GetString() const sReturn += s + "xMusic, "; } - if( m_bAutoSync ) - sReturn += "AutoSync, "; + switch( m_AutosyncType ) + { + case AUTOSYNC_OFF: break; + case AUTOSYNC_SONG: sReturn += "AutosyncSong, "; break; + case AUTOSYNC_MACHINE: sReturn += "AutosyncMachine, "; break; + default: ASSERT(0); + } if( sReturn.GetLength() > 2 ) sReturn.erase( sReturn.GetLength()-2 ); // delete the trailing ", " @@ -122,7 +129,10 @@ void SongOptions::FromString( CString sOptions ) } else if( sBit == "assisttick" ) m_bAssistTick = on; - else if( sBit == "autosync" ) m_bAutoSync = on; + else if( sBit == "autosync" || sBit == "autosyncsong" ) + m_AutosyncType = on ? AUTOSYNC_SONG : AUTOSYNC_OFF; + else if( sBit == "autosyncmachine" ) + m_AutosyncType = on ? AUTOSYNC_MACHINE : AUTOSYNC_OFF; else if( sBit == "savescore" ) m_bSaveScore = on; else if( sBit == "bar" ) m_LifeType = LIFE_BAR; else if( sBit == "battery" ) m_LifeType = LIFE_BATTERY; @@ -138,7 +148,7 @@ bool SongOptions::operator==( const SongOptions &other ) const COMPARE( m_FailType ); COMPARE( m_fMusicRate ); COMPARE( m_bAssistTick ); - COMPARE( m_bAutoSync ); + COMPARE( m_AutosyncType ); COMPARE( m_bSaveScore ); #undef COMPARE return true; diff --git a/stepmania/src/SongOptions.h b/stepmania/src/SongOptions.h index 05ee7f6f26..e114bc405f 100644 --- a/stepmania/src/SongOptions.h +++ b/stepmania/src/SongOptions.h @@ -17,7 +17,14 @@ struct SongOptions FAIL_OFF }; // never fail FailType m_FailType; float m_fMusicRate; - bool m_bAssistTick, m_bAutoSync, m_bSaveScore; + bool m_bAssistTick; + enum AutosyncType { + AUTOSYNC_OFF, + AUTOSYNC_SONG, + AUTOSYNC_MACHINE + }; + AutosyncType m_AutosyncType; + bool m_bSaveScore; SongOptions() { Init(); }; void Init();