The-Simpsons-Hit-and-Run/game/code/presentation/gui/frontend/guiscreensplash.cpp

345 lines
9.8 KiB
C++

//===========================================================================
// Copyright (C) 2000 Radical Entertainment Ltd. All rights reserved.
//
// Component: CGuiScreenSplash
//
// Description: Implementation of the CGuiScreenSplash class.
//
// Authors: Tony Chu
//
// Revisions Date Author Revision
// 2002/07/23 TChu Created for SRR2
//
//===========================================================================
//===========================================================================
// Includes
//===========================================================================
#include <presentation/gui/frontend/guiscreensplash.h>
#include <presentation/gui/frontend/guiscreenplaymovie.h>
#include <presentation/gui/guimenu.h>
#include <presentation/gui/guisystem.h>
#include <presentation/gui/guimanager.h>
#include <presentation/gui/frontend/guimanagerfrontend.h>
#include <cheats/cheatinputsystem.h>
#include <loading/loadingmanager.h>
#include <main/commandlineoptions.h>
#include <raddebug.hpp> // Foundation
#include <page.h>
#include <screen.h>
#include <sprite.h>
#include <text.h>
//===========================================================================
// Global Data, Local Data, Local Classes
//===========================================================================
short CGuiScreenSplash::s_demoPlaybackToggle = 0;
const unsigned int SPLASH_SCREEN_DEMO_WAIT_TIME = 30000; // in msec
//===========================================================================
// Public Member Functions
//===========================================================================
//===========================================================================
// CGuiScreenSplash::CGuiScreenSplash
//===========================================================================
// Description: Constructor.
//
// Constraints: None.
//
// Parameters: None.
//
// Return: N/A.
//
//===========================================================================
CGuiScreenSplash::CGuiScreenSplash
(
Scrooby::Screen* pScreen,
CGuiEntity* pParent
)
: CGuiScreen( pScreen, pParent, GUI_SCREEN_ID_SPLASH ),
m_pMenu( NULL ),
m_pressStart( NULL ),
m_demoLoopTime( SPLASH_SCREEN_DEMO_WAIT_TIME ),
m_elapsedTime( 0 )
{
// Retrieve the Scrooby drawing elements.
//
Scrooby::Page* pPage = m_pScroobyScreen->GetPage( "Splash" );
rAssert( pPage != NULL );
/*
Scrooby::Sprite* splashImage = pPage->GetSprite( "GameLogo" );
if( splashImage != NULL )
{
const float SPLASH_SCREEN_IMAGE_CORRECTION_SCALE = 2.0f;
splashImage->ScaleAboutCenter( SPLASH_SCREEN_IMAGE_CORRECTION_SCALE );
}
*/
// Create a menu.
//
m_pMenu = new CGuiMenu( this );
rAssert( m_pMenu != NULL );
m_pressStart = pPage->GetText( "PressStart" );
rAssert( m_pressStart != NULL );
m_pMenu->AddMenuItem( m_pressStart,
NULL,
NULL,
NULL,
NULL,
NULL,
SELECTION_ENABLED | TEXT_OUTLINE_ENABLED );
// set "press start" text to "loading ...", by default
//
m_pressStart->SetIndex( TEXT_LOADING );
m_pressStart->SetColour( tColour( 255, 255, 255 ) );
if( CommandLineOptions::Get( CLO_DEMO_TEST ) ||
GetCheatInputSystem()->IsCheatEnabled( CHEAT_ID_DEMO_TEST ) )
{
m_demoLoopTime = 1000; // in msec
}
}
//===========================================================================
// CGuiScreenSplash::~CGuiScreenSplash
//===========================================================================
// Description: Destructor.
//
// Constraints: None.
//
// Parameters: None.
//
// Return: N/A.
//
//===========================================================================
CGuiScreenSplash::~CGuiScreenSplash()
{
if( m_pMenu != NULL )
{
delete m_pMenu;
m_pMenu = NULL;
}
}
//===========================================================================
// CGuiScreenSplash::HandleMessage
//===========================================================================
// Description:
//
// Constraints: None.
//
// Parameters: None.
//
// Return: N/A.
//
//===========================================================================
void CGuiScreenSplash::HandleMessage
(
eGuiMessage message,
unsigned int param1,
unsigned int param2
)
{
if( m_state == GUI_WINDOW_STATE_RUNNING )
{
switch( message )
{
case GUI_MSG_UPDATE:
{
if( !m_pMenu->HasSelectionBeenMade() )
{
m_elapsedTime += param1;
if( m_elapsedTime > m_demoLoopTime )
{
if( s_demoPlaybackToggle != 0 )
{
if ( CommandLineOptions::Get( CLO_DEMO_TEST ) ||
GetCheatInputSystem()->IsCheatEnabled( CHEAT_ID_DEMO_TEST ) )
{
this->StartDemoInRuntime();
}
else
{
this->StartDemoAsMovie();
}
}
else
{
if ( CommandLineOptions::Get( CLO_DEMO_TEST ) ||
GetCheatInputSystem()->IsCheatEnabled( CHEAT_ID_DEMO_TEST ) )
{
this->StartDemoInRuntime();
}
else
{
this->StartDemoAsMovie();
}
}
// toggle demo playback format (btw. movie and runtime)
//
s_demoPlaybackToggle = 1 - s_demoPlaybackToggle;
m_elapsedTime = 0;
}
}
if( m_pressStart != NULL && !GetLoadingManager()->IsLoading() ) // sound loading is done
{
rAssert( m_pMenu != NULL );
m_pressStart->SetIndex( TEXT_PRESS_START_GC + PLATFORM_TEXT_INDEX);
m_pressStart->SetColour( m_pMenu->GetHighlightColour() );
m_pMenu->GetMenuItem( 0 )->m_attributes |= SELECTABLE;
// set this to NULL cuz we don't need to change it anymore
//
m_pressStart = NULL;
}
break;
}
case GUI_MSG_CONTROLLER_SELECT:
{
// ignore controller select inputs
//
return;
break;
}
case GUI_MSG_CONTROLLER_START:
{
GetGuiSystem()->SetPrimaryController((int)param1);
if( GetLoadingManager()->IsLoading() )
{
// ignore start input until all loading is done
//
return;
}
if( !m_pMenu->HasSelectionBeenMade() )
{
m_pMenu->MakeSelection();
}
break;
}
case GUI_MSG_MENU_SELECTION_MADE:
{
m_pParent->HandleMessage( GUI_MSG_SPLASH_SCREEN_DONE );
break;
}
default:
{
break;
}
}
// relay message to menu
//
if( m_pMenu != NULL )
{
m_pMenu->HandleMessage( message, param1, param2 );
}
}
// Propogate the message up the hierarchy.
//
CGuiScreen::HandleMessage( message, param1, param2 );
}
//===========================================================================
// CGuiScreenSplash::InitIntro
//===========================================================================
// Description:
//
// Constraints: None.
//
// Parameters: None.
//
// Return: N/A.
//
//===========================================================================
void CGuiScreenSplash::InitIntro()
{
}
//===========================================================================
// CGuiScreenSplash::InitRunning
//===========================================================================
// Description:
//
// Constraints: None.
//
// Parameters: None.
//
// Return: N/A.
//
//===========================================================================
void CGuiScreenSplash::InitRunning()
{
m_elapsedTime = 0;
}
//===========================================================================
// CGuiScreenSplash::InitOutro
//===========================================================================
// Description:
//
// Constraints: None.
//
// Parameters: None.
//
// Return: N/A.
//
//===========================================================================
void CGuiScreenSplash::InitOutro()
{
}
//---------------------------------------------------------------------
// Private Functions
//---------------------------------------------------------------------
void
CGuiScreenSplash::StartDemoInRuntime()
{
// Quit FE and start the demo in runtime.
//
m_pParent->HandleMessage( GUI_MSG_QUIT_FRONTEND, 0 ); // 0 = demo mode
}
void
CGuiScreenSplash::StartDemoAsMovie()
{
#ifndef RAD_WIN32
// Play demo movie.
//
rAssert( m_guiManager );
CGuiScreenPlayMovie* playMovieScreen = static_cast<CGuiScreenPlayMovie*>( m_guiManager->FindWindowByID( GUI_SCREEN_ID_PLAY_MOVIE_DEMO ) );
rAssert( playMovieScreen );
playMovieScreen->SetMovieToPlay( MovieNames::DEMO );
m_pParent->HandleMessage( GUI_MSG_GOTO_SCREEN,
GUI_SCREEN_ID_PLAY_MOVIE_DEMO );
#endif
}