From 350ebdaeecfae17bfac4e46b2ce111dcd9ed803f Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sat, 2 Apr 2005 21:59:27 +0000 Subject: [PATCH] block changes that insert a beat past the end --- stepmania/src/ScreenEdit.cpp | 48 ++++++++++++++++++++++++++---------- stepmania/src/ScreenEdit.h | 3 ++- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index 28cf4b0575..135fa2ef8c 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -969,7 +969,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ const float fOriginalBeat = GAMESTATE->m_fSongBeat; float fDestinationBeat = GAMESTATE->m_fSongBeat + fBeatsToMove; fDestinationBeat = Quantize( fDestinationBeat, NoteTypeToBeat(m_SnapDisplay.GetNoteType()) ); - CLAMP( fDestinationBeat, 0, GetMaximumBeat() ); + CLAMP( fDestinationBeat, 0, GetMaximumBeatForMoving() ); GAMESTATE->m_fSongBeat = fDestinationBeat; @@ -2093,12 +2093,8 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, const vector &iAns default: ASSERT(0); } - - int iRowsToCopy = m_Clipboard.GetLastRow()+1; - // Don't allow pasting past the maximum row - int iMaxRow = (GetMaximumBeat() == FLT_MAX) ? INT_MAX : BeatToNoteRow(GetMaximumBeat()); - CLAMP( iRowsToCopy, 0, iMaxRow - iDestFirstRow + 1 ); + int iRowsToCopy = m_Clipboard.GetLastRow()+1; m_NoteDataEdit.CopyRange( m_Clipboard, 0, iRowsToCopy, iDestFirstRow ); } break; @@ -2621,9 +2617,28 @@ void ScreenEdit::CheckNumberOfNotesAndUndo() return; } } + + if( GAMESTATE->m_pCurSteps[0]->IsAnEdit() ) + { + // Check that the action didn't push notes any farther past the last measure. + // This blocks Insert Beat from pushing past the end, but allows Delete Beat + // to pull back the notes that are already past the end. + float fNewLastBeat = m_NoteDataEdit.GetLastBeat(); + bool bLastBeatIncreased = fNewLastBeat > m_Undo.GetLastBeat(); + bool bPassedTheEnd = fNewLastBeat > GetMaximumBeatForNewNote(); + if( bLastBeatIncreased && bPassedTheEnd ) + { + Undo(); + CString sError = ssprintf( + "This change creates notes past the end of the music and is not allowed.\n\nThe change has been reverted.", + MAX_NOTES_PER_MEASURE, MAX_NOTES_PER_MEASURE ); + SCREENMAN->Prompt( SM_None, sError ); + return; + } + } } -float ScreenEdit::GetMaximumBeat() const +float ScreenEdit::GetMaximumBeatForNewNote() const { if( GAMESTATE->m_pCurSteps[0]->IsAnEdit() ) { @@ -2635,12 +2650,6 @@ float ScreenEdit::GetMaximumBeat() const fEndBeat += BEATS_PER_MEASURE; fEndBeat = ftruncf( fEndBeat, (float)BEATS_PER_MEASURE ); - // Jump to GetLastBeat even if it's past m_pCurSong->m_fLastBeat - // so that users can delete garbage steps past then end that they have - // have inserted in a text editor. Once they delete all steps on - // GetLastBeat() and move off of that beat, they won't be able to return. - fEndBeat = max( fEndBeat, GAMESTATE->m_pCurSong->m_fLastBeat ); - return fEndBeat; } else @@ -2649,6 +2658,19 @@ float ScreenEdit::GetMaximumBeat() const } } +float ScreenEdit::GetMaximumBeatForMoving() const +{ + float fEndBeat = GetMaximumBeatForNewNote(); + + // Jump to GetLastBeat even if it's past m_pCurSong->m_fLastBeat + // so that users can delete garbage steps past then end that they have + // have inserted in a text editor. Once they delete all steps on + // GetLastBeat() and move off of that beat, they won't be able to return. + fEndBeat = max( fEndBeat, m_NoteDataEdit.GetLastBeat() ); + + return fEndBeat; +} + /* * (c) 2001-2004 Chris Danford * All rights reserved. diff --git a/stepmania/src/ScreenEdit.h b/stepmania/src/ScreenEdit.h index 317e1cb50b..124150f353 100644 --- a/stepmania/src/ScreenEdit.h +++ b/stepmania/src/ScreenEdit.h @@ -155,7 +155,8 @@ protected: void MenuItemGainFocus( BitmapText* menuitem ); void MenuItemLoseFocus( BitmapText* menuitem ); - float GetMaximumBeat() const; // don't allow Down key to go past this beat. + float GetMaximumBeatForNewNote() const; // don't allow Down key to go past this beat. + float GetMaximumBeatForMoving() const; // don't allow Down key to go past this beat. EditMode m_EditMode;