separate CurrentStageIndex into separate number per game and per player. This allowed for staggered join periods.
This commit is contained in:
+65
-19
@@ -249,6 +249,8 @@ void GameState::Reset()
|
|||||||
m_bDemonstrationOrJukebox = false;
|
m_bDemonstrationOrJukebox = false;
|
||||||
m_bJukeboxUsesModifiers = false;
|
m_bJukeboxUsesModifiers = false;
|
||||||
m_iCurrentStageIndex = 0;
|
m_iCurrentStageIndex = 0;
|
||||||
|
FOREACH_PlayerNumber( p )
|
||||||
|
m_iPlayerCurrentStageIndexForCurrentCredit[p] = 0;
|
||||||
m_bGameplayLeadIn.Set( false );
|
m_bGameplayLeadIn.Set( false );
|
||||||
m_iNumStagesOfThisSong = 0;
|
m_iNumStagesOfThisSong = 0;
|
||||||
m_bLoadingNextSong = false;
|
m_bLoadingNextSong = false;
|
||||||
@@ -320,6 +322,7 @@ void GameState::Reset()
|
|||||||
void GameState::JoinPlayer( PlayerNumber pn )
|
void GameState::JoinPlayer( PlayerNumber pn )
|
||||||
{
|
{
|
||||||
m_bSideIsJoined[pn] = true;
|
m_bSideIsJoined[pn] = true;
|
||||||
|
m_iPlayerCurrentStageIndexForCurrentCredit[pn] = 0;
|
||||||
|
|
||||||
if( m_MasterPlayerNumber == PLAYER_INVALID )
|
if( m_MasterPlayerNumber == PLAYER_INVALID )
|
||||||
m_MasterPlayerNumber = pn;
|
m_MasterPlayerNumber = pn;
|
||||||
@@ -340,6 +343,19 @@ void GameState::JoinPlayer( PlayerNumber pn )
|
|||||||
MESSAGEMAN->Broadcast( msg );
|
MESSAGEMAN->Broadcast( msg );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameState::UnjoinPlayer( PlayerNumber pn )
|
||||||
|
{
|
||||||
|
m_bSideIsJoined[pn] = false;
|
||||||
|
m_iPlayerCurrentStageIndexForCurrentCredit[pn] = 0;
|
||||||
|
|
||||||
|
if( m_MasterPlayerNumber == pn )
|
||||||
|
m_MasterPlayerNumber = GAMESTATE->GetFirstHumanPlayer();
|
||||||
|
|
||||||
|
Message msg( MessageIDToString(Message_PlayerUnjoined) );
|
||||||
|
msg.SetParam( "Player", pn );
|
||||||
|
MESSAGEMAN->Broadcast( msg );
|
||||||
|
}
|
||||||
|
|
||||||
/* Handle an input that can join a player. Return true if the player joined. */
|
/* Handle an input that can join a player. Return true if the player joined. */
|
||||||
bool GameState::JoinInput( PlayerNumber pn )
|
bool GameState::JoinInput( PlayerNumber pn )
|
||||||
{
|
{
|
||||||
@@ -586,7 +602,7 @@ int GameState::GetNumStagesForCurrentSongAndStepsOrCourse()
|
|||||||
* if a long/marathon song is selected explicitly in the theme with a GameCommand,
|
* if a long/marathon song is selected explicitly in the theme with a GameCommand,
|
||||||
* and PREFSMAN->m_iNumArcadeStages is less than the number of stages that
|
* and PREFSMAN->m_iNumArcadeStages is less than the number of stages that
|
||||||
* song takes. */
|
* song takes. */
|
||||||
int iNumStagesLeft = PREFSMAN->m_iSongsPerPlay - GAMESTATE->m_iCurrentStageIndex;
|
int iNumStagesLeft = GAMESTATE->GetSmallestNumStagesLeftForAnyHumanPlayer();
|
||||||
iNumStagesOfThisSong = min( iNumStagesOfThisSong, iNumStagesLeft );
|
iNumStagesOfThisSong = min( iNumStagesOfThisSong, iNumStagesLeft );
|
||||||
iNumStagesOfThisSong = max( iNumStagesOfThisSong, 1 );
|
iNumStagesOfThisSong = max( iNumStagesOfThisSong, 1 );
|
||||||
|
|
||||||
@@ -653,7 +669,10 @@ void GameState::FinishStage()
|
|||||||
// Increment the stage counter.
|
// Increment the stage counter.
|
||||||
ASSERT( m_iNumStagesOfThisSong >= 1 && m_iNumStagesOfThisSong <= 3 );
|
ASSERT( m_iNumStagesOfThisSong >= 1 && m_iNumStagesOfThisSong <= 3 );
|
||||||
const int iOldStageIndex = m_iCurrentStageIndex;
|
const int iOldStageIndex = m_iCurrentStageIndex;
|
||||||
|
|
||||||
m_iCurrentStageIndex += m_iNumStagesOfThisSong;
|
m_iCurrentStageIndex += m_iNumStagesOfThisSong;
|
||||||
|
FOREACH_EnabledPlayer( p )
|
||||||
|
m_iPlayerCurrentStageIndexForCurrentCredit[p] += m_iNumStagesOfThisSong;
|
||||||
|
|
||||||
m_iNumStagesOfThisSong = 0;
|
m_iNumStagesOfThisSong = 0;
|
||||||
|
|
||||||
@@ -743,17 +762,15 @@ void GameState::ResetStageStatistics()
|
|||||||
STATSMAN->m_CurStageStats = StageStats();
|
STATSMAN->m_CurStageStats = StageStats();
|
||||||
if( PREFSMAN->m_bComboContinuesBetweenSongs )
|
if( PREFSMAN->m_bComboContinuesBetweenSongs )
|
||||||
{
|
{
|
||||||
if( GetStageIndex() == 0 )
|
FOREACH_PlayerNumber( p )
|
||||||
{
|
{
|
||||||
FOREACH_PlayerNumber( p )
|
bool bFirstSong = m_iPlayerCurrentStageIndexForCurrentCredit[p] == 0;
|
||||||
|
if( bFirstSong )
|
||||||
{
|
{
|
||||||
Profile* pProfile = PROFILEMAN->GetProfile(p);
|
Profile* pProfile = PROFILEMAN->GetProfile(p);
|
||||||
STATSMAN->m_CurStageStats.m_player[p].m_iCurCombo = pProfile->m_iCurrentCombo;
|
STATSMAN->m_CurStageStats.m_player[p].m_iCurCombo = pProfile->m_iCurrentCombo;
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else // GetStageIndex() > 0
|
|
||||||
{
|
|
||||||
FOREACH_PlayerNumber( p )
|
|
||||||
{
|
{
|
||||||
STATSMAN->m_CurStageStats.m_player[p].m_iCurCombo = OldStats.m_player[p].m_iCurCombo;
|
STATSMAN->m_CurStageStats.m_player[p].m_iCurCombo = OldStats.m_player[p].m_iCurCombo;
|
||||||
}
|
}
|
||||||
@@ -818,18 +835,41 @@ float GameState::GetSongPercent( float beat ) const
|
|||||||
return (beat - m_pCurSong->m_fFirstBeat) / m_pCurSong->m_fLastBeat;
|
return (beat - m_pCurSong->m_fFirstBeat) / m_pCurSong->m_fLastBeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GameState::GetStageIndex() const
|
int GameState::GetSmallestCurrentStageIndexForAnyHumanPlayer() const
|
||||||
{
|
{
|
||||||
return m_iCurrentStageIndex;
|
int iSmallest = INT_MAX;
|
||||||
|
FOREACH_HumanPlayer( p )
|
||||||
|
iSmallest = min( iSmallest, m_iPlayerCurrentStageIndexForCurrentCredit[p] );
|
||||||
|
return iSmallest;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GameState::GetNumStagesLeft() const
|
int GameState::GetNumStagesLeft( PlayerNumber pn ) const
|
||||||
|
{
|
||||||
|
return PREFSMAN->m_iSongsPerPlay - m_iPlayerCurrentStageIndexForCurrentCredit[pn];
|
||||||
|
}
|
||||||
|
|
||||||
|
int GameState::GetSmallestNumStagesLeftForAnyHumanPlayer() const
|
||||||
{
|
{
|
||||||
if( IsAnExtraStage() )
|
if( IsAnExtraStage() )
|
||||||
return 1;
|
return 1;
|
||||||
if( IsEventMode() )
|
if( IsEventMode() )
|
||||||
return 999;
|
return 999;
|
||||||
return PREFSMAN->m_iSongsPerPlay - m_iCurrentStageIndex;
|
int iSmallest = INT_MAX;
|
||||||
|
FOREACH_HumanPlayer( p )
|
||||||
|
iSmallest = min( iSmallest, GetNumStagesLeft(p) );
|
||||||
|
return iSmallest;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GameState::GetLargestNumStagesLeftForAnyHumanPlayer() const
|
||||||
|
{
|
||||||
|
if( IsAnExtraStage() )
|
||||||
|
return 1;
|
||||||
|
if( IsEventMode() )
|
||||||
|
return 999;
|
||||||
|
int iLargest = INT_MIN;
|
||||||
|
FOREACH_HumanPlayer( p )
|
||||||
|
iLargest = max( iLargest, GetNumStagesLeft(p) );
|
||||||
|
return iLargest;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GameState::IsFinalStage() const
|
bool GameState::IsFinalStage() const
|
||||||
@@ -844,22 +884,22 @@ bool GameState::IsFinalStage() const
|
|||||||
int iPredictedStageForCurSong = GetNumStagesForCurrentSongAndStepsOrCourse();
|
int iPredictedStageForCurSong = GetNumStagesForCurrentSongAndStepsOrCourse();
|
||||||
if( iPredictedStageForCurSong == -1 )
|
if( iPredictedStageForCurSong == -1 )
|
||||||
iPredictedStageForCurSong = 1;
|
iPredictedStageForCurSong = 1;
|
||||||
return m_iCurrentStageIndex + iPredictedStageForCurSong == PREFSMAN->m_iSongsPerPlay;
|
return GetSmallestCurrentStageIndexForAnyHumanPlayer() + iPredictedStageForCurSong == PREFSMAN->m_iSongsPerPlay;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GameState::IsAnExtraStage() const
|
bool GameState::IsAnExtraStage() const
|
||||||
{
|
{
|
||||||
return !IsEventMode() && !IsCourseMode() && m_iCurrentStageIndex >= PREFSMAN->m_iSongsPerPlay;
|
return !IsEventMode() && !IsCourseMode() && GetSmallestCurrentStageIndexForAnyHumanPlayer() >= PREFSMAN->m_iSongsPerPlay;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GameState::IsExtraStage() const
|
bool GameState::IsExtraStage() const
|
||||||
{
|
{
|
||||||
return !IsEventMode() && !IsCourseMode() && m_iCurrentStageIndex == PREFSMAN->m_iSongsPerPlay;
|
return !IsEventMode() && !IsCourseMode() && GetSmallestCurrentStageIndexForAnyHumanPlayer() == PREFSMAN->m_iSongsPerPlay;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GameState::IsExtraStage2() const
|
bool GameState::IsExtraStage2() const
|
||||||
{
|
{
|
||||||
return !IsEventMode() && !IsCourseMode() && m_iCurrentStageIndex == PREFSMAN->m_iSongsPerPlay+1;
|
return !IsEventMode() && !IsCourseMode() && GetSmallestCurrentStageIndexForAnyHumanPlayer() == PREFSMAN->m_iSongsPerPlay+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Stage GameState::GetCurrentStage() const
|
Stage GameState::GetCurrentStage() const
|
||||||
@@ -873,7 +913,7 @@ Stage GameState::GetCurrentStage() const
|
|||||||
else if( IsFinalStage() ) return STAGE_FINAL;
|
else if( IsFinalStage() ) return STAGE_FINAL;
|
||||||
else if( IsExtraStage() ) return STAGE_EXTRA1;
|
else if( IsExtraStage() ) return STAGE_EXTRA1;
|
||||||
else if( IsExtraStage2() ) return STAGE_EXTRA2;
|
else if( IsExtraStage2() ) return STAGE_EXTRA2;
|
||||||
else return (Stage)(STAGE_1+m_iCurrentStageIndex);
|
else return (Stage)(STAGE_1+GetSmallestCurrentStageIndexForAnyHumanPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return true if it's possible for GetCurrentStage() to return the given stage.
|
// Return true if it's possible for GetCurrentStage() to return the given stage.
|
||||||
@@ -1059,7 +1099,6 @@ PlayerNumber GameState::GetFirstHumanPlayer() const
|
|||||||
{
|
{
|
||||||
FOREACH_HumanPlayer( pn )
|
FOREACH_HumanPlayer( pn )
|
||||||
return pn;
|
return pn;
|
||||||
ASSERT(0); // there must be at least 1 human player
|
|
||||||
return PLAYER_INVALID;
|
return PLAYER_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1343,7 +1382,7 @@ SongOptions::FailType GameState::GetPlayerFailType( const PlayerState *pPlayerSt
|
|||||||
if( m_pCurSteps[pn] )
|
if( m_pCurSteps[pn] )
|
||||||
dc = m_pCurSteps[pn]->GetDifficulty();
|
dc = m_pCurSteps[pn]->GetDifficulty();
|
||||||
|
|
||||||
bool bFirstStage = !IsEventMode() && m_iCurrentStageIndex == 0;
|
bool bFirstStage = !IsEventMode() && GetSmallestCurrentStageIndexForAnyHumanPlayer() == 0;
|
||||||
|
|
||||||
/* Easy and beginner are never harder than FAIL_IMMEDIATE_CONTINUE. */
|
/* Easy and beginner are never harder than FAIL_IMMEDIATE_CONTINUE. */
|
||||||
if( dc <= Difficulty_Easy )
|
if( dc <= Difficulty_Easy )
|
||||||
@@ -2102,7 +2141,7 @@ public:
|
|||||||
DEFINE_METHOD( IsDemonstration, m_bDemonstrationOrJukebox )
|
DEFINE_METHOD( IsDemonstration, m_bDemonstrationOrJukebox )
|
||||||
DEFINE_METHOD( GetPlayMode, m_PlayMode )
|
DEFINE_METHOD( GetPlayMode, m_PlayMode )
|
||||||
DEFINE_METHOD( GetSortOrder, m_SortOrder )
|
DEFINE_METHOD( GetSortOrder, m_SortOrder )
|
||||||
DEFINE_METHOD( GetStageIndex, GetStageIndex() )
|
DEFINE_METHOD( GetStageIndex, m_iCurrentStageIndex )
|
||||||
DEFINE_METHOD( IsGoalComplete, IsGoalComplete(Enum::Check<PlayerNumber>(L, 1)) )
|
DEFINE_METHOD( IsGoalComplete, IsGoalComplete(Enum::Check<PlayerNumber>(L, 1)) )
|
||||||
DEFINE_METHOD( PlayerIsUsingModifier, PlayerIsUsingModifier(Enum::Check<PlayerNumber>(L, 1), SArg(2)) )
|
DEFINE_METHOD( PlayerIsUsingModifier, PlayerIsUsingModifier(Enum::Check<PlayerNumber>(L, 1), SArg(2)) )
|
||||||
DEFINE_METHOD( GetCourseSongIndex, GetCourseSongIndex() )
|
DEFINE_METHOD( GetCourseSongIndex, GetCourseSongIndex() )
|
||||||
@@ -2232,6 +2271,12 @@ public:
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
static int GetNumStagesForCurrentSongAndStepsOrCourse( T* p, lua_State *L ) { lua_pushnumber(L, GameState::GetNumStagesForCurrentSongAndStepsOrCourse() ); return 1; }
|
static int GetNumStagesForCurrentSongAndStepsOrCourse( T* p, lua_State *L ) { lua_pushnumber(L, GameState::GetNumStagesForCurrentSongAndStepsOrCourse() ); return 1; }
|
||||||
|
static int GetNumStagesLeft( T* p, lua_State *L )
|
||||||
|
{
|
||||||
|
PlayerNumber pn = Enum::Check<PlayerNumber>(L, 1);
|
||||||
|
lua_pushnumber(L, p->GetNumStagesLeft(pn));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
LunaGameState()
|
LunaGameState()
|
||||||
{
|
{
|
||||||
@@ -2309,6 +2354,7 @@ public:
|
|||||||
ADD_METHOD( GetCurrentStyle );
|
ADD_METHOD( GetCurrentStyle );
|
||||||
ADD_METHOD( IsAnyHumanPlayerUsingMemoryCard );
|
ADD_METHOD( IsAnyHumanPlayerUsingMemoryCard );
|
||||||
ADD_METHOD( GetNumStagesForCurrentSongAndStepsOrCourse );
|
ADD_METHOD( GetNumStagesForCurrentSongAndStepsOrCourse );
|
||||||
|
ADD_METHOD( GetNumStagesLeft );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ public:
|
|||||||
void ApplyGameCommand( const RString &sCommand, PlayerNumber pn=PLAYER_INVALID );
|
void ApplyGameCommand( const RString &sCommand, PlayerNumber pn=PLAYER_INVALID );
|
||||||
void BeginGame(); // called when first player joins
|
void BeginGame(); // called when first player joins
|
||||||
void JoinPlayer( PlayerNumber pn );
|
void JoinPlayer( PlayerNumber pn );
|
||||||
|
void UnjoinPlayer( PlayerNumber pn );
|
||||||
bool JoinInput( PlayerNumber pn );
|
bool JoinInput( PlayerNumber pn );
|
||||||
void PlayersFinalized(); // called after a style is chosen, which means the number of players is finalized
|
void PlayersFinalized(); // called after a style is chosen, which means the number of players is finalized
|
||||||
void EndGame(); // called on ScreenGameOver, ScreenMusicScroll, ScreenCredits
|
void EndGame(); // called on ScreenGameOver, ScreenMusicScroll, ScreenCredits
|
||||||
@@ -116,18 +117,23 @@ public:
|
|||||||
bool m_bDemonstrationOrJukebox; // ScreenGameplay does special stuff when this is true
|
bool m_bDemonstrationOrJukebox; // ScreenGameplay does special stuff when this is true
|
||||||
bool m_bJukeboxUsesModifiers;
|
bool m_bJukeboxUsesModifiers;
|
||||||
int m_iNumStagesOfThisSong;
|
int m_iNumStagesOfThisSong;
|
||||||
|
// Increases every stage, doesn't reset when player continues. It's cosmetic and not used in Stage or Screen branching logic.
|
||||||
int m_iCurrentStageIndex;
|
int m_iCurrentStageIndex;
|
||||||
|
// Num stages played since player joined or conintues by using a credit. Increases every stage if the player is joined. Resets when player joins/continues.
|
||||||
|
int m_iPlayerCurrentStageIndexForCurrentCredit[NUM_PLAYERS];
|
||||||
|
|
||||||
static int GetNumStagesMultiplierForSong( const Song* pSong );
|
static int GetNumStagesMultiplierForSong( const Song* pSong );
|
||||||
static int GetNumStagesForSongAndStyleType( const Song* pSong, StyleType st );
|
static int GetNumStagesForSongAndStyleType( const Song* pSong, StyleType st );
|
||||||
static int GetNumStagesForCurrentSongAndStepsOrCourse();
|
static int GetNumStagesForCurrentSongAndStepsOrCourse();
|
||||||
|
|
||||||
int GetStageIndex() const;
|
|
||||||
void BeginStage();
|
void BeginStage();
|
||||||
void CancelStage();
|
void CancelStage();
|
||||||
void CommitStageStats();
|
void CommitStageStats();
|
||||||
void FinishStage();
|
void FinishStage();
|
||||||
int GetNumStagesLeft() const;
|
int GetSmallestCurrentStageIndexForAnyHumanPlayer() const;
|
||||||
|
int GetNumStagesLeft( PlayerNumber pn ) const;
|
||||||
|
int GetSmallestNumStagesLeftForAnyHumanPlayer() const;
|
||||||
|
int GetLargestNumStagesLeftForAnyHumanPlayer() const;
|
||||||
bool IsFinalStage() const;
|
bool IsFinalStage() const;
|
||||||
bool IsAnExtraStage() const;
|
bool IsAnExtraStage() const;
|
||||||
bool IsExtraStage() const;
|
bool IsExtraStage() const;
|
||||||
|
|||||||
@@ -304,7 +304,7 @@ void LifeMeterBar::UpdateNonstopLifebar()
|
|||||||
if( GAMESTATE->IsEventMode() || GAMESTATE->m_bDemonstrationOrJukebox )
|
if( GAMESTATE->IsEventMode() || GAMESTATE->m_bDemonstrationOrJukebox )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
iCleared = GAMESTATE->GetStageIndex();
|
iCleared = GAMESTATE->GetSmallestCurrentStageIndexForAnyHumanPlayer();
|
||||||
iTotal = PREFSMAN->m_iSongsPerPlay;
|
iTotal = PREFSMAN->m_iSongsPerPlay;
|
||||||
iProgressiveLifebarDifficulty = PREFSMAN->m_iProgressiveStageLifebar;
|
iProgressiveLifebarDifficulty = PREFSMAN->m_iProgressiveStageLifebar;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ LIBS += -lpthread -lrt
|
|||||||
Screens = \
|
Screens = \
|
||||||
Screen.cpp Screen.h ScreenAttract.cpp ScreenAttract.h \
|
Screen.cpp Screen.h ScreenAttract.cpp ScreenAttract.h \
|
||||||
ScreenBookkeeping.cpp ScreenBookkeeping.h \
|
ScreenBookkeeping.cpp ScreenBookkeeping.h \
|
||||||
ScreenCenterImage.cpp ScreenCenterImage.h ScreenCredits.cpp ScreenCredits.h \
|
ScreenCenterImage.cpp ScreenCenterImage.h \
|
||||||
|
ScreenContinue.cpp ScreenContinue.h \
|
||||||
|
ScreenCredits.cpp ScreenCredits.h \
|
||||||
ScreenDebugOverlay.cpp ScreenDebugOverlay.h \
|
ScreenDebugOverlay.cpp ScreenDebugOverlay.h \
|
||||||
ScreenDemonstration.cpp ScreenDemonstration.h ScreenDimensions.h \
|
ScreenDemonstration.cpp ScreenDemonstration.h ScreenDimensions.h \
|
||||||
ScreenEdit.cpp ScreenEdit.h \
|
ScreenEdit.cpp ScreenEdit.h \
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ static const char *MessageIDNames[] = {
|
|||||||
"CoinInserted",
|
"CoinInserted",
|
||||||
"PlayerJoined",
|
"PlayerJoined",
|
||||||
"PlayersFinalized",
|
"PlayersFinalized",
|
||||||
|
"PlayerUnjoined",
|
||||||
"AutosyncChanged",
|
"AutosyncChanged",
|
||||||
"PreferredSongGroupChanged",
|
"PreferredSongGroupChanged",
|
||||||
"PreferredCourseGroupChanged",
|
"PreferredCourseGroupChanged",
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ enum MessageID
|
|||||||
Message_CoinInserted,
|
Message_CoinInserted,
|
||||||
Message_PlayerJoined,
|
Message_PlayerJoined,
|
||||||
Message_PlayersFinalized,
|
Message_PlayersFinalized,
|
||||||
|
Message_PlayerUnjoined,
|
||||||
Message_AutosyncChanged,
|
Message_AutosyncChanged,
|
||||||
Message_PreferredSongGroupChanged,
|
Message_PreferredSongGroupChanged,
|
||||||
Message_PreferredCourseGroupChanged,
|
Message_PreferredCourseGroupChanged,
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ MusicBannerWheel::MusicBannerWheel()
|
|||||||
{
|
{
|
||||||
vector<Song*> vTempSongs;
|
vector<Song*> vTempSongs;
|
||||||
SongCriteria sc;
|
SongCriteria sc;
|
||||||
sc.m_iMaxStagesForSong = GAMESTATE->GetNumStagesLeft();
|
sc.m_iMaxStagesForSong = GAMESTATE->GetSmallestNumStagesLeftForAnyHumanPlayer();
|
||||||
SongUtil::FilterSongs( sc, arraySongs, vTempSongs );
|
SongUtil::FilterSongs( sc, arraySongs, vTempSongs );
|
||||||
arraySongs = vTempSongs;
|
arraySongs = vTempSongs;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ void MusicWheel::BeginScreen()
|
|||||||
/* Invalidate current Song if it can't be played
|
/* Invalidate current Song if it can't be played
|
||||||
* because there are not enough stages remaining. */
|
* because there are not enough stages remaining. */
|
||||||
if( GAMESTATE->m_pCurSong != NULL &&
|
if( GAMESTATE->m_pCurSong != NULL &&
|
||||||
GameState::GetNumStagesMultiplierForSong( GAMESTATE->m_pCurSong ) > GAMESTATE->GetNumStagesLeft() )
|
GameState::GetNumStagesMultiplierForSong( GAMESTATE->m_pCurSong ) > GAMESTATE->GetSmallestNumStagesLeftForAnyHumanPlayer() )
|
||||||
{
|
{
|
||||||
GAMESTATE->m_pCurSong.Set( NULL );
|
GAMESTATE->m_pCurSong.Set( NULL );
|
||||||
}
|
}
|
||||||
@@ -342,7 +342,7 @@ void MusicWheel::GetSongList( vector<Song*> &arraySongs, SortOrder so, const RSt
|
|||||||
{
|
{
|
||||||
vector<Song*> vTempSongs;
|
vector<Song*> vTempSongs;
|
||||||
SongCriteria sc;
|
SongCriteria sc;
|
||||||
sc.m_iMaxStagesForSong = GAMESTATE->GetNumStagesLeft();
|
sc.m_iMaxStagesForSong = GAMESTATE->GetSmallestNumStagesLeftForAnyHumanPlayer();
|
||||||
SongUtil::FilterSongs( sc, apAllSongs, vTempSongs );
|
SongUtil::FilterSongs( sc, apAllSongs, vTempSongs );
|
||||||
apAllSongs = vTempSongs;
|
apAllSongs = vTempSongs;
|
||||||
}
|
}
|
||||||
@@ -407,7 +407,7 @@ void MusicWheel::BuildWheelItemDatas( vector<WheelItemData *> &arrayWheelItemDat
|
|||||||
case SORT_ONI_COURSES:
|
case SORT_ONI_COURSES:
|
||||||
case SORT_ENDLESS_COURSES:
|
case SORT_ENDLESS_COURSES:
|
||||||
/* Don't display course modes after the first stage. */
|
/* Don't display course modes after the first stage. */
|
||||||
if( !GAMESTATE->IsEventMode() && GAMESTATE->m_iCurrentStageIndex )
|
if( !GAMESTATE->IsEventMode() && GAMESTATE->GetLargestNumStagesLeftForAnyHumanPlayer() > 0 )
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,120 @@
|
|||||||
|
#include "global.h"
|
||||||
|
#include "ScreenContinue.h"
|
||||||
|
#include "ScreenManager.h"
|
||||||
|
#include "SongManager.h"
|
||||||
|
#include "GameSoundManager.h"
|
||||||
|
#include "ThemeManager.h"
|
||||||
|
#include "AnnouncerManager.h"
|
||||||
|
#include "song.h"
|
||||||
|
#include "ProfileManager.h"
|
||||||
|
#include "Profile.h"
|
||||||
|
#include "ActorUtil.h"
|
||||||
|
#include "GameState.h"
|
||||||
|
#include "MemoryCardManager.h"
|
||||||
|
#include "RageLog.h"
|
||||||
|
#include "Style.h"
|
||||||
|
#include "GameManager.h"
|
||||||
|
#include "PrefsManager.h"
|
||||||
|
#include "StatsManager.h"
|
||||||
|
#include "PlayerState.h"
|
||||||
|
#include "CommonMetrics.h"
|
||||||
|
#include "InputEventPlus.h"
|
||||||
|
#include "MenuTimer.h"
|
||||||
|
|
||||||
|
|
||||||
|
REGISTER_SCREEN_CLASS( ScreenContinue );
|
||||||
|
ScreenContinue::ScreenContinue() : ScreenWithMenuElements()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenContinue::Init()
|
||||||
|
{
|
||||||
|
ScreenWithMenuElements::Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenContinue::BeginScreen()
|
||||||
|
{
|
||||||
|
GAMESTATE->FinishStage();
|
||||||
|
|
||||||
|
GAMESTATE->SetCurrentStyle( NULL );
|
||||||
|
|
||||||
|
// unjoin all players with 0 stages left
|
||||||
|
FOREACH_HumanPlayer( p )
|
||||||
|
{
|
||||||
|
bool bNoStagesLeft = GAMESTATE->m_iPlayerCurrentStageIndexForCurrentCredit[p] >= PREFSMAN->m_iSongsPerPlay;
|
||||||
|
if( bNoStagesLeft )
|
||||||
|
GAMESTATE->UnjoinPlayer( p );
|
||||||
|
}
|
||||||
|
|
||||||
|
ScreenWithMenuElements::BeginScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenContinue::Input( const InputEventPlus &input )
|
||||||
|
{
|
||||||
|
if( input.MenuI == MENU_BUTTON_START && input.type == IET_FIRST_PRESS && GAMESTATE->JoinInput(input.pn) )
|
||||||
|
{
|
||||||
|
bool bAllPlayersAreEnabled = true;
|
||||||
|
FOREACH_ENUM( PlayerNumber, p )
|
||||||
|
{
|
||||||
|
if( !GAMESTATE->IsPlayerEnabled(p) )
|
||||||
|
bAllPlayersAreEnabled = false;
|
||||||
|
}
|
||||||
|
if( bAllPlayersAreEnabled )
|
||||||
|
{
|
||||||
|
m_MenuTimer->Stop();
|
||||||
|
if( !IsTransitioning() )
|
||||||
|
StartTransitioningScreen( SM_GoToNextScreen );
|
||||||
|
}
|
||||||
|
return; // handled
|
||||||
|
}
|
||||||
|
|
||||||
|
if( IsTransitioning() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( input.MenuI == MENU_BUTTON_START && input.type == IET_FIRST_PRESS && GAMESTATE->IsHumanPlayer(input.pn) )
|
||||||
|
{
|
||||||
|
m_MenuTimer->SetSeconds( m_MenuTimer->GetSeconds() - 1 );
|
||||||
|
return; // handled
|
||||||
|
}
|
||||||
|
|
||||||
|
ScreenWithMenuElements::Input( input );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenContinue::HandleScreenMessage( const ScreenMessage SM )
|
||||||
|
{
|
||||||
|
RString s = ScreenMessageHelpers::NumberToString( SM );
|
||||||
|
|
||||||
|
if( SM == SM_MenuTimer )
|
||||||
|
{
|
||||||
|
if( !IsTransitioning() )
|
||||||
|
StartTransitioningScreen( SM_GoToNextScreen );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScreenWithMenuElements::HandleScreenMessage( SM );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (c) 2004 Chris Danford
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
||||||
|
* whom the Software is furnished to do so, provided that the above
|
||||||
|
* copyright notice(s) and this permission notice appear in all copies of
|
||||||
|
* the Software and that both the above copyright notice(s) and this
|
||||||
|
* permission notice appear in supporting documentation.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
||||||
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
||||||
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
||||||
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||||
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/* ScreenContinue - . */
|
||||||
|
|
||||||
|
#ifndef ScreenContinue_H
|
||||||
|
#define ScreenContinue_H
|
||||||
|
|
||||||
|
#include "ScreenWithMenuElements.h"
|
||||||
|
|
||||||
|
class ScreenContinue : public ScreenWithMenuElements
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScreenContinue();
|
||||||
|
virtual void Init();
|
||||||
|
virtual void BeginScreen();
|
||||||
|
virtual void Input( const InputEventPlus &input );
|
||||||
|
virtual void HandleScreenMessage( const ScreenMessage SM );
|
||||||
|
virtual bool AllowLateJoin() const { return true; }
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (c) 2004 Chris Danford
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
||||||
|
* whom the Software is furnished to do so, provided that the above
|
||||||
|
* copyright notice(s) and this permission notice appear in all copies of
|
||||||
|
* the Software and that both the above copyright notice(s) and this
|
||||||
|
* permission notice appear in supporting documentation.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
||||||
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
||||||
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
||||||
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||||
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
@@ -42,6 +42,8 @@ ScreenEnding::ScreenEnding() : ScreenAttract( false/*dont reset GAMESTATE*/ )
|
|||||||
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
|
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
|
||||||
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_2]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
|
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[PLAYER_2]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
|
||||||
GAMESTATE->m_iCurrentStageIndex = 0;
|
GAMESTATE->m_iCurrentStageIndex = 0;
|
||||||
|
FOREACH_ENUM( PlayerNumber, p )
|
||||||
|
GAMESTATE->m_iPlayerCurrentStageIndexForCurrentCredit[p] = 0;
|
||||||
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
|
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
|
||||||
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[PLAYER_2]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
|
PO_GROUP_CALL( GAMESTATE->m_pPlayerState[PLAYER_2]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
|
||||||
|
|
||||||
@@ -84,10 +86,6 @@ void ScreenEnding::Init()
|
|||||||
{
|
{
|
||||||
ScreenAttract::Init();
|
ScreenAttract::Init();
|
||||||
|
|
||||||
vector<Song*> arraySongs;
|
|
||||||
SONGMAN->GetSongs( arraySongs );
|
|
||||||
SongUtil::SortSongPointerArrayByTitle( arraySongs );
|
|
||||||
|
|
||||||
FOREACH_HumanPlayer( p )
|
FOREACH_HumanPlayer( p )
|
||||||
{
|
{
|
||||||
if( !PROFILEMAN->IsPersistentProfile(p) )
|
if( !PROFILEMAN->IsPersistentProfile(p) )
|
||||||
|
|||||||
@@ -101,6 +101,8 @@ ScreenEvaluation::ScreenEvaluation()
|
|||||||
STATSMAN->m_CurStageStats.m_vpPossibleSongs.push_back( GAMESTATE->m_pCurSong );
|
STATSMAN->m_CurStageStats.m_vpPossibleSongs.push_back( GAMESTATE->m_pCurSong );
|
||||||
GAMESTATE->m_pCurCourse.Set( SONGMAN->GetRandomCourse() );
|
GAMESTATE->m_pCurCourse.Set( SONGMAN->GetRandomCourse() );
|
||||||
GAMESTATE->m_iCurrentStageIndex = 0;
|
GAMESTATE->m_iCurrentStageIndex = 0;
|
||||||
|
FOREACH_ENUM( PlayerNumber, p )
|
||||||
|
GAMESTATE->m_iPlayerCurrentStageIndexForCurrentCredit[p] = 0;
|
||||||
|
|
||||||
FOREACH_PlayerNumber( p )
|
FOREACH_PlayerNumber( p )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ void ScreenGameplayLesson::Init()
|
|||||||
|
|
||||||
// Reset stage number (not relevant in lessons)
|
// Reset stage number (not relevant in lessons)
|
||||||
GAMESTATE->m_iCurrentStageIndex = 0;
|
GAMESTATE->m_iCurrentStageIndex = 0;
|
||||||
|
FOREACH_ENUM( PlayerNumber, p )
|
||||||
|
GAMESTATE->m_iPlayerCurrentStageIndexForCurrentCredit[p] = 0;
|
||||||
|
|
||||||
// Autoplay during demonstration
|
// Autoplay during demonstration
|
||||||
FOREACH_EnabledPlayerInfo( m_vPlayerInfo, pi )
|
FOREACH_EnabledPlayerInfo( m_vPlayerInfo, pi )
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ void ScreenSelectMusic::Init()
|
|||||||
void ScreenSelectMusic::BeginScreen()
|
void ScreenSelectMusic::BeginScreen()
|
||||||
{
|
{
|
||||||
/* Finish any previous stage. It's OK to call this when we havn't played a stage yet.
|
/* Finish any previous stage. It's OK to call this when we havn't played a stage yet.
|
||||||
* Do this before anything that might look at GAMESTATE->m_iCurrentStageIndex. */
|
* Do this before anything that might look at GAMESTATE->m_iCurrentStageIndex or GAMESTATE->m_iPlayerCurrentStageIndexForCurrentCredit. */
|
||||||
GAMESTATE->FinishStage();
|
GAMESTATE->FinishStage();
|
||||||
|
|
||||||
LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
|
LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
|
||||||
|
|||||||
@@ -832,7 +832,7 @@ static void GetPlayableStepsTypes( const Song *pSong, set<StepsType> &vOut )
|
|||||||
bool bShowThisStepsType = find( vstToShow.begin(), vstToShow.end(), *st ) != vstToShow.end();
|
bool bShowThisStepsType = find( vstToShow.begin(), vstToShow.end(), *st ) != vstToShow.end();
|
||||||
|
|
||||||
const Style *pStyle = GAMEMAN->GetFirstCompatibleStyle( GAMESTATE->m_pCurGame, GAMESTATE->GetNumPlayersEnabled(), *st );
|
const Style *pStyle = GAMEMAN->GetFirstCompatibleStyle( GAMESTATE->m_pCurGame, GAMESTATE->GetNumPlayersEnabled(), *st );
|
||||||
bool bEnoughStages = GAMESTATE->GetNumStagesLeft() >= GAMESTATE->GetNumStagesForSongAndStyleType(pSong, pStyle->m_StyleType);
|
bool bEnoughStages = GAMESTATE->GetSmallestNumStagesLeftForAnyHumanPlayer() >= GAMESTATE->GetNumStagesForSongAndStyleType(pSong, pStyle->m_StyleType);
|
||||||
|
|
||||||
if( bShowThisStepsType && bEnoughStages )
|
if( bShowThisStepsType && bEnoughStages )
|
||||||
vOut.insert( *st );
|
vOut.insert( *st );
|
||||||
|
|||||||
@@ -286,6 +286,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\
|
|||||||
<File
|
<File
|
||||||
RelativePath="ScreenCenterImage.h">
|
RelativePath="ScreenCenterImage.h">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\ScreenContinue.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\ScreenContinue.h">
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="ScreenCredits.cpp">
|
RelativePath="ScreenCredits.cpp">
|
||||||
</File>
|
</File>
|
||||||
|
|||||||
Reference in New Issue
Block a user