add ModeChoice::IsPlayable

This commit is contained in:
Glenn Maynard
2003-09-27 03:06:35 +00:00
parent 8d351ab429
commit 53c0a7b02e
2 changed files with 56 additions and 28 deletions
+55 -25
View File
@@ -23,7 +23,6 @@ void ModeChoice::Init()
m_sName = "";
m_sScreen = "";
m_bInvalid = true;
m_sInvalidReason = "";
}
bool ModeChoice::DescribesCurrentMode() const
@@ -125,33 +124,64 @@ void ModeChoice::Load( int iIndex, CString sChoice )
if( sName == "screen" )
{
m_sScreen = sValue;
/* XXX: do this in GameState::IsPlayable, but move GameState::IsPlayable to ModeChoice::IsPlayable */
/* if( m_sScreen == "ScreenEditCoursesMenu" )
{
vector<Course*> vCourses;
SONGMAN->GetAllCourses( vCourses, false );
if( vCourses.size() == 0 )
{
m_bInvalid = true;
m_sInvalidReason = "No courses are installed";
}
}
if( m_sScreen == "ScreenJukeboxMenu" ||
m_sScreen == "ScreenEditMenu" ||
m_sScreen == "ScreenEditCoursesMenu" )
{
if( SONGMAN->GetNumSongs() == 0 )
{
m_bInvalid = true;
m_sInvalidReason = "No songs are installed";
}
}
*/ }
}
}
}
bool ModeChoice::IsPlayable( CString *why ) const
{
if( m_bInvalid )
return false;
if ( m_style != STYLE_INVALID )
{
const int SidesJoinedToPlay = GAMEMAN->GetStyleDefForStyle(m_style)->NumSidesJoinedToPlay();
if( SidesJoinedToPlay != GAMESTATE->GetNumSidesJoined() )
return false;
}
/* Don't allow a PlayMode that's incompatible with our current Style (if set),
* and vice versa. */
const PlayMode &rPlayMode = (m_pm != PLAY_MODE_INVALID) ? m_pm : GAMESTATE->m_PlayMode;
if( rPlayMode == PLAY_MODE_RAVE || rPlayMode == PLAY_MODE_BATTLE )
{
// Can't play rave if there isn't enough room for two players.
// This is correct for dance (ie, no rave for solo and doubles),
// and should be okay for pump .. not sure about other game types.
const Style &rStyle = m_style != STYLE_INVALID? m_style: GAMESTATE->m_CurStyle;
if( rStyle != STYLE_INVALID &&
GAMEMAN->GetStyleDefForStyle(rStyle)->m_iColsPerPlayer >= 6 )
return false;
}
if( !m_sScreen.CompareNoCase("ScreenEditCoursesMenu") )
{
vector<Course*> vCourses;
SONGMAN->GetAllCourses( vCourses, false );
if( vCourses.size() == 0 )
{
if( why )
*why = "No courses are installed";
return false;
}
}
if( !m_sScreen.CompareNoCase("ScreenJukeboxMenu") ||
!m_sScreen.CompareNoCase("ScreenEditMenu") ||
!m_sScreen.CompareNoCase("ScreenEditCoursesMenu") )
{
if( SONGMAN->GetNumSongs() == 0 )
{
if( why )
*why = "No songs are installed";
return false;
}
}
return true;
}
void ModeChoice::ApplyToAllPlayers()
{
for( int pn=0; pn<NUM_PLAYERS; pn++ )
+1 -3
View File
@@ -25,11 +25,9 @@ struct ModeChoice // used in SelectMode
void ApplyToAllPlayers();
void Apply( PlayerNumber pn );
bool DescribesCurrentMode() const;
bool IsPlayable( CString *why = NULL ) const;
bool m_bInvalid;
/* If the reason this selection is invalid may not be obvious to the user, this
* is set to a message. */
CString m_sInvalidReason;
int m_iIndex;
Game m_game;
Style m_style;