2003-02-16 04:01:45 +00:00
#include "global.h"
2003-01-31 21:34:34 +00:00
/*
-----------------------------------------------------------------------------
Class: ScreenJukebox
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "ScreenJukebox.h"
#include "RageLog.h"
#include "ThemeManager.h"
#include "GameState.h"
#include "SongManager.h"
#include "StepMania.h"
2003-02-14 06:31:09 +00:00
#include "SDL_utils.h"
2003-04-13 00:44:50 +00:00
#include "ScreenManager.h"
2003-07-26 23:05:16 +00:00
#include "RageSounds.h"
2003-08-25 15:08:03 +00:00
#include "Steps.h"
2003-01-31 21:34:34 +00:00
2003-03-17 04:56:47 +00:00
const ScreenMessage SM_NotesEnded = ScreenMessage ( SM_User + 10 ); // MUST be same as in ScreenGameplay
2003-01-31 21:34:34 +00:00
2003-03-23 18:47:13 +00:00
bool ScreenJukebox :: SetSong ()
2003-01-31 21:34:34 +00:00
{
2003-02-11 02:20:38 +00:00
vector < Song *> vSongs ;
2003-02-25 00:33:42 +00:00
if ( GAMESTATE -> m_sPreferredGroup == GROUP_ALL_MUSIC )
2003-02-11 02:20:38 +00:00
SONGMAN -> GetSongs ( vSongs );
else
SONGMAN -> GetSongs ( vSongs , GAMESTATE -> m_sPreferredGroup );
2003-01-31 21:34:34 +00:00
//
2003-08-03 00:13:55 +00:00
// Search for a Song and Steps to play during the demo
2003-01-31 21:34:34 +00:00
//
2003-02-11 02:20:38 +00:00
for ( int i = 0 ; i < 600 ; i ++ )
2003-01-31 21:34:34 +00:00
{
2003-02-11 02:20:38 +00:00
if ( vSongs . size () == 0 )
return true ;
Song * pSong = vSongs [ rand () % vSongs . size ()];
2003-01-31 21:34:34 +00:00
if ( ! pSong -> HasMusic () )
continue ; // skip
2004-02-21 01:11:41 +00:00
if ( pSong -> m_SelectionDisplay == Song :: SHOW_NEVER )
continue ; // skip
2003-02-11 02:20:38 +00:00
Difficulty dc = GAMESTATE -> m_PreferredDifficulty [ PLAYER_1 ];
2003-08-03 00:13:55 +00:00
Steps * pNotes = NULL ;
2003-02-11 02:20:38 +00:00
if ( dc != DIFFICULTY_INVALID )
2003-08-10 08:58:11 +00:00
pNotes = pSong -> GetStepsByDifficulty ( GAMESTATE -> GetCurrentStyleDef () -> m_StepsType , GAMESTATE -> m_PreferredDifficulty [ PLAYER_1 ] );
2003-02-11 02:20:38 +00:00
else // "all difficulties"
{
2003-08-03 00:13:55 +00:00
vector < Steps *> vNotes ;
2003-08-10 08:58:11 +00:00
pSong -> GetSteps ( vNotes , GAMESTATE -> GetCurrentStyleDef () -> m_StepsType );
2003-02-11 02:20:38 +00:00
if ( vNotes . size () > 0 )
pNotes = vNotes [ rand () % vNotes . size ()];
}
2003-01-31 21:34:34 +00:00
2003-02-11 02:20:38 +00:00
if ( pNotes == NULL )
2003-01-31 21:34:34 +00:00
continue ; // skip
2004-02-10 21:10:23 +00:00
if ( ! PREFSMAN -> m_bAutogenSteps && pNotes -> IsAutogen ())
2003-08-25 15:08:03 +00:00
continue ; // skip
2003-01-31 21:34:34 +00:00
// Found something we can use!
GAMESTATE -> m_pCurSong = pSong ;
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
GAMESTATE -> m_pCurNotes [ p ] = pNotes ;
2003-03-23 18:47:13 +00:00
return true ; // done looking
2003-01-31 21:34:34 +00:00
}
2003-03-23 18:47:13 +00:00
return false ;
}
bool ScreenJukebox :: PrepareForJukebox () // always return true.
{
// ScreeJukeboxMenu must set this
ASSERT ( GAMESTATE -> m_CurStyle != STYLE_INVALID );
GAMESTATE -> m_PlayMode = PLAY_MODE_ARCADE ;
SetSong ();
2003-03-24 21:26:12 +00:00
// ASSERT( GAMESTATE->m_pCurSong );
2003-01-31 21:34:34 +00:00
GAMESTATE -> m_MasterPlayerNumber = PLAYER_1 ;
// choose some cool options
int Benchmark = 0 ;
if ( Benchmark )
{
/* Note that you also need to make sure you benchmark with the
* same notes. I use a copy of MaxU with only heavy notes included. */
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
{
if ( ! GAMESTATE -> IsPlayerEnabled ( p ) )
continue ;
/* Lots and lots of arrows. This might even bias to arrows a little
* too much. */
GAMESTATE -> m_PlayerOptions [ p ] = PlayerOptions ();
GAMESTATE -> m_PlayerOptions [ p ]. m_fScrollSpeed = .25f ;
2003-04-01 19:31:27 +00:00
GAMESTATE -> m_PlayerOptions [ p ]. m_fPerspectiveTilt = - 1 ;
2003-02-26 23:26:57 +00:00
GAMESTATE -> m_PlayerOptions [ p ]. m_fEffects [ PlayerOptions :: EFFECT_MINI ] = 1 ;
2003-01-31 21:34:34 +00:00
}
GAMESTATE -> m_SongOptions . m_LifeType = SongOptions :: LIFE_BATTERY ;
2003-02-12 23:11:37 +00:00
GAMESTATE -> m_SongOptions . m_FailType = SongOptions :: FAIL_OFF ;
2003-01-31 21:34:34 +00:00
}
for ( int p = 0 ; p < NUM_PLAYERS ; p ++ )
{
if ( ! GAMESTATE -> IsPlayerEnabled ( p ) )
continue ;
2003-02-11 02:20:38 +00:00
if ( GAMESTATE -> m_bJukeboxUsesModifiers )
2003-04-21 04:10:52 +00:00
{
GAMESTATE -> m_PlayerOptions [ p ]. Init ();
GAMESTATE -> m_PlayerOptions [ p ]. FromString ( PREFSMAN -> m_sDefaultModifiers );
2003-02-11 02:20:38 +00:00
GAMESTATE -> m_PlayerOptions [ p ]. ChooseRandomMofifiers ();
2003-04-21 04:10:52 +00:00
}
2003-01-31 21:34:34 +00:00
}
2003-04-21 04:10:52 +00:00
GAMESTATE -> m_SongOptions . Init ();
GAMESTATE -> m_SongOptions . FromString ( PREFSMAN -> m_sDefaultModifiers );
2003-01-31 21:34:34 +00:00
2003-02-12 23:11:37 +00:00
GAMESTATE -> m_SongOptions . m_FailType = SongOptions :: FAIL_OFF ;
2003-01-31 21:34:34 +00:00
2003-03-09 00:55:49 +00:00
GAMESTATE -> m_bDemonstrationOrJukebox = true ;
2003-01-31 21:34:34 +00:00
return true ;
}
2003-09-27 22:30:51 +00:00
ScreenJukebox :: ScreenJukebox ( CString sName , bool bDemonstration ) : ScreenGameplay ( "ScreenGameplay" , PrepareForJukebox () ) // this is a hack to get some code to execute before the ScreenGameplay constructor
2003-01-31 21:34:34 +00:00
{
LOG -> Trace ( "ScreenJukebox::ScreenJukebox()" );
if ( GAMESTATE -> m_pCurSong == NULL ) // we didn't find a song.
{
2003-03-25 21:17:29 +00:00
this -> PostScreenMessage ( SM_GoToNextScreen , 0 ); // Abort demonstration.
2003-01-31 21:34:34 +00:00
return ;
}
2003-04-12 17:39:27 +00:00
m_In . Load ( THEME -> GetPathToB ( "ScreenDemonstration in" ) );
2003-03-09 00:55:49 +00:00
this -> AddChild ( & m_In );
m_In . StartTransitioning ();
2003-04-12 17:39:27 +00:00
m_Out . Load ( THEME -> GetPathToB ( "ScreenDemonstration out" ) );
2003-03-09 00:55:49 +00:00
this -> AddChild ( & m_Out );
2003-01-31 21:34:34 +00:00
ClearMessageQueue (); // remove all of the messages set in ScreenGameplay that animate "ready", "here we go", etc.
GAMESTATE -> m_bPastHereWeGo = true ;
m_DancingState = STATE_DANCING ;
}
ScreenJukebox ::~ ScreenJukebox ()
{
}
void ScreenJukebox :: Update ( float fDeltaTime )
{
ScreenGameplay :: Update ( fDeltaTime );
}
void ScreenJukebox :: Input ( const DeviceInput & DeviceI , const InputEventType type , const GameInput & GameI , const MenuInput & MenuI , const StyleInput & StyleI )
{
//LOG->Trace( "ScreenJukebox::Input()" );
2003-03-17 04:56:47 +00:00
if ( type != IET_FIRST_PRESS )
return ; /* ignore */
2003-01-31 21:34:34 +00:00
if ( MenuI . IsValid () )
{
switch ( MenuI . button )
{
case MENU_BUTTON_LEFT :
case MENU_BUTTON_RIGHT :
2003-03-25 21:17:29 +00:00
SCREENMAN -> PostMessageToTopScreen ( SM_NotesEnded , 0 );
2003-01-31 21:34:34 +00:00
break ;
2003-03-17 04:17:30 +00:00
/* XXX: this is a copy-and-paste from ScreenAttract */
case MENU_BUTTON_START :
case MENU_BUTTON_BACK :
case MENU_BUTTON_COIN :
2003-04-13 04:50:08 +00:00
switch ( PREFSMAN -> m_iCoinMode )
2003-03-17 04:17:30 +00:00
{
2003-04-13 04:50:08 +00:00
case COIN_PAY :
2003-03-17 04:17:30 +00:00
if ( GAMESTATE -> m_iCoins < PREFSMAN -> m_iCoinsPerCredit )
break ; // don't fall through
// fall through
2003-04-13 04:50:08 +00:00
case COIN_HOME :
case COIN_FREE :
2003-07-26 23:05:16 +00:00
SOUND -> StopMusic ();
2003-03-17 04:17:30 +00:00
/* We already played the it was a coin was inserted. Don't play it again. */
if ( MenuI . button != MENU_BUTTON_COIN )
2003-07-26 23:05:16 +00:00
SOUND -> PlayOnce ( THEME -> GetPathToS ( "Common coin" ) );
2003-03-17 04:17:30 +00:00
SDL_Delay ( 800 ); // do a little pause, like the arcade does
SCREENMAN -> SetNewScreen ( "ScreenTitleMenu" );
break ;
default :
ASSERT ( 0 );
}
break ;
2003-01-31 21:34:34 +00:00
}
}
}
void ScreenJukebox :: HandleScreenMessage ( const ScreenMessage SM )
{
switch ( SM )
{
case SM_NotesEnded :
2003-03-17 04:56:47 +00:00
if ( m_Out . IsTransitioning () || m_Out . IsFinished () )
return ; // ignore - we're already fading or faded
2003-03-09 00:55:49 +00:00
m_Out . StartTransitioning ( SM_GoToNextScreen );
2003-01-31 21:34:34 +00:00
return ;
case SM_GoToNextScreen :
2004-01-20 06:08:56 +00:00
SOUND -> StopMusic ();
2003-01-31 21:34:34 +00:00
SCREENMAN -> SetNewScreen ( "ScreenJukebox" );
return ;
}
ScreenGameplay :: HandleScreenMessage ( SM );
2003-02-16 04:56:36 +00:00
}