2002-05-20 08:59:37 +00:00
#include "stdafx.h"
/*
-----------------------------------------------------------------------------
Class: ScreenGameplay
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "ScreenGameplay.h"
#include "SongManager.h"
#include "ScreenManager.h"
#include "GameConstantsAndTypes.h"
2002-07-23 01:41:40 +00:00
#include "PrefsManager.h"
2002-05-20 08:59:37 +00:00
#include "GameManager.h"
#include "SongManager.h"
#include "RageLog.h"
#include "AnnouncerManager.h"
2002-07-23 01:41:40 +00:00
#include "LifeMeterBar.h"
#include "LifeMeterBattery.h"
#include "GameState.h"
#include "ScoreDisplayNormal.h"
#include "ScoreDisplayOni.h"
2002-07-27 19:29:51 +00:00
#include "ScreenPrompt.h"
2002-08-27 03:59:22 +00:00
#include "GrooveRadar.h"
2002-05-20 08:59:37 +00:00
//
2002-07-23 01:41:40 +00:00
// Defines
2002-05-20 08:59:37 +00:00
//
2002-08-27 03:59:22 +00:00
#define TOP_FRAME_X THEME->GetMetricF("ScreenGameplay","TopFrameX")
2002-08-29 20:18:41 +00:00
#define TOP_FRAME_Y( e ) THEME->GetMetricF("ScreenGameplay",ssprintf("TopFrame%sY",e?"Extra":""))
2002-08-27 03:59:22 +00:00
#define BOTTOM_FRAME_X THEME->GetMetricF("ScreenGameplay","BottomFrameX")
2002-08-29 20:18:41 +00:00
#define BOTTOM_FRAME_Y( e ) THEME->GetMetricF("ScreenGameplay",ssprintf("BottomFrame%sY",e?"Extra":""))
2002-08-27 03:59:22 +00:00
#define MIDDLE_FRAME_X THEME->GetMetricF("ScreenGameplay","MiddleFrameX")
#define MIDDLE_FRAME_Y THEME->GetMetricF("ScreenGameplay","MiddleFrameY")
2002-08-29 20:18:41 +00:00
#define LIFE_X( p ) THEME->GetMetricF("ScreenGameplay",ssprintf("LifeP%dX",p+1))
#define LIFE_Y( p, e ) THEME->GetMetricF("ScreenGameplay",ssprintf("LifeP%d%sY",p+1,e?"Extra":""))
2002-08-27 03:59:22 +00:00
#define STAGE_X THEME->GetMetricF("ScreenGameplay","StageX")
2002-08-29 20:18:41 +00:00
#define STAGE_Y( e ) THEME->GetMetricF("ScreenGameplay",ssprintf("Stage%sY",e?"Extra":""))
#define SONG_NUMBER_X( p ) THEME->GetMetricF("ScreenGameplay",ssprintf("SongNumberP%dX",p+1))
#define SONG_NUMBER_Y( p, e ) THEME->GetMetricF("ScreenGameplay",ssprintf("SongNumberP%d%sY",p+1,e?"Extra":""))
#define SCORE_X( p ) THEME->GetMetricF("ScreenGameplay",ssprintf("ScoreP%dX",p+1))
#define SCORE_Y( p, e ) THEME->GetMetricF("ScreenGameplay",ssprintf("ScoreP%d%sY",p+1,e?"Extra":""))
#define PLAYER_OPTIONS_X( p ) THEME->GetMetricF("ScreenGameplay",ssprintf("PlayerOptionsP%dX",p+1))
#define PLAYER_OPTIONS_Y( p, e ) THEME->GetMetricF("ScreenGameplay",ssprintf("PlayerOptionsP%d%sY",p+1,e?"Extra":""))
2002-08-27 03:59:22 +00:00
#define SONG_OPTIONS_X THEME->GetMetricF("ScreenGameplay","SongOptionsX")
2002-08-29 20:18:41 +00:00
#define SONG_OPTIONS_Y( e ) THEME->GetMetricF("ScreenGameplay",ssprintf("SongOptions%sY",e?"Extra":""))
#define DIFFICULTY_X( p ) THEME->GetMetricF("ScreenGameplay",ssprintf("DifficultyP%dX",p+1))
#define DIFFICULTY_Y( p, e, r ) THEME->GetMetricF("ScreenGameplay",ssprintf("DifficultyP%d%s%sY",p+1,e?"Extra":"",r?"Reverse":""))
2002-08-27 03:59:22 +00:00
#define DEBUG_X THEME->GetMetricF("ScreenGameplay","DebugX")
#define DEBUG_Y THEME->GetMetricF("ScreenGameplay","DebugY")
#define AUTOPLAY_X THEME->GetMetricF("ScreenGameplay","AutoPlayX")
#define AUTOPLAY_Y THEME->GetMetricF("ScreenGameplay","AutoPlayY")
#define SURVIVE_TIME_X THEME->GetMetricF("ScreenGameplay","SurviveTimeX")
#define SURVIVE_TIME_Y THEME->GetMetricF("ScreenGameplay","SurviveTimeY")
#define SECONDS_BETWEEN_COMMENTS THEME->GetMetricF("ScreenGameplay","SecondsBetweenComments")
#define DEMONSTRATION_SECONDS THEME->GetMetricF("ScreenGameplay","DemonstrationSeconds")
2002-09-02 21:59:58 +00:00
#define TICK_EARLY_SECONDS THEME->GetMetricF("ScreenGameplay","TickEarlySeconds")
float g_fTickEarlySecondsCache = 0 ; // reading directly out of theme metrics is slow
2002-05-20 08:59:37 +00:00
// received while STATE_DANCING
2002-08-01 03:15:27 +00:00
const ScreenMessage SM_NotesEnded = ScreenMessage ( SM_User + 101 );
const ScreenMessage SM_BeginLoadingNextSong = ScreenMessage ( SM_User + 102 );
2002-08-02 09:31:06 +00:00
const ScreenMessage SM_BeginFadingToTitleMenu = ScreenMessage ( SM_User + 103 );
2002-08-26 05:53:48 +00:00
const ScreenMessage SM_PlayToastySound = ScreenMessage ( SM_User + 105 );
2002-05-20 08:59:37 +00:00
// received while STATE_OUTRO
const ScreenMessage SM_ShowCleared = ScreenMessage ( SM_User + 111 );
const ScreenMessage SM_HideCleared = ScreenMessage ( SM_User + 112 );
2002-08-01 05:11:11 +00:00
const ScreenMessage SM_SaveChangedBeforeGoingBack = ScreenMessage ( SM_User + 113 );
const ScreenMessage SM_GoToScreenAfterBack = ScreenMessage ( SM_User + 114 );
const ScreenMessage SM_GoToStateAfterCleared = ScreenMessage ( SM_User + 115 );
2002-05-20 08:59:37 +00:00
const ScreenMessage SM_BeginFailed = ScreenMessage ( SM_User + 121 );
const ScreenMessage SM_ShowFailed = ScreenMessage ( SM_User + 122 );
const ScreenMessage SM_PlayFailComment = ScreenMessage ( SM_User + 123 );
const ScreenMessage SM_HideFailed = ScreenMessage ( SM_User + 124 );
2002-07-27 19:29:51 +00:00
const ScreenMessage SM_GoToScreenAfterFail = ScreenMessage ( SM_User + 125 );
2002-08-02 09:31:06 +00:00
const ScreenMessage SM_GoToTitleMenu = ScreenMessage ( SM_User + 126 );
2002-05-20 08:59:37 +00:00
ScreenGameplay :: ScreenGameplay ()
{
2002-07-31 19:40:40 +00:00
LOG -> Trace ( "ScreenGameplay::ScreenGameplay()" );
2002-05-20 08:59:37 +00:00
2002-08-28 22:42:40 +00:00
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
{
m_pLifeMeter [ p ] = NULL ;
m_pScoreDisplay [ p ] = NULL ;
}
2002-09-02 21:59:58 +00:00
g_fTickEarlySecondsCache = TICK_EARLY_SECONDS ;
2002-08-28 22:42:40 +00:00
2002-08-27 16:53:25 +00:00
MUSIC -> Stop ();
2002-07-27 19:29:51 +00:00
2002-07-28 20:28:37 +00:00
GAMESTATE -> ResetStageStatistics (); // clear values
2002-08-02 09:31:06 +00:00
2002-08-13 23:26:46 +00:00
const bool bExtra = GAMESTATE -> IsExtraStage () || GAMESTATE -> IsExtraStage2 ();
const bool bReverse [ NUM_PLAYERS ] = {
GAMESTATE -> m_PlayerOptions [ 0 ]. m_bReverseScroll ,
GAMESTATE -> m_PlayerOptions [ 1 ]. m_bReverseScroll
};
2002-07-28 20:28:37 +00:00
// Update possible dance points
2002-08-28 23:20:41 +00:00
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
2002-06-14 22:25:22 +00:00
{
2002-07-28 20:28:37 +00:00
if ( ! GAMESTATE -> IsPlayerEnabled ( p ) )
continue ; // skip
NoteData notedata ;
switch ( GAMESTATE -> m_PlayMode )
2002-06-14 22:25:22 +00:00
{
2002-07-28 20:28:37 +00:00
case PLAY_MODE_ARCADE :
GAMESTATE -> m_pCurNotes [ p ] -> GetNoteData ( & notedata );
GAMESTATE -> m_iPossibleDancePoints [ p ] = notedata . GetPossibleDancePoints ();
break ;
case PLAY_MODE_ONI :
2002-07-29 03:06:55 +00:00
case PLAY_MODE_ENDLESS :
2002-07-23 01:41:40 +00:00
{
2002-07-28 20:28:37 +00:00
GAMESTATE -> m_iPossibleDancePoints [ p ] = 0 ;
Course * pCourse = GAMESTATE -> m_pCurCourse ;
CArray < Song * , Song *> apSongs ;
2002-08-01 13:42:56 +00:00
CArray < Notes * , Notes *> apNotes ;
CStringArray asModifiers ;
2002-09-04 03:29:42 +00:00
pCourse -> GetSongAndNotesForCurrentStyle ( apSongs , apNotes , asModifiers , true );
2002-07-28 20:28:37 +00:00
2002-08-01 13:42:56 +00:00
for ( int i = 0 ; i < apNotes . GetSize (); i ++ )
2002-07-28 20:28:37 +00:00
{
2002-08-01 13:42:56 +00:00
apNotes [ i ] -> GetNoteData ( & notedata );
2002-07-28 20:28:37 +00:00
int iPossibleDancePoints = notedata . GetPossibleDancePoints ();
GAMESTATE -> m_iPossibleDancePoints [ p ] += iPossibleDancePoints ;
}
2002-06-14 22:25:22 +00:00
}
2002-07-28 20:28:37 +00:00
break ;
2002-06-14 22:25:22 +00:00
}
2002-07-28 20:28:37 +00:00
2002-06-14 22:25:22 +00:00
}
2002-07-28 20:28:37 +00:00
m_bChangedOffsetOrBPM = false ;
2002-05-20 08:59:37 +00:00
m_DancingState = STATE_INTRO ;
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-05-20 08:59:37 +00:00
2002-09-02 21:59:58 +00:00
m_Background . SetDiffuse ( D3DXCOLOR ( 0.4f , 0.4f , 0.4f , 1 ) );
this -> AddChild ( & m_Background );
2002-05-20 08:59:37 +00:00
2002-07-28 20:28:37 +00:00
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
2002-05-27 08:23:27 +00:00
{
2002-07-23 01:41:40 +00:00
if ( ! GAMESTATE -> IsPlayerEnabled ( PlayerNumber ( p )) )
2002-05-27 08:23:27 +00:00
continue ;
2002-08-01 21:55:40 +00:00
float fPlayerX = ( float ) GAMESTATE -> GetCurrentStyleDef () -> m_iCenterX [ p ];
m_Player [ p ]. SetX ( fPlayerX );
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_Player [ p ] );
2002-08-01 21:55:40 +00:00
2002-08-13 23:26:46 +00:00
m_sprOniGameOver [ p ]. Load ( THEME -> GetPathTo ( "Graphics" , "gameplay oni gameover" ) );
2002-08-01 21:55:40 +00:00
m_sprOniGameOver [ p ]. SetX ( fPlayerX );
m_sprOniGameOver [ p ]. SetY ( SCREEN_TOP - m_sprOniGameOver [ p ]. GetZoomedHeight () / 2 );
2002-09-02 21:59:58 +00:00
m_sprOniGameOver [ p ]. SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) ); // 0 alpha so we don't waste time drawing while not visible
this -> AddChild ( & m_sprOniGameOver [ p ] );
2002-05-27 08:23:27 +00:00
}
2002-05-20 08:59:37 +00:00
2002-08-01 21:55:40 +00:00
m_OniFade . SetOpened ();
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_OniFade );
2002-08-01 21:55:40 +00:00
2002-08-13 23:26:46 +00:00
m_sprMiddleFrame . Load ( THEME -> GetPathTo ( "Graphics" , "Gameplay Middle Frame" ) );
m_sprMiddleFrame . SetXY ( MIDDLE_FRAME_X , MIDDLE_FRAME_Y );
2002-06-14 22:25:22 +00:00
2002-05-20 08:59:37 +00:00
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
{
2002-07-28 20:28:37 +00:00
switch ( GAMESTATE -> m_SongOptions . m_LifeType )
2002-07-23 01:41:40 +00:00
{
2002-07-28 20:28:37 +00:00
case SongOptions :: LIFE_BAR :
2002-07-23 01:41:40 +00:00
m_pLifeMeter [ p ] = new LifeMeterBar ;
break ;
2002-07-28 20:28:37 +00:00
case SongOptions :: LIFE_BATTERY :
2002-07-23 01:41:40 +00:00
m_pLifeMeter [ p ] = new LifeMeterBattery ;
break ;
default :
ASSERT ( 0 );
}
2002-05-28 20:01:22 +00:00
2002-07-28 20:28:37 +00:00
m_pLifeMeter [ p ] -> Load ( ( PlayerNumber ) p );
2002-08-13 23:26:46 +00:00
m_pLifeMeter [ p ] -> SetXY ( LIFE_X ( p ), LIFE_Y ( p , bExtra ) );
2002-09-02 21:59:58 +00:00
this -> AddChild ( m_pLifeMeter [ p ] );
2002-05-20 08:59:37 +00:00
}
2002-06-14 22:25:22 +00:00
// TopFrame goes above LifeMeter
2002-08-13 23:26:46 +00:00
m_sprTopFrame . Load ( THEME -> GetPathTo ( "Graphics" , bExtra ? "gameplay extra top frame" : "gameplay top frame" ) );
2002-08-29 20:18:41 +00:00
m_sprTopFrame . SetXY ( TOP_FRAME_X , TOP_FRAME_Y ( bExtra ) );
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_sprTopFrame );
2002-06-14 22:25:22 +00:00
2002-09-03 22:31:06 +00:00
m_textStageNumber . LoadFromFont ( THEME -> GetPathTo ( "Fonts" , "gameplay stage" ) );
2002-06-14 22:25:22 +00:00
m_textStageNumber . TurnShadowOff ();
2002-08-29 20:18:41 +00:00
m_textStageNumber . SetXY ( STAGE_X , STAGE_Y ( bExtra ) );
2002-07-23 01:41:40 +00:00
m_textStageNumber . SetText ( GAMESTATE -> GetStageText () );
2002-09-02 21:59:58 +00:00
m_textStageNumber . SetDiffuse ( GAMESTATE -> GetStageColor () );
2002-07-23 01:41:40 +00:00
2002-08-01 21:11:32 +00:00
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
2002-08-01 03:15:27 +00:00
{
2002-08-13 23:26:46 +00:00
m_textCourseSongNumber [ p ]. LoadFromFont ( THEME -> GetPathTo ( "Fonts" , "Header2" ) );
2002-08-01 03:15:27 +00:00
m_textCourseSongNumber [ p ]. TurnShadowOff ();
2002-08-13 23:26:46 +00:00
m_textCourseSongNumber [ p ]. SetXY ( SONG_NUMBER_X ( p ), SONG_NUMBER_Y ( p , bExtra ) );
2002-08-01 03:15:27 +00:00
m_textCourseSongNumber [ p ]. SetText ( "" );
2002-09-02 21:59:58 +00:00
m_textCourseSongNumber [ p ]. SetDiffuse ( GAMESTATE -> GetStageColor () ); // light blue
2002-08-01 03:15:27 +00:00
}
switch ( GAMESTATE -> m_PlayMode )
{
case PLAY_MODE_ARCADE :
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_textStageNumber );
2002-08-01 03:15:27 +00:00
break ;
case PLAY_MODE_ONI :
case PLAY_MODE_ENDLESS :
2002-08-01 21:11:32 +00:00
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
2002-08-01 13:42:56 +00:00
if ( GAMESTATE -> IsPlayerEnabled ( p ) )
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_textCourseSongNumber [ p ] );
2002-08-01 03:15:27 +00:00
break ;
default :
ASSERT ( 0 ); // invalid GameMode
}
2002-06-14 22:25:22 +00:00
2002-08-28 22:42:40 +00:00
//
// Add all Actors in bottom frame
//
2002-08-13 23:26:46 +00:00
m_sprBottomFrame . Load ( THEME -> GetPathTo ( "Graphics" , bExtra ? "gameplay extra bottom frame" : "gameplay bottom frame" ) );
2002-08-29 20:18:41 +00:00
m_sprBottomFrame . SetXY ( BOTTOM_FRAME_X , BOTTOM_FRAME_Y ( bExtra ) );
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_sprBottomFrame );
2002-05-20 08:59:37 +00:00
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
{
2002-07-23 01:41:40 +00:00
if ( ! GAMESTATE -> IsPlayerEnabled ( PlayerNumber ( p )) )
2002-05-20 08:59:37 +00:00
continue ;
2002-07-30 01:45:18 +00:00
2002-08-28 22:42:40 +00:00
switch ( GAMESTATE -> m_PlayMode )
2002-08-13 23:26:46 +00:00
{
2002-08-28 22:42:40 +00:00
case PLAY_MODE_ARCADE :
m_pScoreDisplay [ p ] = new ScoreDisplayNormal ;
break ;
case PLAY_MODE_ONI :
case PLAY_MODE_ENDLESS :
m_pScoreDisplay [ p ] = new ScoreDisplayOni ;
break ;
default :
ASSERT ( 0 );
}
m_pScoreDisplay [ p ] -> Init ( ( PlayerNumber ) p );
m_pScoreDisplay [ p ] -> SetXY ( SCORE_X ( p ), SCORE_Y ( p , bExtra ) );
m_pScoreDisplay [ p ] -> SetZoom ( 0.8f );
2002-09-02 21:59:58 +00:00
m_pScoreDisplay [ p ] -> SetDiffuse ( PlayerToColor ( p ) );
this -> AddChild ( m_pScoreDisplay [ p ] );
2002-07-12 22:01:32 +00:00
2002-08-13 23:26:46 +00:00
m_textPlayerOptions [ p ]. LoadFromFont ( THEME -> GetPathTo ( "Fonts" , "normal" ) );
2002-05-28 20:01:22 +00:00
m_textPlayerOptions [ p ]. TurnShadowOff ();
2002-08-13 23:26:46 +00:00
m_textPlayerOptions [ p ]. SetXY ( PLAYER_OPTIONS_X ( p ), PLAYER_OPTIONS_Y ( p , bExtra ) );
2002-05-28 20:01:22 +00:00
m_textPlayerOptions [ p ]. SetZoom ( 0.5f );
2002-09-02 21:59:58 +00:00
m_textPlayerOptions [ p ]. SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
2002-07-23 01:41:40 +00:00
m_textPlayerOptions [ p ]. SetText ( GAMESTATE -> m_PlayerOptions [ p ]. GetString () );
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_textPlayerOptions [ p ] );
2002-05-20 08:59:37 +00:00
}
2002-08-13 23:26:46 +00:00
m_textSongOptions . LoadFromFont ( THEME -> GetPathTo ( "Fonts" , "normal" ) );
m_textSongOptions . TurnShadowOff ();
2002-08-29 20:18:41 +00:00
m_textSongOptions . SetXY ( SONG_OPTIONS_X , SONG_OPTIONS_Y ( bExtra ) );
2002-08-13 23:26:46 +00:00
m_textSongOptions . SetZoom ( 0.5f );
2002-09-02 21:59:58 +00:00
m_textSongOptions . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
2002-08-13 23:26:46 +00:00
m_textSongOptions . SetText ( GAMESTATE -> m_SongOptions . GetString () );
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_textSongOptions );
2002-06-14 22:25:22 +00:00
// Get the current StyleDef definition (used below)
2002-08-22 23:03:39 +00:00
const StyleDef * pStyleDef = GAMESTATE -> GetCurrentStyleDef ();
2002-06-14 22:25:22 +00:00
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
{
2002-07-23 01:41:40 +00:00
if ( ! GAMESTATE -> IsPlayerEnabled ( PlayerNumber ( p )) )
2002-06-14 22:25:22 +00:00
continue ;
2002-07-23 01:41:40 +00:00
2002-09-03 22:31:06 +00:00
m_DifficultyBanner [ p ]. SetXY ( DIFFICULTY_X ( p ), DIFFICULTY_Y ( p , bExtra , bReverse [ p ]) );
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_DifficultyBanner [ p ] );
2002-06-14 22:25:22 +00:00
}
2002-08-13 23:26:46 +00:00
m_textDebug . LoadFromFont ( THEME -> GetPathTo ( "Fonts" , "normal" ) );
2002-06-24 22:04:31 +00:00
m_textDebug . SetXY ( DEBUG_X , DEBUG_Y );
2002-09-02 21:59:58 +00:00
m_textDebug . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
this -> AddChild ( & m_textDebug );
2002-08-23 20:18:29 +00:00
m_textAutoPlay . LoadFromFont ( THEME -> GetPathTo ( "Fonts" , "normal" ) );
m_textAutoPlay . SetXY ( AUTOPLAY_X , AUTOPLAY_Y );
m_textAutoPlay . SetText ( "AutoPlay is ON" );
2002-09-02 21:59:58 +00:00
m_textAutoPlay . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
this -> AddChild ( & m_textAutoPlay );
2002-05-20 08:59:37 +00:00
2002-06-24 22:04:31 +00:00
2002-05-20 08:59:37 +00:00
m_StarWipe . SetClosed ();
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_StarWipe );
2002-05-20 08:59:37 +00:00
2002-08-13 23:26:46 +00:00
m_sprReady . Load ( THEME -> GetPathTo ( "Graphics" , "gameplay ready" ) );
2002-05-20 08:59:37 +00:00
m_sprReady . SetXY ( CENTER_X , CENTER_Y );
2002-09-02 21:59:58 +00:00
m_sprReady . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
this -> AddChild ( & m_sprReady );
2002-05-20 08:59:37 +00:00
2002-08-13 23:26:46 +00:00
m_sprHereWeGo . Load ( THEME -> GetPathTo ( "Graphics" , "gameplay here we go" ) );
2002-05-20 08:59:37 +00:00
m_sprHereWeGo . SetXY ( CENTER_X , CENTER_Y );
2002-09-02 21:59:58 +00:00
m_sprHereWeGo . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
this -> AddChild ( & m_sprHereWeGo );
2002-05-20 08:59:37 +00:00
2002-08-13 23:26:46 +00:00
m_sprCleared . Load ( THEME -> GetPathTo ( "Graphics" , "gameplay cleared" ) );
2002-05-20 08:59:37 +00:00
m_sprCleared . SetXY ( CENTER_X , CENTER_Y );
2002-09-02 21:59:58 +00:00
m_sprCleared . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
this -> AddChild ( & m_sprCleared );
2002-05-20 08:59:37 +00:00
2002-08-13 23:26:46 +00:00
m_sprFailed . Load ( THEME -> GetPathTo ( "Graphics" , "gameplay failed" ) );
2002-05-20 08:59:37 +00:00
m_sprFailed . SetXY ( CENTER_X , CENTER_Y );
2002-09-02 21:59:58 +00:00
m_sprFailed . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
this -> AddChild ( & m_sprFailed );
2002-05-20 08:59:37 +00:00
2002-08-02 09:31:06 +00:00
if ( GAMESTATE -> m_bDemonstration )
{
2002-09-02 21:59:58 +00:00
m_quadDemonstrationBox . SetDiffuse ( D3DXCOLOR ( 0 , 0 , 0 , 0.7f ) );
2002-08-02 09:31:06 +00:00
m_quadDemonstrationBox . StretchTo ( CRect ( SCREEN_LEFT , int ( CENTER_Y - 60 ), SCREEN_RIGHT , int ( CENTER_Y + 60 )) );
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_quadDemonstrationBox );
2002-08-02 09:31:06 +00:00
2002-08-13 23:26:46 +00:00
m_sprDemonstration . Load ( THEME -> GetPathTo ( "Graphics" , "gameplay demonstration" ) );
2002-08-02 09:31:06 +00:00
m_sprDemonstration . SetXY ( CENTER_X , CENTER_Y );
m_sprDemonstration . SetEffectBlinking ();
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_sprDemonstration );
2002-08-02 09:31:06 +00:00
m_Fade . OpenWipingRight ();
}
2002-07-27 19:29:51 +00:00
m_Fade . SetOpened ();
2002-09-02 21:59:58 +00:00
this -> AddChild ( & m_Fade );
2002-07-27 19:29:51 +00:00
2002-05-20 08:59:37 +00:00
2002-09-03 22:31:06 +00:00
m_textSurviveTime . LoadFromTextureAndChars ( THEME -> GetPathTo ( "Graphics" , "gameplay survive time numbers 7x2" ), "01234 :56789%." );
2002-08-01 13:42:56 +00:00
m_textSurviveTime . TurnShadowOff ();
m_textSurviveTime . SetXY ( SURVIVE_TIME_X , SURVIVE_TIME_Y );
m_textSurviveTime . SetText ( "" );
2002-09-02 21:59:58 +00:00
m_textSurviveTime . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
this -> AddChild ( & m_textSurviveTime );
2002-08-01 13:42:56 +00:00
2002-08-26 05:53:48 +00:00
m_sprToasty . Load ( THEME -> GetPathTo ( "Graphics" , "gameplay toasty" ) );
2002-09-02 21:59:58 +00:00
m_sprToasty . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
this -> AddChild ( & m_sprToasty );
2002-08-26 05:53:48 +00:00
m_soundToasty . Load ( THEME -> GetPathTo ( "Sounds" , "gameplay toasty" ) );
2002-05-20 08:59:37 +00:00
2002-08-02 09:31:06 +00:00
if ( ! GAMESTATE -> m_bDemonstration ) // don't load sounds if just playing demonstration
{
2002-08-28 22:42:40 +00:00
m_soundFail . Load ( THEME -> GetPathTo ( "Sounds" , "gameplay failed" ) );
m_soundOniDie . Load ( THEME -> GetPathTo ( "Sounds" , "gameplay oni die" ) );
m_announcerReady . Load ( ANNOUNCER -> GetPathTo ( "gameplay ready" ) );
2002-08-02 09:31:06 +00:00
if ( GAMESTATE -> IsExtraStage () || GAMESTATE -> IsExtraStage2 () )
2002-08-27 23:31:41 +00:00
m_announcerHereWeGo . Load ( ANNOUNCER -> GetPathTo ( "gameplay here we go extra" ) );
2002-08-02 09:31:06 +00:00
else if ( GAMESTATE -> IsFinalStage () )
2002-08-27 23:31:41 +00:00
m_announcerHereWeGo . Load ( ANNOUNCER -> GetPathTo ( "gameplay here we go final" ) );
2002-08-02 09:31:06 +00:00
else
2002-08-27 23:31:41 +00:00
m_announcerHereWeGo . Load ( ANNOUNCER -> GetPathTo ( "gameplay here we go normal" ) );
2002-08-28 22:42:40 +00:00
m_announcerDanger . Load ( ANNOUNCER -> GetPathTo ( "gameplay comment danger" ) );
m_announcerGood . Load ( ANNOUNCER -> GetPathTo ( "gameplay comment good" ) );
m_announcerHot . Load ( ANNOUNCER -> GetPathTo ( "gameplay comment hot" ) );
2002-07-11 19:02:26 +00:00
2002-08-28 22:42:40 +00:00
m_announcer100Combo . Load ( ANNOUNCER -> GetPathTo ( "gameplay 100 combo" ) );
m_announcer200Combo . Load ( ANNOUNCER -> GetPathTo ( "gameplay 200 combo" ) );
m_announcer300Combo . Load ( ANNOUNCER -> GetPathTo ( "gameplay 300 combo" ) );
m_announcer400Combo . Load ( ANNOUNCER -> GetPathTo ( "gameplay 400 combo" ) );
m_announcer500Combo . Load ( ANNOUNCER -> GetPathTo ( "gameplay 500 combo" ) );
m_announcer600Combo . Load ( ANNOUNCER -> GetPathTo ( "gameplay 600 combo" ) );
m_announcer700Combo . Load ( ANNOUNCER -> GetPathTo ( "gameplay 700 combo" ) );
m_announcer800Combo . Load ( ANNOUNCER -> GetPathTo ( "gameplay 800 combo" ) );
m_announcer900Combo . Load ( ANNOUNCER -> GetPathTo ( "gameplay 900 combo" ) );
m_announcer1000Combo . Load ( ANNOUNCER -> GetPathTo ( "gameplay 1000 combo" ) );
m_announcerComboStopped . Load ( ANNOUNCER -> GetPathTo ( "gameplay combo stopped" ) );
2002-08-02 09:31:06 +00:00
}
2002-05-20 08:59:37 +00:00
2002-08-15 16:45:49 +00:00
m_iRowLastCrossed = - 1 ;
2002-08-13 23:26:46 +00:00
m_soundAssistTick . Load ( THEME -> GetPathTo ( "Sounds" , "gameplay assist tick" ) );
2002-05-20 08:59:37 +00:00
2002-08-28 22:42:40 +00:00
TweenOnScreen ();
2002-05-20 08:59:37 +00:00
2002-08-31 03:04:38 +00:00
/* XXX: We set m_textPlayerOptions[p] above, so that won't
* include options set by the course. Should it? -glenn */
2002-07-28 20:28:37 +00:00
LoadNextSong ( true );
2002-06-14 22:25:22 +00:00
2002-08-02 09:31:06 +00:00
if ( GAMESTATE -> m_bDemonstration )
{
m_StarWipe . SetOpened ();
m_DancingState = STATE_DANCING ;
m_soundMusic . Play ();
2002-08-13 23:26:46 +00:00
this -> SendScreenMessage ( SM_BeginFadingToTitleMenu , DEMONSTRATION_SECONDS );
2002-08-02 09:31:06 +00:00
}
else
{
for ( int i = 0 ; i < 30 ; i ++ )
this -> SendScreenMessage ( ScreenMessage ( SM_User + i ), i / 2.0f ); // Send messages to we can get the introduction rolling
}
2002-05-20 08:59:37 +00:00
}
ScreenGameplay ::~ ScreenGameplay ()
{
2002-07-31 19:40:40 +00:00
LOG -> Trace ( "ScreenGameplay::~ScreenGameplay()" );
2002-07-23 01:41:40 +00:00
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
{
2002-08-28 22:42:40 +00:00
SAFE_DELETE ( m_pLifeMeter [ p ] );
SAFE_DELETE ( m_pScoreDisplay [ p ] );
2002-07-23 01:41:40 +00:00
}
2002-05-20 08:59:37 +00:00
m_soundMusic . Stop ();
}
2002-07-28 20:28:37 +00:00
bool ScreenGameplay :: IsLastSong ()
2002-06-24 22:04:31 +00:00
{
2002-07-28 20:28:37 +00:00
switch ( GAMESTATE -> m_PlayMode )
2002-06-24 22:04:31 +00:00
{
2002-07-28 20:28:37 +00:00
case PLAY_MODE_ARCADE :
return true ;
case PLAY_MODE_ONI :
case PLAY_MODE_ENDLESS :
{
Course * pCourse = GAMESTATE -> m_pCurCourse ;
2002-07-29 03:06:55 +00:00
if ( pCourse -> m_bRepeat )
return false ;
2002-07-28 20:28:37 +00:00
CArray < Song * , Song *> apSongs ;
2002-08-01 13:42:56 +00:00
CArray < Notes * , Notes *> apNotes ;
CStringArray asModifiers ;
2002-09-04 03:29:42 +00:00
pCourse -> GetSongAndNotesForCurrentStyle ( apSongs , apNotes , asModifiers , true );
2002-07-28 20:28:37 +00:00
2002-08-01 03:15:27 +00:00
return GAMESTATE -> m_iSongsIntoCourse >= apSongs . GetSize (); // there are no more songs left
2002-07-28 20:28:37 +00:00
}
break ;
default :
ASSERT ( 0 );
return true ;
}
}
void ScreenGameplay :: LoadNextSong ( bool bFirstLoad )
{
GAMESTATE -> ResetMusicStatistics ();
switch ( GAMESTATE -> m_PlayMode )
{
case PLAY_MODE_ARCADE :
break ;
case PLAY_MODE_ONI :
case PLAY_MODE_ENDLESS :
{
2002-08-01 05:11:11 +00:00
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
m_textCourseSongNumber [ p ]. SetText ( ssprintf ( "%d" , GAMESTATE -> m_iSongsBeforeFail [ p ] + 1 ) );
2002-07-28 20:28:37 +00:00
Course * pCourse = GAMESTATE -> m_pCurCourse ;
CArray < Song * , Song *> apSongs ;
2002-08-01 13:42:56 +00:00
CArray < Notes * , Notes *> apNotes ;
CStringArray asModifiers ;
2002-07-28 20:28:37 +00:00
2002-09-04 03:29:42 +00:00
pCourse -> GetSongAndNotesForCurrentStyle ( apSongs , apNotes , asModifiers , true );
int iPlaySongIndex = GAMESTATE -> m_iSongsIntoCourse ;
iPlaySongIndex %= apSongs . GetSize ();
2002-07-29 03:06:55 +00:00
GAMESTATE -> m_pCurSong = apSongs [ iPlaySongIndex ];
2002-08-01 21:11:32 +00:00
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
2002-08-01 13:42:56 +00:00
{
GAMESTATE -> m_pCurNotes [ p ] = apNotes [ iPlaySongIndex ];
if ( asModifiers [ iPlaySongIndex ] != "" ) // some modifiers specified
GAMESTATE -> m_PlayerOptions [ p ]. FromString ( asModifiers [ iPlaySongIndex ] ); // put them into effect
}
2002-07-28 20:28:37 +00:00
}
break ;
default :
ASSERT ( 0 );
break ;
2002-06-24 22:04:31 +00:00
}
2002-07-28 20:28:37 +00:00
m_textStageNumber . SetText ( GAMESTATE -> GetStageText () );
2002-06-24 22:04:31 +00:00
2002-06-14 22:25:22 +00:00
2002-06-24 22:04:31 +00:00
2002-07-28 20:28:37 +00:00
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
2002-06-14 22:25:22 +00:00
{
2002-07-28 20:28:37 +00:00
if ( ! GAMESTATE -> IsPlayerEnabled ( p ) )
2002-06-14 22:25:22 +00:00
continue ;
2002-08-01 21:55:40 +00:00
// reset oni game over graphic
m_sprOniGameOver [ p ]. SetY ( SCREEN_TOP - m_sprOniGameOver [ p ]. GetZoomedHeight () / 2 );
2002-09-02 21:59:58 +00:00
m_sprOniGameOver [ p ]. SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) ); // 0 alpha so we don't waste time drawing while not visible
2002-08-01 21:55:40 +00:00
if ( GAMESTATE -> m_SongOptions . m_LifeType == SongOptions :: LIFE_BATTERY && GAMESTATE -> m_fSecondsBeforeFail [ p ] != - 1 ) // already failed
ShowOniGameOver (( PlayerNumber ) p );
2002-07-23 01:41:40 +00:00
m_DifficultyBanner [ p ]. SetFromNotes ( PlayerNumber ( p ), GAMESTATE -> m_pCurNotes [ p ] );
2002-06-14 22:25:22 +00:00
2002-07-03 03:13:13 +00:00
NoteData originalNoteData ;
2002-07-23 01:41:40 +00:00
GAMESTATE -> m_pCurNotes [ p ] -> GetNoteData ( & originalNoteData );
2002-06-14 22:25:22 +00:00
2002-08-22 23:03:39 +00:00
const StyleDef * pStyleDef = GAMESTATE -> GetCurrentStyleDef ();
2002-06-14 22:25:22 +00:00
NoteData newNoteData ;
2002-07-03 03:13:13 +00:00
pStyleDef -> GetTransformedNoteDataForStyle ( ( PlayerNumber ) p , & originalNoteData , & newNoteData );
2002-06-14 22:25:22 +00:00
2002-07-28 20:28:37 +00:00
m_Player [ p ]. Load ( ( PlayerNumber ) p , & newNoteData , m_pLifeMeter [ p ], m_pScoreDisplay [ p ] );
2002-06-14 22:25:22 +00:00
}
2002-08-22 09:31:32 +00:00
m_Background . LoadFromSong ( GAMESTATE -> m_pCurSong );
2002-09-02 21:59:58 +00:00
m_Background . SetDiffuse ( D3DXCOLOR ( 0.5f , 0.5f , 0.5f , 1 ) );
m_Background . BeginTweening ( 2 );
m_Background . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
2002-07-23 01:41:40 +00:00
m_soundMusic . Load ( GAMESTATE -> m_pCurSong -> GetMusicPath (), true ); // enable accurate sync
float fStartSeconds = min ( 0 , - 4 + GAMESTATE -> m_pCurSong -> GetElapsedTimeFromBeat ( GAMESTATE -> m_pCurSong -> m_fFirstBeat ) );
m_soundMusic . SetPositionSeconds ( fStartSeconds );
m_soundMusic . SetPlaybackRate ( GAMESTATE -> m_SongOptions . m_fMusicRate );
2002-07-28 20:28:37 +00:00
if ( ! bFirstLoad )
2002-07-23 01:41:40 +00:00
m_soundMusic . Play ();
2002-06-14 22:25:22 +00:00
}
2002-07-27 19:29:51 +00:00
bool ScreenGameplay :: OneIsHot ()
{
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
if ( GAMESTATE -> IsPlayerEnabled ( PlayerNumber ( p )) )
2002-08-20 21:00:56 +00:00
if ( m_pLifeMeter [ p ] -> IsHot () )
2002-07-27 19:29:51 +00:00
return true ;
return false ;
}
bool ScreenGameplay :: AllAreInDanger ()
{
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
if ( GAMESTATE -> IsPlayerEnabled ( PlayerNumber ( p )) )
if ( ! m_pLifeMeter [ p ] -> IsInDanger () )
return false ;
return true ;
}
bool ScreenGameplay :: AllAreFailing ()
{
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
if ( GAMESTATE -> IsPlayerEnabled ( PlayerNumber ( p )) )
if ( ! m_pLifeMeter [ p ] -> IsFailing () )
return false ;
return true ;
}
bool ScreenGameplay :: AllFailedEarlier ()
{
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
if ( GAMESTATE -> IsPlayerEnabled ( p ) )
if ( ! m_pLifeMeter [ p ] -> FailedEarlier () )
return false ;
return true ;
}
2002-06-14 22:25:22 +00:00
2002-05-20 08:59:37 +00:00
void ScreenGameplay :: Update ( float fDeltaTime )
{
2002-07-31 19:40:40 +00:00
//LOG->Trace( "ScreenGameplay::Update(%f)", fDeltaTime );
2002-05-20 08:59:37 +00:00
2002-07-11 19:02:26 +00:00
m_soundMusic . Update ( fDeltaTime );
2002-05-20 08:59:37 +00:00
2002-07-23 01:41:40 +00:00
if ( GAMESTATE -> m_pCurSong == NULL )
2002-06-24 22:04:31 +00:00
return ;
2002-08-02 09:31:06 +00:00
// update the global music statistics for other classes to access
2002-05-20 08:59:37 +00:00
float fPositionSeconds = m_soundMusic . GetPositionSeconds ();
2002-06-30 23:19:33 +00:00
float fSongBeat , fBPS ;
bool bFreeze ;
2002-07-23 01:41:40 +00:00
GAMESTATE -> m_pCurSong -> GetBeatAndBPSFromElapsedTime ( fPositionSeconds , fSongBeat , fBPS , bFreeze );
2002-05-20 08:59:37 +00:00
2002-07-23 01:41:40 +00:00
GAMESTATE -> m_fMusicSeconds = fPositionSeconds ;
2002-07-28 20:28:37 +00:00
GAMESTATE -> m_fSongBeat = fSongBeat ;
2002-07-23 01:41:40 +00:00
GAMESTATE -> m_fCurBPS = fBPS ;
GAMESTATE -> m_bFreeze = bFreeze ;
2002-08-02 09:31:06 +00:00
// LOG->Trace( "GAMESTATE->m_fMusicSeconds = %f", GAMESTATE->m_fMusicSeconds );
2002-05-20 08:59:37 +00:00
2002-07-23 01:41:40 +00:00
2002-07-31 19:40:40 +00:00
//LOG->Trace( "m_fOffsetInBeats = %f, m_fBeatsPerSecond = %f, m_Music.GetPositionSeconds = %f", m_fOffsetInBeats, m_fBeatsPerSecond, m_Music.GetPositionSeconds() );
2002-05-20 08:59:37 +00:00
switch ( m_DancingState )
{
case STATE_DANCING :
2002-07-27 19:29:51 +00:00
//
2002-05-20 08:59:37 +00:00
// Check for end of song
2002-07-27 19:29:51 +00:00
//
2002-08-28 22:42:40 +00:00
if ( fSongBeat > GAMESTATE -> m_pCurSong -> m_fLastBeat + 2 && ! m_soundMusic . IsPlaying () )
2002-08-01 03:15:27 +00:00
{
GAMESTATE -> m_fSongBeat = 0 ;
2002-08-20 21:00:56 +00:00
m_soundMusic . Stop ();
2002-07-11 19:02:26 +00:00
this -> SendScreenMessage ( SM_NotesEnded , 0 );
2002-08-01 03:15:27 +00:00
}
2002-07-27 19:29:51 +00:00
//
// check for fail
//
switch ( GAMESTATE -> m_SongOptions . m_FailType )
{
case SongOptions :: FAIL_ARCADE :
2002-08-01 21:55:40 +00:00
switch ( GAMESTATE -> m_SongOptions . m_LifeType )
{
case SongOptions :: LIFE_BAR :
if ( AllAreFailing () ) SCREENMAN -> SendMessageToTopScreen ( SM_BeginFailed , 0 );
if ( AllAreInDanger () ) m_Background . TurnDangerOn ();
else m_Background . TurnDangerOff ();
break ;
case SongOptions :: LIFE_BATTERY :
if ( AllFailedEarlier () ) SCREENMAN -> SendMessageToTopScreen ( SM_BeginFailed , 0 );
if ( AllAreInDanger () ) m_Background . TurnDangerOn ();
else m_Background . TurnDangerOff ();
2002-07-27 19:29:51 +00:00
2002-08-01 21:55:40 +00:00
// check for individual fail
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
if ( GAMESTATE -> IsPlayerEnabled ( p ) )
if ( m_pLifeMeter [ p ] -> IsFailing () && GAMESTATE -> m_fSecondsBeforeFail [ p ] == - 1 ) // not yet failed
2002-08-02 09:31:06 +00:00
if ( ! AllFailedEarlier () ) // if not the last one to fail
{
// kill them!
GAMESTATE -> m_fSecondsBeforeFail [ p ] = GAMESTATE -> GetElapsedSeconds ();
m_soundOniDie . PlayRandom ();
ShowOniGameOver (( PlayerNumber ) p );
m_Player [ p ]. Init (); // remove all notes and scoring
m_Player [ p ]. FadeToFail (); // tell the NoteField to fade to white
}
2002-08-01 21:55:40 +00:00
break ;
}
2002-07-27 19:29:51 +00:00
break ;
case SongOptions :: FAIL_END_OF_SONG :
case SongOptions :: FAIL_OFF :
break ; // don't check for fail
default :
ASSERT ( 0 );
}
//
2002-05-20 08:59:37 +00:00
// Check to see if it's time to play a gameplay comment
2002-07-27 19:29:51 +00:00
//
2002-08-02 09:31:06 +00:00
if ( ! GAMESTATE -> m_bDemonstration ) // don't play announcer comments in demonstration
2002-05-20 08:59:37 +00:00
{
2002-08-02 09:31:06 +00:00
m_fTimeLeftBeforeDancingComment -= fDeltaTime ;
if ( m_fTimeLeftBeforeDancingComment <= 0 )
{
if ( OneIsHot () )
m_announcerHot . PlayRandom ();
else if ( AllAreInDanger () )
m_announcerDanger . PlayRandom ();
else
m_announcerGood . PlayRandom ();
2002-08-20 21:00:56 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ; // reset for the next comment
2002-08-02 09:31:06 +00:00
}
2002-08-20 21:00:56 +00:00
2002-05-20 08:59:37 +00:00
}
}
2002-06-24 22:04:31 +00:00
//
// Send crossed row messages to Player
//
int iRowNow = BeatToNoteRowNotRounded ( fSongBeat );
2002-08-15 16:45:49 +00:00
if ( iRowNow >= 0 && iRowNow < MAX_TAP_NOTE_ROWS )
2002-06-24 22:04:31 +00:00
{
2002-08-15 16:45:49 +00:00
for ( int r = m_iRowLastCrossed + 1 ; r <= iRowNow ; r ++ ) // for each index we crossed since the last update
2002-06-24 22:04:31 +00:00
{
2002-08-15 16:45:49 +00:00
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
{
if ( GAMESTATE -> IsPlayerEnabled ( p ) )
m_Player [ p ]. CrossedRow ( r );
}
2002-06-24 22:04:31 +00:00
}
2002-08-15 16:45:49 +00:00
m_iRowLastCrossed = iRowNow ;
2002-06-24 22:04:31 +00:00
}
//
// play assist ticks
//
// Sound cards have a latency between when a sample is Play()ed and when the sound
// will start coming out the speaker. Compensate for this by boosting
// fPositionSeconds ahead
2002-07-23 01:41:40 +00:00
if ( GAMESTATE -> m_SongOptions . m_AssistType == SongOptions :: ASSIST_TICK )
2002-05-20 08:59:37 +00:00
{
2002-09-02 21:59:58 +00:00
fPositionSeconds += ( SOUND -> GetPlayLatency () + g_fTickEarlySecondsCache ) * m_soundMusic . GetPlaybackRate (); // HACK: Play the sound a little bit early to account for the fact that the middle of the tick sounds occurs 0.015 seconds into playing.
2002-07-23 01:41:40 +00:00
GAMESTATE -> m_pCurSong -> GetBeatAndBPSFromElapsedTime ( fPositionSeconds , fSongBeat , fBPS , bFreeze );
2002-05-20 08:59:37 +00:00
2002-06-24 22:04:31 +00:00
int iRowNow = BeatToNoteRowNotRounded ( fSongBeat );
2002-08-03 18:40:09 +00:00
iRowNow = max ( 0 , iRowNow );
2002-06-24 22:04:31 +00:00
static int iRowLastCrossed = 0 ;
2002-05-20 08:59:37 +00:00
bool bAnyoneHasANote = false ; // set this to true if any player has a note at one of the indicies we crossed
2002-06-24 22:04:31 +00:00
for ( int r = iRowLastCrossed + 1 ; r <= iRowNow ; r ++ ) // for each index we crossed since the last update
2002-05-20 08:59:37 +00:00
{
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
{
2002-07-23 01:41:40 +00:00
if ( ! GAMESTATE -> IsPlayerEnabled ( ( PlayerNumber ) p ) )
2002-05-20 08:59:37 +00:00
continue ; // skip
2002-06-24 22:04:31 +00:00
bAnyoneHasANote |= m_Player [ p ]. IsThereANoteAtRow ( r );
2002-05-27 08:23:27 +00:00
break ; // this will only play the tick for the first player that is joined
2002-05-20 08:59:37 +00:00
}
}
if ( bAnyoneHasANote )
2002-08-26 05:53:48 +00:00
m_soundAssistTick . Play ();
2002-05-20 08:59:37 +00:00
2002-06-24 22:04:31 +00:00
iRowLastCrossed = iRowNow ;
2002-05-20 08:59:37 +00:00
}
2002-08-02 09:31:06 +00:00
2002-08-23 20:18:29 +00:00
if ( PREFSMAN -> m_bAutoPlay && ! GAMESTATE -> m_bDemonstration )
2002-09-02 21:59:58 +00:00
m_textAutoPlay . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
2002-08-23 20:18:29 +00:00
else
2002-09-02 21:59:58 +00:00
m_textAutoPlay . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
2002-08-02 09:31:06 +00:00
Screen :: Update ( fDeltaTime );
2002-05-20 08:59:37 +00:00
}
void ScreenGameplay :: DrawPrimitives ()
{
Screen :: DrawPrimitives ();
}
void ScreenGameplay :: Input ( const DeviceInput & DeviceI , const InputEventType type , const GameInput & GameI , const MenuInput & MenuI , const StyleInput & StyleI )
{
2002-07-31 19:40:40 +00:00
//LOG->Trace( "ScreenGameplay::Input()" );
2002-08-21 21:47:06 +00:00
if ( type == IET_RELEASE ) return ; // don't care
2002-05-20 08:59:37 +00:00
2002-08-02 09:31:06 +00:00
if ( GAMESTATE -> m_bDemonstration )
{
2002-08-26 03:51:12 +00:00
/* Special case:always allow escape. */
if ( DeviceI . device == DEVICE_KEYBOARD && DeviceI . button == DIK_ESCAPE && ! m_Fade . IsClosing () )
{
this -> SendScreenMessage ( SM_BeginFadingToTitleMenu , 0 );
}
/* Since escape backs out, we want to allow any other back buttons to
* work, too, to avoid confusion. */
else if ( ( MenuI . button == MENU_BUTTON_START || MenuI . button == MENU_BUTTON_BACK )
&& ! m_Fade . IsClosing () )
2002-08-02 09:31:06 +00:00
{
m_soundMusic . Stop ();
2002-08-13 23:26:46 +00:00
SOUND -> PlayOnceStreamed ( THEME -> GetPathTo ( "Sounds" , "insert coin" ) );
:: Sleep ( 1000 ); // do a little pause, like the arcade does
this -> SendScreenMessage ( SM_GoToTitleMenu , 0 );
2002-08-02 09:31:06 +00:00
}
return ; // don't fall through below
}
2002-05-20 08:59:37 +00:00
2002-06-24 22:04:31 +00:00
// Handle special keys to adjust the offset
2002-07-03 21:27:26 +00:00
if ( DeviceI . device == DEVICE_KEYBOARD )
2002-06-24 22:04:31 +00:00
{
switch ( DeviceI . button )
{
2002-08-26 05:53:48 +00:00
// case DIK_F6:
// this->SendScreenMessage( SM_BeginToasty, 0 );
// break;
2002-08-25 05:07:47 +00:00
case DIK_F7 :
if ( GAMESTATE -> m_SongOptions . m_AssistType == SongOptions :: ASSIST_NONE )
GAMESTATE -> m_SongOptions . m_AssistType = SongOptions :: ASSIST_TICK ;
else
GAMESTATE -> m_SongOptions . m_AssistType = SongOptions :: ASSIST_NONE ;
m_textDebug . SetText ( ssprintf ( "Assist tick is %s." , ( GAMESTATE -> m_SongOptions . m_AssistType == SongOptions :: ASSIST_NONE ) ? "OFF" : "ON" ) );
2002-09-02 21:59:58 +00:00
m_textDebug . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
2002-08-25 05:07:47 +00:00
m_textDebug . StopTweening ();
2002-09-02 21:59:58 +00:00
m_textDebug . BeginTweening ( 3 ); // sleep
m_textDebug . BeginTweening ( 0.5f ); // fade out
m_textDebug . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
2002-08-25 05:07:47 +00:00
break ;
2002-07-27 19:29:51 +00:00
case DIK_F8 :
PREFSMAN -> m_bAutoPlay = ! PREFSMAN -> m_bAutoPlay ;
break ;
case DIK_F9 :
case DIK_F10 :
2002-07-03 21:27:26 +00:00
{
2002-07-27 19:29:51 +00:00
m_bChangedOffsetOrBPM = true ;
2002-07-03 21:27:26 +00:00
float fOffsetDelta ;
switch ( DeviceI . button )
{
2002-07-27 19:29:51 +00:00
case DIK_F9 : fOffsetDelta = - 0.025f ; break ;
case DIK_F10 : fOffsetDelta = + 0.025f ; break ;
default : ASSERT ( 0 );
}
if ( type == IET_FAST_REPEAT )
2002-07-31 19:40:40 +00:00
fOffsetDelta *= 10 ;
2002-08-02 09:31:06 +00:00
BPMSegment & seg = GAMESTATE -> m_pCurSong -> GetBPMSegmentAtBeat ( GAMESTATE -> m_fSongBeat );
2002-07-27 19:29:51 +00:00
seg . m_fBPM += fOffsetDelta ;
2002-08-23 20:18:29 +00:00
m_textDebug . SetText ( ssprintf ( "Cur BPM = %f" , seg . m_fBPM ) );
2002-09-02 21:59:58 +00:00
m_textDebug . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
2002-07-27 19:29:51 +00:00
m_textDebug . StopTweening ();
2002-09-02 21:59:58 +00:00
m_textDebug . BeginTweening ( 3 ); // sleep
m_textDebug . BeginTweening ( 0.5f ); // fade out
m_textDebug . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
2002-07-27 19:29:51 +00:00
}
break ;
case DIK_F11 :
case DIK_F12 :
{
m_bChangedOffsetOrBPM = true ;
float fOffsetDelta ;
switch ( DeviceI . button )
{
case DIK_F11 : fOffsetDelta = - 0.02f ; break ;
case DIK_F12 : fOffsetDelta = + 0.02f ; break ;
2002-07-03 21:27:26 +00:00
default : ASSERT ( 0 );
}
if ( type == IET_FAST_REPEAT )
2002-07-31 19:40:40 +00:00
fOffsetDelta *= 10 ;
2002-07-03 21:27:26 +00:00
2002-07-23 01:41:40 +00:00
GAMESTATE -> m_pCurSong -> m_fBeat0OffsetInSeconds += fOffsetDelta ;
2002-07-03 21:27:26 +00:00
2002-08-23 20:18:29 +00:00
m_textDebug . SetText ( ssprintf ( "Offset = %f" , GAMESTATE -> m_pCurSong -> m_fBeat0OffsetInSeconds ) );
2002-09-02 21:59:58 +00:00
m_textDebug . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
2002-07-03 21:27:26 +00:00
m_textDebug . StopTweening ();
2002-09-02 21:59:58 +00:00
m_textDebug . BeginTweening ( 3 ); // sleep
m_textDebug . BeginTweening ( 0.5f ); // fade out
m_textDebug . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
2002-07-03 21:27:26 +00:00
}
2002-06-24 22:04:31 +00:00
break ;
}
}
2002-07-28 20:28:37 +00:00
if ( MenuI . IsValid () &&
MenuI . button == MENU_BUTTON_BACK &&
m_DancingState != STATE_OUTRO &&
! m_Fade . IsClosing () )
2002-05-20 08:59:37 +00:00
{
2002-08-24 06:34:15 +00:00
if ( ! PREFSMAN -> m_bDelayedEscape ||
( DeviceI . device == DEVICE_KEYBOARD && type == IET_SLOW_REPEAT ) ||
2002-08-01 13:42:56 +00:00
( DeviceI . device != DEVICE_KEYBOARD && type == IET_FAST_REPEAT ) )
{
m_DancingState = STATE_OUTRO ;
2002-08-13 23:26:46 +00:00
SOUND -> PlayOnceStreamed ( THEME -> GetPathTo ( "Sounds" , "menu back" ) );
2002-08-24 22:48:16 +00:00
/* Hmm. There are a bunch of subtly different ways we can
* tween out:
* 1. Keep rendering the song, and keep it moving. This might
* cause problems if the cancel and the end of the song overlap.
* 2. Stop the song completely, so all song motion under the tween
* ceases.
* 3. Stop the song, but keep effects (eg. Drunk) running.
* 4. Don't display the song at all.
*
* We're doing #3. I'm not sure which is best.
*
* We have to pause the music, not stop it. If we stop it,
* its position will be 0, and we'll render the *start*
* of the song while we tween out, which looks really strange.
* -glenn
*/
m_soundMusic . Pause ();
2002-08-01 13:42:56 +00:00
this -> ClearMessageQueue ();
m_Fade . CloseWipingLeft ( SM_SaveChangedBeforeGoingBack );
}
2002-05-20 08:59:37 +00:00
}
2002-07-27 19:29:51 +00:00
//
// handle a step
//
2002-08-23 20:18:29 +00:00
if ( m_DancingState == STATE_DANCING && type == IET_FIRST_PRESS && ! PREFSMAN -> m_bAutoPlay && StyleI . IsValid () )
if ( GAMESTATE -> IsPlayerEnabled ( StyleI . player ) )
m_Player [ StyleI . player ]. Step ( StyleI . col );
2002-05-20 08:59:37 +00:00
}
2002-08-02 09:31:06 +00:00
void SaveChanges ()
2002-07-27 19:29:51 +00:00
{
2002-07-28 20:28:37 +00:00
switch ( GAMESTATE -> m_PlayMode )
{
case PLAY_MODE_ARCADE :
2002-08-25 19:00:12 +00:00
GAMESTATE -> m_pCurSong -> SaveToSongFile ();
2002-07-28 20:28:37 +00:00
break ;
case PLAY_MODE_ONI :
case PLAY_MODE_ENDLESS :
{
for ( int i = 0 ; i < GAMESTATE -> m_pCurCourse -> m_iStages ; i ++ )
{
Song * pSong = GAMESTATE -> m_pCurCourse -> m_apSongs [ i ];
2002-08-25 19:00:12 +00:00
pSong -> SaveToSongFile ();
2002-07-28 20:28:37 +00:00
}
}
break ;
default :
ASSERT ( 0 );
}
2002-07-27 19:29:51 +00:00
}
2002-08-02 09:31:06 +00:00
void DontSaveChanges ()
2002-07-27 19:29:51 +00:00
{
2002-07-28 20:28:37 +00:00
switch ( GAMESTATE -> m_PlayMode )
{
case PLAY_MODE_ARCADE :
GAMESTATE -> m_pCurSong -> LoadFromSMFile ( GAMESTATE -> m_pCurSong -> GetCacheFilePath () );
break ;
case PLAY_MODE_ONI :
case PLAY_MODE_ENDLESS :
{
for ( int i = 0 ; i < GAMESTATE -> m_pCurCourse -> m_iStages ; i ++ )
{
Song * pSong = GAMESTATE -> m_pCurCourse -> m_apSongs [ i ];
pSong -> LoadFromSMFile ( GAMESTATE -> m_pCurSong -> GetCacheFilePath () );
}
}
break ;
default :
ASSERT ( 0 );
}
2002-07-27 19:29:51 +00:00
}
void ShowSavePrompt ( ScreenMessage SM_SendWhenDone )
{
2002-07-28 20:28:37 +00:00
CString sMessage ;
switch ( GAMESTATE -> m_PlayMode )
{
case PLAY_MODE_ARCADE :
sMessage = ssprintf (
"You have changed the offset or BPM of \n "
"%s. \n "
"Would you like to save these changes back \n "
"to the song file? \n "
2002-08-20 06:26:34 +00:00
"Choosing NO will discard your changes." ,
2002-07-28 20:28:37 +00:00
GAMESTATE -> m_pCurSong -> GetFullTitle () );
break ;
case PLAY_MODE_ONI :
case PLAY_MODE_ENDLESS :
sMessage = ssprintf (
"You have changed the offset or BPM of \n "
"one or more songs in this course. \n "
"Would you like to save these changes back \n "
"to the song file(s)? \n "
2002-08-20 06:26:34 +00:00
"Choosing NO will discard your changes." );
2002-07-28 20:28:37 +00:00
break ;
default :
ASSERT ( 0 );
}
2002-08-27 03:59:22 +00:00
SCREENMAN -> Prompt ( SM_SendWhenDone , sMessage , true , true , SaveChanges , DontSaveChanges );
2002-07-27 19:29:51 +00:00
}
2002-05-20 08:59:37 +00:00
void ScreenGameplay :: HandleScreenMessage ( const ScreenMessage SM )
{
switch ( SM )
{
// received while STATE_INTRO
case SM_User + 0 :
m_StarWipe . OpenWipingRight ( SM_None );
break ;
case SM_User + 1 :
break ;
case SM_User + 2 :
m_sprReady . StartFocusing ();
2002-07-11 19:02:26 +00:00
m_announcerReady . PlayRandom ();
2002-05-20 08:59:37 +00:00
break ;
case SM_User + 3 :
break ;
case SM_User + 4 :
m_sprReady . StartBlurring ();
break ;
case SM_User + 5 :
2002-07-23 01:41:40 +00:00
{
m_sprHereWeGo . StartFocusing ();
m_announcerHereWeGo . PlayRandom ();
m_Background . FadeIn ();
m_soundMusic . Play ();
}
2002-05-20 08:59:37 +00:00
break ;
case SM_User + 6 :
break ;
case SM_User + 7 :
break ;
case SM_User + 8 :
m_sprHereWeGo . StartBlurring ();
m_DancingState = STATE_DANCING ; // STATE CHANGE! Now the user is allowed to press Back
break ;
case SM_User + 9 :
break ;
// received while STATE_DANCING
2002-07-11 19:02:26 +00:00
case SM_NotesEnded :
2002-07-23 01:41:40 +00:00
{
2002-07-28 20:28:37 +00:00
// save any statistics
2002-07-23 01:41:40 +00:00
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
2002-07-27 19:29:51 +00:00
{
2002-07-28 20:28:37 +00:00
if ( GAMESTATE -> IsPlayerEnabled ( p ) )
{
for ( int r = 0 ; r < NUM_RADAR_CATEGORIES ; r ++ )
{
RadarCategory rc = ( RadarCategory ) r ;
GAMESTATE -> m_fRadarPossible [ p ][ r ] = m_Player [ p ]. GetRadarValue ( rc , GAMESTATE -> m_pCurSong -> m_fMusicLengthSeconds );
GAMESTATE -> m_fRadarActual [ p ][ r ] = m_Player [ p ]. GetActualRadarValue ( rc , GAMESTATE -> m_pCurSong -> m_fMusicLengthSeconds );
}
}
2002-07-27 19:29:51 +00:00
}
2002-07-28 20:28:37 +00:00
GAMESTATE -> m_apSongsPlayed . Add ( GAMESTATE -> m_pCurSong );
2002-08-01 03:15:27 +00:00
GAMESTATE -> m_iSongsIntoCourse ++ ;
2002-08-01 21:11:32 +00:00
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
2002-08-01 03:15:27 +00:00
if ( GAMESTATE -> IsPlayerEnabled ( p ) )
if ( ! m_pLifeMeter [ p ] -> FailedEarlier () )
GAMESTATE -> m_iSongsBeforeFail [ p ] ++ ;
2002-07-28 20:28:37 +00:00
if ( ! IsLastSong () )
2002-07-27 19:29:51 +00:00
{
2002-08-01 03:15:27 +00:00
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
if ( GAMESTATE -> IsPlayerEnabled ( p ) )
if ( ! m_pLifeMeter [ p ] -> FailedEarlier () )
m_pLifeMeter [ p ] -> SongEnded (); // let the oni life meter give them back a life
m_OniFade . CloseWipingRight ( SM_BeginLoadingNextSong );
2002-07-28 20:28:37 +00:00
}
else // IsLastSong
{
if ( m_DancingState == STATE_OUTRO ) // gameplay already ended
return ; // ignore
m_DancingState = STATE_OUTRO ;
GAMESTATE -> AccumulateStageStatistics (); // accumulate values for final evaluation
if ( GAMESTATE -> m_SongOptions . m_FailType == SongOptions :: FAIL_END_OF_SONG && AllFailedEarlier () )
{
this -> SendScreenMessage ( SM_BeginFailed , 0 );
}
else
{
2002-08-13 23:26:46 +00:00
m_StarWipe . CloseWipingRight ( SM_None );
this -> SendScreenMessage ( SM_ShowCleared , 1 );
2002-08-27 23:31:41 +00:00
SOUND -> PlayOnceStreamedFromDir ( ANNOUNCER -> GetPathTo ( "gameplay cleared" ) );
2002-07-28 20:28:37 +00:00
}
2002-07-27 19:29:51 +00:00
}
2002-05-20 08:59:37 +00:00
}
break ;
2002-08-01 03:15:27 +00:00
case SM_BeginLoadingNextSong :
LoadNextSong ( false );
m_OniFade . OpenWipingRight ( SM_None );
break ;
2002-08-02 09:31:06 +00:00
case SM_BeginFadingToTitleMenu :
m_Fade . CloseWipingRight ( SM_GoToTitleMenu );
break ;
2002-08-01 03:15:27 +00:00
2002-08-26 05:53:48 +00:00
case SM_BeginToasty :
this -> SendScreenMessage ( SM_PlayToastySound , 0.3f );
// set off screen
2002-08-27 03:59:22 +00:00
m_sprToasty . StopTweening ();
2002-09-02 21:59:58 +00:00
m_sprToasty . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
2002-08-26 05:53:48 +00:00
m_sprToasty . SetX ( SCREEN_RIGHT + m_sprToasty . GetUnzoomedWidth () / 2 );
m_sprToasty . SetY ( SCREEN_BOTTOM - m_sprToasty . GetUnzoomedHeight () / 2 );
2002-09-02 21:59:58 +00:00
m_sprToasty . BeginTweening ( 0.2f , Actor :: TWEEN_BIAS_BEGIN ); // slide on
2002-08-26 05:53:48 +00:00
m_sprToasty . SetTweenX ( SCREEN_RIGHT - m_sprToasty . GetUnzoomedWidth () / 2 );
2002-09-02 21:59:58 +00:00
m_sprToasty . BeginTweening ( 0.6f ); // sleep
m_sprToasty . BeginTweening ( 0.3f , Actor :: TWEEN_BIAS_END ); // slide off
2002-08-26 05:53:48 +00:00
m_sprToasty . SetTweenX ( SCREEN_RIGHT + m_sprToasty . GetUnzoomedWidth () / 2 );
2002-09-02 21:59:58 +00:00
m_sprToasty . BeginTweening ( 0.001f ); // fade out
m_sprToasty . SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
2002-08-26 05:53:48 +00:00
break ;
case SM_PlayToastySound :
m_soundToasty . Play ();
break ;
2002-07-11 19:02:26 +00:00
case SM_100Combo :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcer100Combo . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
case SM_200Combo :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcer200Combo . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
case SM_300Combo :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcer300Combo . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
case SM_400Combo :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcer400Combo . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
case SM_500Combo :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcer500Combo . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
case SM_600Combo :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcer600Combo . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
case SM_700Combo :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcer700Combo . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
case SM_800Combo :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcer800Combo . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
case SM_900Combo :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcer900Combo . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
case SM_1000Combo :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcer1000Combo . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
case SM_ComboStopped :
if ( m_fTimeLeftBeforeDancingComment < 12 )
{
m_announcerComboStopped . PlayRandom ();
2002-08-13 23:26:46 +00:00
m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS ;
2002-07-11 19:02:26 +00:00
}
break ;
// received while STATE_OUTRO
2002-05-20 08:59:37 +00:00
case SM_ShowCleared :
2002-08-26 05:53:48 +00:00
m_sprCleared . BeginTweening ( 1.0f );
2002-09-02 21:59:58 +00:00
m_sprCleared . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
SCREENMAN -> SendMessageToTopScreen ( SM_HideCleared , 1.5 );
2002-05-20 08:59:37 +00:00
break ;
case SM_HideCleared :
2002-08-27 16:53:25 +00:00
m_sprCleared . BeginTweening ( 0.7f );
2002-09-02 21:59:58 +00:00
m_sprCleared . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
2002-07-27 19:29:51 +00:00
SCREENMAN -> SendMessageToTopScreen ( SM_GoToStateAfterCleared , 1 );
2002-05-20 08:59:37 +00:00
break ;
2002-08-01 05:11:11 +00:00
case SM_SaveChangedBeforeGoingBack :
if ( m_bChangedOffsetOrBPM )
{
m_bChangedOffsetOrBPM = false ;
ShowSavePrompt ( SM_GoToScreenAfterBack );
}
2002-08-01 13:42:56 +00:00
else
this -> SendScreenMessage ( SM_GoToScreenAfterBack , 0 );
2002-08-01 05:11:11 +00:00
break ;
2002-07-27 19:29:51 +00:00
case SM_GoToScreenAfterBack :
switch ( GAMESTATE -> m_PlayMode )
{
2002-07-29 03:06:55 +00:00
case PLAY_MODE_ARCADE :
2002-08-27 03:59:22 +00:00
SCREENMAN -> SetNewScreen ( "ScreenSelectMusic" );
2002-07-29 03:06:55 +00:00
break ;
case PLAY_MODE_ONI :
case PLAY_MODE_ENDLESS :
2002-08-27 03:59:22 +00:00
SCREENMAN -> SetNewScreen ( "ScreenSelectCourse" );
2002-07-29 03:06:55 +00:00
break ;
2002-07-27 19:29:51 +00:00
default : ASSERT ( 0 );
}
break ;
case SM_GoToStateAfterCleared :
if ( m_bChangedOffsetOrBPM )
{
m_bChangedOffsetOrBPM = false ;
ShowSavePrompt ( SM_GoToStateAfterCleared );
break ;
}
2002-08-27 03:59:22 +00:00
SCREENMAN -> SetNewScreen ( "ScreenEvaluation" );
2002-05-20 08:59:37 +00:00
break ;
case SM_BeginFailed :
m_DancingState = STATE_OUTRO ;
m_soundMusic . Pause ();
2002-08-13 23:26:46 +00:00
m_StarWipe . SetTransitionTime ( 1.5f );
2002-05-20 08:59:37 +00:00
m_StarWipe . CloseWipingRight ( SM_None );
2002-08-02 09:31:06 +00:00
int p ;
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
2002-08-01 21:55:40 +00:00
if ( GAMESTATE -> IsPlayerEnabled ( p ) )
m_Player [ p ]. FadeToFail ();
2002-08-01 13:42:56 +00:00
2002-05-20 08:59:37 +00:00
this -> SendScreenMessage ( SM_ShowFailed , 0.2f );
break ;
case SM_ShowFailed :
2002-07-11 19:02:26 +00:00
m_soundFail . PlayRandom ();
2002-05-20 08:59:37 +00:00
// make the background invisible so we don't waste mem bandwidth drawing it
m_Background . BeginTweening ( 1 );
2002-09-02 21:59:58 +00:00
m_Background . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
2002-05-20 08:59:37 +00:00
m_sprFailed . SetZoom ( 4 );
m_sprFailed . BeginBlurredTweening ( 0.8f , TWEEN_BIAS_END );
m_sprFailed . SetTweenZoom ( 0.5f ); // zoom out
2002-09-02 21:59:58 +00:00
m_sprFailed . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0.7f ) ); // and fade in
m_sprFailed . BeginTweening ( 0.3f );
2002-05-20 08:59:37 +00:00
m_sprFailed . SetTweenZoom ( 1.1f ); // bounce
2002-09-02 21:59:58 +00:00
m_sprFailed . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0.7f ) ); // and fade in
m_sprFailed . BeginTweening ( 0.2f );
2002-05-20 08:59:37 +00:00
m_sprFailed . SetTweenZoom ( 1.0f ); // come to rest
2002-09-02 21:59:58 +00:00
m_sprFailed . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0.7f ) ); // and fade in
2002-05-20 08:59:37 +00:00
2002-08-01 13:42:56 +00:00
// show the survive time if extra stage
if ( GAMESTATE -> IsExtraStage () || GAMESTATE -> IsExtraStage2 () )
{
float fMaxSurviveSeconds = - 1 ;
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
if ( GAMESTATE -> IsPlayerEnabled ( p ) )
fMaxSurviveSeconds = max ( fMaxSurviveSeconds , GAMESTATE -> GetPlayerSurviveTime (( PlayerNumber ) p ) );
ASSERT ( fMaxSurviveSeconds != - 1 );
m_textSurviveTime . SetText ( "TIME " + SecondsToTime ( fMaxSurviveSeconds ) );
m_textSurviveTime . BeginTweening ( 0.3f ); // sleep
2002-09-02 21:59:58 +00:00
m_textSurviveTime . BeginTweening ( 0.3f ); // fade in
m_textSurviveTime . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
2002-08-01 13:42:56 +00:00
}
2002-09-02 21:59:58 +00:00
SCREENMAN -> SendMessageToTopScreen ( SM_PlayFailComment , 1.0f );
SCREENMAN -> SendMessageToTopScreen ( SM_HideFailed , 2.0f );
2002-05-20 08:59:37 +00:00
break ;
case SM_PlayFailComment :
2002-08-27 23:31:41 +00:00
SOUND -> PlayOnceStreamedFromDir ( ANNOUNCER -> GetPathTo ( "gameplay failed" ) );
2002-05-20 08:59:37 +00:00
break ;
case SM_HideFailed :
m_sprFailed . StopTweening ();
m_sprFailed . BeginTweening ( 1.0f );
2002-09-02 21:59:58 +00:00
m_sprFailed . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
2002-05-20 08:59:37 +00:00
2002-08-01 13:42:56 +00:00
m_textSurviveTime . BeginTweening ( 0.5f ); // sleep
2002-09-02 21:59:58 +00:00
m_textSurviveTime . BeginTweening ( 0.5f ); // fade out
m_textSurviveTime . SetTweenDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 0 ) );
2002-08-01 13:42:56 +00:00
2002-05-27 08:23:27 +00:00
SCREENMAN -> SendMessageToTopScreen ( SM_GoToScreenAfterFail , 1.5f );
2002-05-20 08:59:37 +00:00
break ;
2002-05-27 08:23:27 +00:00
case SM_GoToScreenAfterFail :
2002-07-27 19:29:51 +00:00
if ( m_bChangedOffsetOrBPM )
{
m_bChangedOffsetOrBPM = false ;
ShowSavePrompt ( SM_GoToScreenAfterFail );
break ;
}
2002-08-22 09:31:32 +00:00
if ( GAMESTATE -> m_PlayMode == PLAY_MODE_ONI || GAMESTATE -> m_PlayMode == PLAY_MODE_ENDLESS )
2002-08-27 03:59:22 +00:00
SCREENMAN -> SetNewScreen ( "ScreenEvaluation" );
2002-08-22 09:31:32 +00:00
else if ( PREFSMAN -> m_bEventMode )
2002-07-27 19:29:51 +00:00
this -> SendScreenMessage ( SM_GoToScreenAfterBack , 0 );
2002-08-01 13:42:56 +00:00
else if ( GAMESTATE -> IsExtraStage () || GAMESTATE -> IsExtraStage2 () )
2002-08-27 03:59:22 +00:00
SCREENMAN -> SetNewScreen ( "ScreenFinalEvaluation" );
2002-05-27 08:23:27 +00:00
else
2002-08-27 03:59:22 +00:00
SCREENMAN -> SetNewScreen ( "ScreenGameOver" );
2002-05-20 08:59:37 +00:00
break ;
2002-08-02 09:31:06 +00:00
case SM_GoToTitleMenu :
2002-08-27 03:59:22 +00:00
SCREENMAN -> SetNewScreen ( "ScreenTitleMenu" );
2002-08-02 09:31:06 +00:00
break ;
2002-05-20 08:59:37 +00:00
}
2002-06-14 22:25:22 +00:00
}
2002-05-20 08:59:37 +00:00
2002-06-14 22:25:22 +00:00
void ScreenGameplay :: TweenOnScreen ()
{
2002-08-28 22:42:40 +00:00
int i , p ;
2002-06-14 22:25:22 +00:00
2002-08-28 22:42:40 +00:00
CArray < Actor * , Actor *> apActorsInTopFrame ;
apActorsInTopFrame . Add ( & m_sprTopFrame );
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
apActorsInTopFrame . Add ( m_pLifeMeter [ p ] );
apActorsInTopFrame . Add ( & m_textStageNumber );
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
apActorsInTopFrame . Add ( & m_textCourseSongNumber [ p ] );
for ( i = 0 ; i < apActorsInTopFrame . GetSize (); i ++ )
{
float fOriginalY = apActorsInTopFrame [ i ] -> GetY ();
apActorsInTopFrame [ i ] -> SetY ( fOriginalY - 100 );
if ( ! GAMESTATE -> m_bDemonstration )
2002-09-02 21:59:58 +00:00
apActorsInTopFrame [ i ] -> BeginTweening ( 0.5f ); // sleep
apActorsInTopFrame [ i ] -> BeginTweening ( 1 );
2002-08-28 22:42:40 +00:00
apActorsInTopFrame [ i ] -> SetTweenY ( fOriginalY );
}
CArray < Actor * , Actor *> apActorsInBottomFrame ;
apActorsInBottomFrame . Add ( & m_sprBottomFrame );
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
{
if ( ! GAMESTATE -> IsPlayerEnabled ( p ) )
continue ;
apActorsInBottomFrame . Add ( m_pScoreDisplay [ p ] );
apActorsInBottomFrame . Add ( & m_textPlayerOptions [ p ] );
}
apActorsInBottomFrame . Add ( & m_textSongOptions );
for ( i = 0 ; i < apActorsInBottomFrame . GetSize (); i ++ )
{
float fOriginalY = apActorsInBottomFrame [ i ] -> GetY ();
apActorsInBottomFrame [ i ] -> SetY ( fOriginalY + 100 );
if ( ! GAMESTATE -> m_bDemonstration )
2002-09-02 21:59:58 +00:00
apActorsInBottomFrame [ i ] -> BeginTweening ( 0.5f ); // sleep
apActorsInBottomFrame [ i ] -> BeginTweening ( 1 );
2002-08-28 22:42:40 +00:00
apActorsInBottomFrame [ i ] -> SetTweenY ( fOriginalY );
}
for ( p = 0 ; p < NUM_PLAYERS ; p ++ )
{
float fOriginalX = m_DifficultyBanner [ p ]. GetX ();
m_DifficultyBanner [ p ]. SetX ( ( p == PLAYER_1 ) ? fOriginalX - 200 : fOriginalX + 200 );
if ( ! GAMESTATE -> m_bDemonstration )
2002-09-02 21:59:58 +00:00
m_DifficultyBanner [ p ]. BeginTweening ( 0.5f ); // sleep
m_DifficultyBanner [ p ]. BeginTweening ( 1 );
2002-08-28 22:42:40 +00:00
m_DifficultyBanner [ p ]. SetTweenX ( fOriginalX );
}
2002-05-20 08:59:37 +00:00
}
2002-06-14 22:25:22 +00:00
void ScreenGameplay :: TweenOffScreen ()
{
}
2002-08-01 21:55:40 +00:00
void ScreenGameplay :: ShowOniGameOver ( PlayerNumber p )
{
2002-09-02 21:59:58 +00:00
m_sprOniGameOver [ p ]. SetDiffuse ( D3DXCOLOR ( 1 , 1 , 1 , 1 ) );
2002-08-01 21:55:40 +00:00
m_sprOniGameOver [ p ]. BeginTweening ( 0.5f , Actor :: TWEEN_BOUNCE_END );
m_sprOniGameOver [ p ]. SetTweenY ( CENTER_Y );
m_sprOniGameOver [ p ]. SetEffectBobbing ( D3DXVECTOR3 ( 0 , 6 , 0 ), 4 );
}