Allow game selection screens before setting the style

Handle "screen" ModeChoice command.
Focus tweening cleanups.
This commit is contained in:
Glenn Maynard
2003-11-05 18:49:57 +00:00
parent c36a787821
commit 177acf795a
2 changed files with 49 additions and 54 deletions
+43 -50
View File
@@ -20,6 +20,7 @@
#include "AnnouncerManager.h"
#include "ModeChoice.h"
#include "ActorUtil.h"
#include "RageLog.h"
#define NUM_ICON_PARTS THEME->GetMetricI(m_sName,"NumIconParts")
#define NUM_PREVIEW_PARTS THEME->GetMetricI(m_sName,"NumPreviewParts")
@@ -36,13 +37,6 @@ const ScreenMessage SM_PlayPostSwitchPage = (ScreenMessage)(SM_User+1);
ScreenSelectMaster::ScreenSelectMaster( CString sClassName ) : ScreenSelect( sClassName )
{
/* ScreenSelect::ScreenSelect will have set m_bPlayersCanJoin if the style is being
* set. We should either have a style or be setting the style, or GameState::IsHumanPlayer
* will always return true. Nothing does this right now, and it's an easy mistake,
* so don't allow it. */
if( GAMESTATE->m_CurStyle == STYLE_INVALID && !GAMESTATE->m_bPlayersCanJoin )
RageException::Throw("Screen %s doesn't set the style and the style isn't already set", m_sName.c_str() );
int p, i;
for( p=0; p<NUM_PLAYERS; p++ )
@@ -359,6 +353,8 @@ void ScreenSelectMaster::ChangeSelection( PlayerNumber pn, int iNewChoice )
}
{
/* XXX: If !SharedPreviewAndCursor, this is incorrect. (Nothing uses
* both icon focus and !SharedPreviewAndCursor right now.) */
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
{
COMMAND( m_sprIcon[i][iOldChoice], "LoseFocus" );
@@ -443,15 +439,33 @@ void ScreenSelectMaster::MenuStart( PlayerNumber pn )
for( int i=0; i<NUM_CURSOR_PARTS; i++ )
fSecs = max( fSecs, COMMAND( m_sprCursor[i][pn], "Choose") );
// check to see if everyone has chosen
bool bAllDone = true;
for( p=0; p<NUM_PLAYERS; p++ )
if( GAMESTATE->IsHumanPlayer((PlayerNumber)p) )
bAllDone &= m_bChosen[p];
/* If SHARED_PREVIEW_AND_CURSOR, only one player has to pick. */
if( !SHARED_PREVIEW_AND_CURSOR )
{
// check to see if everyone has chosen
for( p=0; p<NUM_PLAYERS; p++ )
if( GAMESTATE->IsHumanPlayer((PlayerNumber)p) )
bAllDone &= m_bChosen[p];
}
if( bAllDone )
this->PostScreenMessage( SM_BeginFadingOut, fSecs );// tell our owner it's time to move on
}
/*
* We want all items to always run OnCommand and either GainFocus or LoseFocus on
* tween-in. If we only run OnCommand, then it has to contain a copy of either
* GainFocus or LoseFocus, which implies that the default setting is hard-coded in
* the theme. Always run both.
*
* However, the actual tween-in is OnCommand; we don't always want to actually run
* through the Gain/LoseFocus tweens during initial tween-in. So, we run the focus
* command first, do a FinishTweening to pop it in place, and then run OnCommand.
* This means that the focus command should be position neutral; eg. only use "addx",
* not "x".
*/
float ScreenSelectMaster::TweenOnScreen()
{
float fSecs = 0;
@@ -460,15 +474,9 @@ float ScreenSelectMaster::TweenOnScreen()
{
for( int i=0; i<NUM_ICON_PARTS; i++ )
{
COMMAND( m_sprIcon[i][c], (int(c) == m_iChoice[0])? "GainFocus":"LoseFocus" );
m_sprIcon[i][c]->FinishTweening();
fSecs = max( fSecs, SET_XY_AND_ON_COMMAND( m_sprIcon[i][c] ) );
for( int c=0; c<(int) m_aModeChoices.size(); c++ )
{
const bool GainingFocus = (c == m_iChoice[0]);
fSecs = max( fSecs, COMMAND( m_sprIcon[i][c], GainingFocus? "GainFocus":"LoseFocus" ) );
if( !GainingFocus )
m_sprIcon[i][c]->FinishTweening();
}
}
if( SHARED_PREVIEW_AND_CURSOR )
@@ -476,12 +484,9 @@ float ScreenSelectMaster::TweenOnScreen()
int p=0;
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
{
// SET_XY( m_sprPreview[i][c][p] );
COMMAND( m_sprPreview[i][c][p], (int(c) == m_iChoice[p])? "GainFocus":"LoseFocus" );
m_sprPreview[i][c][p]->FinishTweening();
fSecs = max( fSecs, SET_XY_AND_ON_COMMAND( m_sprPreview[i][c][p] ) );
const bool GainingFocus = (int(c) == m_iChoice[p]);
fSecs = max( fSecs, COMMAND( m_sprPreview[i][c][p], GainingFocus? "GainFocus":"LoseFocus" ) );
if( !GainingFocus )
m_sprPreview[i][c][p]->FinishTweening();
}
}
else
@@ -490,37 +495,13 @@ float ScreenSelectMaster::TweenOnScreen()
if( GAMESTATE->IsPlayerEnabled(p) )
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
{
// SET_XY( m_sprPreview[i][c][p] );
COMMAND( m_sprPreview[i][c][p], int(c) == m_iChoice[p]? "GainFocus":"LoseFocus" );
m_sprPreview[i][c][p]->FinishTweening();
fSecs = max( fSecs, SET_XY_AND_ON_COMMAND( m_sprPreview[i][c][p] ) );
const bool GainingFocus = (int(c) == m_iChoice[p]);
fSecs = max( fSecs, COMMAND( m_sprPreview[i][c][p], GainingFocus? "GainFocus":"LoseFocus" ) );
if( !GainingFocus )
m_sprPreview[i][c][p]->FinishTweening();
}
}
}
if( SHARED_PREVIEW_AND_CURSOR )
{
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
fSecs = max( fSecs, COMMAND( m_sprPreview[i][m_iChoice[0]][0], "GainFocus" ) );
}
else
{
for( int p=0; p<NUM_PLAYERS; p++ )
{
if( !GAMESTATE->IsPlayerEnabled(p) )
continue;
for( int c=0; c<(int) m_aModeChoices.size(); c++ )
for( int i=0; i<NUM_PREVIEW_PARTS; i++ )
{
const char *cmd = (c == m_iChoice[p])? "GainFocus":"LoseFocus";
fSecs = max( fSecs, COMMAND( m_sprPreview[i][c][p], cmd ) );
}
}
}
// Need to SetXY of Cursor after Icons since it depends on the Icons' positions.
if( SHARED_PREVIEW_AND_CURSOR )
{
@@ -573,7 +554,19 @@ float ScreenSelectMaster::TweenOffScreen()
continue; // skip
for( int i=0; i<NUM_ICON_PARTS; i++ )
{
fSecs = max( fSecs, OFF_COMMAND( m_sprIcon[i][c] ) );
bool SelectedByEitherPlayer = false;
for( int p=0; p<NUM_PLAYERS; p++ )
if( GAMESTATE->IsPlayerEnabled(p) && m_iChoice[p] == (int)c )
SelectedByEitherPlayer = true;
if( SelectedByEitherPlayer )
fSecs = max( fSecs, COMMAND( m_sprIcon[i][c], "OffFocused" ) );
else
fSecs = max( fSecs, COMMAND( m_sprIcon[i][c], "OffUnfocused" ) );
}
if( SHARED_PREVIEW_AND_CURSOR )
{