Fixed two theme switcher bugs, griped about Lua, added LoadGroupColors to SONGMAN
authorMark Cannon <vyhdycokio@gmail.com>
Thu, 19 Jun 2008 06:53:35 +0000 (06:53 +0000)
committerMark Cannon <vyhdycokio@gmail.com>
Thu, 19 Jun 2008 06:53:35 +0000 (06:53 +0000)
git-svn-id: https://openitg.svn.sourceforge.net/svnroot/openitg@391 83fadc84-e282-4d84-a09a-c4228d6ae7e5

changelog.txt
src/GameCommand.cpp
src/LuaReference.h
src/SongManager.cpp
src/SongManager.h

index 333f559..7c77b58 100755 (executable)
@@ -17,6 +17,8 @@ OpenITG, alpha 7 (in development)
 -Fixed bugs:
     (OpenGL) Arrow shader fails on full-screen, causing scrolling brackets
     Actor sounds ignore attract sound settings
+    After switching themes, OpenITG crashes on the songwheel
+    Theme switching sometimes causes failed asserts
     Phantom input when canceling custom song loads
     ScreenArcadeStart loops endlessly until manual exit
 -Fixed mistakes:
index 1cc47f4..784220b 100755 (executable)
@@ -737,21 +737,30 @@ void GameCommand::ApplySelf( const vector<PlayerNumber> &vpns ) const
        if( m_sModifiers != "" )
                FOREACH_CONST( PlayerNumber, vpns, pn )
                        GAMESTATE->ApplyModifiers( *pn, m_sModifiers );
-       if( m_LuaFunction.IsSet() )
+
+       /* do this here, so we load new metrics before attempting screen loads.
+        * IMPORTANT: re-cache SONGMAN metrics so we don't encounter an ugly crash. */
+       if( m_sTheme != "" && m_sTheme != THEME->GetCurThemeName() )
        {
+               THEME->SwitchThemeAndLanguage( m_sTheme, THEME->GetCurLanguage() );
+               SONGMAN->LoadGroupColors();
+       }
+
+       /* This demonstrates a non-trivial error in the LUA subsystem,
+        * or a grave misunderstanding on my part. Why can the LUA
+        * function be set with no actual data?
+        * Oh well. We can get away with just ignoring it here.
+        * -- Vyhd */
+       if( m_LuaFunction.IsSet() && m_LuaFunction.GetExpression() != "" )
+       {
+
                Lua *L = LUA->Get();
                FOREACH_CONST( PlayerNumber, vpns, pn )
                {
                        m_LuaFunction.PushSelf( L );
 
-                       /* UGLY DISGUSTING HACK: if theme switching, work around a
-                        * crash here. We'll find the actual cause before long... */
-                       if( lua_isnil(L, -1) && m_sTheme != "" )
-                               break;
-
                        ASSERT( !lua_isnil(L, -1) );
 
-
                        lua_pushnumber( L, *pn ); // 1st parameter
                        lua_call( L, 1, 0 ); // call function with 1 argument and 0 results
                }
@@ -806,10 +815,6 @@ void GameCommand::ApplySelf( const vector<PlayerNumber> &vpns ) const
        if( m_bStopMusic )
                SOUND->StopMusic();
 
-       /* do this here, so we load new metrics before attempting screen loads */
-       if( m_sTheme != "" && m_sTheme != THEME->GetCurThemeName() )
-               THEME->SwitchThemeAndLanguage( m_sTheme, THEME->GetCurLanguage() );
-
        FOREACH_CONST( CString, m_vsScreensToPrepare, s )
                SCREENMAN->PrepareScreen( *s );
        if( m_bDeletePreparedScreens )
index cc011a7..acbdc56 100755 (executable)
@@ -57,7 +57,7 @@ class LuaExpression: public LuaReference
 public:
        LuaExpression( const CString &sExpression = "" ) { if( sExpression != "" ) SetFromExpression( sExpression ); }
        void SetFromExpression( const CString &sExpression );
-
+       CString GetExpression() const { return m_sExpression; }
 protected:
        virtual void Register();
 
index 95807bf..b121bae 100755 (executable)
@@ -54,10 +54,7 @@ CString COURSE_GROUP_COLOR_NAME( size_t i ) { return ssprintf("CourseGroupColor%
 
 SongManager::SongManager()
 {
-       NUM_SONG_GROUP_COLORS   .Load("SongManager","NumSongGroupColors");
-       SONG_GROUP_COLOR                .Load("SongManager",SONG_GROUP_COLOR_NAME,NUM_SONG_GROUP_COLORS);
-       NUM_COURSE_GROUP_COLORS .Load("SongManager","NumCourseGroupColors");
-       COURSE_GROUP_COLOR              .Load("SongManager",COURSE_GROUP_COLOR_NAME,NUM_COURSE_GROUP_COLORS);
+       LoadGroupColors();
 }
 
 SongManager::~SongManager()
@@ -68,6 +65,14 @@ SongManager::~SongManager()
        FreeSongs();
 }
 
+void SongManager::LoadGroupColors()
+{
+       NUM_SONG_GROUP_COLORS   .Load("SongManager","NumSongGroupColors");
+       SONG_GROUP_COLOR                .Load("SongManager",SONG_GROUP_COLOR_NAME,NUM_SONG_GROUP_COLORS);
+       NUM_COURSE_GROUP_COLORS .Load("SongManager","NumCourseGroupColors");
+       COURSE_GROUP_COLOR              .Load("SongManager",COURSE_GROUP_COLOR_NAME,NUM_COURSE_GROUP_COLORS);
+}
+
 void SongManager::InitAll( LoadingWindow *ld )
 {
        InitSongsFromDisk( ld );
@@ -450,14 +455,19 @@ bool SongManager::DoesGroupExist( CString sGroupName )
 
 RageColor SongManager::GetSongGroupColor( const CString &sSongGroupName )
 {
+       CHECKPOINT;
        // search for the group index
        unsigned i;
        for( i=0; i<m_sSongGroupNames.size(); i++ )
        {
                if( m_sSongGroupNames[i] == sSongGroupName )
+               {
+                       CHECKPOINT_M( "Found group name." );
                        break;
+               }
        }
        ASSERT_M( i != m_sSongGroupNames.size(), sSongGroupName );      // this is not a valid group
+       CHECKPOINT_M( "Assert not met." );
 
        return SONG_GROUP_COLOR.GetValue( i%NUM_SONG_GROUP_COLORS );
 }
index eb706ae..8cde0c8 100755 (executable)
@@ -28,6 +28,7 @@ public:
        void InitSongsFromDisk( LoadingWindow *ld );
        void FreeSongs();
        void Cleanup();
+       void LoadGroupColors();
 
        void Invalidate( Song *pStaleSong );
        void RevertFromDisk( Song *pSong, bool bAllowNotesLoss=false );