2002-05-20 08:59:37 +00:00
|
|
|
#include "stdafx.h"
|
|
|
|
|
/*
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
Class: ScreenStage
|
|
|
|
|
|
|
|
|
|
Desc: See header.
|
|
|
|
|
|
|
|
|
|
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
|
|
|
|
|
Chris Danford
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "ScreenStage.h"
|
|
|
|
|
#include "ScreenManager.h"
|
|
|
|
|
#include "PrefsManager.h"
|
2002-07-23 01:41:40 +00:00
|
|
|
#include "PrefsManager.h"
|
2002-05-20 08:59:37 +00:00
|
|
|
#include "RageLog.h"
|
|
|
|
|
#include "GameConstantsAndTypes.h"
|
|
|
|
|
#include "BitmapText.h"
|
|
|
|
|
#include "TransitionFadeWipe.h"
|
|
|
|
|
#include "TransitionFade.h"
|
|
|
|
|
#include "ScreenSelectMusic.h"
|
|
|
|
|
#include "ScreenGameplay.h"
|
|
|
|
|
#include "SongManager.h"
|
|
|
|
|
#include "Sprite.h"
|
|
|
|
|
#include "AnnouncerManager.h"
|
2002-07-23 01:41:40 +00:00
|
|
|
#include "GameState.h"
|
|
|
|
|
|
2002-05-20 08:59:37 +00:00
|
|
|
|
|
|
|
|
const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 1);
|
2002-07-11 19:02:26 +00:00
|
|
|
const ScreenMessage SM_DoneFadingIn = ScreenMessage(SM_User + 2);
|
2002-05-20 08:59:37 +00:00
|
|
|
const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 3);
|
|
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
enum StageType
|
|
|
|
|
{
|
|
|
|
|
TYPE_NORMAL,
|
|
|
|
|
TYPE_FINAL,
|
|
|
|
|
TYPE_EXTRA1,
|
|
|
|
|
TYPE_EXTRA2,
|
|
|
|
|
TYPE_ONI,
|
|
|
|
|
TYPE_ENDLESS
|
|
|
|
|
};
|
2002-05-20 08:59:37 +00:00
|
|
|
|
2002-06-24 22:04:31 +00:00
|
|
|
ScreenStage::ScreenStage()
|
2002-05-20 08:59:37 +00:00
|
|
|
{
|
2002-07-28 20:28:37 +00:00
|
|
|
MUSIC->Stop();
|
|
|
|
|
|
2002-07-11 19:02:26 +00:00
|
|
|
m_pNextScreen = NULL;
|
|
|
|
|
|
2002-06-24 22:04:31 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
for( int i=0; i<4; i++ )
|
2002-07-29 03:06:55 +00:00
|
|
|
{
|
2002-08-13 23:26:46 +00:00
|
|
|
m_sprNumbers[i].Load( THEME->GetPathTo("Graphics","stage numbers") );
|
|
|
|
|
m_sprNumbers[i].StopAnimating();
|
2002-07-23 01:41:40 +00:00
|
|
|
}
|
2002-08-13 23:26:46 +00:00
|
|
|
m_sprStage.Load( THEME->GetPathTo("Graphics","stage stage") ); // we may load a different graphic into here later
|
|
|
|
|
const float fStageHeight = m_sprStage.GetUnzoomedHeight();
|
|
|
|
|
|
|
|
|
|
const float fStageOffScreenY = CENTER_Y+fStageHeight;
|
|
|
|
|
|
|
|
|
|
m_quadMask.SetDiffuseColor( D3DXCOLOR(0,0,0,0) );
|
|
|
|
|
m_quadMask.StretchTo( CRect(SCREEN_LEFT, roundf(fStageOffScreenY-fStageHeight/2), SCREEN_RIGHT, roundf(fStageOffScreenY+fStageHeight/2)) );
|
|
|
|
|
m_quadMask.SetZ( -1 ); // important: fill Z buffer with values that will cause subsequent draws to fail the Z test
|
|
|
|
|
|
|
|
|
|
m_frameStage.SetXY( CENTER_X, fStageOffScreenY );
|
|
|
|
|
m_frameStage.BeginTweening(0.8f, Actor::TWEEN_BIAS_BEGIN );
|
|
|
|
|
m_frameStage.SetTweenY( CENTER_Y );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
StageType stage_type;
|
|
|
|
|
if( GAMESTATE->m_PlayMode == PLAY_MODE_ONI ) stage_type = TYPE_ONI;
|
|
|
|
|
else if( GAMESTATE->m_PlayMode == PLAY_MODE_ENDLESS ) stage_type = TYPE_ENDLESS;
|
|
|
|
|
else if( GAMESTATE->IsExtraStage() ) stage_type = TYPE_EXTRA1;
|
|
|
|
|
else if( GAMESTATE->IsExtraStage2() ) stage_type = TYPE_EXTRA2;
|
|
|
|
|
else if( GAMESTATE->IsFinalStage() ) stage_type = TYPE_FINAL;
|
|
|
|
|
else stage_type = TYPE_NORMAL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch( stage_type )
|
2002-05-20 08:59:37 +00:00
|
|
|
{
|
2002-08-13 23:26:46 +00:00
|
|
|
case TYPE_NORMAL:
|
|
|
|
|
{
|
|
|
|
|
const int iStageNo = GAMESTATE->GetStageIndex()+1;
|
|
|
|
|
switch( iStageNo )
|
|
|
|
|
{
|
|
|
|
|
case 1: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_1) ); break;
|
|
|
|
|
case 2: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_2) ); break;
|
|
|
|
|
case 3: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_3) ); break;
|
|
|
|
|
case 4: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_4) ); break;
|
|
|
|
|
case 5: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_5) ); break;
|
|
|
|
|
default: ; break; // play nothing
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TYPE_FINAL:
|
2002-06-24 22:04:31 +00:00
|
|
|
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_FINAL) );
|
2002-08-13 23:26:46 +00:00
|
|
|
break;
|
|
|
|
|
case TYPE_EXTRA1:
|
|
|
|
|
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_EXTRA1) );
|
|
|
|
|
break;
|
|
|
|
|
case TYPE_EXTRA2:
|
|
|
|
|
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_EXTRA2) );
|
|
|
|
|
break;
|
|
|
|
|
case TYPE_ONI:
|
|
|
|
|
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ONI) );
|
|
|
|
|
break;
|
|
|
|
|
case TYPE_ENDLESS:
|
|
|
|
|
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ENDLESS) );
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
ASSERT(0);
|
2002-06-24 22:04:31 +00:00
|
|
|
}
|
2002-05-20 08:59:37 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
switch( stage_type )
|
|
|
|
|
{
|
|
|
|
|
case TYPE_NORMAL:
|
2002-05-20 08:59:37 +00:00
|
|
|
{
|
2002-08-13 23:26:46 +00:00
|
|
|
const int iStageNo = GAMESTATE->GetStageIndex()+1;
|
|
|
|
|
CString sStageNo = ssprintf("%d", iStageNo);
|
|
|
|
|
|
|
|
|
|
// Set frame of numbers
|
|
|
|
|
int i;
|
|
|
|
|
for( i=0; i<sStageNo.GetLength(); i++ )
|
|
|
|
|
m_sprNumbers[i].SetState( atoi(CString(sStageNo[i])) );
|
|
|
|
|
|
|
|
|
|
// Set frame of suffix
|
|
|
|
|
int iIndexOfSuffix = sStageNo.GetLength();
|
|
|
|
|
if( ( (iStageNo/10) % 10 ) == 1 ) // in the teens (e.g. 19, 213)
|
|
|
|
|
m_sprNumbers[iIndexOfSuffix].SetState( 13 ); // th
|
|
|
|
|
else // not in the teens
|
|
|
|
|
{
|
|
|
|
|
const int iLastDigit = iStageNo%10;
|
|
|
|
|
switch( iLastDigit )
|
|
|
|
|
{
|
|
|
|
|
case 1: m_sprNumbers[iIndexOfSuffix].SetState( 10 ); break; // st
|
|
|
|
|
case 2: m_sprNumbers[iIndexOfSuffix].SetState( 11 ); break; // nd
|
|
|
|
|
case 3: m_sprNumbers[iIndexOfSuffix].SetState( 12 ); break; // rd
|
|
|
|
|
default: m_sprNumbers[iIndexOfSuffix].SetState( 13 ); break; // th
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set X positions
|
|
|
|
|
const float fFrameWidth = m_sprNumbers[0].GetUnzoomedWidth();
|
|
|
|
|
const int iNumChars = iIndexOfSuffix+1;
|
|
|
|
|
const float fTotalCharsWidth = m_sprNumbers[0].GetUnzoomedWidth();
|
|
|
|
|
const float fSpaceBetweenNumsAndStage = fFrameWidth;
|
|
|
|
|
const float fStageWidth = m_sprStage.GetUnzoomedWidth();
|
|
|
|
|
const float fTotalWidth = fTotalCharsWidth + fSpaceBetweenNumsAndStage + fStageWidth;
|
|
|
|
|
const float fCharsCenterX = -fTotalWidth/2.0f + fTotalCharsWidth/2.0f;
|
|
|
|
|
const float fStageCenterX = +fTotalWidth/2.0f - fStageWidth/2.0f;
|
|
|
|
|
|
|
|
|
|
for( i=0; i<iNumChars; i++ )
|
|
|
|
|
{
|
|
|
|
|
float fOffsetX = SCALE(i, 0, iNumChars-1, -(iNumChars-1)/2.0f*fFrameWidth, (iNumChars-1)/2.0f*fFrameWidth);
|
|
|
|
|
m_sprNumbers[i].SetX( fCharsCenterX + fOffsetX );
|
|
|
|
|
}
|
|
|
|
|
m_sprStage.SetX( fStageCenterX );
|
|
|
|
|
|
|
|
|
|
for( i=0; i<iNumChars; i++ )
|
|
|
|
|
m_frameStage.AddSubActor( &m_sprNumbers[i] );
|
|
|
|
|
m_frameStage.AddSubActor( &m_sprStage );
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
2002-08-13 23:26:46 +00:00
|
|
|
break;
|
|
|
|
|
case TYPE_FINAL:
|
|
|
|
|
m_sprStage.Load( THEME->GetPathTo("Graphics","stage final") );
|
|
|
|
|
m_frameStage.AddSubActor( &m_sprStage );
|
|
|
|
|
break;
|
|
|
|
|
case TYPE_EXTRA1:
|
|
|
|
|
m_sprStage.Load( THEME->GetPathTo("Graphics","stage extra1") );
|
|
|
|
|
m_frameStage.AddSubActor( &m_sprStage );
|
|
|
|
|
break;
|
|
|
|
|
case TYPE_EXTRA2:
|
|
|
|
|
m_sprStage.Load( THEME->GetPathTo("Graphics","stage extra2") );
|
|
|
|
|
m_frameStage.AddSubActor( &m_sprStage );
|
|
|
|
|
break;
|
|
|
|
|
case TYPE_ONI:
|
|
|
|
|
m_sprStage.Load( THEME->GetPathTo("Graphics","stage oni") );
|
|
|
|
|
m_frameStage.AddSubActor( &m_sprStage );
|
|
|
|
|
break;
|
|
|
|
|
case TYPE_ENDLESS:
|
|
|
|
|
m_sprStage.Load( THEME->GetPathTo("Graphics","stage endless") );
|
|
|
|
|
m_frameStage.AddSubActor( &m_sprStage );
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
ASSERT(0);
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
2002-06-24 22:04:31 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
m_Fade.SetOpened();
|
2002-06-24 22:04:31 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
this->SendScreenMessage( SM_DoneFadingIn, 1.0f );
|
2002-07-11 19:02:26 +00:00
|
|
|
this->SendScreenMessage( SM_StartFadingOut, 1.2f );
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
void ScreenStage::Update( float fDeltaTime )
|
|
|
|
|
{
|
|
|
|
|
Screen::Update( fDeltaTime );
|
|
|
|
|
|
|
|
|
|
m_quadMask.Update( fDeltaTime );
|
|
|
|
|
m_frameStage.Update( fDeltaTime );
|
|
|
|
|
m_Fade.Update( fDeltaTime );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenStage::DrawPrimitives()
|
|
|
|
|
{
|
|
|
|
|
DISPLAY->EnableZBuffer();
|
|
|
|
|
m_quadMask.Draw();
|
|
|
|
|
m_frameStage.Draw();
|
|
|
|
|
DISPLAY->DisableZBuffer();
|
|
|
|
|
m_Fade.Draw();
|
|
|
|
|
}
|
2002-05-20 08:59:37 +00:00
|
|
|
|
|
|
|
|
void ScreenStage::HandleScreenMessage( const ScreenMessage SM )
|
|
|
|
|
{
|
|
|
|
|
switch( SM )
|
|
|
|
|
{
|
|
|
|
|
case SM_StartFadingOut:
|
2002-08-13 23:26:46 +00:00
|
|
|
m_Fade.CloseWipingRight( SM_GoToNextState );
|
2002-05-20 08:59:37 +00:00
|
|
|
break;
|
2002-07-11 19:02:26 +00:00
|
|
|
case SM_DoneFadingIn:
|
|
|
|
|
m_pNextScreen = new ScreenGameplay;
|
|
|
|
|
break;
|
2002-05-20 08:59:37 +00:00
|
|
|
case SM_GoToNextState:
|
2002-07-11 19:02:26 +00:00
|
|
|
SCREENMAN->SetNewScreen( m_pNextScreen );
|
2002-05-20 08:59:37 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|