diff --git a/stepmania/src/GameConstantsAndTypes.cpp b/stepmania/src/GameConstantsAndTypes.cpp index 01c029fd86..979e6c0cbc 100644 --- a/stepmania/src/GameConstantsAndTypes.cpp +++ b/stepmania/src/GameConstantsAndTypes.cpp @@ -408,6 +408,14 @@ LuaXType( Stage ); XToLocalizedString( Stage ); LuaFunction( StageToLocalizedString, StageToLocalizedString(Enum::Check(L, 1)) ); +static const char *EarnedExtraStageNames[] = { + "No", + "Extra1", + "Extra2", +}; +XToString( EarnedExtraStage ); +LuaXType( EarnedExtraStage ); + static const char *MultiPlayerStatusNames[] = { "Joined", diff --git a/stepmania/src/GameConstantsAndTypes.h b/stepmania/src/GameConstantsAndTypes.h index f11b94a701..9ad5b7faf1 100644 --- a/stepmania/src/GameConstantsAndTypes.h +++ b/stepmania/src/GameConstantsAndTypes.h @@ -485,6 +485,18 @@ LuaDeclareType( Stage ); const RString& StageToLocalizedString( Stage i ); +enum EarnedExtraStage +{ + EarnedExtraStage_No, + EarnedExtraStage_Extra1, + EarnedExtraStage_Extra2, + NUM_EarnedExtraStage, + EarnedExtraStage_Invalid +}; +const RString& EarnedExtraStageToString( EarnedExtraStage s ); +LuaDeclareType( EarnedExtraStage ); + + enum ProfileLoadResult { ProfileLoadResult_Success, diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 1343972d28..ee5e2b5584 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -727,7 +727,9 @@ void GameState::FinishStage() m_iNumStagesOfThisSong = 0; - if( HasEarnedExtraStageInternal() ) + EarnedExtraStage e = CalculateEarnedExtraStage(); + STATSMAN->m_CurStageStats.m_EarnedExtraStage = e; + if( e != EarnedExtraStage_No ) { LOG->Trace( "awarded extra stage" ); FOREACH_HumanPlayer( p ) @@ -1217,25 +1219,25 @@ bool GameState::IsBattleMode() const } } -bool GameState::HasEarnedExtraStageInternal() const +EarnedExtraStage GameState::CalculateEarnedExtraStage() const { if( IsEventMode() ) - return false; + return EarnedExtraStage_No; if( !PREFSMAN->m_bAllowExtraStage ) - return false; + return EarnedExtraStage_No; if( m_PlayMode != PLAY_MODE_REGULAR ) - return false; + return EarnedExtraStage_No; if( m_bBackedOutOfFinalStage ) - return false; + return EarnedExtraStage_No; if( GetSmallestNumStagesLeftForAnyHumanPlayer() > 0 ) - return false; + return EarnedExtraStage_No; if( m_iAwardedExtraStages[m_MasterPlayerNumber] >= 2 ) - return false; + return EarnedExtraStage_No; FOREACH_EnabledPlayer( pn ) { @@ -1254,15 +1256,15 @@ bool GameState::HasEarnedExtraStageInternal() const if( IsExtraStage() ) { if( ALLOW_EXTRA_2 && STATSMAN->m_CurStageStats.m_player[pn].GetGrade() <= GRADE_TIER_FOR_EXTRA_2 ) - return true; + return EarnedExtraStage_Extra2; } else if( STATSMAN->m_CurStageStats.m_player[pn].GetGrade() <= GRADE_TIER_FOR_EXTRA_1 ) { - return true; + return EarnedExtraStage_Extra1; } } - return false; + return EarnedExtraStage_No; } PlayerNumber GameState::GetBestPlayer() const diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 4effde01e4..d796681848 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -338,7 +338,7 @@ public: // Keep extra stage logic internal to GameState. private: - bool HasEarnedExtraStageInternal() const; + EarnedExtraStage CalculateEarnedExtraStage() const; int m_iAwardedExtraStages[NUM_PLAYERS]; bool m_bEarnedExtraStage; diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index 9770cbf183..9aaffa6f5b 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -98,6 +98,8 @@ void ScreenEvaluation::Init() ss.m_playMode = GAMESTATE->m_PlayMode; ss.m_pStyle = GAMESTATE->GetCurrentStyle(); ss.m_Stage = Stage_1st; + enum_add( ss.m_Stage, rand()%3 ); + ss.m_EarnedExtraStage = (EarnedExtraStage)(rand() % NUM_EarnedExtraStage); GAMESTATE->m_MasterPlayerNumber = PLAYER_1; GAMESTATE->m_pCurSong.Set( SONGMAN->GetRandomSong() ); ss.m_vpPlayedSongs.push_back( GAMESTATE->m_pCurSong ); @@ -226,22 +228,6 @@ void ScreenEvaluation::Init() m_pStageStats = &m_FinalEvalStageStats; } - m_bFailed = m_pStageStats->AllFailed(); - -/* - // - // Debugging - // - { - FOREACH_PlayerNumber( p ) // foreach line - for( int r=0; rradarPossible[p][r] = 0.5f + r/10.0f; - m_pStageStats->radarActual[p][r] = 0.5f + r/10.0f; - } - } -*/ - // // update persistent statistics // @@ -623,18 +609,9 @@ void ScreenEvaluation::Init() FOREACH_PlayerNumber( p ) best_grade = min( best_grade, grade[p] ); - if( !SUMMARY && GAMESTATE->HasEarnedExtraStage() ) + if( m_pStageStats->m_EarnedExtraStage != EarnedExtraStage_No ) { - m_sprTryExtraStage.Load( THEME->GetPathG(m_sName,GAMESTATE->IsExtraStage2()?"try extra2":"try extra1") ); - m_sprTryExtraStage->SetName( "TryExtraStage" ); - ActorUtil::LoadAllCommands( *m_sprTryExtraStage, m_sName ); - SET_XY( m_sprTryExtraStage ); - this->AddChild( m_sprTryExtraStage ); - - if( GAMESTATE->IsExtraStage2() ) - SOUND->PlayOnce( THEME->GetPathS(m_sName,"try extra2") ); - else - SOUND->PlayOnce( THEME->GetPathS(m_sName,"try extra1") ); + SOUND->PlayOnce( THEME->GetPathS(m_sName,"try " + EarnedExtraStageToString(m_pStageStats->m_EarnedExtraStage)) ); } else if( bOneHasNewTopRecord && ANNOUNCER->HasSoundsFor("evaluation new record") ) { diff --git a/stepmania/src/ScreenEvaluation.h b/stepmania/src/ScreenEvaluation.h index 8a07d4e301..be5af6f692 100644 --- a/stepmania/src/ScreenEvaluation.h +++ b/stepmania/src/ScreenEvaluation.h @@ -107,10 +107,6 @@ protected: AutoActor m_sprTimeLabel; BitmapText m_textTime[NUM_PLAYERS]; - // extra area - AutoActor m_sprTryExtraStage; - bool m_bFailed; - RageSound m_soundStart; // sound played if the player passes or fails ThemeMetric SUMMARY; diff --git a/stepmania/src/StageStats.cpp b/stepmania/src/StageStats.cpp index 0871ccc201..37025fd0a6 100644 --- a/stepmania/src/StageStats.cpp +++ b/stepmania/src/StageStats.cpp @@ -24,6 +24,7 @@ StageStats::StageStats() m_pStyle = NULL; m_vpPlayedSongs.clear(); m_vpPossibleSongs.clear(); + m_EarnedExtraStage = EarnedExtraStage_No; m_bGaveUp = false; m_bUsedAutoplay = false; m_fGameplaySeconds = 0; @@ -343,16 +344,17 @@ public: return 1; } - static int GetGameplaySeconds( T* p, lua_State *L ) { lua_pushnumber(L, p->m_fGameplaySeconds); return 1; } - static int OnePassed( T* p, lua_State *L ) { lua_pushboolean(L, p->OnePassed()); return 1; } - static int AllFailed( T* p, lua_State *L ) { lua_pushboolean(L, p->AllFailed()); return 1; } - static int GetStage( T* p, lua_State *L ) { LuaHelpers::Push( L, p->m_Stage ); return 1; } - DEFINE_METHOD( GetStageIndex, m_iStageIndex ) + static int GetGameplaySeconds( T* p, lua_State *L ) { lua_pushnumber(L, p->m_fGameplaySeconds); return 1; } + static int OnePassed( T* p, lua_State *L ) { lua_pushboolean(L, p->OnePassed()); return 1; } + static int AllFailed( T* p, lua_State *L ) { lua_pushboolean(L, p->AllFailed()); return 1; } + static int GetStage( T* p, lua_State *L ) { LuaHelpers::Push( L, p->m_Stage ); return 1; } + DEFINE_METHOD( GetStageIndex, m_iStageIndex ) static int PlayerHasHighScore( T* p, lua_State *L ) { lua_pushboolean(L, p->PlayerHasHighScore(Enum::Check(L, 1))); return 1; } + DEFINE_METHOD( GetEarnedExtraStage, m_EarnedExtraStage ) LunaStageStats() { @@ -366,6 +368,7 @@ public: ADD_METHOD( GetStage ); ADD_METHOD( GetStageIndex ); ADD_METHOD( PlayerHasHighScore ); + ADD_METHOD( GetEarnedExtraStage ); } }; diff --git a/stepmania/src/StageStats.h b/stepmania/src/StageStats.h index 192158d2f0..e6f21852c8 100644 --- a/stepmania/src/StageStats.h +++ b/stepmania/src/StageStats.h @@ -33,6 +33,7 @@ public: vector m_vpPlayedSongs; vector m_vpPossibleSongs; + EarnedExtraStage m_EarnedExtraStage; bool m_bGaveUp; // exited gameplay by giving up bool m_bUsedAutoplay; // used autoplay at any point during gameplay