clean up memory card logic

This commit is contained in:
Chris Danford
2004-01-03 03:42:40 +00:00
parent 0cc7d74e3e
commit 97146abaaf
13 changed files with 228 additions and 343 deletions
+128 -126
View File
@@ -31,34 +31,31 @@
#include "RageTextureManager.h"
#include "ProfileManager.h"
#include "ThemeManager.h"
#include "MemoryCardManager.h"
ScreenManager* SCREENMAN = NULL; // global and accessable from anywhere in our program
#define STATS_X THEME->GetMetricF("ScreenSystemLayer","StatsX")
#define STATS_Y THEME->GetMetricF("ScreenSystemLayer","StatsY")
#define PLAYER_INFO_PRESS_START THEME->GetMetric ("ScreenSystemLayer","PlayerInfoPressStart")
#define PLAYER_INFO_INSERT_CARD THEME->GetMetric ("ScreenSystemLayer","PlayerInfoInsertCard")
#define PLAYER_INFO_NO_CARD THEME->GetMetric ("ScreenSystemLayer","PlayerInfoNoCard")
#define PLAYER_INFO_NOT_PRESENT THEME->GetMetric ("ScreenSystemLayer","PlayerInfoNotPresent")
#define PLAYER_INFO_INSERT_MORE THEME->GetMetric ("ScreenSystemLayer","PlayerInfoInsertMore")
#define CREDITS_TEXT_HOME THEME->GetMetric ("ScreenSystemLayer","CreditsTextHome")
#define CREDITS_TEXT_FREE_PLAY THEME->GetMetric ("ScreenSystemLayer","CreditsTextFreePlay")
#define CREDITS_TEXT_CREDITS THEME->GetMetric ("ScreenSystemLayer","CreditsTextCredits")
#define CREDITS_JOIN_ONLY THEME->GetMetric ("ScreenSystemLayer","CreditsJoinOnly")
#define CREDITS_PRESS_START THEME->GetMetric ("ScreenSystemLayer","CreditsPressStart")
#define CREDITS_INSERT_CARD THEME->GetMetric ("ScreenSystemLayer","CreditsInsertCard")
#define CREDITS_CARD_ERROR THEME->GetMetric ("ScreenSystemLayer","CreditsCardError")
#define CREDITS_CARD_TOO_LATE THEME->GetMetric ("ScreenSystemLayer","CreditsCardTooLate")
#define CREDITS_TEXT_HOME THEME->GetMetric ("ScreenSystemLayer","CreditsTextHome")
#define CREDITS_TEXT_FREE_PLAY THEME->GetMetric ("ScreenSystemLayer","CreditsTextFreePlay")
#define CREDITS_TEXT_CREDITS THEME->GetMetric ("ScreenSystemLayer","CreditsTextCredits")
#define CREDITS_JOIN_ONLY THEME->GetMetricB("ScreenSystemLayer","CreditsJoinOnly")
const int NUM_SKIPS = 5;
const int NUM_SKIPS_TO_SHOW = 5;
/* 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_textPlayerInfo[NUM_PLAYERS];
BitmapText m_textCredits;
BitmapText m_textSysTime;
BitmapText m_Skips[NUM_SKIPS];
BitmapText m_textMessage;
BitmapText m_textCredits[NUM_PLAYERS];
BitmapText m_textTime;
BitmapText m_textSkips[NUM_SKIPS_TO_SHOW];
int m_LastSkip;
Quad m_SkipBackground;
@@ -75,38 +72,29 @@ public:
ScreenSystemLayer::ScreenSystemLayer() : Screen("ScreenSystemLayer")
{
m_textSystemMessage.LoadFromFont( THEME->GetPathToF("Common normal") );
m_textSystemMessage.SetHorizAlign( Actor::align_left );
m_textSystemMessage.SetVertAlign( Actor::align_top );
m_textSystemMessage.SetXY( 4.0f, 4.0f );
m_textSystemMessage.SetZoom( 0.8f );
m_textSystemMessage.SetShadowLength( 2 );
m_textSystemMessage.SetDiffuse( RageColor(1,1,1,0) );
this->AddChild(&m_textSystemMessage);
m_textMessage.LoadFromFont( THEME->GetPathToF("ScreenSystemLayer message") );
m_textMessage.SetName( "Message" );
SET_XY_AND_ON_COMMAND( m_textMessage );
this->AddChild(&m_textMessage);
m_textStats.LoadFromFont( THEME->GetPathToF("Common 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 );
m_textStats.LoadFromFont( THEME->GetPathToF("ScreenSystemLayer stats") );
m_textStats.SetName( "Stats" );
SET_XY_AND_ON_COMMAND( m_textStats );
this->AddChild(&m_textStats);
m_textSysTime.LoadFromFont( THEME->GetPathToF("Common 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);
this->AddChild(&m_textSysTime);
m_textTime.LoadFromFont( THEME->GetPathToF("ScreenSystemLayer time") );
m_textTime.SetName( "Time" );
SET_XY_AND_ON_COMMAND( m_textTime );
this->AddChild(&m_textTime);
for( int p=0; p<NUM_PLAYERS; p++ )
{
this->AddChild(&m_textPlayerInfo[p]);
m_textCredits[p].LoadFromFont( THEME->GetPathToF("ScreenManager credits") );
m_textCredits[p].SetName( ssprintf("CreditsP%d",p+1) );
SET_XY_AND_ON_COMMAND( &m_textCredits[p] );
this->AddChild(&m_textCredits[p]);
}
this->AddChild(&m_textCredits);
/* "Was that a skip?" This displays a message when an update takes
* abnormally long, to quantify skips more precisely, verify them
@@ -118,124 +106,138 @@ ScreenSystemLayer::ScreenSystemLayer() : Screen("ScreenSystemLayer")
SKIP_WIDTH = 160.0f, SKIP_Y_DIST = 16.0f;
m_SkipBackground.StretchTo(RectF(SKIP_LEFT-8, SKIP_TOP-8,
SKIP_LEFT+SKIP_WIDTH, SKIP_TOP+SKIP_Y_DIST*NUM_SKIPS));
SKIP_LEFT+SKIP_WIDTH, SKIP_TOP+SKIP_Y_DIST*NUM_SKIPS_TO_SHOW));
m_SkipBackground.SetDiffuse( RageColor(0,0,0,0) );
this->AddChild(&m_SkipBackground);
for( int i=0; i<NUM_SKIPS; i++ )
for( int i=0; i<NUM_SKIPS_TO_SHOW; i++ )
{
/* This is somewhat big. Let's put it on the right side, where it'll
* obscure the 2P side during gameplay; there's nowhere to put it that
* doesn't obscure something, and it's just a diagnostic. */
m_Skips[i].LoadFromFont( THEME->GetPathToF("Common normal") );
m_Skips[i].SetXY( SKIP_LEFT, SKIP_TOP + SKIP_Y_DIST*i );
m_Skips[i].SetHorizAlign( Actor::align_left );
m_Skips[i].SetVertAlign( Actor::align_top );
m_Skips[i].SetZoom( 0.5f );
m_Skips[i].SetDiffuse( RageColor(1,1,1,0) );
m_Skips[i].EnableShadow(false);
this->AddChild(&m_Skips[i]);
m_textSkips[i].LoadFromFont( THEME->GetPathToF("Common normal") );
m_textSkips[i].SetXY( SKIP_LEFT, SKIP_TOP + SKIP_Y_DIST*i );
m_textSkips[i].SetHorizAlign( Actor::align_left );
m_textSkips[i].SetVertAlign( Actor::align_top );
m_textSkips[i].SetZoom( 0.5f );
m_textSkips[i].SetDiffuse( RageColor(1,1,1,0) );
m_textSkips[i].EnableShadow(false);
this->AddChild(&m_textSkips[i]);
}
RefreshCreditsMessages();
}
void ScreenSystemLayer::SystemMessage( CString sMessage )
{
m_textSystemMessage.FinishTweening();
m_textSystemMessage.SetText( sMessage );
m_textSystemMessage.SetDiffuseAlpha( 1 );
m_textSystemMessage.SetX( -640 );
m_textSystemMessage.BeginTweening( 0.5f );
m_textSystemMessage.SetX( 4 );
m_textSystemMessage.BeginTweening( 5 );
m_textSystemMessage.BeginTweening( 0.5f );
m_textSystemMessage.SetDiffuse( RageColor(1,1,1,0) );
m_textMessage.FinishTweening();
m_textMessage.SetText( sMessage );
m_textMessage.SetDiffuseAlpha( 1 );
m_textMessage.SetX( -640 );
m_textMessage.BeginTweening( 0.5f );
m_textMessage.SetX( 4 );
m_textMessage.BeginTweening( 5 );
m_textMessage.BeginTweening( 0.5f );
m_textMessage.SetDiffuse( RageColor(1,1,1,0) );
}
void ScreenSystemLayer::SystemMessageNoAnimate( CString sMessage )
{
m_textSystemMessage.FinishTweening();
m_textSystemMessage.SetText( sMessage );
m_textSystemMessage.SetX( 4 );
m_textSystemMessage.SetDiffuseAlpha( 1 );
m_textSystemMessage.BeginTweening( 5 );
m_textSystemMessage.BeginTweening( 0.5f );
m_textSystemMessage.SetDiffuse( RageColor(1,1,1,0) );
m_textMessage.FinishTweening();
m_textMessage.SetText( sMessage );
m_textMessage.SetX( 4 );
m_textMessage.SetDiffuseAlpha( 1 );
m_textMessage.BeginTweening( 5 );
m_textMessage.BeginTweening( 0.5f );
m_textMessage.SetDiffuse( RageColor(1,1,1,0) );
}
void ScreenSystemLayer::RefreshCreditsMessages()
{
m_textCredits.LoadFromFont( THEME->GetPathToF("ScreenManager credits") );
m_textCredits.SetName( "Credits" );
SET_XY_AND_ON_COMMAND( &m_textCredits );
CString sCredits;
switch( PREFSMAN->m_iCoinMode )
{
case COIN_HOME:
sCredits = CREDITS_TEXT_HOME;
break;
case COIN_PAY:
{
int Coins = GAMESTATE->m_iCoins % PREFSMAN->m_iCoinsPerCredit;
sCredits = ssprintf("%s %d", CREDITS_TEXT_CREDITS.c_str(), GAMESTATE->m_iCoins / PREFSMAN->m_iCoinsPerCredit);
if (Coins)
sCredits += ssprintf(" %d/%d", Coins, PREFSMAN->m_iCoinsPerCredit );
}
break;
case COIN_FREE:
sCredits = CREDITS_TEXT_FREE_PLAY;
break;
default:
ASSERT(0);
}
if( CREDITS_JOIN_ONLY && !GAMESTATE->PlayersCanJoin() )
sCredits = "";
m_textCredits.SetText( sCredits );
// update joined
for( int p=0; p<NUM_PLAYERS; p++ )
{
m_textPlayerInfo[p].LoadFromFont( THEME->GetPathToF("ScreenManager credits") );
m_textPlayerInfo[p].SetName( ssprintf("PlayerInfoP%d",p+1 ) );
SET_XY_AND_ON_COMMAND( &m_textPlayerInfo[p] );
CString sCredits;
CString sPlayerInfo;
if( GAMESTATE->m_bSideIsJoined[p] )
if( GAMESTATE->m_bIsOnSystemMenu ) // no mem card
{
sCredits = "";
}
else if( GAMESTATE->m_bSideIsJoined[p] )
{
MemoryCardState mcs = MEMCARDMAN->GetCardState( (PlayerNumber)p );
Profile* pProfile = PROFILEMAN->GetProfile( (PlayerNumber)p );
if( pProfile )
{
if( !pProfile->m_sLastUsedHighScoreName.empty() )
sPlayerInfo = pProfile->m_sLastUsedHighScoreName;
sCredits = pProfile->m_sLastUsedHighScoreName;
else
sPlayerInfo = pProfile->m_sName;
sCredits = pProfile->m_sName;
}
else if( GAMESTATE->m_bIsOnSystemMenu ) // no mem card
sPlayerInfo = "";
else
{
if( GAMESTATE->PlayersCanJoin() )
sPlayerInfo = PLAYER_INFO_INSERT_CARD;
else
sPlayerInfo = PLAYER_INFO_NO_CARD;
switch( mcs )
{
case MEMORY_CARD_STATE_NO_CARD:
if( GAMESTATE->PlayersCanJoin() )
sCredits = CREDITS_INSERT_CARD;
else
sCredits = "";
break;
case MEMORY_CARD_STATE_WRITE_ERROR:
sCredits = CREDITS_CARD_ERROR;
break;
case MEMORY_CARD_STATE_TOO_LATE:
sCredits = CREDITS_CARD_TOO_LATE;
break;
case MEMORY_CARD_STATE_READY:
sCredits = "";
break;
default:
ASSERT(0);
}
}
}
else if( GAMESTATE->PlayersCanJoin() )
{
sCredits = CREDITS_PRESS_START;
if( PREFSMAN->m_iCoinMode==COIN_PAY &&
PREFSMAN->m_Premium!=PrefsManager::JOINT_PREMIUM &&
GAMESTATE->m_iCoins<PREFSMAN->m_iCoinsPerCredit )
sPlayerInfo = PLAYER_INFO_INSERT_MORE;
else
sPlayerInfo = PLAYER_INFO_PRESS_START;
{
int Coins = GAMESTATE->m_iCoins % PREFSMAN->m_iCoinsPerCredit;
sCredits = ssprintf("%s %d", CREDITS_TEXT_CREDITS.c_str(), GAMESTATE->m_iCoins / PREFSMAN->m_iCoinsPerCredit);
if (Coins)
sCredits += ssprintf(" %d/%d", Coins, PREFSMAN->m_iCoinsPerCredit );
}
}
else
{
sPlayerInfo = PLAYER_INFO_NOT_PRESENT;
switch( PREFSMAN->m_iCoinMode )
{
case COIN_HOME:
sCredits = CREDITS_TEXT_HOME;
break;
case COIN_PAY:
{
int Coins = GAMESTATE->m_iCoins % PREFSMAN->m_iCoinsPerCredit;
sCredits = ssprintf("%s %d", CREDITS_TEXT_CREDITS.c_str(), GAMESTATE->m_iCoins / PREFSMAN->m_iCoinsPerCredit);
if (Coins)
sCredits += ssprintf(" %d/%d", Coins, PREFSMAN->m_iCoinsPerCredit );
}
break;
case COIN_FREE:
sCredits = CREDITS_TEXT_FREE_PLAY;
break;
default:
ASSERT(0);
}
}
m_textPlayerInfo[p].SetText( sPlayerInfo );
if( CREDITS_JOIN_ONLY && !GAMESTATE->PlayersCanJoin() )
sCredits = "";
m_textCredits[p].SetText( sCredits );
}
}
@@ -244,7 +246,7 @@ void ScreenSystemLayer::UpdateTimestampAndSkips()
if(!PREFSMAN->m_bTimestamping)
{
/* Hide: */
m_textSysTime.SetDiffuse( RageColor(1,1,1,0) );
m_textTime.SetDiffuse( RageColor(1,1,1,0) );
m_SkipBackground.SetDiffuse( RageColor(0,0,0,0) );
return;
}
@@ -282,23 +284,23 @@ void ScreenSystemLayer::UpdateTimestampAndSkips()
RageColor(1,1,0,1), /* yellow */
RageColor(1,0.2f,0.2f,1) /* light red */
};
m_Skips[m_LastSkip].SetText(ssprintf("%s: %.0fms (%.0f)",
m_textSkips[m_LastSkip].SetText(ssprintf("%s: %.0fms (%.0f)",
time.c_str(), 1000*UpdateTime, UpdateTime/ExpectedUpdate));
m_Skips[m_LastSkip].StopTweening();
m_Skips[m_LastSkip].SetDiffuse(RageColor(1,1,1,1));
m_Skips[m_LastSkip].BeginTweening(0.2f);
m_Skips[m_LastSkip].SetDiffuse(colors[skip]);
m_Skips[m_LastSkip].BeginTweening(3.0f);
m_Skips[m_LastSkip].BeginTweening(0.2f);
m_Skips[m_LastSkip].SetDiffuse(RageColor(1,1,1,0));
m_textSkips[m_LastSkip].StopTweening();
m_textSkips[m_LastSkip].SetDiffuse(RageColor(1,1,1,1));
m_textSkips[m_LastSkip].BeginTweening(0.2f);
m_textSkips[m_LastSkip].SetDiffuse(colors[skip]);
m_textSkips[m_LastSkip].BeginTweening(3.0f);
m_textSkips[m_LastSkip].BeginTweening(0.2f);
m_textSkips[m_LastSkip].SetDiffuse(RageColor(1,1,1,0));
m_LastSkip++;
m_LastSkip %= NUM_SKIPS;
m_LastSkip %= NUM_SKIPS_TO_SHOW;
}
}
m_textSysTime.SetText( time );
m_textSysTime.SetDiffuse( RageColor(1,0,1,1) );
m_textTime.SetText( time );
m_textTime.SetDiffuse( RageColor(1,0,1,1) );
}
void ScreenSystemLayer::Update( float fDeltaTime )