From a1225289740f349b4e8454ca0c1b3ec79d64824f Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Fri, 6 May 2005 10:48:32 +0000 Subject: [PATCH] Allow AutoActors for Stage and CouseNumber --- stepmania/src/GameConstantsAndTypes.cpp | 19 +++++++++++ stepmania/src/GameConstantsAndTypes.h | 23 +++++++++++++ stepmania/src/GameState.cpp | 45 +++++++++++++------------ stepmania/src/GameState.h | 4 +-- stepmania/src/PrefsManager.cpp | 2 ++ stepmania/src/PrefsManager.h | 2 ++ stepmania/src/ScreenEvaluation.cpp | 4 +-- stepmania/src/ScreenGameplay.cpp | 40 +++++++++++----------- stepmania/src/ScreenGameplay.h | 8 +++-- stepmania/src/ScreenSelectMusic.cpp | 27 +++++++-------- stepmania/src/ScreenSelectMusic.h | 2 +- stepmania/src/ScreenStage.cpp | 2 +- 12 files changed, 113 insertions(+), 65 deletions(-) diff --git a/stepmania/src/GameConstantsAndTypes.cpp b/stepmania/src/GameConstantsAndTypes.cpp index 23beb084a7..b68bc55795 100644 --- a/stepmania/src/GameConstantsAndTypes.cpp +++ b/stepmania/src/GameConstantsAndTypes.cpp @@ -319,6 +319,25 @@ static void LuaGoalType(lua_State* L) REGISTER_WITH_LUA_FUNCTION( LuaGoalType ); +static const CString StageNames[] = { + "1", + "2", + "3", + "4", + "5", + "6", + "Final", + "Extra1", + "Extra2", + "Nonstop", + "Oni", + "Endless", + "Event", + "Demo", +}; +XToString( Stage, NUM_STAGES ); + + #include "LuaFunctions.h" LuaFunction_NoArgs( CoinMode, CoinModeToString(PREFSMAN->m_CoinMode) ) LuaFunction_NoArgs( Premium, PremiumToString(PREFSMAN->m_Premium) ) diff --git a/stepmania/src/GameConstantsAndTypes.h b/stepmania/src/GameConstantsAndTypes.h index 8e5c5a7861..0a752816df 100644 --- a/stepmania/src/GameConstantsAndTypes.h +++ b/stepmania/src/GameConstantsAndTypes.h @@ -382,6 +382,29 @@ enum EditMode }; +enum Stage +{ + STAGE_1, + STAGE_2, + STAGE_3, + STAGE_4, + STAGE_5, + STAGE_6, + STAGE_FINAL, + STAGE_EXTRA1, + STAGE_EXTRA2, + STAGE_NONSTOP, + STAGE_ONI, + STAGE_ENDLESS, + STAGE_EVENT, + STAGE_DEMO, + NUM_STAGES, + STAGE_INVALID, +}; +#define FOREACH_Stage( s ) FOREACH_ENUM( Stage, NUM_STAGES, s ) +const CString& StageToString( Stage s ); + + #endif /* diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 04e6eb3af8..02015af875 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -724,33 +724,26 @@ bool GameState::IsExtraStage2() const return m_iCurrentStageIndex == PREFSMAN->m_iSongsPerPlay+1; } -CString GameState::GetStageText() const +Stage GameState::GetCurrentStage() const { - if( m_bDemonstrationOrJukebox ) return "demo"; + if( m_bDemonstrationOrJukebox ) return STAGE_DEMO; // "event" has precedence - else if( GAMESTATE->IsEventMode() ) return "event"; - else if( m_PlayMode == PLAY_MODE_ONI ) return "oni"; - else if( m_PlayMode == PLAY_MODE_NONSTOP ) return "nonstop"; - else if( m_PlayMode == PLAY_MODE_ENDLESS ) return "endless"; - else if( IsFinalStage() ) return "final"; - else if( IsExtraStage() ) return "extra1"; - else if( IsExtraStage2() ) return "extra2"; - else return ssprintf("%d",m_iCurrentStageIndex+1); + else if( GAMESTATE->IsEventMode() ) return STAGE_EVENT; + else if( m_PlayMode == PLAY_MODE_ONI ) return STAGE_ONI; + else if( m_PlayMode == PLAY_MODE_NONSTOP ) return STAGE_NONSTOP; + else if( m_PlayMode == PLAY_MODE_ENDLESS ) return STAGE_ENDLESS; + else if( IsFinalStage() ) return STAGE_FINAL; + else if( IsExtraStage() ) return STAGE_EXTRA1; + else if( IsExtraStage2() ) return STAGE_EXTRA2; + else return (Stage)(STAGE_1+m_iCurrentStageIndex); } -void GameState::GetAllStageTexts( CStringArray &out ) const +void GameState::GetPossibleStages( vector &out ) const { + // Optimze me so that we don't load graphics that can't possibly be shown out.clear(); - out.push_back( "demo" ); - out.push_back( "oni" ); - out.push_back( "nonstop" ); - out.push_back( "endless" ); - out.push_back( "event" ); - out.push_back( "final" ); - out.push_back( "extra1" ); - out.push_back( "extra2" ); - for( int stage = 0; stage < PREFSMAN->m_iSongsPerPlay; ++stage ) - out.push_back( ssprintf("%d",stage+1) ); + FOREACH_Stage( s ) + out.push_back( s ); } int GameState::GetCourseSongIndex() const @@ -2071,7 +2064,6 @@ LuaFunction_NoArgs( NumStagesLeft, GAMESTATE->GetNumStagesLeft() ) LuaFunction_NoArgs( IsFinalStage, GAMESTATE->IsFinalStage() ) LuaFunction_NoArgs( IsExtraStage, GAMESTATE->IsExtraStage() ) LuaFunction_NoArgs( IsExtraStage2, GAMESTATE->IsExtraStage2() ) -LuaFunction_NoArgs( GetStageText, GAMESTATE->GetStageText() ) LuaFunction_NoArgs( CourseSongIndex, GAMESTATE->GetCourseSongIndex() ) LuaFunction_NoArgs( PlayModeName, PlayModeToString(GAMESTATE->m_PlayMode) ) LuaFunction_NoArgs( CurStyleName, CString( GAMESTATE->m_pCurStyle == NULL ? "none": GAMESTATE->GetCurrentStyle()->m_szName ) ) @@ -2091,6 +2083,15 @@ int LuaFunc_UsingModifier( lua_State *L ) } LuaFunction( UsingModifier ); +CString GetStageText() +{ + // all lowercase or compatibility with scripts + CString s = StageToString( GAMESTATE->GetCurrentStage() ); + s.MakeLower(); + return s; +} +LuaFunction_NoArgs( GetStageText, GetStageText() ) + /* * (c) 2001-2004 Chris Danford, Glenn Maynard, Chris Gomez * All rights reserved. diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 5d53e98ab1..d3e0671713 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -121,8 +121,8 @@ public: bool IsFinalStage() const; bool IsExtraStage() const; bool IsExtraStage2() const; - CString GetStageText() const; - void GetAllStageTexts( CStringArray &out ) const; + Stage GetCurrentStage() const; + void GetPossibleStages( vector &out ) const; int GetCourseSongIndex() const; CString GetPlayerDisplayName( PlayerNumber pn ) const; diff --git a/stepmania/src/PrefsManager.cpp b/stepmania/src/PrefsManager.cpp index 94a6cd3590..8c594665d3 100644 --- a/stepmania/src/PrefsManager.cpp +++ b/stepmania/src/PrefsManager.cpp @@ -450,6 +450,8 @@ void PrefsManager::ReadGlobalPrefsFromIni( const IniFile &ini ) FOREACHS_CONST( IPreference*, *SubscriptionManager::s_pSubscribers, p ) (*p)->ReadFrom( ini ); + + CLAMP( m_iSongsPerPlay.Value(), 0, MAX_SONGS_PER_PLAY ); } void PrefsManager::SaveGlobalPrefsToDisk() const diff --git a/stepmania/src/PrefsManager.h b/stepmania/src/PrefsManager.h index 0e11271e59..2dfc527774 100644 --- a/stepmania/src/PrefsManager.h +++ b/stepmania/src/PrefsManager.h @@ -9,6 +9,8 @@ #include "Preference.h" class IniFile; +const int MAX_SONGS_PER_PLAY = 7; + class PrefsManager { public: diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index 859d3eee0f..a67d61471b 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -327,7 +327,7 @@ void ScreenEvaluation::Init() SET_XY_AND_ON_COMMAND( m_sprLargeBannerFrame ); this->AddChild( m_sprLargeBannerFrame ); - m_sprStage.Load( THEME->GetPathG(m_sName,"stage "+GAMESTATE->GetStageText()) ); + m_sprStage.Load( THEME->GetPathG(m_sName,"stage "+StageToString(GAMESTATE->GetCurrentStage())) ); m_sprStage->SetName( "Stage" ); SET_XY_AND_ON_COMMAND( m_sprStage ); this->AddChild( m_sprStage ); @@ -365,7 +365,7 @@ void ScreenEvaluation::Init() SET_XY_AND_ON_COMMAND( m_sprLargeBannerFrame ); this->AddChild( m_sprLargeBannerFrame ); - m_sprStage.Load( THEME->GetPathG(m_sName,"stage "+GAMESTATE->GetStageText()) ); + m_sprStage.Load( THEME->GetPathG(m_sName,"stage "+StageToString(GAMESTATE->GetCurrentStage())) ); m_sprStage->SetName( "Stage" ); SET_XY_AND_ON_COMMAND( m_sprStage ); this->AddChild( m_sprStage ); diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 26fcb32ae3..bc0648695a 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -295,9 +295,9 @@ void ScreenGameplay::Init() // Add LifeFrame // m_sprLifeFrame.Load( THEME->GetPathG(m_sName,bBattery?"oni life frame":"life frame") ); - m_sprLifeFrame.SetName( "LifeFrame" ); + m_sprLifeFrame->SetName( "LifeFrame" ); SET_XY( m_sprLifeFrame ); - this->AddChild( &m_sprLifeFrame ); + this->AddChild( m_sprLifeFrame ); // // Add score frame @@ -456,11 +456,7 @@ void ScreenGameplay::Init() // // Add stage / SongNumber // - m_sprStage.SetName( "Stage" ); - SET_XY( m_sprStage ); - m_sprCourseSongNumber.SetName( "CourseSongNumber" ); - SET_XY( m_sprCourseSongNumber ); FOREACH_EnabledPlayer(p) { @@ -485,13 +481,21 @@ void ScreenGameplay::Init() case PLAY_MODE_REGULAR: case PLAY_MODE_BATTLE: case PLAY_MODE_RAVE: - m_sprStage.Load( THEME->GetPathG(m_sName,"stage "+GAMESTATE->GetStageText()) ); - this->AddChild( &m_sprStage ); + m_sprStage.Load( THEME->GetPathG(m_sName,"stage "+StageToString(GAMESTATE->GetCurrentStage())) ); + m_sprStage->SetName( "Stage" ); + SET_XY( m_sprStage ); + this->AddChild( m_sprStage ); break; case PLAY_MODE_NONSTOP: case PLAY_MODE_ONI: case PLAY_MODE_ENDLESS: - this->AddChild( &m_sprCourseSongNumber ); + for( int i=0; iGetPathG( m_sName, ssprintf("course song %i",i+1)) ); + m_sprCourseSongNumber[i]->SetName( "CourseSongNumber" ); + SET_XY( m_sprCourseSongNumber[i] ); + this->AddChild( m_sprCourseSongNumber[i] ); + } FOREACH_EnabledPlayer( p ) this->AddChild( &m_textCourseSongNumber[p] ); @@ -859,16 +863,12 @@ void ScreenGameplay::SetupSong( int iSongIndex ) } } -void ScreenGameplay::LoadCourseSongNumber( int SongNumber ) +void ScreenGameplay::LoadCourseSongNumber( int iSongNumber ) { if( !GAMESTATE->IsCourseMode() ) return; - - const CString path = THEME->GetPathG( m_sName, ssprintf("course song %i",SongNumber+1), true ); - if( path != "" ) - m_sprCourseSongNumber.Load( path ); - else - m_sprCourseSongNumber.UnloadTexture(); + for( int i=0; iSetHidden( i != iSongNumber ); } void ScreenGameplay::LoadNextSong() @@ -2398,13 +2398,13 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) m_NextSong.Reset(); m_NextSong.StartTransitioning( SM_LoadNextSong ); LoadCourseSongNumber( GAMESTATE->GetCourseSongIndex()+1 ); - COMMAND( m_sprCourseSongNumber, "ChangeIn" ); + COMMAND( m_sprCourseSongNumber[GAMESTATE->GetCourseSongIndex()], "ChangeIn" ); } else if( SM == SM_LoadNextSong ) { SongFinished(); - COMMAND( m_sprCourseSongNumber, "ChangeOut" ); + COMMAND( m_sprCourseSongNumber[GAMESTATE->GetCourseSongIndex()], "ChangeOut" ); LoadNextSong(); GAMESTATE->m_bPastHereWeGo = true; @@ -2541,7 +2541,7 @@ void ScreenGameplay::TweenOnScreen() { ON_COMMAND( m_sprLifeFrame ); ON_COMMAND( m_sprStage ); - ON_COMMAND( m_sprCourseSongNumber ); + ON_COMMAND( m_sprCourseSongNumber[GAMESTATE->GetCourseSongIndex()] ); ON_COMMAND( m_sprStageFrame ); ON_COMMAND( m_textSongOptions ); ON_COMMAND( m_sprScoreFrame ); @@ -2579,7 +2579,7 @@ void ScreenGameplay::TweenOffScreen() OFF_COMMAND( m_sprLifeFrame ); OFF_COMMAND( m_sprStage ); - OFF_COMMAND( m_sprCourseSongNumber ); + OFF_COMMAND( m_sprCourseSongNumber[GAMESTATE->GetCourseSongIndex()] ); OFF_COMMAND( m_sprStageFrame ); OFF_COMMAND( m_textSongOptions ); OFF_COMMAND( m_sprScoreFrame ); diff --git a/stepmania/src/ScreenGameplay.h b/stepmania/src/ScreenGameplay.h index b3e86ba9af..7af0c777bf 100644 --- a/stepmania/src/ScreenGameplay.h +++ b/stepmania/src/ScreenGameplay.h @@ -29,6 +29,8 @@ class Inventory; AutoScreenMessage( SM_NotesEnded ) +const int MAX_COURSE_SONG_NUMBER_GRAPHICS = 5; + class LyricsLoader; class ScreenGameplay : public ScreenWithMenuElements { @@ -104,11 +106,11 @@ protected: Transition m_SongFinished; // shows after each song, course or not Sprite m_sprStaticBackground; - Sprite m_sprLifeFrame; + AutoActor m_sprLifeFrame; LifeMeter* m_pLifeMeter[NUM_PLAYERS]; CombinedLifeMeter* m_pCombinedLifeMeter; - Sprite m_sprStage; - Sprite m_sprCourseSongNumber; + AutoActor m_sprStage; + AutoActor m_sprCourseSongNumber[MAX_COURSE_SONG_NUMBER_GRAPHICS]; AutoActor m_sprStageFrame; BitmapText m_textCourseSongNumber[NUM_PLAYERS]; BitmapText m_textStepsDescription[NUM_PLAYERS]; diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index 11a3e7d193..ba44215032 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -183,21 +183,17 @@ void ScreenSelectMusic::Init() this->AddChild( &m_DifficultyDisplay ); { - CStringArray StageTexts; - GAMESTATE->GetAllStageTexts( StageTexts ); - for( unsigned i = 0; i < StageTexts.size(); ++i ) + vector vStages; + GAMESTATE->GetPossibleStages( vStages ); + FOREACH_CONST( Stage, vStages, s ) { - CString path = THEME->GetPathG( m_sName, "stage "+StageTexts[i], true ); - if( path != "" ) - TEXTUREMAN->CacheTexture( path ); + m_sprStage[*s].Load( THEME->GetPathG(m_sName,"stage "+StageToString(*s)) ); + m_sprStage[*s]->SetName( "Stage" ); + SET_XY( m_sprStage[*s] ); + this->AddChild( m_sprStage[*s] ); } } - // loaded in AfterMusicChange - m_sprStage.SetName( "Stage" ); - SET_XY( m_sprStage ); - this->AddChild( &m_sprStage ); - m_sprCDTitleFront.SetName( "CDTitle" ); m_sprCDTitleFront.Load( THEME->GetPathG(m_sName,"fallback cdtitle") ); SET_XY( m_sprCDTitleFront ); @@ -544,7 +540,7 @@ void ScreenSelectMusic::TweenOnScreen() ON_COMMAND( m_sprExplanation ); ON_COMMAND( m_BPMDisplay ); ON_COMMAND( m_DifficultyDisplay ); - ON_COMMAND( m_sprStage ); + ON_COMMAND( m_sprStage[GAMESTATE->GetCurrentStage()] ); ON_COMMAND( m_sprCDTitleFront ); ON_COMMAND( m_sprCDTitleBack ); ON_COMMAND( m_GrooveRadar ); @@ -600,7 +596,7 @@ void ScreenSelectMusic::TweenOffScreen() OFF_COMMAND( m_sprExplanation ); OFF_COMMAND( m_BPMDisplay ); OFF_COMMAND( m_DifficultyDisplay ); - OFF_COMMAND( m_sprStage ); + OFF_COMMAND( m_sprStage[GAMESTATE->GetCurrentStage()] ); OFF_COMMAND( m_sprCDTitleFront ); OFF_COMMAND( m_sprCDTitleBack ); OFF_COMMAND( m_GrooveRadar ); @@ -1842,7 +1838,10 @@ void ScreenSelectMusic::AfterMusicChange() g_StartedLoadingAt.Touch(); // update stage counter display (long versions/marathons) - m_sprStage.Load( THEME->GetPathG(m_sName,"stage "+GAMESTATE->GetStageText()) ); + FOREACH_Stage( s ) + { + m_sprStage[s]->SetHidden( s != GAMESTATE->GetCurrentStage() ); + } if( (int) m_Artists.size() > MAX_COURSE_ENTRIES_BEFORE_VARIOUS ) { diff --git a/stepmania/src/ScreenSelectMusic.h b/stepmania/src/ScreenSelectMusic.h index 89b18ab441..524f739eb1 100644 --- a/stepmania/src/ScreenSelectMusic.h +++ b/stepmania/src/ScreenSelectMusic.h @@ -104,7 +104,7 @@ protected: AutoActor m_sprBannerFrame; AutoActor m_sprExplanation; BPMDisplay m_BPMDisplay; - Sprite m_sprStage; + AutoActor m_sprStage[NUM_STAGES]; Sprite m_sprCDTitleFront, m_sprCDTitleBack; Sprite m_sprDifficultyFrame[NUM_PLAYERS]; DifficultyIcon m_DifficultyIcon[NUM_PLAYERS]; diff --git a/stepmania/src/ScreenStage.cpp b/stepmania/src/ScreenStage.cpp index 6de7150178..61f2ac9b88 100644 --- a/stepmania/src/ScreenStage.cpp +++ b/stepmania/src/ScreenStage.cpp @@ -95,7 +95,7 @@ void ScreenStage::Init() SET_XY_AND_ON_COMMAND( m_Artist ); SET_XY_AND_ON_COMMAND( m_SongTitle ); - SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo("stage "+GAMESTATE->GetStageText()) ); + SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo("stage "+StageToString(GAMESTATE->GetCurrentStage())) ); this->SortByDrawOrder(); }