diff --git a/stepmania/src/NoteDataWithScoring.h b/stepmania/src/NoteDataWithScoring.h index 587b1ab5b0..df2c220b11 100644 --- a/stepmania/src/NoteDataWithScoring.h +++ b/stepmania/src/NoteDataWithScoring.h @@ -10,11 +10,6 @@ struct RadarValues; -struct RowTrack: public pair -{ - RowTrack( const HoldNote &hn ): pair( hn.iEndRow, hn.iTrack ) { } -}; - class NoteDataWithScoring : public NoteData { public: diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index c4d6df7511..48bdfd84a2 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -20,6 +20,8 @@ NoteField::NoteField() { + m_pNoteData = NULL; + m_textMeasureNumber.LoadFromFont( THEME->GetPathToF("Common normal") ); m_textMeasureNumber.SetZoom( 1.0f ); @@ -57,8 +59,8 @@ void NoteField::CacheNoteSkin( CString skin ) return; LOG->Trace("NoteField::CacheNoteSkin: cache %s", skin.c_str() ); - NoteDisplayCols *nd = new NoteDisplayCols( GetNumTracks() ); - for( int c=0; cGetNumTracks() ); + for( int c=0; cGetNumTracks(); c++ ) nd->display[c].Load( c, m_pPlayerState, skin, m_fYReverseOffsetPixels ); nd->m_ReceptorArrowRow.Load( m_pPlayerState, skin, m_fYReverseOffsetPixels ); nd->m_GhostArrowRow.Load( m_pPlayerState, skin, m_fYReverseOffsetPixels ); @@ -101,12 +103,13 @@ void NoteField::CacheAllUsedNoteSkins( bool bDeleteUnused ) } void NoteField::Load( - const NoteData* pNoteData, + const NoteData *pNoteData, const PlayerState* pPlayerState, int iFirstPixelToDraw, int iLastPixelToDraw, float fYReverseOffsetPixels ) { + m_pNoteData = pNoteData; m_pPlayerState = pPlayerState; m_iStartDrawingPixel = iFirstPixelToDraw; m_iEndDrawingPixel = iLastPixelToDraw; @@ -115,10 +118,7 @@ void NoteField::Load( m_fPercentFadeToFail = -1; m_LastSeenBeatToNoteSkinRev = -1; - NoteDataWithScoring::Init(); - - this->CopyAll( *pNoteData ); - ASSERT( GetNumTracks() == GAMESTATE->GetCurrentStyle()->m_iColsPerPlayer ); + ASSERT( m_pNoteData->GetNumTracks() == GAMESTATE->GetCurrentStyle()->m_iColsPerPlayer ); /* If we're in gameplay, we havn't applied course modifiers yet, so we don't know what * note skins we'll need. Don't delete unused skins yet. */ @@ -543,7 +543,7 @@ void NoteField::DrawPrimitives() float fSelectedRangeGlow = SCALE( cosf(RageTimer::GetTimeSinceStart()*2), -1, 1, 0.1f, 0.3f ); - for( int c=0; cGetNumTracks(); c++ ) // for each arrow column { // TODO: Remove use of PlayerNumber. PlayerNumber pn = m_pPlayerState->m_PlayerNumber; @@ -555,9 +555,9 @@ void NoteField::DrawPrimitives() NDMap::iterator CurDisplay = m_BeatToNoteDisplays.begin(); ASSERT( CurDisplay != m_BeatToNoteDisplays.end() ); NDMap::iterator NextDisplay = CurDisplay; ++NextDisplay; - for( int i=0; i < GetNumHoldNotes(); i++ ) + for( int i=0; i < m_pNoteData->GetNumHoldNotes(); i++ ) { - const HoldNote &hn = GetHoldNote(i); + const HoldNote &hn = m_pNoteData->GetHoldNote(i); if( hn.iTrack != c ) // this HoldNote doesn't belong to this column continue; @@ -605,15 +605,20 @@ void NoteField::DrawPrimitives() NextDisplay = CurDisplay; ++NextDisplay; // draw notes from furthest to closest - FOREACH_NONEMPTY_ROW_IN_TRACK_RANGE_REVERSE( *this, c, i, iFirstIndexToDraw, iLastIndexToDraw ) + FOREACH_NONEMPTY_ROW_IN_TRACK_RANGE_REVERSE( *m_pNoteData, c, i, iFirstIndexToDraw, iLastIndexToDraw ) { - TapNote tn = GetTapNote(c, i); + const TapNote &tn = m_pNoteData->GetTapNote(c, i); if( tn.type == TapNote::empty ) // no note here continue; // skip if( tn.type == TapNote::hold_head ) // this is a HoldNote begin marker. Grade it, but don't draw continue; // skip + /* Don't draw hidden (fully judged) steps. */ + if( tn.result.bHidden ) + continue; + + // TRICKY: If boomerang is on, then all notes in the range // [iFirstIndexToDraw,iLastIndexToDraw] aren't necessarily visible. // Test every note to make sure it's on screen before drawing @@ -625,9 +630,9 @@ void NoteField::DrawPrimitives() // See if there is a hold step that begins on this index. bool bHoldNoteBeginsOnThisBeat = false; - for( int c2=0; c2GetNumTracks(); c2++ ) { - if( GetTapNote(c2, i).type == TapNote::hold_head) + if( m_pNoteData->GetTapNote(c2, i).type == TapNote::hold_head) { bHoldNoteBeginsOnThisBeat = true; break; diff --git a/stepmania/src/NoteField.h b/stepmania/src/NoteField.h index ff899a8bdb..44afef25e6 100644 --- a/stepmania/src/NoteField.h +++ b/stepmania/src/NoteField.h @@ -1,7 +1,7 @@ -/* NoteField - adds rendering to NoteDataWithScoring */ +/* NoteField - renders a NoteData */ -#ifndef NOTEFIELD_H -#define NOTEFIELD_H +#ifndef NOTE_FIELD_H +#define NOTE_FIELD_H #include "Sprite.h" #include "ActorFrame.h" @@ -14,7 +14,7 @@ #include "ReceptorArrowRow.h" #include "GhostArrowRow.h" -class NoteField : public NoteDataWithScoring, public ActorFrame +class NoteField : public ActorFrame { public: NoteField(); @@ -53,6 +53,8 @@ protected: void RefreshBeatToNoteSkin(); + const NoteData *m_pNoteData; + float m_fPercentFadeToFail; // -1 of not fading to fail const PlayerState* m_pPlayerState; diff --git a/stepmania/src/NoteTypes.h b/stepmania/src/NoteTypes.h index 2a8cb2b183..ec053fd6db 100644 --- a/stepmania/src/NoteTypes.h +++ b/stepmania/src/NoteTypes.h @@ -16,6 +16,9 @@ struct TapNoteResult * was hit early; positive numbers mean it was hit late. These values are * only meaningful for graded taps (tns >= TNS_BOO). */ float fTapNoteOffset; + + /* If the whole row has been judged, all taps on the row will be set to hidden. */ + bool bHidden; }; struct HoldNoteResult diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index 28a025d54d..fa855758ab 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -342,20 +342,9 @@ void Player::Update( float fDeltaTime ) { HoldNote &hn = m_NoteData.GetHoldNote(i); - /* Find the associated hold note in m_pNoteField. */ - /* ack: this iterates over all hold notes */ - int iHN = m_pNoteField->GetMatchingHoldNote( hn ); - HoldNote &NoteFieldHoldNote = m_pNoteField->GetHoldNote( iHN ); - - // set hold flags so NoteField can do intelligent drawing hn.bHeld = false; hn.bActive = false; - if( m_pNoteField ) - { - NoteFieldHoldNote.bHeld = false; - NoteFieldHoldNote.bActive = false; - } HoldNoteScore hns = hn.result.hns; @@ -386,9 +375,6 @@ void Player::Update( float fDeltaTime ) /* This hold note is not judged and we stepped on its head. Update iLastHeldRow. * Do this even if we're a little beyond the end of the hold note, to make sure * iLastHeldRow is clamped to iEndRow if the hold note is held all the way. */ - if( m_pNoteField ) - NoteFieldHoldNote.result.iLastHeldRow = min( iSongRow, hn.iEndRow ); - hn.result.iLastHeldRow = min( iSongRow, hn.iEndRow ); } @@ -398,11 +384,6 @@ void Player::Update( float fDeltaTime ) // set hold flag so NoteField can do intelligent drawing hn.bHeld = bIsHoldingButton && bSteppedOnTapNote; hn.bActive = bSteppedOnTapNote; - if( m_pNoteField ) - { - NoteFieldHoldNote.bHeld = bIsHoldingButton && bSteppedOnTapNote; - NoteFieldHoldNote.bActive = bSteppedOnTapNote; - } if( bSteppedOnTapNote && bIsHoldingButton ) { @@ -455,12 +436,6 @@ void Player::Update( float fDeltaTime ) m_ProTimingDisplay.SetJudgment( ms_error, TNS_MISS ); } - if( m_pNoteField ) - { - NoteFieldHoldNote.result.fLife = fLife; - NoteFieldHoldNote.result.hns = hns; - } - hn.result.fLife = fLife; hn.result.hns = hns; } @@ -524,8 +499,6 @@ void Player::ApplyWaitingTransforms() GAMESTATE->SetNoteSkinForBeatRange( m_pPlayerState, po.m_sNoteSkin, fStartBeat, fEndBeat ); NoteDataUtil::TransformNoteData( m_NoteData, po, GAMESTATE->GetCurrentStyle()->m_StepsType, fStartBeat, fEndBeat ); - if( m_pNoteField ) - m_pNoteField->CopyRange( m_NoteData, BeatToNoteRow(fStartBeat), BeatToNoteRow(fEndBeat), BeatToNoteRow(fStartBeat) ); } m_pPlayerState->m_ModsToApply.clear(); } @@ -763,17 +736,16 @@ void Player::Step( int col, RageTimer tm ) if( m_pCombinedLifeMeter ) m_pCombinedLifeMeter->ChangeLifeMine( pn ); + tn.result.bHidden = true; + m_NoteData.SetTapNote( col, iIndexOverlappingNote, tn ); if( m_pNoteField ) - { - m_pNoteField->SetTapNote(col, iIndexOverlappingNote, TAP_EMPTY); // remove from NoteField m_pNoteField->DidTapNote( col, score, false ); - } } break; case TapNote::attack: score = TNS_NONE; // don't score this as anything - if( fSecondsFromPerfect <= ADJUSTED_WINDOW(Attack) ) + if( fSecondsFromPerfect <= ADJUSTED_WINDOW(Attack) && !tn.result.bHidden ) { m_soundAttackLaunch.Play(); @@ -798,9 +770,8 @@ void Player::Step( int col, RageTimer tm ) TapNote tn = m_NoteData.GetTapNote(t, iIndexOverlappingNote); if( tn.type == TapNote::attack ) { - m_NoteData.SetTapNote(col, iIndexOverlappingNote, TAP_EMPTY); // remove from NoteField - if( m_pNoteField ) - m_pNoteField->SetTapNote(col, iIndexOverlappingNote, TAP_EMPTY); // remove from NoteField + tn.result.bHidden = true; + m_NoteData.SetTapNote( col, iIndexOverlappingNote, tn ); } } } @@ -862,11 +833,10 @@ void Player::Step( int col, RageTimer tm ) if( m_pCombinedLifeMeter ) m_pCombinedLifeMeter->ChangeLifeMine( pn ); + tn.result.bHidden = true; + m_NoteData.SetTapNote( col, iIndexOverlappingNote, tn ); if( m_pNoteField ) - { - m_pNoteField->SetTapNote(col, iIndexOverlappingNote, TAP_EMPTY); // remove from NoteField m_pNoteField->DidTapNote( col, score, false ); - } } } @@ -904,9 +874,8 @@ void Player::Step( int col, RageTimer tm ) TapNote tn = m_NoteData.GetTapNote(t, iIndexOverlappingNote); if( tn.type == TapNote::attack ) { - m_NoteData.SetTapNote(col, iIndexOverlappingNote, TAP_EMPTY); // remove from NoteField - if( m_pNoteField ) - m_pNoteField->SetTapNote(col, iIndexOverlappingNote, TAP_EMPTY); // remove from NoteField + tn.result.bHidden = true; + m_NoteData.SetTapNote( col, iIndexOverlappingNote, tn ); } } } @@ -955,6 +924,7 @@ void Player::Step( int col, RageTimer tm ) m_NoteData.SetTapNote( col, iIndexOverlappingNote, tn ); + if( m_pPlayerState->m_PlayerController == PC_HUMAN && score >= TNS_GREAT ) HandleAutosync(fNoteOffset); @@ -1074,8 +1044,10 @@ void Player::OnRowCompletelyJudged( int iIndexThatWasSteppedOn ) // If the score is great or better, remove the note from the screen to // indicate success. (Or always if blind is on.) if( score >= TNS_GREAT || m_pPlayerState->m_PlayerOptions.m_fBlind ) - if( m_pNoteField ) - m_pNoteField->SetTapNote(c, iIndexThatWasSteppedOn, TAP_EMPTY); + { + tn.result.bHidden = true; + m_NoteData.SetTapNote( c, iIndexThatWasSteppedOn, tn ); + } // show the ghost arrow for this column if (m_pPlayerState->m_PlayerOptions.m_fBlind) @@ -1252,14 +1224,6 @@ void Player::RandomizeNotes( int iNoteRow ) m_NoteData.SetTapNote( t, iNewNoteRow, t2 ); m_NoteData.SetTapNote( iSwapWith, iNewNoteRow, t1 ); - - if( m_pNoteField ) - { - const TapNote nft1 = m_pNoteField->GetTapNote( t, iNewNoteRow ); - const TapNote nft2 = m_pNoteField->GetTapNote( iSwapWith, iNewNoteRow ); - m_pNoteField->SetTapNote( t, iNewNoteRow, nft2 ); - m_pNoteField->SetTapNote( iSwapWith, iNewNoteRow, nft1 ); - } } } diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index 8f5bf16936..ba12429f2c 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -498,15 +498,18 @@ ScreenEdit::ScreenEdit( CString sName ) : Screen( sName ) m_NoteFieldEdit.SetXY( EDIT_X, PLAYER_Y ); m_NoteFieldEdit.SetZoom( 0.5f ); - m_NoteFieldEdit.Load( ¬eData, GAMESTATE->m_pPlayerState[PLAYER_1], -240, 800, PLAYER_HEIGHT*2 ); + m_NoteDataEdit.CopyAll( noteData ); + + m_NoteFieldEdit.Load( &m_NoteDataEdit, GAMESTATE->m_pPlayerState[PLAYER_1], -240, 800, PLAYER_HEIGHT*2 ); m_rectRecordBack.StretchTo( RectF(SCREEN_LEFT, SCREEN_TOP, SCREEN_RIGHT, SCREEN_BOTTOM) ); m_rectRecordBack.SetDiffuse( RageColor(0,0,0,0) ); m_NoteFieldRecord.SetXY( EDIT_X, PLAYER_Y ); - m_NoteFieldRecord.Load( ¬eData, GAMESTATE->m_pPlayerState[PLAYER_1], -150, 350, 350 ); + m_NoteDataRecord.CopyAll( noteData ); + m_NoteFieldRecord.Load( &m_NoteDataRecord, GAMESTATE->m_pPlayerState[PLAYER_1], -150, 350, 350 ); - m_Clipboard.SetNumTracks( m_NoteFieldEdit.GetNumTracks() ); + m_Clipboard.SetNumTracks( m_NoteDataEdit.GetNumTracks() ); GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.Init(); // don't allow weird options in editor. It doesn't handle reverse well. @@ -646,7 +649,7 @@ void ScreenEdit::Update( float fDeltaTime ) // create a new hold note HoldNote newHN( t, BeatToNoteRow(fStartBeat), BeatToNoteRow(fEndBeat) ); - m_NoteFieldRecord.AddHoldNote( newHN ); + m_NoteDataRecord.AddHoldNote( newHN ); } } } @@ -730,8 +733,8 @@ void ScreenEdit::Update( float fDeltaTime ) void ScreenEdit::UpdateTextInfo() { - int iNumTapNotes = m_NoteFieldEdit.GetNumTapNotes(); - int iNumHoldNotes = m_NoteFieldEdit.GetNumHoldNotes(); + int iNumTapNotes = m_NoteDataEdit.GetNumTapNotes(); + int iNumHoldNotes = m_NoteDataEdit.GetNumHoldNotes(); CString sNoteType = NoteTypeToString(m_SnapDisplay.GetNoteType()) + " notes"; @@ -869,35 +872,35 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ // Alt + number = input to right half if( EditIsBeingPressed(EDIT_BUTTON_RIGHT_SIDE) ) - iCol += m_NoteFieldEdit.GetNumTracks()/2; + iCol += m_NoteDataEdit.GetNumTracks()/2; const float fSongBeat = GAMESTATE->m_fSongBeat; const int iSongIndex = BeatToNoteRow( fSongBeat ); - if( iCol >= m_NoteFieldEdit.GetNumTracks() ) // this button is not in the range of columns for this Style + if( iCol >= m_NoteDataEdit.GetNumTracks() ) // this button is not in the range of columns for this Style break; // check for to see if the user intended to remove a HoldNote - for( int i=0; im_fSongBeat; break; case EDIT_BUTTON_SCROLL_END: - fBeatsToMove = m_NoteFieldEdit.GetLastBeat() - GAMESTATE->m_fSongBeat; + fBeatsToMove = m_NoteDataEdit.GetLastBeat() - GAMESTATE->m_fSongBeat; break; } @@ -981,9 +984,9 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ // Ctrl + number = input to right half if( EditIsBeingPressed(EDIT_BUTTON_RIGHT_SIDE) ) - iCol += m_NoteFieldEdit.GetNumTracks()/2; + iCol += m_NoteDataEdit.GetNumTracks()/2; - if( iCol >= m_NoteFieldEdit.GetNumTracks() ) + if( iCol >= m_NoteDataEdit.GetNumTracks() ) continue; // skip EditButton b = EditButton(EDIT_BUTTON_COLUMN_0+n); @@ -996,7 +999,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ newHN.iStartRow = max(newHN.iStartRow, 0); newHN.iEndRow = max(newHN.iEndRow, 0); - m_NoteFieldEdit.AddHoldNote( newHN ); + m_NoteDataEdit.AddHoldNote( newHN ); } if( EditIsBeingPressed(EDIT_BUTTON_SCROLL_SELECT) ) @@ -1097,7 +1100,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ // save current steps Steps* pSteps = GAMESTATE->m_pCurSteps[PLAYER_1]; ASSERT( pSteps ); - pSteps->SetNoteData( m_NoteFieldEdit ); + pSteps->SetNoteData( m_NoteDataEdit ); // Get all Steps of this StepsType StepsType st = pSteps->m_StepsType; @@ -1134,7 +1137,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ pSteps = *it; GAMESTATE->m_pCurSteps[PLAYER_1] = m_pSteps = pSteps; - pSteps->GetNoteData( m_NoteFieldEdit ); + pSteps->GetNoteData( m_NoteDataEdit ); SCREENMAN->SystemMessage( ssprintf( "Switched to %s %s '%s'", GAMEMAN->StepsTypeToString( pSteps->m_StepsType ).c_str(), @@ -1360,7 +1363,7 @@ void ScreenEdit::InputRecord( const DeviceInput& DeviceI, const InputEventType t if( iRow < 0 ) break; - m_NoteFieldRecord.SetTapNote(iCol, iRow, TAP_ORIGINAL_TAP); + m_NoteDataRecord.SetTapNote(iCol, iRow, TAP_ORIGINAL_TAP); m_NoteFieldRecord.Step( iCol, TNS_MARVELOUS ); } break; @@ -1465,11 +1468,11 @@ void ScreenEdit::TransitionFromRecordToEdit() int rowEnd = BeatToNoteRow( m_NoteFieldEdit.m_fEndMarker ); // delete old TapNotes in the range - m_NoteFieldEdit.ClearRange( rowBegin, rowEnd ); + m_NoteDataEdit.ClearRange( rowBegin, rowEnd ); - m_NoteFieldEdit.CopyRange( m_NoteFieldRecord, rowBegin, rowEnd, rowBegin ); + m_NoteDataEdit.CopyRange( m_NoteDataRecord, rowBegin, rowEnd, rowBegin ); - m_NoteFieldRecord.ClearAll(); + m_NoteDataRecord.ClearAll(); } /* Helper for SM_DoReloadFromDisk */ @@ -1561,7 +1564,7 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) CString sMods = poChosen.GetString(); const int row = BeatToNoteRow( GAMESTATE->m_fSongBeat ); - m_NoteFieldEdit.SetTapAttackNote( g_iLastInsertAttackTrack, row, sMods, g_fLastInsertAttackDurationSeconds ); + m_NoteDataEdit.SetTapAttackNote( g_iLastInsertAttackTrack, row, sMods, g_fLastInsertAttackDurationSeconds ); GAMESTATE->RestoreSelectedOptions(); // restore the edit and playback options } break; @@ -1606,7 +1609,7 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SystemMessage( sMessage ); m_pSteps = GAMESTATE->m_pCurSteps[PLAYER_1] = pSteps; - m_pSteps->GetNoteData( m_NoteFieldEdit ); + m_pSteps->GetNoteData( m_NoteDataEdit ); break; } @@ -1714,28 +1717,28 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, int* iAnswers ) g_EditNotesStatistics.rows[meter].defaultChoice = clamp( pSteps->GetMeter()-1, 0, 14 ); g_EditNotesStatistics.rows[predict_meter].choices.resize(1);g_EditNotesStatistics.rows[predict_meter].choices[0] = ssprintf("%f",pSteps->PredictMeter()); g_EditNotesStatistics.rows[description].choices.resize(1); g_EditNotesStatistics.rows[description].choices[0] = pSteps->GetDescription(); - g_EditNotesStatistics.rows[tap_notes].choices.resize(1); g_EditNotesStatistics.rows[tap_notes].choices[0] = ssprintf("%d", m_NoteFieldEdit.GetNumTapNotes()); - g_EditNotesStatistics.rows[hold_notes].choices.resize(1); g_EditNotesStatistics.rows[hold_notes].choices[0] = ssprintf("%d", m_NoteFieldEdit.GetNumHoldNotes()); - g_EditNotesStatistics.rows[stream].choices.resize(1); g_EditNotesStatistics.rows[stream].choices[0] = ssprintf("%f", NoteDataUtil::GetStreamRadarValue(m_NoteFieldEdit,fMusicSeconds)); - g_EditNotesStatistics.rows[voltage].choices.resize(1); g_EditNotesStatistics.rows[voltage].choices[0] = ssprintf("%f", NoteDataUtil::GetVoltageRadarValue(m_NoteFieldEdit,fMusicSeconds)); + g_EditNotesStatistics.rows[tap_notes].choices.resize(1); g_EditNotesStatistics.rows[tap_notes].choices[0] = ssprintf("%d", m_NoteDataEdit.GetNumTapNotes()); + g_EditNotesStatistics.rows[hold_notes].choices.resize(1); g_EditNotesStatistics.rows[hold_notes].choices[0] = ssprintf("%d", m_NoteDataEdit.GetNumHoldNotes()); + g_EditNotesStatistics.rows[stream].choices.resize(1); g_EditNotesStatistics.rows[stream].choices[0] = ssprintf("%f", NoteDataUtil::GetStreamRadarValue(m_NoteDataEdit,fMusicSeconds)); + g_EditNotesStatistics.rows[voltage].choices.resize(1); g_EditNotesStatistics.rows[voltage].choices[0] = ssprintf("%f", NoteDataUtil::GetVoltageRadarValue(m_NoteDataEdit,fMusicSeconds)); - g_EditNotesStatistics.rows[air].choices.resize(1); g_EditNotesStatistics.rows[air].choices[0] = ssprintf("%f", NoteDataUtil::GetAirRadarValue(m_NoteFieldEdit,fMusicSeconds)); - g_EditNotesStatistics.rows[freeze].choices.resize(1); g_EditNotesStatistics.rows[freeze].choices[0] = ssprintf("%f", NoteDataUtil::GetFreezeRadarValue(m_NoteFieldEdit,fMusicSeconds)); - g_EditNotesStatistics.rows[chaos].choices.resize(1); g_EditNotesStatistics.rows[chaos].choices[0] = ssprintf("%f", NoteDataUtil::GetChaosRadarValue(m_NoteFieldEdit,fMusicSeconds)); + g_EditNotesStatistics.rows[air].choices.resize(1); g_EditNotesStatistics.rows[air].choices[0] = ssprintf("%f", NoteDataUtil::GetAirRadarValue(m_NoteDataEdit,fMusicSeconds)); + g_EditNotesStatistics.rows[freeze].choices.resize(1); g_EditNotesStatistics.rows[freeze].choices[0] = ssprintf("%f", NoteDataUtil::GetFreezeRadarValue(m_NoteDataEdit,fMusicSeconds)); + g_EditNotesStatistics.rows[chaos].choices.resize(1); g_EditNotesStatistics.rows[chaos].choices[0] = ssprintf("%f", NoteDataUtil::GetChaosRadarValue(m_NoteDataEdit,fMusicSeconds)); SCREENMAN->MiniMenu( &g_EditNotesStatistics, SM_BackFromEditNotesStatistics ); } break; case play_whole_song: { m_NoteFieldEdit.m_fBeginMarker = 0; - m_NoteFieldEdit.m_fEndMarker = m_NoteFieldEdit.GetLastBeat(); + m_NoteFieldEdit.m_fEndMarker = m_NoteDataEdit.GetLastBeat(); HandleAreaMenuChoice( play, NULL ); } break; case play_current_beat_to_end: { m_NoteFieldEdit.m_fBeginMarker = GAMESTATE->m_fSongBeat; - m_NoteFieldEdit.m_fEndMarker = m_NoteFieldEdit.GetLastBeat(); + m_NoteFieldEdit.m_fEndMarker = m_NoteDataEdit.GetLastBeat(); HandleAreaMenuChoice( play, NULL ); } break; @@ -1745,7 +1748,7 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, int* iAnswers ) Steps* pSteps = GAMESTATE->m_pCurSteps[PLAYER_1]; ASSERT( pSteps ); - pSteps->SetNoteData( m_NoteFieldEdit ); + pSteps->SetNoteData( m_NoteDataEdit ); GAMESTATE->m_pCurSong->Save(); // we shouldn't say we're saving a DWI if we're on any game besides @@ -1909,7 +1912,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) int iFirstRow = BeatToNoteRow( m_NoteFieldEdit.m_fBeginMarker ); int iLastRow = BeatToNoteRow( m_NoteFieldEdit.m_fEndMarker ); m_Clipboard.ClearAll(); - m_Clipboard.CopyRange( m_NoteFieldEdit, iFirstRow, iLastRow ); + m_Clipboard.CopyRange( m_NoteDataEdit, iFirstRow, iLastRow ); } break; case paste_at_current_beat: @@ -1917,7 +1920,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) int iSrcFirstRow = 0; int iSrcLastRow = BeatToNoteRow( m_Clipboard.GetLastBeat() ); int iDestFirstRow = BeatToNoteRow( GAMESTATE->m_fSongBeat ); - m_NoteFieldEdit.CopyRange( m_Clipboard, iSrcFirstRow, iSrcLastRow, iDestFirstRow ); + m_NoteDataEdit.CopyRange( m_Clipboard, iSrcFirstRow, iSrcLastRow, iDestFirstRow ); } break; case paste_at_begin_marker: @@ -1926,7 +1929,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) int iSrcFirstRow = 0; int iSrcLastRow = BeatToNoteRow( m_Clipboard.GetLastBeat() ); int iDestFirstRow = BeatToNoteRow( m_NoteFieldEdit.m_fBeginMarker ); - m_NoteFieldEdit.CopyRange( m_Clipboard, iSrcFirstRow, iSrcLastRow, iDestFirstRow ); + m_NoteDataEdit.CopyRange( m_Clipboard, iSrcFirstRow, iSrcLastRow, iDestFirstRow ); } break; case clear: @@ -1934,13 +1937,13 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) ASSERT( m_NoteFieldEdit.m_fBeginMarker!=-1 && m_NoteFieldEdit.m_fEndMarker!=-1 ); int iFirstRow = BeatToNoteRow( m_NoteFieldEdit.m_fBeginMarker ); int iLastRow = BeatToNoteRow( m_NoteFieldEdit.m_fEndMarker ); - m_NoteFieldEdit.ClearRange( iFirstRow, iLastRow ); + m_NoteDataEdit.ClearRange( iFirstRow, iLastRow ); } break; case quantize: { NoteType nt = (NoteType)iAnswers[c]; - NoteDataUtil::SnapToNearestNoteType( m_NoteFieldEdit, nt, nt, m_NoteFieldEdit.m_fBeginMarker, m_NoteFieldEdit.m_fEndMarker ); + NoteDataUtil::SnapToNearestNoteType( m_NoteDataEdit, nt, nt, m_NoteFieldEdit.m_fBeginMarker, m_NoteFieldEdit.m_fEndMarker ); } break; case turn: @@ -1972,28 +1975,28 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) StepsType st = GAMESTATE->GetCurrentStyle()->m_StepsType; switch( tt ) { - case noholds: NoteDataUtil::RemoveHoldNotes( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case nomines: NoteDataUtil::RemoveMines( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case little: NoteDataUtil::Little( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case wide: NoteDataUtil::Wide( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case big: NoteDataUtil::Big( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case quick: NoteDataUtil::Quick( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case bmrize: NoteDataUtil::BMRize( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case skippy: NoteDataUtil::Skippy( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case mines: NoteDataUtil::AddMines( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case echo: NoteDataUtil::Echo( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case stomp: NoteDataUtil::Stomp( m_NoteFieldEdit, st, fBeginBeat, fEndBeat ); break; - case planted: NoteDataUtil::Planted( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case floored: NoteDataUtil::Floored( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case twister: NoteDataUtil::Twister( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case nojumps: NoteDataUtil::RemoveJumps( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case nohands: NoteDataUtil::RemoveHands( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; - case noquads: NoteDataUtil::RemoveQuads( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; + case noholds: NoteDataUtil::RemoveHoldNotes( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case nomines: NoteDataUtil::RemoveMines( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case little: NoteDataUtil::Little( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case wide: NoteDataUtil::Wide( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case big: NoteDataUtil::Big( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case quick: NoteDataUtil::Quick( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case bmrize: NoteDataUtil::BMRize( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case skippy: NoteDataUtil::Skippy( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case mines: NoteDataUtil::AddMines( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case echo: NoteDataUtil::Echo( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case stomp: NoteDataUtil::Stomp( m_NoteDataEdit, st, fBeginBeat, fEndBeat ); break; + case planted: NoteDataUtil::Planted( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case floored: NoteDataUtil::Floored( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case twister: NoteDataUtil::Twister( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case nojumps: NoteDataUtil::RemoveJumps( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case nohands: NoteDataUtil::RemoveHands( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; + case noquads: NoteDataUtil::RemoveQuads( m_NoteDataEdit, fBeginBeat, fEndBeat ); break; default: ASSERT(0); } // bake in the additions - NoteDataUtil::ConvertAdditionsToRegular( m_NoteFieldEdit ); + NoteDataUtil::ConvertAdditionsToRegular( m_NoteDataEdit ); } break; case alter: @@ -2060,7 +2063,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) float fNewClipboardBeats = fOldClipboardBeats * fScale; float fDeltaBeats = fNewClipboardBeats - fOldClipboardBeats; float fNewClipboardEndBeat = m_NoteFieldEdit.m_fBeginMarker + fNewClipboardBeats; - NoteDataUtil::ShiftRows( m_NoteFieldEdit, m_NoteFieldEdit.m_fBeginMarker, fDeltaBeats ); + NoteDataUtil::ShiftRows( m_NoteDataEdit, m_NoteFieldEdit.m_fBeginMarker, fDeltaBeats ); m_pSong->m_Timing.ScaleRegion( fScale, m_NoteFieldEdit.m_fBeginMarker, m_NoteFieldEdit.m_fEndMarker ); HandleAreaMenuChoice( paste_at_begin_marker, NULL ); @@ -2115,7 +2118,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) /* If we're in course display mode, set that up. */ SetupCourseAttacks(); - m_Player.Load( m_NoteFieldEdit ); + m_Player.Load( m_NoteDataEdit ); GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerController = PREFSMAN->m_bAutoPlay?PC_AUTOPLAY:PC_HUMAN; m_rectRecordBack.StopTweening(); @@ -2130,7 +2133,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) * and recalc it. */ Steps* pSteps = GAMESTATE->m_pCurSteps[PLAYER_1]; ASSERT( pSteps ); - pSteps->SetNoteData( m_NoteFieldEdit ); + pSteps->SetNoteData( m_NoteDataEdit ); m_pSong->ReCalculateRadarValuesAndLastBeat(); m_Background.Unload(); @@ -2162,8 +2165,9 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) GAMESTATE->ResetNoteSkins(); // initialize m_NoteFieldRecord - m_NoteFieldRecord.Load( &m_NoteFieldEdit, GAMESTATE->m_pPlayerState[PLAYER_1], -150, 350, 350 ); - m_NoteFieldRecord.SetNumTracks( m_NoteFieldEdit.GetNumTracks() ); + m_NoteDataRecord.SetNumTracks( m_NoteDataEdit.GetNumTracks() ); + m_NoteDataRecord.CopyAll( m_NoteDataEdit ); + m_NoteFieldRecord.Load( &m_NoteDataRecord, GAMESTATE->m_pPlayerState[PLAYER_1], -150, 350, 350 ); m_rectRecordBack.StopTweening(); m_rectRecordBack.BeginTweening( 0.5f ); @@ -2182,10 +2186,10 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) } break; case insert_and_shift: - NoteDataUtil::ShiftRows( m_NoteFieldEdit, GAMESTATE->m_fSongBeat, 1 ); + NoteDataUtil::ShiftRows( m_NoteDataEdit, GAMESTATE->m_fSongBeat, 1 ); break; case delete_and_shift: - NoteDataUtil::ShiftRows( m_NoteFieldEdit, GAMESTATE->m_fSongBeat, -1 ); + NoteDataUtil::ShiftRows( m_NoteDataEdit, GAMESTATE->m_fSongBeat, -1 ); break; case shift_pauses_forward: m_pSong->m_Timing.ShiftRows( GAMESTATE->m_fSongBeat, 1 ); @@ -2203,7 +2207,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) float fStopLength = fMarkerEnd - fMarkerStart; // be sure not to clobber the row at the start - a row at the end // can be dropped safely, though - NoteDataUtil::ShiftRows( m_NoteFieldEdit, + NoteDataUtil::ShiftRows( m_NoteDataEdit, m_NoteFieldEdit.m_fBeginMarker + 0.003f, (-m_NoteFieldEdit.m_fEndMarker+m_NoteFieldEdit.m_fBeginMarker) ); @@ -2258,10 +2262,10 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) fStopLength *= fBPMatPause; fStopLength /= 60; // don't move the step from where it is, just move everything later - m_NoteFieldEdit.ConvertHoldNotesTo2sAnd3s(); - NoteDataUtil::ShiftRows( m_NoteFieldEdit, GAMESTATE->m_fSongBeat + 0.003f, fStopLength ); + m_NoteDataEdit.ConvertHoldNotesTo2sAnd3s(); + NoteDataUtil::ShiftRows( m_NoteDataEdit, GAMESTATE->m_fSongBeat + 0.003f, fStopLength ); m_pSong->m_Timing.ShiftRows( GAMESTATE->m_fSongBeat + 0.003f, fStopLength ); - m_NoteFieldEdit.Convert2sAnd3sToHoldNotes(); + m_NoteDataEdit.Convert2sAnd3sToHoldNotes(); } // Hello and welcome to I FEEL STUPID :-) diff --git a/stepmania/src/ScreenEdit.h b/stepmania/src/ScreenEdit.h index 0e05777e5d..2b64bc7b40 100644 --- a/stepmania/src/ScreenEdit.h +++ b/stepmania/src/ScreenEdit.h @@ -151,6 +151,7 @@ protected: Steps* m_pSteps; NoteField m_NoteFieldEdit; + NoteDataWithScoring m_NoteDataEdit; SnapDisplay m_SnapDisplay; AutoActor m_sprOverlay; @@ -176,6 +177,7 @@ protected: // for MODE_RECORD NoteField m_NoteFieldRecord; + NoteDataWithScoring m_NoteDataRecord; // for MODE_PLAY void SetupCourseAttacks();