2003-02-16 04:01:45 +00:00
|
|
|
#include "global.h"
|
2002-05-20 08:59:37 +00:00
|
|
|
/*
|
|
|
|
|
-----------------------------------------------------------------------------
|
2002-08-13 23:26:46 +00:00
|
|
|
Class: ScreenManager
|
2002-05-20 08:59:37 +00:00
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
Desc: See header.
|
2002-05-20 08:59:37 +00:00
|
|
|
|
2003-03-15 00:02:54 +00:00
|
|
|
Copyright (c) 2001-2003 by the person(s) listed below. All rights reserved.
|
2002-08-13 23:26:46 +00:00
|
|
|
Chris Danford
|
2003-02-19 23:53:19 +00:00
|
|
|
Tim Hentenaar
|
2003-03-15 00:02:54 +00:00
|
|
|
Glenn Maynard
|
2002-05-20 08:59:37 +00:00
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "ScreenManager.h"
|
|
|
|
|
#include "IniFile.h"
|
|
|
|
|
#include "GameConstantsAndTypes.h"
|
2002-07-23 01:41:40 +00:00
|
|
|
#include "PrefsManager.h"
|
2002-05-20 08:59:37 +00:00
|
|
|
#include "RageLog.h"
|
2002-08-13 23:26:46 +00:00
|
|
|
#include "GameState.h"
|
2002-08-27 03:59:22 +00:00
|
|
|
#include "RageException.h"
|
2002-10-24 07:11:21 +00:00
|
|
|
#include "RageTimer.h"
|
2002-11-11 04:53:31 +00:00
|
|
|
#include "ThemeManager.h"
|
2002-12-30 00:13:47 +00:00
|
|
|
#include "RageDisplay.h"
|
2003-02-22 01:58:56 +00:00
|
|
|
#include "Screen.h"
|
2003-03-03 10:03:02 +00:00
|
|
|
#include "SongManager.h"
|
2002-05-20 08:59:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
ScreenManager* SCREENMAN = NULL; // global and accessable from anywhere in our program
|
|
|
|
|
|
|
|
|
|
|
2002-09-23 07:35:47 +00:00
|
|
|
#define STATS_X THEME->GetMetricF("ScreenManager","StatsX")
|
|
|
|
|
#define STATS_Y THEME->GetMetricF("ScreenManager","StatsY")
|
|
|
|
|
#define CREDITS_X( p ) THEME->GetMetricF("ScreenManager",ssprintf("CreditsP%dX",p+1))
|
|
|
|
|
#define CREDITS_Y( p ) THEME->GetMetricF("ScreenManager",ssprintf("CreditsP%dY",p+1))
|
|
|
|
|
#define CREDITS_COLOR THEME->GetMetricC("ScreenManager","CreditsColor")
|
|
|
|
|
#define CREDITS_SHADOW_LENGTH THEME->GetMetricF("ScreenManager","CreditsShadowLength")
|
|
|
|
|
#define CREDITS_ZOOM THEME->GetMetricF("ScreenManager","CreditsZoom")
|
2002-08-13 23:26:46 +00:00
|
|
|
|
2003-03-15 00:02:54 +00:00
|
|
|
/* This screen is drawn on top of everything else, and receives updates,
|
|
|
|
|
* but not input. */
|
|
|
|
|
class ScreenSystemLayer: public Screen
|
|
|
|
|
{
|
|
|
|
|
BitmapText m_textStats;
|
|
|
|
|
BitmapText m_textSystemMessage;
|
|
|
|
|
BitmapText m_textCreditInfo[NUM_PLAYERS];
|
|
|
|
|
BitmapText m_textSysTime;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
ScreenSystemLayer();
|
|
|
|
|
void SystemMessage( CString sMessage );
|
|
|
|
|
void RefreshCreditsMessages();
|
|
|
|
|
void Update( float fDeltaTime );
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ScreenSystemLayer::ScreenSystemLayer()
|
2002-05-20 08:59:37 +00:00
|
|
|
{
|
2002-08-13 23:26:46 +00:00
|
|
|
m_textSystemMessage.LoadFromFont( THEME->GetPathTo("Fonts","normal") );
|
2002-05-20 08:59:37 +00:00
|
|
|
m_textSystemMessage.SetHorizAlign( Actor::align_left );
|
2002-08-23 20:18:29 +00:00
|
|
|
m_textSystemMessage.SetVertAlign( Actor::align_top );
|
|
|
|
|
m_textSystemMessage.SetXY( 4.0f, 4.0f );
|
2003-03-09 00:55:49 +00:00
|
|
|
m_textSystemMessage.SetZoom( 0.8f );
|
|
|
|
|
m_textSystemMessage.SetShadowLength( 2 );
|
2002-10-28 05:30:45 +00:00
|
|
|
m_textSystemMessage.SetDiffuse( RageColor(1,1,1,0) );
|
2003-03-15 00:02:54 +00:00
|
|
|
this->AddChild(&m_textSystemMessage);
|
|
|
|
|
|
|
|
|
|
m_textStats.LoadFromFont( THEME->GetPathTo("Fonts","normal") );
|
|
|
|
|
m_textStats.SetXY( STATS_X, STATS_Y );
|
|
|
|
|
m_textStats.SetHorizAlign( Actor::align_right );
|
|
|
|
|
m_textStats.SetVertAlign( Actor::align_top );
|
|
|
|
|
m_textStats.SetZoom( 0.5f );
|
|
|
|
|
m_textStats.SetShadowLength( 2 );
|
|
|
|
|
this->AddChild(&m_textStats);
|
2003-03-07 04:48:13 +00:00
|
|
|
|
|
|
|
|
m_textSysTime.LoadFromFont( THEME->GetPathTo("Fonts","normal") );
|
|
|
|
|
m_textSysTime.SetXY( 4.0f, 40.0f );
|
|
|
|
|
m_textSysTime.SetHorizAlign( Actor::align_left );
|
|
|
|
|
m_textSysTime.SetVertAlign( Actor::align_top );
|
|
|
|
|
m_textSysTime.SetZoom( 0.5f );
|
|
|
|
|
m_textSysTime.SetDiffuse( RageColor(1,0,1,1) );
|
|
|
|
|
m_textSysTime.EnableShadow(false);
|
2003-03-15 00:02:54 +00:00
|
|
|
this->AddChild(&m_textSysTime);
|
|
|
|
|
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
|
|
|
|
m_textCreditInfo[p].LoadFromFont( THEME->GetPathTo("Fonts","credits") );
|
|
|
|
|
m_textCreditInfo[p].SetXY( CREDITS_X(p), CREDITS_Y(p) );
|
|
|
|
|
m_textCreditInfo[p].SetZoom( CREDITS_ZOOM );
|
|
|
|
|
m_textCreditInfo[p].SetDiffuse( CREDITS_COLOR );
|
|
|
|
|
m_textCreditInfo[p].SetShadowLength( CREDITS_SHADOW_LENGTH );
|
|
|
|
|
this->AddChild(&m_textCreditInfo[p]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenSystemLayer::SystemMessage( CString sMessage )
|
|
|
|
|
{
|
|
|
|
|
m_textSystemMessage.StopTweening();
|
|
|
|
|
m_textSystemMessage.SetText( sMessage );
|
|
|
|
|
m_textSystemMessage.SetDiffuse( RageColor(1,1,1,1) );
|
|
|
|
|
m_textSystemMessage.SetX( -640 );
|
|
|
|
|
m_textSystemMessage.BeginTweening( 0.3f );
|
|
|
|
|
m_textSystemMessage.SetX( 4 );
|
|
|
|
|
m_textSystemMessage.BeginTweening( 5 );
|
|
|
|
|
m_textSystemMessage.BeginTweening( 0.3f );
|
|
|
|
|
m_textSystemMessage.SetDiffuse( RageColor(1,1,1,0) );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenSystemLayer::RefreshCreditsMessages()
|
|
|
|
|
{
|
|
|
|
|
// update joined
|
|
|
|
|
for( int p=0; p<NUM_PLAYERS; p++ )
|
|
|
|
|
{
|
|
|
|
|
switch( PREFSMAN->m_CoinMode )
|
|
|
|
|
{
|
|
|
|
|
case PrefsManager::COIN_HOME:
|
|
|
|
|
if( GAMESTATE->m_bSideIsJoined[p] )
|
|
|
|
|
m_textCreditInfo[p].SetText( "" );
|
|
|
|
|
else if( GAMESTATE->m_bPlayersCanJoin ) // would (GAMESTATE->m_CurStyle!=STYLE_INVALID) do the same thing?
|
|
|
|
|
m_textCreditInfo[p].SetText( "PRESS START" );
|
|
|
|
|
else
|
|
|
|
|
m_textCreditInfo[p].SetText( "NOT PRESENT" );
|
|
|
|
|
break;
|
|
|
|
|
case PrefsManager::COIN_PAY:
|
|
|
|
|
{
|
|
|
|
|
int Coins = GAMESTATE->m_iCoins % PREFSMAN->m_iCoinsPerCredit;
|
|
|
|
|
CString txt = ssprintf("CREDIT(S) %d", GAMESTATE->m_iCoins / PREFSMAN->m_iCoinsPerCredit);
|
|
|
|
|
if (Coins)
|
|
|
|
|
txt += ssprintf(" %d/%d", Coins, PREFSMAN->m_iCoinsPerCredit );
|
|
|
|
|
m_textCreditInfo[p].SetText(txt);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case PrefsManager::COIN_FREE:
|
|
|
|
|
m_textCreditInfo[p].SetText( "FREE PLAY" );
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
ASSERT(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenSystemLayer::Update( float fDeltaTime )
|
|
|
|
|
{
|
|
|
|
|
Screen::Update(fDeltaTime);
|
|
|
|
|
|
|
|
|
|
if( PREFSMAN && PREFSMAN->m_bShowStats )
|
|
|
|
|
{
|
|
|
|
|
m_textStats.SetDiffuse( RageColor(1,1,1,1) );
|
|
|
|
|
|
|
|
|
|
/* If FPS == 0, we don't have stats yet. */
|
|
|
|
|
if(DISPLAY->GetFPS())
|
|
|
|
|
m_textStats.SetText( ssprintf(
|
|
|
|
|
"%i FPS\n%i av FPS\n%i VPF",
|
|
|
|
|
DISPLAY->GetFPS(), DISPLAY->GetCumFPS(),
|
|
|
|
|
DISPLAY->GetVPF()) );
|
|
|
|
|
else
|
|
|
|
|
m_textStats.SetText( "-- FPS\n-- av FPS\n-- VPF" );
|
|
|
|
|
} else
|
|
|
|
|
m_textStats.SetDiffuse( RageColor(1,1,1,0) ); /* hide */
|
|
|
|
|
|
|
|
|
|
if(PREFSMAN->m_bTimestamping)
|
|
|
|
|
{
|
|
|
|
|
m_textSysTime.SetText( SecondsToTime(RageTimer::GetTimeSinceStart()) );
|
|
|
|
|
m_textSysTime.SetDiffuse( RageColor(1,1,1,1) );
|
|
|
|
|
} else
|
|
|
|
|
m_textSysTime.SetDiffuse( RageColor(1,1,1,0) ); /* hide */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ScreenManager::ScreenManager()
|
|
|
|
|
{
|
|
|
|
|
m_SystemLayer = new ScreenSystemLayer;
|
|
|
|
|
|
|
|
|
|
m_ScreenBuffered = NULL;
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ScreenManager::~ScreenManager()
|
|
|
|
|
{
|
2002-07-31 19:40:40 +00:00
|
|
|
LOG->Trace( "ScreenManager::~ScreenManager()" );
|
2002-05-20 08:59:37 +00:00
|
|
|
|
2002-08-23 06:50:48 +00:00
|
|
|
EmptyDeleteQueue();
|
|
|
|
|
|
2003-03-09 00:55:49 +00:00
|
|
|
// delete current Screens
|
2002-10-31 02:20:11 +00:00
|
|
|
for( unsigned i=0; i<m_ScreenStack.size(); i++ )
|
2003-03-15 00:02:54 +00:00
|
|
|
delete m_ScreenStack[i];
|
|
|
|
|
delete m_ScreenBuffered;
|
|
|
|
|
delete m_SystemLayer;
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
2002-08-23 06:50:48 +00:00
|
|
|
void ScreenManager::EmptyDeleteQueue()
|
|
|
|
|
{
|
|
|
|
|
// delete all ScreensToDelete
|
2002-10-31 02:20:11 +00:00
|
|
|
for( unsigned i=0; i<m_ScreensToDelete.size(); i++ )
|
2002-08-23 06:50:48 +00:00
|
|
|
SAFE_DELETE( m_ScreensToDelete[i] );
|
2002-05-20 08:59:37 +00:00
|
|
|
|
2002-10-24 20:15:24 +00:00
|
|
|
m_ScreensToDelete.clear();
|
2002-08-23 06:50:48 +00:00
|
|
|
}
|
2002-05-20 08:59:37 +00:00
|
|
|
|
|
|
|
|
void ScreenManager::Update( float fDeltaTime )
|
|
|
|
|
{
|
2002-08-23 06:50:48 +00:00
|
|
|
EmptyDeleteQueue();
|
2002-05-20 08:59:37 +00:00
|
|
|
|
2003-01-19 21:51:46 +00:00
|
|
|
// Only update the topmost screen on the stack.
|
|
|
|
|
|
|
|
|
|
/* Screens take some time to load. If we don't do this, then screens
|
|
|
|
|
* receive an initial update that includes all of the time they spent
|
|
|
|
|
* loading, which will chop off their tweens.
|
|
|
|
|
*
|
|
|
|
|
* We don't want to simply cap update times; for example, the stage
|
|
|
|
|
* screen sets a 4 second timer, preps the gameplay screen, and then
|
|
|
|
|
* displays the prepped screen after the timer runs out; this lets the
|
|
|
|
|
* load time be masked (as long as the load takes less than 4 seconds).
|
|
|
|
|
* If we cap that large update delta from the screen load, the update
|
|
|
|
|
* to load the new screen will come after 4 seconds plus the load time.
|
|
|
|
|
*
|
|
|
|
|
* So, let's just drop the first update for every screen.
|
|
|
|
|
*/
|
2003-03-09 00:55:49 +00:00
|
|
|
ASSERT( !m_ScreenStack.empty() ); // Why play the game if there is nothing showing?
|
2003-01-19 21:51:46 +00:00
|
|
|
Screen* pScreen = m_ScreenStack[m_ScreenStack.size()-1];
|
|
|
|
|
if( pScreen->IsFirstUpdate() )
|
|
|
|
|
pScreen->Update( 0 );
|
|
|
|
|
else
|
|
|
|
|
pScreen->Update( fDeltaTime );
|
2003-03-15 00:02:54 +00:00
|
|
|
|
|
|
|
|
m_SystemLayer->Update( fDeltaTime );
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ScreenManager::Restore()
|
|
|
|
|
{
|
2003-02-20 21:22:18 +00:00
|
|
|
// Restore all CurrentScreens (back to front)
|
2002-10-31 02:20:11 +00:00
|
|
|
for( unsigned i=0; i<m_ScreenStack.size(); i++ )
|
2002-05-20 08:59:37 +00:00
|
|
|
m_ScreenStack[i]->Restore();
|
2003-03-15 00:02:54 +00:00
|
|
|
m_SystemLayer->Restore();
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenManager::Invalidate()
|
|
|
|
|
{
|
2002-10-31 02:20:11 +00:00
|
|
|
for( unsigned i=0; i<m_ScreenStack.size(); i++ )
|
2002-05-20 08:59:37 +00:00
|
|
|
m_ScreenStack[i]->Invalidate();
|
2003-03-15 00:02:54 +00:00
|
|
|
m_SystemLayer->Invalidate();
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenManager::Draw()
|
|
|
|
|
{
|
2003-02-20 21:22:18 +00:00
|
|
|
if( !m_ScreenStack.empty() && !m_ScreenStack.back()->IsTransparent() ) // top screen isn't transparent
|
|
|
|
|
m_ScreenStack.back()->Draw();
|
|
|
|
|
else
|
|
|
|
|
for( unsigned i=0; i<m_ScreenStack.size(); i++ ) // Draw all screens bottom to top
|
|
|
|
|
m_ScreenStack[i]->Draw();
|
2003-03-15 00:02:54 +00:00
|
|
|
m_SystemLayer->Draw();
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ScreenManager::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )
|
|
|
|
|
{
|
2002-09-06 00:31:25 +00:00
|
|
|
// LOG->Trace( "ScreenManager::Input( %d-%d, %d-%d, %d-%d, %d-%d )",
|
|
|
|
|
// DeviceI.device, DeviceI.button, GameI.controller, GameI.button, MenuI.player, MenuI.button, StyleI.player, StyleI.col );
|
2002-05-20 08:59:37 +00:00
|
|
|
|
|
|
|
|
// pass input only to topmost state
|
2002-10-31 02:20:11 +00:00
|
|
|
if( !m_ScreenStack.empty() )
|
|
|
|
|
m_ScreenStack.back()->Input( DeviceI, type, GameI, MenuI, StyleI );
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
2002-08-27 03:59:22 +00:00
|
|
|
|
2002-09-03 05:43:58 +00:00
|
|
|
Screen* ScreenManager::MakeNewScreen( CString sClassName )
|
|
|
|
|
{
|
2003-03-03 10:03:02 +00:00
|
|
|
Screen *ret = Screen::Create( sClassName );
|
2002-12-21 07:54:24 +00:00
|
|
|
|
2002-12-29 23:37:41 +00:00
|
|
|
/* Loading probably took a little while. Let's reset stats. This prevents us
|
2002-12-21 07:54:24 +00:00
|
|
|
* from displaying an unnaturally low FPS value, and the next FPS value we
|
|
|
|
|
* display will be accurate, which makes skips in the initial tween-ins more
|
|
|
|
|
* apparent. */
|
|
|
|
|
DISPLAY->ResetStats();
|
|
|
|
|
|
2002-12-21 18:23:37 +00:00
|
|
|
/* This is a convenient time to clean up our song cache. */
|
2003-01-27 23:10:44 +00:00
|
|
|
SONGMAN->CleanData();
|
2002-12-21 18:23:37 +00:00
|
|
|
|
2002-12-21 07:54:24 +00:00
|
|
|
return ret;
|
2002-09-03 05:43:58 +00:00
|
|
|
}
|
|
|
|
|
|
2002-09-04 00:25:30 +00:00
|
|
|
void ScreenManager::PrepNewScreen( CString sClassName )
|
|
|
|
|
{
|
2002-09-04 23:40:01 +00:00
|
|
|
ASSERT(m_ScreenBuffered == NULL);
|
|
|
|
|
m_ScreenBuffered = MakeNewScreen(sClassName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenManager::LoadPreppedScreen()
|
|
|
|
|
{
|
|
|
|
|
ASSERT( m_ScreenBuffered != NULL);
|
|
|
|
|
SetNewScreen( m_ScreenBuffered );
|
2003-03-12 01:26:44 +00:00
|
|
|
|
|
|
|
|
// Need to update the new screen once, or else it will be
|
|
|
|
|
// drawn before ever being Update()d.
|
|
|
|
|
Update( 0 );
|
|
|
|
|
|
2002-09-04 23:40:01 +00:00
|
|
|
m_ScreenBuffered = NULL;
|
2002-09-04 00:25:30 +00:00
|
|
|
}
|
|
|
|
|
|
2003-03-10 02:29:01 +00:00
|
|
|
void ScreenManager::DeletePreppedScreen()
|
|
|
|
|
{
|
|
|
|
|
SAFE_DELETE( m_ScreenBuffered );
|
|
|
|
|
}
|
|
|
|
|
|
2002-09-04 00:25:30 +00:00
|
|
|
void ScreenManager::SetNewScreen( Screen *pNewScreen )
|
|
|
|
|
{
|
|
|
|
|
RefreshCreditsMessages();
|
2002-09-23 07:35:47 +00:00
|
|
|
|
2002-10-24 19:55:09 +00:00
|
|
|
// move current screen(s) to ScreenToDelete
|
|
|
|
|
m_ScreensToDelete.insert(m_ScreensToDelete.end(), m_ScreenStack.begin(), m_ScreenStack.end());
|
2002-09-04 00:25:30 +00:00
|
|
|
|
2002-10-24 20:15:24 +00:00
|
|
|
m_ScreenStack.clear();
|
2002-10-31 04:23:39 +00:00
|
|
|
m_ScreenStack.push_back( pNewScreen );
|
2002-09-04 00:25:30 +00:00
|
|
|
}
|
|
|
|
|
|
2002-08-27 03:59:22 +00:00
|
|
|
void ScreenManager::SetNewScreen( CString sClassName )
|
2002-05-20 08:59:37 +00:00
|
|
|
{
|
2002-09-04 00:25:30 +00:00
|
|
|
/* If we prepped a screen but didn't use it, nuke it. */
|
|
|
|
|
SAFE_DELETE( m_ScreenBuffered );
|
2002-09-03 05:43:58 +00:00
|
|
|
|
2002-10-24 07:11:21 +00:00
|
|
|
RageTimer t;
|
|
|
|
|
|
2003-03-09 00:55:49 +00:00
|
|
|
Screen* pOldTopScreen = m_ScreenStack.empty() ? NULL : m_ScreenStack.back();
|
|
|
|
|
|
2002-08-27 03:59:22 +00:00
|
|
|
// It makes sense that ScreenManager should allocate memory for a new screen since it
|
|
|
|
|
// deletes it later on. This also convention will reduce includes because screens won't
|
|
|
|
|
// have to include each other's headers of other screens.
|
2002-09-03 05:43:58 +00:00
|
|
|
Screen* pNewScreen = MakeNewScreen(sClassName);
|
2002-10-29 07:58:44 +00:00
|
|
|
LOG->Trace( "Loaded %s in %f", sClassName.GetString(), t.GetDeltaTime());
|
2002-10-24 07:11:21 +00:00
|
|
|
|
2003-03-09 00:55:49 +00:00
|
|
|
if( pOldTopScreen!=NULL && m_ScreenStack.back()!=pOldTopScreen )
|
|
|
|
|
{
|
|
|
|
|
// While constructing this Screen, it's constructor called
|
|
|
|
|
// SetNewScreen again! That SetNewScreen Command should
|
|
|
|
|
// override this older one.
|
|
|
|
|
SAFE_DELETE( pNewScreen );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2002-09-04 00:25:30 +00:00
|
|
|
SetNewScreen( pNewScreen );
|
2003-02-12 06:25:51 +00:00
|
|
|
|
2003-02-12 11:43:08 +00:00
|
|
|
/* If this is a system menu, don't let the operator key touch it!
|
|
|
|
|
However, if you add an options screen, please include it here -- Miryokuteki */
|
2003-02-12 06:25:51 +00:00
|
|
|
if( sClassName == "ScreenOptionsMenu" || sClassName == "ScreenMachineOptions" ||
|
|
|
|
|
sClassName == "ScreenOptions" || sClassName == "ScreenInputOptions" ||
|
|
|
|
|
sClassName == "ScreenGraphicOptions" || sClassName == "ScreenGameplayOptions" ||
|
|
|
|
|
sClassName == "ScreenMapControllers" || sClassName == "ScreenPlayerOptions" ||
|
|
|
|
|
sClassName == "ScreenAppearanceOptions" || sClassName == "ScreenEdit" ||
|
2003-03-09 00:55:49 +00:00
|
|
|
sClassName == "ScreenEditMenu" || sClassName == "ScreenSoundOptions")
|
|
|
|
|
GAMESTATE->m_bIsOnSystemMenu = true;
|
|
|
|
|
else
|
|
|
|
|
GAMESTATE->m_bIsOnSystemMenu = false;
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
2003-02-19 05:46:09 +00:00
|
|
|
void ScreenManager::AddNewScreenToTop( CString sClassName )
|
|
|
|
|
{
|
|
|
|
|
Screen* pNewScreen = MakeNewScreen(sClassName);
|
|
|
|
|
m_ScreenStack.push_back( pNewScreen );
|
|
|
|
|
}
|
|
|
|
|
|
2003-03-03 10:03:02 +00:00
|
|
|
#include "ScreenPrompt.h"
|
|
|
|
|
#include "ScreenTextEntry.h"
|
|
|
|
|
#include "ScreenMiniMenu.h"
|
|
|
|
|
|
2002-08-27 03:59:22 +00:00
|
|
|
void ScreenManager::Prompt( ScreenMessage SM_SendWhenDone, CString sText, bool bYesNo, bool bDefaultAnswer, void(*OnYes)(), void(*OnNo)() )
|
2002-05-20 08:59:37 +00:00
|
|
|
{
|
2002-08-27 03:59:22 +00:00
|
|
|
// add the new state onto the back of the array
|
2002-10-31 04:23:39 +00:00
|
|
|
m_ScreenStack.push_back( new ScreenPrompt(SM_SendWhenDone, sText, bYesNo, bDefaultAnswer, OnYes, OnNo) );
|
2002-08-27 03:59:22 +00:00
|
|
|
}
|
2002-05-20 08:59:37 +00:00
|
|
|
|
2002-08-27 03:59:22 +00:00
|
|
|
void ScreenManager::TextEntry( ScreenMessage SM_SendWhenDone, CString sQuestion, CString sInitialAnswer, void(*OnOK)(CString sAnswer), void(*OnCanel)() )
|
|
|
|
|
{
|
2002-05-20 08:59:37 +00:00
|
|
|
// add the new state onto the back of the array
|
2002-10-31 04:23:39 +00:00
|
|
|
m_ScreenStack.push_back( new ScreenTextEntry(SM_SendWhenDone, sQuestion, sInitialAnswer, OnOK, OnCanel) );
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
2003-02-18 23:15:38 +00:00
|
|
|
void ScreenManager::MiniMenu( MiniMenuDefinition* pDef, ScreenMessage SM_SendOnOK, ScreenMessage SM_SendOnCancel )
|
|
|
|
|
{
|
|
|
|
|
// add the new state onto the back of the array
|
|
|
|
|
m_ScreenStack.push_back( new ScreenMiniMenu(pDef, SM_SendOnOK, SM_SendOnCancel) );
|
|
|
|
|
}
|
|
|
|
|
|
2002-07-27 19:29:51 +00:00
|
|
|
void ScreenManager::PopTopScreen( ScreenMessage SM )
|
2002-05-20 08:59:37 +00:00
|
|
|
{
|
2002-10-31 02:20:11 +00:00
|
|
|
Screen* pScreenToPop = m_ScreenStack.back(); // top menu
|
2002-05-20 08:59:37 +00:00
|
|
|
//pScreenToPop->HandleScreenMessage( SM_LosingInputFocus );
|
2002-10-31 04:11:08 +00:00
|
|
|
m_ScreenStack.erase(m_ScreenStack.end()-1, m_ScreenStack.end());
|
2002-10-31 04:23:39 +00:00
|
|
|
m_ScreensToDelete.push_back( pScreenToPop );
|
2002-05-20 08:59:37 +00:00
|
|
|
|
2002-10-31 02:20:11 +00:00
|
|
|
Screen* pNewTopScreen = m_ScreenStack[m_ScreenStack.size()-1];
|
2002-07-27 19:29:51 +00:00
|
|
|
pNewTopScreen->HandleScreenMessage( SM );
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScreenManager::SendMessageToTopScreen( ScreenMessage SM, float fDelay )
|
|
|
|
|
{
|
2002-10-31 02:20:11 +00:00
|
|
|
Screen* pTopScreen = m_ScreenStack.back();
|
2002-05-20 08:59:37 +00:00
|
|
|
pTopScreen->SendScreenMessage( SM, fDelay );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ScreenManager::SystemMessage( CString sMessage )
|
|
|
|
|
{
|
2003-03-15 00:02:54 +00:00
|
|
|
m_SystemLayer->SystemMessage( sMessage );
|
2002-05-20 08:59:37 +00:00
|
|
|
}
|
|
|
|
|
|
2002-08-13 23:26:46 +00:00
|
|
|
void ScreenManager::RefreshCreditsMessages()
|
|
|
|
|
{
|
2003-03-15 00:02:54 +00:00
|
|
|
m_SystemLayer->RefreshCreditsMessages();
|
2003-02-12 07:52:20 +00:00
|
|
|
}
|
|
|
|
|
|