separate CurrentStageIndex into separate number per game and per player. This allowed for staggered join periods.

This commit is contained in:
Chris Danford
2007-03-25 09:37:14 +00:00
parent 813432c98d
commit 43ef38383d
16 changed files with 263 additions and 34 deletions
+66 -20
View File
@@ -249,6 +249,8 @@ void GameState::Reset()
m_bDemonstrationOrJukebox = false;
m_bJukeboxUsesModifiers = false;
m_iCurrentStageIndex = 0;
FOREACH_PlayerNumber( p )
m_iPlayerCurrentStageIndexForCurrentCredit[p] = 0;
m_bGameplayLeadIn.Set( false );
m_iNumStagesOfThisSong = 0;
m_bLoadingNextSong = false;
@@ -320,6 +322,7 @@ void GameState::Reset()
void GameState::JoinPlayer( PlayerNumber pn )
{
m_bSideIsJoined[pn] = true;
m_iPlayerCurrentStageIndexForCurrentCredit[pn] = 0;
if( m_MasterPlayerNumber == PLAYER_INVALID )
m_MasterPlayerNumber = pn;
@@ -340,6 +343,19 @@ void GameState::JoinPlayer( PlayerNumber pn )
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. */
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,
* and PREFSMAN->m_iNumArcadeStages is less than the number of stages that
* song takes. */
int iNumStagesLeft = PREFSMAN->m_iSongsPerPlay - GAMESTATE->m_iCurrentStageIndex;
int iNumStagesLeft = GAMESTATE->GetSmallestNumStagesLeftForAnyHumanPlayer();
iNumStagesOfThisSong = min( iNumStagesOfThisSong, iNumStagesLeft );
iNumStagesOfThisSong = max( iNumStagesOfThisSong, 1 );
@@ -653,7 +669,10 @@ void GameState::FinishStage()
// Increment the stage counter.
ASSERT( m_iNumStagesOfThisSong >= 1 && m_iNumStagesOfThisSong <= 3 );
const int iOldStageIndex = m_iCurrentStageIndex;
m_iCurrentStageIndex += m_iNumStagesOfThisSong;
FOREACH_EnabledPlayer( p )
m_iPlayerCurrentStageIndexForCurrentCredit[p] += m_iNumStagesOfThisSong;
m_iNumStagesOfThisSong = 0;
@@ -743,17 +762,15 @@ void GameState::ResetStageStatistics()
STATSMAN->m_CurStageStats = StageStats();
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);
STATSMAN->m_CurStageStats.m_player[p].m_iCurCombo = pProfile->m_iCurrentCombo;
}
}
else // GetStageIndex() > 0
{
FOREACH_PlayerNumber( p )
else
{
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;
}
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() )
return 1;
if( IsEventMode() )
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
@@ -844,22 +884,22 @@ bool GameState::IsFinalStage() const
int iPredictedStageForCurSong = GetNumStagesForCurrentSongAndStepsOrCourse();
if( iPredictedStageForCurSong == -1 )
iPredictedStageForCurSong = 1;
return m_iCurrentStageIndex + iPredictedStageForCurSong == PREFSMAN->m_iSongsPerPlay;
return GetSmallestCurrentStageIndexForAnyHumanPlayer() + iPredictedStageForCurSong == PREFSMAN->m_iSongsPerPlay;
}
bool GameState::IsAnExtraStage() const
{
return !IsEventMode() && !IsCourseMode() && m_iCurrentStageIndex >= PREFSMAN->m_iSongsPerPlay;
return !IsEventMode() && !IsCourseMode() && GetSmallestCurrentStageIndexForAnyHumanPlayer() >= PREFSMAN->m_iSongsPerPlay;
}
bool GameState::IsExtraStage() const
{
return !IsEventMode() && !IsCourseMode() && m_iCurrentStageIndex == PREFSMAN->m_iSongsPerPlay;
return !IsEventMode() && !IsCourseMode() && GetSmallestCurrentStageIndexForAnyHumanPlayer() == PREFSMAN->m_iSongsPerPlay;
}
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
@@ -873,7 +913,7 @@ Stage GameState::GetCurrentStage() const
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);
else return (Stage)(STAGE_1+GetSmallestCurrentStageIndexForAnyHumanPlayer());
}
// Return true if it's possible for GetCurrentStage() to return the given stage.
@@ -1059,7 +1099,6 @@ PlayerNumber GameState::GetFirstHumanPlayer() const
{
FOREACH_HumanPlayer( pn )
return pn;
ASSERT(0); // there must be at least 1 human player
return PLAYER_INVALID;
}
@@ -1343,7 +1382,7 @@ SongOptions::FailType GameState::GetPlayerFailType( const PlayerState *pPlayerSt
if( m_pCurSteps[pn] )
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. */
if( dc <= Difficulty_Easy )
@@ -2102,7 +2141,7 @@ public:
DEFINE_METHOD( IsDemonstration, m_bDemonstrationOrJukebox )
DEFINE_METHOD( GetPlayMode, m_PlayMode )
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( PlayerIsUsingModifier, PlayerIsUsingModifier(Enum::Check<PlayerNumber>(L, 1), SArg(2)) )
DEFINE_METHOD( GetCourseSongIndex, GetCourseSongIndex() )
@@ -2232,7 +2271,13 @@ public:
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()
{
ADD_METHOD( IsPlayerEnabled );
@@ -2309,6 +2354,7 @@ public:
ADD_METHOD( GetCurrentStyle );
ADD_METHOD( IsAnyHumanPlayerUsingMemoryCard );
ADD_METHOD( GetNumStagesForCurrentSongAndStepsOrCourse );
ADD_METHOD( GetNumStagesLeft );
}
};
+8 -2
View File
@@ -41,6 +41,7 @@ public:
void ApplyGameCommand( const RString &sCommand, PlayerNumber pn=PLAYER_INVALID );
void BeginGame(); // called when first player joins
void JoinPlayer( PlayerNumber pn );
void UnjoinPlayer( PlayerNumber pn );
bool JoinInput( PlayerNumber pn );
void PlayersFinalized(); // called after a style is chosen, which means the number of players is finalized
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_bJukeboxUsesModifiers;
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;
// 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 GetNumStagesForSongAndStyleType( const Song* pSong, StyleType st );
static int GetNumStagesForCurrentSongAndStepsOrCourse();
int GetStageIndex() const;
void BeginStage();
void CancelStage();
void CommitStageStats();
void FinishStage();
int GetNumStagesLeft() const;
int GetSmallestCurrentStageIndexForAnyHumanPlayer() const;
int GetNumStagesLeft( PlayerNumber pn ) const;
int GetSmallestNumStagesLeftForAnyHumanPlayer() const;
int GetLargestNumStagesLeftForAnyHumanPlayer() const;
bool IsFinalStage() const;
bool IsAnExtraStage() const;
bool IsExtraStage() const;
+1 -1
View File
@@ -304,7 +304,7 @@ void LifeMeterBar::UpdateNonstopLifebar()
if( GAMESTATE->IsEventMode() || GAMESTATE->m_bDemonstrationOrJukebox )
return;
iCleared = GAMESTATE->GetStageIndex();
iCleared = GAMESTATE->GetSmallestCurrentStageIndexForAnyHumanPlayer();
iTotal = PREFSMAN->m_iSongsPerPlay;
iProgressiveLifebarDifficulty = PREFSMAN->m_iProgressiveStageLifebar;
break;
+3 -1
View File
@@ -24,7 +24,9 @@ LIBS += -lpthread -lrt
Screens = \
Screen.cpp Screen.h ScreenAttract.cpp ScreenAttract.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 \
ScreenDemonstration.cpp ScreenDemonstration.h ScreenDimensions.h \
ScreenEdit.cpp ScreenEdit.h \
+1
View File
@@ -54,6 +54,7 @@ static const char *MessageIDNames[] = {
"CoinInserted",
"PlayerJoined",
"PlayersFinalized",
"PlayerUnjoined",
"AutosyncChanged",
"PreferredSongGroupChanged",
"PreferredCourseGroupChanged",
+1
View File
@@ -51,6 +51,7 @@ enum MessageID
Message_CoinInserted,
Message_PlayerJoined,
Message_PlayersFinalized,
Message_PlayerUnjoined,
Message_AutosyncChanged,
Message_PreferredSongGroupChanged,
Message_PreferredCourseGroupChanged,
+1 -1
View File
@@ -65,7 +65,7 @@ MusicBannerWheel::MusicBannerWheel()
{
vector<Song*> vTempSongs;
SongCriteria sc;
sc.m_iMaxStagesForSong = GAMESTATE->GetNumStagesLeft();
sc.m_iMaxStagesForSong = GAMESTATE->GetSmallestNumStagesLeftForAnyHumanPlayer();
SongUtil::FilterSongs( sc, arraySongs, vTempSongs );
arraySongs = vTempSongs;
}
+3 -3
View File
@@ -159,7 +159,7 @@ void MusicWheel::BeginScreen()
/* Invalidate current Song if it can't be played
* because there are not enough stages remaining. */
if( GAMESTATE->m_pCurSong != NULL &&
GameState::GetNumStagesMultiplierForSong( GAMESTATE->m_pCurSong ) > GAMESTATE->GetNumStagesLeft() )
GameState::GetNumStagesMultiplierForSong( GAMESTATE->m_pCurSong ) > GAMESTATE->GetSmallestNumStagesLeftForAnyHumanPlayer() )
{
GAMESTATE->m_pCurSong.Set( NULL );
}
@@ -342,7 +342,7 @@ void MusicWheel::GetSongList( vector<Song*> &arraySongs, SortOrder so, const RSt
{
vector<Song*> vTempSongs;
SongCriteria sc;
sc.m_iMaxStagesForSong = GAMESTATE->GetNumStagesLeft();
sc.m_iMaxStagesForSong = GAMESTATE->GetSmallestNumStagesLeftForAnyHumanPlayer();
SongUtil::FilterSongs( sc, apAllSongs, vTempSongs );
apAllSongs = vTempSongs;
}
@@ -407,7 +407,7 @@ void MusicWheel::BuildWheelItemDatas( vector<WheelItemData *> &arrayWheelItemDat
case SORT_ONI_COURSES:
case SORT_ENDLESS_COURSES:
/* Don't display course modes after the first stage. */
if( !GAMESTATE->IsEventMode() && GAMESTATE->m_iCurrentStageIndex )
if( !GAMESTATE->IsEventMode() && GAMESTATE->GetLargestNumStagesLeftForAnyHumanPlayer() > 0 )
continue;
}
+120
View File
@@ -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.
*/
+45
View File
@@ -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.
*/
+2 -4
View File
@@ -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_2]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, 2.0f );
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_2]->m_PlayerOptions, ModsLevel_Stage, ChooseRandomModifiers );
@@ -84,10 +86,6 @@ void ScreenEnding::Init()
{
ScreenAttract::Init();
vector<Song*> arraySongs;
SONGMAN->GetSongs( arraySongs );
SongUtil::SortSongPointerArrayByTitle( arraySongs );
FOREACH_HumanPlayer( p )
{
if( !PROFILEMAN->IsPersistentProfile(p) )
+2
View File
@@ -101,6 +101,8 @@ ScreenEvaluation::ScreenEvaluation()
STATSMAN->m_CurStageStats.m_vpPossibleSongs.push_back( GAMESTATE->m_pCurSong );
GAMESTATE->m_pCurCourse.Set( SONGMAN->GetRandomCourse() );
GAMESTATE->m_iCurrentStageIndex = 0;
FOREACH_ENUM( PlayerNumber, p )
GAMESTATE->m_iPlayerCurrentStageIndexForCurrentCredit[p] = 0;
FOREACH_PlayerNumber( p )
{
+2
View File
@@ -57,6 +57,8 @@ void ScreenGameplayLesson::Init()
// Reset stage number (not relevant in lessons)
GAMESTATE->m_iCurrentStageIndex = 0;
FOREACH_ENUM( PlayerNumber, p )
GAMESTATE->m_iPlayerCurrentStageIndexForCurrentCredit[p] = 0;
// Autoplay during demonstration
FOREACH_EnabledPlayerInfo( m_vPlayerInfo, pi )
+1 -1
View File
@@ -180,7 +180,7 @@ void ScreenSelectMusic::Init()
void ScreenSelectMusic::BeginScreen()
{
/* 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();
LIGHTSMAN->SetLightsMode( LIGHTSMODE_MENU );
+1 -1
View File
@@ -832,7 +832,7 @@ static void GetPlayableStepsTypes( const Song *pSong, set<StepsType> &vOut )
bool bShowThisStepsType = find( vstToShow.begin(), vstToShow.end(), *st ) != vstToShow.end();
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 )
vOut.insert( *st );
+6
View File
@@ -286,6 +286,12 @@ cl /Zl /nologo /c verstub.cpp /Fo&quot;$(IntDir)&quot;\
<File
RelativePath="ScreenCenterImage.h">
</File>
<File
RelativePath=".\ScreenContinue.cpp">
</File>
<File
RelativePath=".\ScreenContinue.h">
</File>
<File
RelativePath="ScreenCredits.cpp">
</File>