Files
itgmania212121/stepmania/src/ScreenSelectStyle.cpp
T

389 lines
11 KiB
C++
Raw Normal View History

2002-05-20 08:59:37 +00:00
#include "stdafx.h"
/*
-----------------------------------------------------------------------------
2002-06-27 17:49:10 +00:00
Class: ScreenSelectStyle
2002-05-20 08:59:37 +00:00
Desc: Testing the Screen class.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
2002-06-27 17:49:10 +00:00
Chris Danford
2002-05-20 08:59:37 +00:00
-----------------------------------------------------------------------------
*/
#include "ScreenSelectStyle.h"
#include "ScreenManager.h"
#include "PrefsManager.h"
#include "RageMusic.h"
#include "ScreenTitleMenu.h"
#include "ScreenCaution.h"
#include "GameConstantsAndTypes.h"
2002-07-23 01:41:40 +00:00
#include "PrefsManager.h"
#include "ScreenSelectGroup.h"
2002-05-20 08:59:37 +00:00
#include "ScreenSelectDifficulty.h"
#include "ScreenSandbox.h"
#include "GameManager.h"
#include "RageLog.h"
#include "AnnouncerManager.h"
2002-07-23 01:41:40 +00:00
#include "GameState.h"
2002-05-20 08:59:37 +00:00
#define ICONS_START_X THEME->GetMetricF("SelectStyle","IconsStartX")
#define ICONS_SPACING_X THEME->GetMetricF("SelectStyle","IconsSpacingX")
#define ICONS_START_Y THEME->GetMetricF("SelectStyle","IconsStartY")
#define ICONS_SPACING_Y THEME->GetMetricF("SelectStyle","IconsSpacingY")
#define EXPLANATION_X THEME->GetMetricF("SelectStyle","ExplanationX")
#define EXPLANATION_Y THEME->GetMetricF("SelectStyle","ExplanationY")
#define INFO_X THEME->GetMetricF("SelectStyle","InfoX")
#define INFO_Y THEME->GetMetricF("SelectStyle","InfoY")
#define PREVIEW_X THEME->GetMetricF("SelectStyle","PreviewX")
#define PREVIEW_Y THEME->GetMetricF("SelectStyle","PreviewY")
2002-05-20 08:59:37 +00:00
2002-08-15 16:45:49 +00:00
#define SKIP_SELECT_DIFFICULTY THEME->GetMetricB("General","SkipSelectDifficulty")
2002-05-20 08:59:37 +00:00
const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User + 1);
const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2);
ScreenSelectStyle::ScreenSelectStyle()
{
LOG->Trace( "ScreenSelectStyle::ScreenSelectStyle()" );
2002-05-20 08:59:37 +00:00
2002-06-24 22:04:31 +00:00
// Reset the current style and game
2002-07-23 01:41:40 +00:00
GAMESTATE->m_CurStyle = STYLE_NONE;
GAMESTATE->m_bPlayersCanJoin = true;
2002-06-24 22:04:31 +00:00
2002-08-17 06:44:04 +00:00
GAMEMAN->GetGameplayStylesForGame( GAMESTATE->m_CurGame, m_aPossibleStyles );
ASSERT( m_aPossibleStyles.GetSize() > 0 ); // every game should have at least one Style, or else why have the Game? :-)
2002-05-27 18:36:01 +00:00
m_iSelection = 0;
2002-05-20 08:59:37 +00:00
2002-05-27 18:36:01 +00:00
for( int i=0; i<m_aPossibleStyles.GetSize(); i++ )
2002-05-20 08:59:37 +00:00
{
2002-05-27 18:36:01 +00:00
Style style = m_aPossibleStyles[i];
m_sprIcon[i].Load( THEME->GetPathTo("Graphics",ssprintf("select style icons game %d",GAMESTATE->m_CurGame) ) );
2002-05-27 18:36:01 +00:00
m_sprIcon[i].StopAnimating();
m_sprIcon[i].SetState( i );
m_sprIcon[i].SetXY( ICONS_START_X + i*ICONS_SPACING_X, ICONS_START_Y + i*ICONS_SPACING_Y );
2002-07-23 01:41:40 +00:00
this->AddSubActor( &m_sprIcon[i] );
2002-05-20 08:59:37 +00:00
}
UpdateEnabledDisabled();
m_sprExplanation.Load( THEME->GetPathTo("Graphics","select style explanation") );
2002-05-27 18:36:01 +00:00
m_sprExplanation.SetXY( EXPLANATION_X, EXPLANATION_Y );
2002-07-23 01:41:40 +00:00
this->AddSubActor( &m_sprExplanation );
2002-05-27 18:36:01 +00:00
m_sprPreview.SetXY( PREVIEW_X, PREVIEW_Y );
2002-07-23 01:41:40 +00:00
this->AddSubActor( &m_sprPreview );
2002-05-27 18:36:01 +00:00
m_sprInfo.SetXY( INFO_X, INFO_Y );
2002-07-23 01:41:40 +00:00
this->AddSubActor( &m_sprInfo );
2002-05-20 08:59:37 +00:00
2002-06-27 17:49:10 +00:00
// Load dummy Sprites
2002-06-27 19:14:23 +00:00
for( i=0; i<m_aPossibleStyles.GetSize(); i++ )
2002-06-27 17:49:10 +00:00
{
m_sprDummyPreview[i].Load( THEME->GetPathTo("Graphics",ssprintf("select style preview game %d style %d",GAMESTATE->m_CurGame,i)) );
m_sprDummyInfo[i].Load( THEME->GetPathTo("Graphics",ssprintf("select style info game %d style %d",GAMESTATE->m_CurGame,i)) );
2002-06-27 17:49:10 +00:00
}
2002-05-20 08:59:37 +00:00
m_Menu.Load(
THEME->GetPathTo("Graphics","select style background"),
THEME->GetPathTo("Graphics","select style top edge"),
2002-07-11 19:02:26 +00:00
ssprintf("Use %c %c to select, then press START", char(1), char(2) ),
false, true, 40
2002-05-20 08:59:37 +00:00
);
2002-07-23 01:41:40 +00:00
this->AddSubActor( &m_Menu );
2002-05-20 08:59:37 +00:00
m_soundChange.Load( THEME->GetPathTo("Sounds","select style change") );
m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") );
2002-05-20 08:59:37 +00:00
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_STYLE_INTRO) );
if( !MUSIC->IsPlaying() || MUSIC->GetLoadedFilePath() != THEME->GetPathTo("Sounds","select style music") )
2002-05-20 08:59:37 +00:00
{
MUSIC->Load( THEME->GetPathTo("Sounds","select style music") );
MUSIC->Play( true );
2002-05-20 08:59:37 +00:00
}
2002-05-27 18:36:01 +00:00
AfterChange();
2002-05-20 08:59:37 +00:00
TweenOnScreen();
2002-05-28 20:01:22 +00:00
m_Menu.TweenOnScreenFromBlack( SM_None );
2002-05-20 08:59:37 +00:00
}
ScreenSelectStyle::~ScreenSelectStyle()
{
LOG->Trace( "ScreenSelectStyle::~ScreenSelectStyle()" );
2002-05-20 08:59:37 +00:00
}
void ScreenSelectStyle::DrawPrimitives()
{
m_Menu.DrawBottomLayer();
Screen::DrawPrimitives();
m_Menu.DrawTopLayer();
}
void ScreenSelectStyle::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )
{
LOG->Trace( "ScreenSelectStyle::Input()" );
2002-05-20 08:59:37 +00:00
2002-05-28 20:01:22 +00:00
if( m_Menu.IsClosing() )
2002-05-20 08:59:37 +00:00
return;
Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler
}
void ScreenSelectStyle::HandleScreenMessage( const ScreenMessage SM )
{
Screen::HandleScreenMessage( SM );
switch( SM )
{
2002-05-27 08:23:27 +00:00
case SM_MenuTimer:
2002-06-24 22:04:31 +00:00
MenuStart(PLAYER_INVALID);
2002-05-27 08:23:27 +00:00
break;
2002-05-20 08:59:37 +00:00
case SM_GoToPrevState:
MUSIC->Stop();
SCREENMAN->SetNewScreen( new ScreenTitleMenu );
break;
case SM_GoToNextState:
if( SKIP_SELECT_DIFFICULTY )
SCREENMAN->SetNewScreen( new ScreenSelectGroup );
else
SCREENMAN->SetNewScreen( new ScreenSelectDifficulty );
2002-05-20 08:59:37 +00:00
break;
}
}
2002-05-27 18:36:01 +00:00
void ScreenSelectStyle::BeforeChange()
{
m_sprIcon[m_iSelection].SetEffectNone();
}
void ScreenSelectStyle::AfterChange()
{
m_sprIcon[m_iSelection].SetEffectGlowing();
2002-05-28 20:01:22 +00:00
// Tween Preview
m_sprPreview.Load( THEME->GetPathTo("Graphics",ssprintf("select style preview game %d style %d",GAMESTATE->m_CurGame,m_iSelection)) );
2002-05-27 18:36:01 +00:00
2002-05-28 20:01:22 +00:00
m_sprPreview.StopTweening();
m_sprPreview.SetGlowColor( D3DXCOLOR(1,1,1,0) );
2002-05-28 20:01:22 +00:00
m_sprPreview.SetDiffuseColor( D3DXCOLOR(1,1,1,0) );
m_sprPreview.BeginTweeningQueued( 0.25f ); // sleep
m_sprPreview.BeginTweeningQueued( 0.2f ); // fade to white
m_sprPreview.SetTweenAddColor( D3DXCOLOR(1,1,1,1) );
m_sprPreview.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,0) );
m_sprPreview.BeginTweeningQueued( 0.01f ); // turn color on
m_sprPreview.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) );
m_sprPreview.BeginTweeningQueued( 0.2f ); // fade to color
m_sprPreview.SetTweenAddColor( D3DXCOLOR(1,1,1,0) );
m_sprPreview.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) );
// Tween Info
m_sprInfo.Load( THEME->GetPathTo("Graphics",ssprintf("select style info game %d style %d",GAMESTATE->m_CurGame,m_iSelection)) );
2002-05-28 20:01:22 +00:00
m_sprInfo.StopTweening();
2002-05-27 18:36:01 +00:00
m_sprInfo.SetZoomY( 0 );
2002-05-28 20:01:22 +00:00
m_sprInfo.BeginTweeningQueued( 0.5f, Actor::TWEEN_BOUNCE_END );
2002-05-27 18:36:01 +00:00
m_sprInfo.SetTweenZoomY( 1 );
}
void ScreenSelectStyle::MenuLeft( const PlayerNumber p )
2002-05-20 08:59:37 +00:00
{
// search for a style to the left of the current selection that is enabled
int iSwitchToStyleIndex = -1; // -1 means none found
for( int i=m_iSelection-1; i>=0; i-- )
{
if( IsEnabled(i) )
{
iSwitchToStyleIndex = i;
break;
}
}
if( iSwitchToStyleIndex == -1 )
2002-05-20 08:59:37 +00:00
return;
BeforeChange();
m_iSelection = iSwitchToStyleIndex;
2002-05-20 08:59:37 +00:00
m_soundChange.PlayRandom();
AfterChange();
}
2002-05-27 18:36:01 +00:00
void ScreenSelectStyle::MenuRight( const PlayerNumber p )
2002-05-20 08:59:37 +00:00
{
// search for a style to the right of the current selection that is enabled
int iSwitchToStyleIndex = -1; // -1 means none found
for( int i=m_iSelection+1; i<m_aPossibleStyles.GetSize(); i++ )
{
if( IsEnabled(i) )
{
iSwitchToStyleIndex = i;
break;
}
}
if( iSwitchToStyleIndex == -1 )
2002-05-20 08:59:37 +00:00
return;
BeforeChange();
m_iSelection = iSwitchToStyleIndex;
2002-05-20 08:59:37 +00:00
m_soundChange.PlayRandom();
AfterChange();
}
2002-05-27 18:36:01 +00:00
void ScreenSelectStyle::MenuStart( const PlayerNumber p )
2002-05-20 08:59:37 +00:00
{
if( p!=PLAYER_INVALID && !GAMESTATE->m_bIsJoined[p] )
{
SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","menu start") );
GAMESTATE->m_bIsJoined[p] = true;
SCREENMAN->RefreshCreditsMessages();
UpdateEnabledDisabled();
return; // don't fall through
}
2002-07-23 01:41:40 +00:00
GAMESTATE->m_CurStyle = GetSelectedStyle();
2002-05-20 08:59:37 +00:00
2002-05-27 08:23:27 +00:00
AnnouncerElement ae;
2002-07-23 01:41:40 +00:00
switch( GAMESTATE->m_CurStyle )
2002-05-27 08:23:27 +00:00
{
case STYLE_DANCE_SINGLE: ae = ANNOUNCER_SELECT_STYLE_COMMENT_SINGLE; break;
case STYLE_DANCE_VERSUS: ae = ANNOUNCER_SELECT_STYLE_COMMENT_VERSUS; break;
case STYLE_DANCE_DOUBLE: ae = ANNOUNCER_SELECT_STYLE_COMMENT_DOUBLE; break;
case STYLE_DANCE_COUPLE: ae = ANNOUNCER_SELECT_STYLE_COMMENT_COUPLE; break;
case STYLE_DANCE_SOLO: ae = ANNOUNCER_SELECT_STYLE_COMMENT_SOLO; break;
case STYLE_PUMP_SINGLE: ae = ANNOUNCER_SELECT_STYLE_COMMENT_SINGLE; break;
case STYLE_PUMP_VERSUS: ae = ANNOUNCER_SELECT_STYLE_COMMENT_VERSUS; break;
default: ASSERT(0); break; // invalid Style
}
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ae) );
2002-05-20 08:59:37 +00:00
2002-05-28 20:01:22 +00:00
m_Menu.TweenOffScreenToMenu( SM_GoToNextState );
2002-05-20 08:59:37 +00:00
m_soundSelect.PlayRandom();
TweenOffScreen();
}
2002-05-27 18:36:01 +00:00
void ScreenSelectStyle::MenuBack( const PlayerNumber p )
2002-05-20 08:59:37 +00:00
{
MUSIC->Stop();
2002-05-28 20:01:22 +00:00
m_Menu.TweenOffScreenToBlack( SM_GoToPrevState, true );
2002-05-20 08:59:37 +00:00
2002-05-28 20:01:22 +00:00
// m_Fade.CloseWipingLeft( SM_GoToPrevState );
2002-05-20 08:59:37 +00:00
2002-05-28 20:01:22 +00:00
// TweenOffScreen();
2002-05-20 08:59:37 +00:00
}
void ScreenSelectStyle::TweenOffScreen()
{
2002-05-27 18:36:01 +00:00
for( int i=0; i<NUM_STYLES; i++ )
2002-05-20 08:59:37 +00:00
{
2002-05-27 18:36:01 +00:00
m_sprIcon[i].BeginTweening( MENU_ELEMENTS_TWEEN_TIME );
m_sprIcon[i].SetTweenZoomY( 0 );
2002-05-20 08:59:37 +00:00
}
2002-05-27 18:36:01 +00:00
m_sprExplanation.BeginTweening( MENU_ELEMENTS_TWEEN_TIME );
m_sprExplanation.SetTweenZoomY( 0 );
2002-05-20 08:59:37 +00:00
2002-05-27 18:36:01 +00:00
m_sprPreview.BeginTweening( MENU_ELEMENTS_TWEEN_TIME );
m_sprPreview.SetTweenZoomY( 0 );
2002-05-20 08:59:37 +00:00
2002-05-27 18:36:01 +00:00
m_sprInfo.BeginTweening( MENU_ELEMENTS_TWEEN_TIME );
m_sprInfo.SetTweenZoomX( 0 );
2002-05-20 08:59:37 +00:00
}
void ScreenSelectStyle::TweenOnScreen()
{
2002-05-27 18:36:01 +00:00
float fOriginalZoom;
2002-05-20 08:59:37 +00:00
2002-05-27 18:36:01 +00:00
for( int i=0; i<NUM_STYLES; i++ )
2002-05-20 08:59:37 +00:00
{
2002-05-27 18:36:01 +00:00
fOriginalZoom = m_sprIcon[i].GetZoomY();
m_sprIcon[i].SetZoomY( 0 );
m_sprIcon[i].BeginTweening( MENU_ELEMENTS_TWEEN_TIME );
m_sprIcon[i].SetTweenZoomY( fOriginalZoom );
2002-05-20 08:59:37 +00:00
}
2002-05-27 18:36:01 +00:00
fOriginalZoom = m_sprExplanation.GetZoomY();
m_sprExplanation.SetZoomY( 0 );
m_sprExplanation.BeginTweening( MENU_ELEMENTS_TWEEN_TIME );
m_sprExplanation.SetTweenZoomY( fOriginalZoom );
2002-05-20 08:59:37 +00:00
2002-05-28 20:01:22 +00:00
// let AfterChange tween Preview and Info
/*
2002-05-27 18:36:01 +00:00
fOriginalZoom = m_sprPreview.GetZoomY();
m_sprPreview.SetZoomY( 0 );
m_sprPreview.BeginTweening( MENU_ELEMENTS_TWEEN_TIME );
m_sprPreview.SetTweenZoomY( fOriginalZoom );
2002-05-20 08:59:37 +00:00
2002-05-27 18:36:01 +00:00
fOriginalZoom = m_sprInfo.GetZoomY();
m_sprInfo.SetZoomY( 0 );
m_sprInfo.BeginTweening( MENU_ELEMENTS_TWEEN_TIME );
m_sprInfo.SetTweenZoomY( fOriginalZoom );
2002-05-28 20:01:22 +00:00
*/
2002-05-20 08:59:37 +00:00
}
bool ScreenSelectStyle::IsEnabled( int iStyleIndex )
{
Style style = m_aPossibleStyles[iStyleIndex];
int iNumSidesJoined = 0;
for( int c=0; c<2; c++ )
if( GAMESTATE->m_bIsJoined[c] )
iNumSidesJoined++; // left side, and right side
switch( GAMEMAN->GetStyleDefForStyle(style)->m_StyleType )
{
case StyleDef::ONE_PLAYER_ONE_CREDIT: return iNumSidesJoined==1;
case StyleDef::ONE_PLAYER_TWO_CREDITS: return iNumSidesJoined==2;
case StyleDef::TWO_PLAYERS_TWO_CREDITS: return iNumSidesJoined==2;
default: ASSERT(0); return false;
}
}
void ScreenSelectStyle::UpdateEnabledDisabled()
{
int i;
for( i=0; i<m_aPossibleStyles.GetSize(); i++ )
{
if( IsEnabled(i) )
m_sprIcon[i].SetDiffuseColor( D3DXCOLOR(1,1,1,1) );
else
m_sprIcon[i].SetDiffuseColor( D3DXCOLOR(0.5f,0.5f,0.5f,1) );
}
// Select first enabled style
BeforeChange();
int iSwitchToStyleIndex = -1; // -1 means none found
for( i=0; i<m_aPossibleStyles.GetSize(); i++ )
{
if( IsEnabled(i) )
{
iSwitchToStyleIndex = i;
break;
}
}
ASSERT( iSwitchToStyleIndex != -1 ); // no styles are enabled. We're stuck! This should never happen
m_iSelection = iSwitchToStyleIndex;
AfterChange();
}