From e8d67d919150f1432acbb3a09e51977be28a09dc Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Thu, 12 Jan 2006 21:39:00 +0000 Subject: [PATCH] Remove "note skin for beat range", "beat range revision" stuff. We still load all note skins for a course in advance, and note skins are still sent through the weird "attack queue" stuff. --- stepmania/src/GameState.cpp | 34 -------- stepmania/src/GameState.h | 6 -- stepmania/src/NoteField.cpp | 134 ++++++------------------------- stepmania/src/NoteField.h | 9 --- stepmania/src/PlayerState.cpp | 6 -- stepmania/src/PlayerState.h | 3 - stepmania/src/ScreenGameplay.cpp | 4 +- 7 files changed, 26 insertions(+), 170 deletions(-) diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 4b3980bfab..bad7aab838 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -196,7 +196,6 @@ void GameState::Reset() m_bJukeboxUsesModifiers = false; m_iCurrentStageIndex = 0; m_bGameplayLeadIn.Set( false ); - m_BeatToNoteSkinRev = 0; m_iNumStagesOfThisSong = 0; NOTESKIN->RefreshNoteSkinData( this->m_pCurGame ); @@ -1095,21 +1094,6 @@ bool GameState::IsDisqualified( PlayerNumber pn ) } } -void GameState::ResetNoteSkins() -{ - FOREACH_PlayerNumber( pn ) - ResetNoteSkinsForPlayer( m_pPlayerState[pn] ); - - ++m_BeatToNoteSkinRev; -} - -void GameState::ResetNoteSkinsForPlayer( PlayerState *ps ) -{ - ps->ResetNoteSkins(); - - ++m_BeatToNoteSkinRev; -} - void GameState::GetAllUsedNoteSkins( vector &out ) const { FOREACH_EnabledPlayer( pn ) @@ -1151,24 +1135,6 @@ void GameState::GetUndisplayedBeats( const PlayerState* pPlayerState, float Tota } -void GameState::SetNoteSkinForBeatRange( PlayerState* pPlayerState, const CString& sNoteSkin, float StartBeat, float EndBeat ) -{ - map &BeatToNoteSkin = pPlayerState->m_BeatToNoteSkin; - - /* Erase any other note skin settings in this range. */ - map::iterator begin = BeatToNoteSkin.lower_bound( StartBeat ); - map::iterator end = BeatToNoteSkin.upper_bound( EndBeat ); - BeatToNoteSkin.erase( begin, end ); - - /* Add the skin to m_BeatToNoteSkin. */ - BeatToNoteSkin[StartBeat] = sNoteSkin; - - /* Return to the default note skin after the duration. */ - BeatToNoteSkin[EndBeat] = pPlayerState->m_StagePlayerOptions.m_sNoteSkin; - - ++m_BeatToNoteSkinRev; -} - /* This is called to launch an attack, or to queue an attack if a.fStartSecond * is set. This is also called by GameState::Update when activating a queued attack. */ void GameState::LaunchAttack( MultiPlayer target, const Attack& a ) diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index a01dd4b6d6..d30e9406b3 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -164,9 +164,6 @@ public: RageTimer m_LastBeatUpdate; // time of last m_fSongBeat, etc. update BroadcastOnChange m_bGameplayLeadIn; - int m_BeatToNoteSkinRev; /* hack: incremented whenever m_BeatToNoteSkin changes */ - void ResetNoteSkins(); - void ResetNoteSkinsForPlayer( PlayerState *ps ); void GetAllUsedNoteSkins( vector &out ) const; static const float MUSIC_SECONDS_INVALID; @@ -183,9 +180,6 @@ public: bool AllHumanHaveComboOf30OrMoreMisses() const; bool OneIsHot() const; - // used in PLAY_MODE_BATTLE and PLAY_MODE_RAVE - void SetNoteSkinForBeatRange( PlayerState* pPlayerState, const CString& sNoteSkin, float StartBeat, float EndBeat ); - // used in PLAY_MODE_BATTLE float m_fOpponentHealthPercent; diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index 58cd689e17..0719a6e14d 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -77,6 +77,12 @@ void NoteField::CacheNoteSkin( const CString &sNoteSkin_ ) void NoteField::CacheAllUsedNoteSkins() { + /* Cache all note skins that we might need for the whole song, course or battle + * play, so we don't have to load them later (such as between course songs). */ + vector skins; + GAMESTATE->GetAllUsedNoteSkins( skins ); + for( unsigned i=0; i < skins.size(); ++i ) + CacheNoteSkin( skins[i] ); CString sNoteSkin = m_pPlayerState->m_PlayerOptions.m_sNoteSkin; CacheNoteSkin( sNoteSkin ); } @@ -98,7 +104,6 @@ void NoteField::Load( m_iEndDrawingPixel = iLastPixelToDraw; m_fPercentFadeToFail = -1; - m_LastSeenBeatToNoteSkinRev = -1; //int i1 = m_pNoteData->GetNumTracks(); //int i2 = GAMESTATE->GetCurrentStyle()->m_iColsPerPlayer; @@ -106,46 +111,10 @@ void NoteField::Load( ASSERT_M( m_pNoteData->GetNumTracks() == GAMESTATE->GetCurrentStyle()->m_iColsPerPlayer, ssprintf("%d = %d",m_pNoteData->GetNumTracks(), GAMESTATE->GetCurrentStyle()->m_iColsPerPlayer) ); - RefreshBeatToNoteSkin(); -} - - -void NoteField::RefreshBeatToNoteSkin() -{ - if( GAMESTATE->m_BeatToNoteSkinRev == m_LastSeenBeatToNoteSkinRev ) - return; - m_LastSeenBeatToNoteSkinRev = GAMESTATE->m_BeatToNoteSkinRev; - - /* Set by GameState::ResetNoteSkins(): */ - ASSERT( !m_pPlayerState->m_BeatToNoteSkin.empty() ); - - m_BeatToNoteDisplays.clear(); - - /* GAMESTATE->m_BeatToNoteSkin[pn] maps from song beats to note skins. Maintain - * m_BeatToNoteDisplays, to map from song beats to NoteDisplay*s, so we don't - * have to do it while rendering. */ - - for( map::const_iterator it = m_pPlayerState->m_BeatToNoteSkin.begin(); - it != m_pPlayerState->m_BeatToNoteSkin.end(); - ++it ) - { - const float Beat = it->first; - const CString &Skin = it->second; - - map::iterator display = m_NoteDisplays.find( Skin ); - if( display == m_NoteDisplays.end() ) - { - /* Skins should always be loaded by CacheAllUsedNoteSkins. */ - LOG->Warn( "NoteField::RefreshBeatToNoteSkin: need note skin \"%s\" which should have been loaded already", Skin.c_str() ); - this->CacheNoteSkin( Skin ); - display = m_NoteDisplays.find( Skin ); - } - - ASSERT_M( display != m_NoteDisplays.end(), ssprintf("Couldn't find %s", Skin.c_str()) ); - - NoteDisplayCols *cols = display->second; - m_BeatToNoteDisplays[Beat] = cols; - } + // The note skin may have changed at the beginning of a new course song. + map::iterator it = m_NoteDisplays.find( m_pPlayerState->m_PlayerOptions.m_sNoteSkin ); + ASSERT_M( it != m_NoteDisplays.end(), m_pPlayerState->m_PlayerOptions.m_sNoteSkin ); + LastDisplay = it->second; } void NoteField::Update( float fDeltaTime ) @@ -154,10 +123,7 @@ void NoteField::Update( float fDeltaTime ) m_rectMarkerBar.Update( fDeltaTime ); - NoteDisplayCols *cur = SearchForSongBeat(); - - if( cur != LastDisplay ) - LastDisplay = cur; + NoteDisplayCols *cur = LastDisplay; cur->m_ReceptorArrowRow.Update( fDeltaTime ); cur->m_GhostArrowRow.Update( fDeltaTime ); @@ -167,14 +133,9 @@ void NoteField::Update( float fDeltaTime ) // Update fade to failed - FOREACHM( CString, NoteDisplayCols*, m_NoteDisplays, iter ) - { - iter->second->m_ReceptorArrowRow.SetFadeToFailPercent( m_fPercentFadeToFail ); - } + LastDisplay->m_ReceptorArrowRow.SetFadeToFailPercent( m_fPercentFadeToFail ); - RefreshBeatToNoteSkin(); - /* * Update all NoteDisplays. Hack: We need to call this once per frame, not * once per player. @@ -189,13 +150,11 @@ void NoteField::ProcessMessages( float fDeltaTime ) { ActorFrame::ProcessMessages( fDeltaTime ); - /* If m_BeatToNoteDisplays isn't filled yet, we're receiving a message - * before Load() was called. */ - if( !m_BeatToNoteDisplays.empty() ) + /* If LastDisplay is NULL, we're receiving a message before Load() was called. */ + if( LastDisplay != NULL ) { - NoteDisplayCols *pCur = SearchForSongBeat(); - pCur->m_ReceptorArrowRow.ProcessMessages( fDeltaTime ); - pCur->m_GhostArrowRow.ProcessMessages( fDeltaTime ); + LastDisplay->m_ReceptorArrowRow.ProcessMessages( fDeltaTime ); + LastDisplay->m_GhostArrowRow.ProcessMessages( fDeltaTime ); } } @@ -347,46 +306,9 @@ void NoteField::DrawBGChangeText( const float fBeat, const CString sNewBGName ) m_textMeasureNumber.Draw(); } -/* cur is an iterator within m_NoteDisplays. next is ++cur. Advance or rewind cur to - * point to the block that contains beat. We maintain next as an optimization, as this - * is called for every tap. */ -void NoteField::SearchForBeat( NDMap::iterator &cur, NDMap::iterator &next, float Beat ) -{ - /* cur is too far ahead: */ - while( cur != m_BeatToNoteDisplays.begin() && cur->first > Beat ) - { - next = cur; - --cur; - } - - /* cur is too far behind: */ - while( next != m_BeatToNoteDisplays.end() && next->first < Beat ) - { - cur = next; - ++next; - } -} - NoteField::NoteDisplayCols *NoteField::SearchForSongBeat() { - return SearchForBeat( GAMESTATE->m_fSongBeat ); -} - -NoteField::NoteDisplayCols *NoteField::SearchForBeat( float Beat ) -{ - NDMap::iterator it = m_BeatToNoteDisplays.lower_bound( Beat ); - /* The first entry should always be lower than any Beat we might receive. */ - // This assert is firing with Beat = -7408. -Chris - // Again with Beat = -7254 and GAMESTATE->m_fMusicSeconds = -3043.61 - // Again with Beat = -9806 and GAMESTATE->m_fMusicSeconds = -3017.22 - // Again with Beat = -9806 and GAMESTATE->m_fMusicSeconds = -3017.22 - // Again in the middle of Remember December in Hardcore Galore: - // Beat = -9373.56 and GAMESTATE->m_fMusicSeconds = -2923.48 - ASSERT_M( it != m_BeatToNoteDisplays.begin(), ssprintf("%f",Beat) ); - --it; - ASSERT_M( it != m_BeatToNoteDisplays.end(), ssprintf("%f",Beat) ); - - return it->second; + return LastDisplay; } // CPU OPTIMIZATION OPPORTUNITY: @@ -478,11 +400,11 @@ void NoteField::DrawPrimitives() //LOG->Trace( "NoteField::DrawPrimitives()" ); /* This should be filled in on the first update. */ - ASSERT( !m_BeatToNoteDisplays.empty() ); + ASSERT( LastDisplay != NULL ); ArrowEffects::Update(); - NoteDisplayCols *cur = SearchForSongBeat(); + NoteDisplayCols *cur = LastDisplay; cur->m_ReceptorArrowRow.Draw(); const PlayerOptions ¤t_po = m_pPlayerState->m_CurrentPlayerOptions; @@ -696,10 +618,6 @@ void NoteField::DrawPrimitives() // // Draw all HoldNotes in this column (so that they appear under the tap notes) // - NDMap::iterator CurDisplay = m_BeatToNoteDisplays.begin(); - ASSERT( CurDisplay != m_BeatToNoteDisplays.end() ); - NDMap::iterator NextDisplay = CurDisplay; ++NextDisplay; - { NoteData::TrackMap::const_iterator begin, end; m_pNoteData->GetTapNoteRangeInclusive( c, iFirstIndexToDraw, iLastIndexToDraw+1, begin, end ); @@ -742,14 +660,12 @@ void NoteField::DrawPrimitives() SearchForSongBeat()->m_GhostArrowRow.SetHoldIsActive( c ); ASSERT_M( NoteRowToBeat(iStartRow) > -2000, ssprintf("%i %i %i", iStartRow, iEndRow, c) ); - SearchForBeat( CurDisplay, NextDisplay, NoteRowToBeat(iStartRow) ); bool bIsInSelectionRange = false; if( m_iBeginMarker!=-1 && m_iEndMarker!=-1 ) bIsInSelectionRange = (m_iBeginMarker <= iStartRow && iEndRow < m_iEndMarker); - const NoteDisplayCols *nd = CurDisplay->second; - nd->display[c].DrawHold( tn, c, iStartRow, bIsHoldingNote, bIsActive, Result, bIsInSelectionRange ? fSelectedRangeGlow : m_fPercentFadeToFail, false, m_fYReverseOffsetPixels, (float) iFirstPixelToDraw, (float) iLastPixelToDraw ); + LastDisplay->display[c].DrawHold( tn, c, iStartRow, bIsHoldingNote, bIsActive, Result, bIsInSelectionRange ? fSelectedRangeGlow : m_fPercentFadeToFail, false, m_fYReverseOffsetPixels, (float) iFirstPixelToDraw, (float) iLastPixelToDraw ); } } @@ -758,8 +674,6 @@ void NoteField::DrawPrimitives() // // Draw all TapNotes in this column // - CurDisplay = m_BeatToNoteDisplays.begin(); - NextDisplay = CurDisplay; ++NextDisplay; // draw notes from furthest to closest @@ -788,13 +702,11 @@ void NoteField::DrawPrimitives() continue; // skip ASSERT_M( NoteRowToBeat(i) > -2000, ssprintf("%i %i %i, %f %f", i, iLastIndexToDraw, iFirstIndexToDraw, GAMESTATE->m_fSongBeat, GAMESTATE->m_fMusicSeconds) ); - SearchForBeat( CurDisplay, NextDisplay, NoteRowToBeat(i) ); - const NoteDisplayCols *nd = CurDisplay->second; // See if there is a hold step that begins on this index. Only do this // if the note skin cares. bool bHoldNoteBeginsOnThisBeat = false; - if( nd->display[c].DrawHoldHeadForTapsOnSameRow() ) + if( LastDisplay->display[c].DrawHoldHeadForTapsOnSameRow() ) { for( int c2=0; c2GetNumTracks(); c2++ ) { @@ -819,11 +731,11 @@ void NoteField::DrawPrimitives() Sprite sprite; sprite.Load( THEME->GetPathG("NoteField","attack "+tn.sAttackModifiers) ); float fBeat = NoteRowToBeat(i); - nd->display[c].DrawActor( &sprite, c, fBeat, bIsInSelectionRange ? fSelectedRangeGlow : m_fPercentFadeToFail, 1, m_fYReverseOffsetPixels, false, NotePart_Tap ); + LastDisplay->display[c].DrawActor( &sprite, c, fBeat, bIsInSelectionRange ? fSelectedRangeGlow : m_fPercentFadeToFail, 1, m_fYReverseOffsetPixels, false, NotePart_Tap ); } else { - nd->display[c].DrawTap( c, NoteRowToBeat(i), bHoldNoteBeginsOnThisBeat, bIsAddition, bIsMine, bIsInSelectionRange ? fSelectedRangeGlow : m_fPercentFadeToFail, 1, m_fYReverseOffsetPixels ); + LastDisplay->display[c].DrawTap( c, NoteRowToBeat(i), bHoldNoteBeginsOnThisBeat, bIsAddition, bIsMine, bIsInSelectionRange ? fSelectedRangeGlow : m_fPercentFadeToFail, 1, m_fYReverseOffsetPixels ); } } diff --git a/stepmania/src/NoteField.h b/stepmania/src/NoteField.h index 77abd05e46..7d5536dca8 100644 --- a/stepmania/src/NoteField.h +++ b/stepmania/src/NoteField.h @@ -39,7 +39,6 @@ public: void DidHoldNote( int iCol, HoldNoteScore score, bool bBright ); const PlayerState *GetPlayerState() const { return m_pPlayerState; } - void RefreshBeatToNoteSkin(); protected: void CacheAllUsedNoteSkins(); @@ -77,16 +76,8 @@ protected: /* All loaded note displays, mapped by their name. */ map m_NoteDisplays; - int m_LastSeenBeatToNoteSkinRev; - - /* Map of beat->NoteDisplayCols. This is updated whenever GAMESTATE-> changes. */ - typedef map NDMap; - void SearchForBeat( NDMap::iterator &cur, NDMap::iterator &next, float Beat ); - NoteDisplayCols *SearchForBeat( float Beat ); NoteDisplayCols *SearchForSongBeat(); - NDMap m_BeatToNoteDisplays; - NoteDisplayCols *LastDisplay; // used in MODE_EDIT diff --git a/stepmania/src/PlayerState.cpp b/stepmania/src/PlayerState.cpp index 7310659962..193ab19edc 100644 --- a/stepmania/src/PlayerState.cpp +++ b/stepmania/src/PlayerState.cpp @@ -2,12 +2,6 @@ #include "PlayerState.h" #include "GameState.h" -void PlayerState::ResetNoteSkins() -{ - m_BeatToNoteSkin.clear(); - m_BeatToNoteSkin[-1000] = m_PlayerOptions.m_sNoteSkin; -} - void PlayerState::Update( float fDelta ) { m_CurrentPlayerOptions.Approach( m_PlayerOptions, fDelta ); diff --git a/stepmania/src/PlayerState.h b/stepmania/src/PlayerState.h index cf7a9daf8b..edf605102b 100644 --- a/stepmania/src/PlayerState.h +++ b/stepmania/src/PlayerState.h @@ -25,7 +25,6 @@ public: m_StagePlayerOptions.Init(); m_StoredPlayerOptions.Init(); - m_BeatToNoteSkin.clear(); m_fLastDrawnBeat = -100; m_HealthState = ALIVE; @@ -48,7 +47,6 @@ public: m_Inventory[i].MakeBlank(); } - void ResetNoteSkins(); void Update( float fDelta ); // TODO: Remove use of PlayerNumber. All data about the player should live @@ -66,7 +64,6 @@ public: // // Used in Gameplay // - map m_BeatToNoteSkin; mutable float m_fLastDrawnBeat; // Set by NoteField. Used to push NoteSkin-changing modifers back so that the NoteSkin doesn't pop. enum HealthState { HOT, ALIVE, DANGER, DEAD }; diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index c4086324b3..0f6dee6f7d 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -998,7 +998,9 @@ void ScreenGameplay::SetupSong( int iSongIndex ) a.sModifiers = po.m_sNoteSkin; GAMESTATE->LaunchAttack( pi->GetPlayerStateAndStageStatsIndex(), a ); - GAMESTATE->m_SongOptions.FromString( a.sModifiers ); + + /* Update attack bOn flags. */ + pi->GetPlayerState()->Update(0); }