diff --git a/stepmania/src/GameCommand.cpp b/stepmania/src/GameCommand.cpp index a3682ac943..9572f87329 100644 --- a/stepmania/src/GameCommand.cpp +++ b/stepmania/src/GameCommand.cpp @@ -85,7 +85,7 @@ bool GameCommand::DescribesCurrentModeForAllPlayers() const bool GameCommand::DescribesCurrentMode( PlayerNumber pn ) const { - if( m_pGame != NULL && m_pGame != GAMESTATE->m_pCurGame ) + if( m_pGame != NULL && m_pGame != GAMESTATE->m_pCurGame.Get() ) return false; if( m_pm != PLAY_MODE_INVALID && GAMESTATE->m_PlayMode != m_pm ) return false; @@ -728,7 +728,7 @@ void GameCommand::ApplySelf( const vector &vpns ) const const PlayMode OldPlayMode = GAMESTATE->m_PlayMode; if( m_pGame != NULL ) - GAMESTATE->m_pCurGame = m_pGame; + GAMESTATE->SetCurGame( m_pGame ); if( m_pm != PLAY_MODE_INVALID ) GAMESTATE->m_PlayMode.Set( m_pm ); diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index f161ec04f5..a6b50a24a5 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -36,6 +36,7 @@ #include "LuaReference.h" #include "CommonMetrics.h" #include "CharacterManager.h" +#include "Game.h" #include #include @@ -62,6 +63,7 @@ Song* GameState::GetDefaultSong() const GameState::GameState() : + m_pCurGame( Message_CurrentGameChanged ), m_pCurStyle( Message_CurrentStyleChanged ), m_PlayMode( Message_PlayModeChanged ), m_sPreferredSongGroup( Message_PreferredSongGroupChanged ), @@ -82,7 +84,7 @@ GameState::GameState() : { m_pCurStyle.Set( NULL ); - m_pCurGame = NULL; + m_pCurGame.Set( NULL ); m_iCoins = 0; m_timeGameStarted.SetZero(); m_bDemonstrationOrJukebox = false; @@ -576,6 +578,13 @@ void GameState::Update( float fDelta ) } } +void GameState::SetCurGame( const Game *pGame ) +{ + m_pCurGame.Set( pGame ); + CString sGame = pGame ? CString(pGame->m_szName) : CString(); + PREFSMAN->m_sCurrentGame.Set( sGame ); +} + const float GameState::MUSIC_SECONDS_INVALID = -5000.0f; void GameState::ResetMusicStatistics() diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index c9691ae451..9b2674312a 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -52,7 +52,8 @@ public: // // Main state info // - const Game* m_pCurGame; + void SetCurGame( const Game *pGame ); // Call this instead of m_pCurGame.Set to make sure PREFSMAN->m_sCurrentGame stays in sync + BroadcastOnChangePtr m_pCurGame; BroadcastOnChangePtr m_pCurStyle; bool m_bSideIsJoined[NUM_PLAYERS]; // left side, right side bool m_bIsMultiPlayerJoined[NUM_MultiPlayer]; diff --git a/stepmania/src/MessageManager.cpp b/stepmania/src/MessageManager.cpp index d29f0a4e34..ed7fe7db0c 100644 --- a/stepmania/src/MessageManager.cpp +++ b/stepmania/src/MessageManager.cpp @@ -12,6 +12,7 @@ MessageManager* MESSAGEMAN = NULL; // global and accessable from anywhere in our static const CString MessageNames[] = { + "CurrentGameChanged", "CurrentStyleChanged", "PlayModeChanged", "CurrentSongChanged", diff --git a/stepmania/src/MessageManager.h b/stepmania/src/MessageManager.h index 1dfac1d412..bac15059b9 100644 --- a/stepmania/src/MessageManager.h +++ b/stepmania/src/MessageManager.h @@ -27,6 +27,7 @@ struct lua_State; enum Message { + Message_CurrentGameChanged, Message_CurrentStyleChanged, Message_PlayModeChanged, Message_CurrentSongChanged, diff --git a/stepmania/src/NetworkSyncManager.cpp b/stepmania/src/NetworkSyncManager.cpp index 033f9cb4b9..bca7dace58 100644 --- a/stepmania/src/NetworkSyncManager.cpp +++ b/stepmania/src/NetworkSyncManager.cpp @@ -684,7 +684,7 @@ void NetworkSyncManager::ProcessInput() GameName = m_packet.ReadNT(); StyleName = m_packet.ReadNT(); - GAMESTATE->m_pCurGame = GAMEMAN->StringToGameType( GameName ); + GAMESTATE->SetCurGame( GAMEMAN->StringToGameType(GameName) ); GAMESTATE->m_pCurStyle.Set( GAMEMAN->GameAndStringToStyle(GAMESTATE->m_pCurGame,StyleName) ); SCREENMAN->SetNewScreen( "ScreenNetSelectMusic" ); //Should this be metric'd out? diff --git a/stepmania/src/Preference.h b/stepmania/src/Preference.h index ef01b53199..8f1de4badd 100644 --- a/stepmania/src/Preference.h +++ b/stepmania/src/Preference.h @@ -59,7 +59,7 @@ public: m_currentValue = m_defaultValue; } - T Get() const + const T &Get() const { return m_currentValue; } diff --git a/stepmania/src/PrefsManager.cpp b/stepmania/src/PrefsManager.cpp index 5cc93b5bff..accc2d5b3d 100644 --- a/stepmania/src/PrefsManager.cpp +++ b/stepmania/src/PrefsManager.cpp @@ -425,7 +425,7 @@ void PrefsManager::ResetToFactoryDefaults() SavePrefsToDisk(); } -void PrefsManager::ReadPrefsFromFile( CString sIni ) +void PrefsManager::ReadPrefsFromFile( const CString &sIni ) { IniFile ini; if( !ini.ReadFile(sIni) ) @@ -512,13 +512,19 @@ CString PrefsManager::GetMovieDrivers() return m_sMovieDrivers; } -CString PrefsManager::GetLightsDriver() { +CString PrefsManager::GetLightsDriver() +{ if ( m_sLightsDriver.Get().empty() ) return (CString)DEFAULT_LIGHTS_DRIVER; else return m_sLightsDriver; } +PrefsManager::GamePrefs &PrefsManager::GetCurrentGamePrefs() +{ + ASSERT( !m_sCurrentGame.Get().empty() ); + return m_mapGameNameToGamePrefs[m_sCurrentGame]; +} // lua start #include "LuaBinding.h" diff --git a/stepmania/src/PrefsManager.h b/stepmania/src/PrefsManager.h index 49a6ff0075..5060e117d1 100644 --- a/stepmania/src/PrefsManager.h +++ b/stepmania/src/PrefsManager.h @@ -283,7 +283,7 @@ public: }; map m_mapGameNameToGamePrefs; - GamePrefs &GetCurrentGamePrefs() { return m_mapGameNameToGamePrefs[m_sCurrentGame]; } // inserts if not already present + GamePrefs &GetCurrentGamePrefs(); void SaveGamePrefsToDisk(); void ReadGamePrefsFromDisk(); @@ -293,7 +293,7 @@ public: void PushSelf( lua_State *L ); protected: - void ReadPrefsFromFile( CString sIni ); + void ReadPrefsFromFile( const CString &sIni ); }; diff --git a/stepmania/src/ScreenTitleMenu.cpp b/stepmania/src/ScreenTitleMenu.cpp index c390f80bd9..d28fa72043 100644 --- a/stepmania/src/ScreenTitleMenu.cpp +++ b/stepmania/src/ScreenTitleMenu.cpp @@ -104,7 +104,7 @@ void ScreenTitleMenu::Input( const InputEventPlus &input ) if( iter == vGames.end() ) iter = vGames.begin(); - GAMESTATE->m_pCurGame = *iter; + GAMESTATE->SetCurGame( *iter ); /* Reload the theme if it's changed, but don't back to the initial screen. */ ResetGame(); diff --git a/stepmania/src/StepMania.cpp b/stepmania/src/StepMania.cpp index 939d9e4d2e..7d32cdf498 100644 --- a/stepmania/src/StepMania.cpp +++ b/stepmania/src/StepMania.cpp @@ -747,11 +747,7 @@ void ChangeCurrentGame( const Game* g ) INPUTMAPPER->SaveMappingsToDisk(); // save mappings before switching the game - GAMESTATE->m_pCurGame = g; - - /* Load this game's preferences. If we just set an unavailable game type, this - * will change it back to the default. */ - PREFSMAN->m_sCurrentGame.Set( g->m_szName ); + GAMESTATE->SetCurGame( g ); /* Save the newly-selected game. */ PREFSMAN->SavePrefsToDisk(); @@ -771,21 +767,21 @@ void ReadGamePrefsFromDisk( bool bSwitchToLastPlayedGame ) { ASSERT( GAMEMAN != NULL ); CString sGame; - GAMESTATE->m_pCurGame = NULL; + GAMESTATE->SetCurGame( NULL ); if( !PREFSMAN->m_sCurrentGame.Get().empty() ) - GAMESTATE->m_pCurGame = GAMEMAN->StringToGameType( PREFSMAN->m_sCurrentGame ); + GAMESTATE->SetCurGame( GAMEMAN->StringToGameType(PREFSMAN->m_sCurrentGame) ); } /* If the active game type isn't actually available, revert to the default. */ if( GAMESTATE->m_pCurGame == NULL ) { - GAMESTATE->m_pCurGame = GAMEMAN->GetDefaultGame(); + GAMESTATE->SetCurGame( GAMEMAN->GetDefaultGame() ); } else if( !GAMEMAN->IsGameEnabled( GAMESTATE->m_pCurGame ) && GAMESTATE->m_pCurGame != GAMEMAN->GetDefaultGame() ) { LOG->Warn( "Default NoteSkin for \"%s\" missing, reverting to \"%s\"", GAMESTATE->m_pCurGame->m_szName, GAMEMAN->GetDefaultGame()->m_szName ); - GAMESTATE->m_pCurGame = GAMEMAN->GetDefaultGame(); + GAMESTATE->SetCurGame( GAMEMAN->GetDefaultGame() ); } /* Load keymaps for the new game. */