From 8cde91eb2e15bcbb6be69685f4c8fcc3f418c1fd Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sat, 31 Jan 2015 00:23:54 -0700 Subject: [PATCH] Prevent crashes from an invalid noteskin being set. --- src/NoteField.cpp | 5 +++++ src/NoteSkinManager.cpp | 9 +++++++++ src/NoteSkinManager.h | 4 +++- src/PlayerOptions.cpp | 6 +++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/NoteField.cpp b/src/NoteField.cpp index 1d7672af4d..33a3b04b94 100644 --- a/src/NoteField.cpp +++ b/src/NoteField.cpp @@ -137,7 +137,10 @@ void NoteField::CacheAllUsedNoteSkins() GAMESTATE->GetAllUsedNoteSkins( asSkinsLower ); asSkinsLower.push_back( m_pPlayerState->m_PlayerOptions.GetStage().m_sNoteSkin ); FOREACH( RString, asSkinsLower, s ) + { + NOTESKIN->ValidateNoteSkinName(*s); s->MakeLower(); + } for( unsigned i=0; i < asSkinsLower.size(); ++i ) CacheNoteSkin( asSkinsLower[i] ); @@ -155,6 +158,7 @@ void NoteField::CacheAllUsedNoteSkins() UncacheNoteSkin( *s ); RString sCurrentNoteSkinLower = m_pPlayerState->m_PlayerOptions.GetCurrent().m_sNoteSkin; + NOTESKIN->ValidateNoteSkinName(sCurrentNoteSkinLower); sCurrentNoteSkinLower.MakeLower(); map::iterator it = m_NoteDisplays.find( sCurrentNoteSkinLower ); @@ -165,6 +169,7 @@ void NoteField::CacheAllUsedNoteSkins() FOREACH_EnabledPlayer( pn ) { RString sNoteSkinLower = GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.GetCurrent().m_sNoteSkin; + NOTESKIN->ValidateNoteSkinName(sNoteSkinLower); sNoteSkinLower.MakeLower(); it = m_NoteDisplays.find( sNoteSkinLower ); ASSERT_M( it != m_NoteDisplays.end(), sNoteSkinLower ); diff --git a/src/NoteSkinManager.cpp b/src/NoteSkinManager.cpp index 9d3dd0d7f7..02948b2ddd 100644 --- a/src/NoteSkinManager.cpp +++ b/src/NoteSkinManager.cpp @@ -246,6 +246,15 @@ RString NoteSkinManager::GetDefaultNoteSkinName() return name; } +void NoteSkinManager::ValidateNoteSkinName(RString& name) +{ + if(name.empty() || !DoesNoteSkinExist(name)) + { + LuaHelpers::ReportScriptError("Someone set a noteskin that doesn't exist. Good job."); + name= GetDefaultNoteSkinName(); + } +} + void NoteSkinManager::GetAllNoteSkinNamesForGame( const Game *pGame, vector &AddTo ) { if( pGame == m_pCurGame ) diff --git a/src/NoteSkinManager.h b/src/NoteSkinManager.h index f5ad944020..db06b25719 100644 --- a/src/NoteSkinManager.h +++ b/src/NoteSkinManager.h @@ -25,9 +25,11 @@ public: bool DoNoteSkinsExistForGame( const Game *pGame ); RString GetDefaultNoteSkinName(); // looks up current const Game* in GAMESTATE + void ValidateNoteSkinName(RString& name); + void SetCurrentNoteSkin( const RString &sNoteSkin ) { m_sCurrentNoteSkin = sNoteSkin; } const RString &GetCurrentNoteSkin() { return m_sCurrentNoteSkin; } - void SetPlayerNumber( PlayerNumber pn ) { m_PlayerNumber = pn; } + void SetPlayerNumber( PlayerNumber pn ) { m_PlayerNumber = pn; } void SetGameController( GameController gc ) { m_GameController = gc; } RString GetPath( const RString &sButtonName, const RString &sElement ); bool PushActorTemplate( Lua *L, const RString &sButton, const RString &sElement, bool bSpriteOnly ); diff --git a/src/PlayerOptions.cpp b/src/PlayerOptions.cpp index 8efefb4f0d..94a4991c13 100644 --- a/src/PlayerOptions.cpp +++ b/src/PlayerOptions.cpp @@ -811,7 +811,11 @@ PlayerOptions& PlayerOptions::operator=(PlayerOptions const& other) CPY_SPEED(fPlayerAutoPlay); CPY_SPEED(fPerspectiveTilt); CPY_SPEED(fSkew); - CPY(m_sNoteSkin); + if(!other.m_sNoteSkin.empty() && + NOTESKIN->DoesNoteSkinExist(other.m_sNoteSkin)) + { + CPY(m_sNoteSkin); + } for( int i = 0; i < PlayerOptions::NUM_ACCELS; ++i ) { CPY_SPEED(fAccels[i]);