Various bug fixes. See changelog.

This commit is contained in:
Chris Danford
2002-07-23 01:41:40 +00:00
parent 83d773d239
commit 317c352a9b
129 changed files with 3744 additions and 1949 deletions
+6 -3
View File
@@ -1,18 +1,21 @@
#include "stdafx.h" // testing updates #include "stdafx.h" // testing updates
/* /*
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
File: ActorFrame.h Class: ActorFrame
Desc: Base class for all objects that appear on the screen. Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#include "ActorFrame.h" #include "ActorFrame.h"
void ActorFrame::AddActor( Actor* pActor) void ActorFrame::AddSubActor( Actor* pActor)
{ {
ASSERT( pActor );
ASSERT( (void*)pActor != (void*)0xC0000005 );
m_SubActors.Add( pActor ); m_SubActors.Add( pActor );
} }
+4 -3
View File
@@ -1,11 +1,12 @@
#pragma once #pragma once
/* /*
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
File: ActorFrame.h Class: ActorFrame
Desc: Base class for all objects that appear on the screen. Desc: A container for other actors.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
@@ -23,7 +24,7 @@ protected:
public: public:
void AddActor( Actor* pActor); void AddSubActor( Actor* pActor);
virtual void Update( float fDeltaTime ); virtual void Update( float fDeltaTime );
virtual void DrawPrimitives(); virtual void DrawPrimitives();
+24 -32
View File
@@ -11,7 +11,6 @@
*/ */
#include "AnnouncerManager.h" #include "AnnouncerManager.h"
#include "PrefsManager.h"
#include "RageLog.h" #include "RageLog.h"
@@ -28,10 +27,8 @@ AnnouncerManager::AnnouncerManager()
CStringArray arrayAnnouncerNames; CStringArray arrayAnnouncerNames;
GetAnnouncerNames( arrayAnnouncerNames ); GetAnnouncerNames( arrayAnnouncerNames );
// for( int i=0; i<arrayAnnouncerNames.GetSize(); i++ ) for( int i=0; i<arrayAnnouncerNames.GetSize(); i++ )
// AssertAnnouncerIsComplete( arrayAnnouncerNames[i] ); AssertAnnouncerIsComplete( arrayAnnouncerNames[i] );
SwitchAnnouncer( PREFSMAN->m_sAnnouncer );
} }
void AnnouncerManager::GetAnnouncerNames( CStringArray& AddTo ) void AnnouncerManager::GetAnnouncerNames( CStringArray& AddTo )
@@ -46,36 +43,17 @@ void AnnouncerManager::GetAnnouncerNames( CStringArray& AddTo )
} }
} }
void AnnouncerManager::SwitchAnnouncer( CString sAnnouncerName ) bool AnnouncerManager::DoesAnnouncerExist( CString sAnnouncerName )
{ {
LOG->WriteLine("AnnouncerManager::SwitchAnnouncer()");
if( sAnnouncerName == "" ) if( sAnnouncerName == "" )
{ return true;
m_sCurAnnouncerName = "";
return;
}
CStringArray asAnnouncerNames; CStringArray asAnnouncerNames;
GetAnnouncerNames( asAnnouncerNames ); GetAnnouncerNames( asAnnouncerNames );
for( int i=0; i<asAnnouncerNames.GetSize(); i++ ) for( int i=0; i<asAnnouncerNames.GetSize(); i++ )
if( asAnnouncerNames[i] == sAnnouncerName ) if( 0==stricmp(sAnnouncerName, asAnnouncerNames[i]) )
goto announcer_exists; return true;
return false;
// if we get here, the announcer doesn't exist
sAnnouncerName = asAnnouncerNames[0];
LOG->WriteLine("Announcer '" + sAnnouncerName + "' does not exist.");
announcer_exists:
m_sCurAnnouncerName = sAnnouncerName;
CString sAnnouncerDir = GetAnnouncerDirFromName( m_sCurAnnouncerName );
if( !DoesFileExist( sAnnouncerDir ) )
throw RageException( "Error loading the announcer in diretory '%s'.", m_sCurAnnouncerName );
LOG->WriteLine("Announcer successfully switched to '" + sAnnouncerName + "'.");
} }
void AnnouncerManager::AssertAnnouncerIsComplete( CString sAnnouncerName ) void AnnouncerManager::AssertAnnouncerIsComplete( CString sAnnouncerName )
@@ -83,8 +61,8 @@ void AnnouncerManager::AssertAnnouncerIsComplete( CString sAnnouncerName )
for( int i=0; i<NUM_ANNOUNCER_ELEMENTS; i++ ) for( int i=0; i<NUM_ANNOUNCER_ELEMENTS; i++ )
{ {
CString sPath = GetPathTo( (AnnouncerElement)i, sAnnouncerName ); CString sPath = GetPathTo( (AnnouncerElement)i, sAnnouncerName );
if( !DoesFileExist(sPath) ) // if( !DoesFileExist(sPath) )
throw RageException( "The Announcer element '%s' is missing.", sPath ); // throw RageException( "The Announcer element '%s' is missing.", sPath );
} }
} }
@@ -93,6 +71,16 @@ CString AnnouncerManager::GetAnnouncerDirFromName( CString sAnnouncerName )
return ANNOUNCER_BASE_DIR + sAnnouncerName + "\\"; return ANNOUNCER_BASE_DIR + sAnnouncerName + "\\";
} }
void AnnouncerManager::SwitchAnnouncer( CString sNewAnnouncerName )
{
if( sNewAnnouncerName != "" )
m_sCurAnnouncerName = "";
else if( !DoesAnnouncerExist(sNewAnnouncerName) )
m_sCurAnnouncerName = "";
else
m_sCurAnnouncerName = sNewAnnouncerName;
}
CString AnnouncerManager::GetPathTo( AnnouncerElement ae ) CString AnnouncerManager::GetPathTo( AnnouncerElement ae )
{ {
return GetPathTo( ae, m_sCurAnnouncerName ); return GetPathTo( ae, m_sCurAnnouncerName );
@@ -134,6 +122,7 @@ CString AnnouncerManager::GetPathTo( AnnouncerElement ae, CString sAnnouncerName
case ANNOUNCER_EVALUATION_FINAL_B: sAssetDir = "evaluation final b"; break; case ANNOUNCER_EVALUATION_FINAL_B: sAssetDir = "evaluation final b"; break;
case ANNOUNCER_EVALUATION_FINAL_C: sAssetDir = "evaluation final c"; break; case ANNOUNCER_EVALUATION_FINAL_C: sAssetDir = "evaluation final c"; break;
case ANNOUNCER_EVALUATION_FINAL_D: sAssetDir = "evaluation final d"; break; case ANNOUNCER_EVALUATION_FINAL_D: sAssetDir = "evaluation final d"; break;
case ANNOUNCER_EVALUATION_FINAL_E: sAssetDir = "evaluation final e"; break;
case ANNOUNCER_GAME_OVER: sAssetDir = "game over"; break; case ANNOUNCER_GAME_OVER: sAssetDir = "game over"; break;
case ANNOUNCER_MENU_HURRY_UP: sAssetDir = "menu hurry up"; break; case ANNOUNCER_MENU_HURRY_UP: sAssetDir = "menu hurry up"; break;
case ANNOUNCER_MUSIC_SCROLL: sAssetDir = "music scroll"; break; case ANNOUNCER_MUSIC_SCROLL: sAssetDir = "music scroll"; break;
@@ -143,6 +132,7 @@ CString AnnouncerManager::GetPathTo( AnnouncerElement ae, CString sAnnouncerName
case ANNOUNCER_EVALUATION_B: sAssetDir = "evaluation b"; break; case ANNOUNCER_EVALUATION_B: sAssetDir = "evaluation b"; break;
case ANNOUNCER_EVALUATION_C: sAssetDir = "evaluation c"; break; case ANNOUNCER_EVALUATION_C: sAssetDir = "evaluation c"; break;
case ANNOUNCER_EVALUATION_D: sAssetDir = "evaluation d"; break; case ANNOUNCER_EVALUATION_D: sAssetDir = "evaluation d"; break;
case ANNOUNCER_EVALUATION_E: sAssetDir = "evaluation e"; break;
case ANNOUNCER_SELECT_COURSE_INTRO: sAssetDir = "select course intro"; break; case ANNOUNCER_SELECT_COURSE_INTRO: sAssetDir = "select course intro"; break;
case ANNOUNCER_SELECT_DIFFICULTY_COMMENT_EASY: sAssetDir = "select difficulty comment easy"; break; case ANNOUNCER_SELECT_DIFFICULTY_COMMENT_EASY: sAssetDir = "select difficulty comment easy"; break;
case ANNOUNCER_SELECT_DIFFICULTY_COMMENT_HARD: sAssetDir = "select difficulty comment hard"; break; case ANNOUNCER_SELECT_DIFFICULTY_COMMENT_HARD: sAssetDir = "select difficulty comment hard"; break;
@@ -168,8 +158,10 @@ CString AnnouncerManager::GetPathTo( AnnouncerElement ae, CString sAnnouncerName
case ANNOUNCER_STAGE_3: sAssetDir = "stage 3"; break; case ANNOUNCER_STAGE_3: sAssetDir = "stage 3"; break;
case ANNOUNCER_STAGE_4: sAssetDir = "stage 4"; break; case ANNOUNCER_STAGE_4: sAssetDir = "stage 4"; break;
case ANNOUNCER_STAGE_5: sAssetDir = "stage 5"; break; case ANNOUNCER_STAGE_5: sAssetDir = "stage 5"; break;
case ANNOUNCER_STAGE_EXTRA: sAssetDir = "stage extra"; break;
case ANNOUNCER_STAGE_FINAL: sAssetDir = "stage final"; break; case ANNOUNCER_STAGE_FINAL: sAssetDir = "stage final"; break;
case ANNOUNCER_STAGE_EXTRA: sAssetDir = "stage extra"; break;
case ANNOUNCER_STAGE_ANOTHER_EXTRA: sAssetDir = "stage another extra"; break;
case ANNOUNCER_STAGE_CHALLENGE: sAssetDir = "stage challenge"; break;
case ANNOUNCER_TITLE_MENU_ATTRACT: sAssetDir = "title menu attract"; break; case ANNOUNCER_TITLE_MENU_ATTRACT: sAssetDir = "title menu attract"; break;
case ANNOUNCER_TITLE_MENU_GAME_NAME: sAssetDir = "title menu game name"; break; case ANNOUNCER_TITLE_MENU_GAME_NAME: sAssetDir = "title menu game name"; break;
+15 -7
View File
@@ -42,6 +42,7 @@ enum AnnouncerElement {
ANNOUNCER_EVALUATION_FINAL_B, ANNOUNCER_EVALUATION_FINAL_B,
ANNOUNCER_EVALUATION_FINAL_C, ANNOUNCER_EVALUATION_FINAL_C,
ANNOUNCER_EVALUATION_FINAL_D, ANNOUNCER_EVALUATION_FINAL_D,
ANNOUNCER_EVALUATION_FINAL_E,
ANNOUNCER_GAME_OVER, ANNOUNCER_GAME_OVER,
ANNOUNCER_MENU_HURRY_UP, ANNOUNCER_MENU_HURRY_UP,
ANNOUNCER_MUSIC_SCROLL, ANNOUNCER_MUSIC_SCROLL,
@@ -51,6 +52,7 @@ enum AnnouncerElement {
ANNOUNCER_EVALUATION_B, ANNOUNCER_EVALUATION_B,
ANNOUNCER_EVALUATION_C, ANNOUNCER_EVALUATION_C,
ANNOUNCER_EVALUATION_D, ANNOUNCER_EVALUATION_D,
ANNOUNCER_EVALUATION_E,
ANNOUNCER_SELECT_COURSE_INTRO, ANNOUNCER_SELECT_COURSE_INTRO,
ANNOUNCER_SELECT_DIFFICULTY_COMMENT_EASY, ANNOUNCER_SELECT_DIFFICULTY_COMMENT_EASY,
ANNOUNCER_SELECT_DIFFICULTY_COMMENT_HARD, ANNOUNCER_SELECT_DIFFICULTY_COMMENT_HARD,
@@ -76,8 +78,10 @@ enum AnnouncerElement {
ANNOUNCER_STAGE_3, ANNOUNCER_STAGE_3,
ANNOUNCER_STAGE_4, ANNOUNCER_STAGE_4,
ANNOUNCER_STAGE_5, ANNOUNCER_STAGE_5,
ANNOUNCER_STAGE_EXTRA,
ANNOUNCER_STAGE_FINAL, ANNOUNCER_STAGE_FINAL,
ANNOUNCER_STAGE_EXTRA,
ANNOUNCER_STAGE_ANOTHER_EXTRA,
ANNOUNCER_STAGE_CHALLENGE,
ANNOUNCER_TITLE_MENU_ATTRACT, ANNOUNCER_TITLE_MENU_ATTRACT,
ANNOUNCER_TITLE_MENU_GAME_NAME, ANNOUNCER_TITLE_MENU_GAME_NAME,
@@ -91,19 +95,23 @@ public:
AnnouncerManager(); AnnouncerManager();
void GetAnnouncerNames( CStringArray& AddTo ); void GetAnnouncerNames( CStringArray& AddTo );
CString GetCurrentAnnouncerName() { return m_sCurAnnouncerName; } bool DoesAnnouncerExist( CString sAnnouncerName );
void SwitchAnnouncer( CString sAnnouncerName ); // return false if Announcer doesn't exist void SwitchAnnouncer( CString sNewAnnouncerName );
void AssertAnnouncerIsComplete( CString sAnnouncerName ); // return false if Announcer doesn't exist CString GetCurAnnouncerName() { return m_sCurAnnouncerName; };
CString GetPathTo( AnnouncerElement ae ); CString GetPathTo( AnnouncerElement ae );
CString GetPathTo( AnnouncerElement ae, CString sAnnouncerName );
protected: protected:
CString GetAnnouncerDirFromName( CString sAnnouncerName ); void AssertAnnouncerIsComplete( CString sAnnouncerName ); // only used in Debug
CString GetPathTo( AnnouncerElement ae, CString sAnnouncerName );
static CString GetAnnouncerDirFromName( CString sAnnouncerName );
CString GetElementDir( AnnouncerElement te ); CString GetElementDir( AnnouncerElement te );
CString m_sCurAnnouncerName; // "" means no announcer CString m_sCurAnnouncerName;
}; };
extern AnnouncerManager* ANNOUNCER; // global and accessable from anywhere in our program extern AnnouncerManager* ANNOUNCER; // global and accessable from anywhere in our program
+11 -6
View File
@@ -14,6 +14,7 @@
#include "ColorNote.h" #include "ColorNote.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "GameManager.h" #include "GameManager.h"
#include "GameState.h"
float ArrowGetYOffset( const PlayerOptions& po, float fStepIndex, float fSongBeat ) float ArrowGetYOffset( const PlayerOptions& po, float fStepIndex, float fSongBeat )
@@ -34,8 +35,7 @@ float ArrowGetYOffset( const PlayerOptions& po, float fStepIndex, float fSongBea
float ArrowGetXPos( const PlayerOptions& po, int iColNum, float fYOffset, float fSongBeat ) float ArrowGetXPos( const PlayerOptions& po, int iColNum, float fYOffset, float fSongBeat )
{ {
float fColOffsetFromCenter = iColNum - (GAMEMAN->GetCurrentStyleDef()->m_iColsPerPlayer-1)/2.0f; float fPixelOffsetFromCenter = GAMESTATE->GetCurrentStyleDef()->m_ColumnInfo[PLAYER_1][iColNum].fXOffset;
float fPixelOffsetFromCenter = fColOffsetFromCenter * ARROW_SIZE;
// BUG OR FEATURE??? THIS IS WHERE THE REAL COLUMN PLACEMENT HAPPENS!!! // BUG OR FEATURE??? THIS IS WHERE THE REAL COLUMN PLACEMENT HAPPENS!!!
// GAMEMANAGER SITS AROUND ON ITS ASS DOING NOTHING // GAMEMANAGER SITS AROUND ON ITS ASS DOING NOTHING
@@ -44,22 +44,27 @@ float ArrowGetXPos( const PlayerOptions& po, int iColNum, float fYOffset, float
// can possibly change my arrow placements, Ez2dancer column setups will be here until // can possibly change my arrow placements, Ez2dancer column setups will be here until
// somebody makes some other system. In the meantime, if it works, i'm using it. // somebody makes some other system. In the meantime, if it works, i'm using it.
if ( GAMEMAN->m_CurGame == GAME_EZ2 ) // Chris:
// It's working now, so I'm commenting out your placement code below.
/*
if ( GAMESTATE->m_CurGame == GAME_EZ2 )
{ {
fPixelOffsetFromCenter = fColOffsetFromCenter * ARROW_SIZE / 1.3f; fPixelOffsetFromCenter = fColOffsetFromCenter * ARROW_SIZE / 1.3f;
if ( GAMEMAN->m_CurStyle == STYLE_EZ2_REAL || GAMEMAN->m_CurStyle == STYLE_EZ2_REAL_VERSUS ) // real gets MEGA squashed if ( GAEMSTATE->m_CurStyle == STYLE_EZ2_REAL || GAEMSTATE->m_CurStyle == STYLE_EZ2_REAL_VERSUS ) // real gets MEGA squashed
{ {
fPixelOffsetFromCenter = fColOffsetFromCenter * ARROW_SIZE / 1.6f; fPixelOffsetFromCenter = fColOffsetFromCenter * ARROW_SIZE / 1.6f;
} }
else if ( GAMEMAN->m_CurStyle == STYLE_EZ2_DOUBLE && GAMEMAN->m_sMasterPlayerNumber == PLAYER_1) else if ( GAEMSTATE->m_CurStyle == STYLE_EZ2_DOUBLE && GAEMSTATE->m_sMasterPlayerNumber == PLAYER_1)
{ {
fPixelOffsetFromCenter = (fColOffsetFromCenter + 2.9f) * ARROW_SIZE / 1.3f; fPixelOffsetFromCenter = (fColOffsetFromCenter + 2.9f) * ARROW_SIZE / 1.3f;
} }
else if ( GAMEMAN->m_CurStyle == STYLE_EZ2_DOUBLE && GAMEMAN->m_sMasterPlayerNumber == PLAYER_2) else if ( GAEMSTATE->m_CurStyle == STYLE_EZ2_DOUBLE && GAEMSTATE->m_sMasterPlayerNumber == PLAYER_2)
{ {
fPixelOffsetFromCenter = (fColOffsetFromCenter - 3.1f) * ARROW_SIZE / 1.3f; fPixelOffsetFromCenter = (fColOffsetFromCenter - 3.1f) * ARROW_SIZE / 1.3f;
} }
} }
*/
switch( po.m_EffectType ) switch( po.m_EffectType )
{ {
+4 -4
View File
@@ -12,7 +12,7 @@
#include "BPMDisplay.h" #include "BPMDisplay.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
@@ -44,9 +44,9 @@ BPMDisplay::BPMDisplay()
m_textLabel.SetDiffuseColorTopEdge( D3DXCOLOR(1,1,0,1) ); // yellow m_textLabel.SetDiffuseColorTopEdge( D3DXCOLOR(1,1,0,1) ); // yellow
m_textLabel.SetDiffuseColorBottomEdge( D3DXCOLOR(1,0.5f,0,1) ); // orange m_textLabel.SetDiffuseColorBottomEdge( D3DXCOLOR(1,0.5f,0,1) ); // orange
//this->AddActor( &m_rectFrame ); //this->AddSubActor( &m_rectFrame );
this->AddActor( &m_textBPM ); this->AddSubActor( &m_textBPM );
this->AddActor( &m_textLabel ); this->AddSubActor( &m_textLabel );
} }
+2 -2
View File
@@ -12,7 +12,7 @@
#include "Background.h" #include "Background.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "PrefsManager.h" #include "PrefsManager.h"
#include "RageBitmapTexture.h" #include "RageBitmapTexture.h"
@@ -300,7 +300,7 @@ void Background::DrawPrimitives()
bool Background::DangerVisible() bool Background::DangerVisible()
{ {
return m_bInDanger && (TIMER->GetTimeSinceStart() - (int)TIMER->GetTimeSinceStart()) > 0.5f; return m_bInDanger && (TIMER->GetTimeSinceStart() - (int)TIMER->GetTimeSinceStart()) < 0.5f;
} }
+1 -1
View File
@@ -12,7 +12,7 @@
#include "RageUtil.h" #include "RageUtil.h"
#include "Banner.h" #include "Banner.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "SongManager.h" #include "SongManager.h"
#include "RageBitmapTexture.h" #include "RageBitmapTexture.h"
+3 -3
View File
@@ -13,7 +13,7 @@
#include "BannerWithFrame.h" #include "BannerWithFrame.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "RageLog.h" #include "RageLog.h"
@@ -23,8 +23,8 @@ BannerWithFrame::BannerWithFrame()
m_sprBannerFrame.Load( THEME->GetPathTo(GRAPHIC_EVALUATION_BANNER_FRAME) ); m_sprBannerFrame.Load( THEME->GetPathTo(GRAPHIC_EVALUATION_BANNER_FRAME) );
m_Banner.SetCroppedSize( m_sprBannerFrame.GetUnzoomedWidth()-6, m_sprBannerFrame.GetUnzoomedHeight()-6 ); m_Banner.SetCroppedSize( m_sprBannerFrame.GetUnzoomedWidth()-6, m_sprBannerFrame.GetUnzoomedHeight()-6 );
this->AddActor( &m_Banner ); this->AddSubActor( &m_Banner );
this->AddActor( &m_sprBannerFrame ); this->AddSubActor( &m_sprBannerFrame );
} }
void BannerWithFrame::LoadFromSong( Song* pSong ) void BannerWithFrame::LoadFromSong( Song* pSong )
+6 -5
View File
@@ -1,16 +1,17 @@
#include "stdafx.h" #include "stdafx.h"
/* /*
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
File: Combo.h Class: Combo
Desc: A graphic displayed in the Combo during Dancing. Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#include "Combo.h" #include "Combo.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "ScreenManager.h" #include "ScreenManager.h"
#include "ScreenGameplay.h" #include "ScreenGameplay.h"
@@ -35,8 +36,8 @@ Combo::Combo()
m_sprCombo.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); // invisible m_sprCombo.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); // invisible
this->AddActor( &m_textComboNumber ); this->AddSubActor( &m_textComboNumber );
this->AddActor( &m_sprCombo ); this->AddSubActor( &m_sprCombo );
} }
+5 -10
View File
@@ -1,21 +1,18 @@
#pragma once
/* /*
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
File: Combo.h Class: Combo
Desc: A graphic displayed in the Combo during Dancing. Desc: Text that displays the size of the current combo.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#ifndef _Combo_H_
#define _Combo_H_
#include "ActorFrame.h" #include "ActorFrame.h"
#include "Sprite.h" #include "Sprite.h"
#include "ScoreDisplayRolling.h" #include "BitmapText.h"
@@ -38,5 +35,3 @@ protected:
Sprite m_sprCombo; Sprite m_sprCombo;
BitmapText m_textComboNumber; BitmapText m_textComboNumber;
}; };
#endif
+71 -4
View File
@@ -11,8 +11,11 @@
*/ */
#include "Course.h" #include "Course.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "Song.h" #include "Song.h"
#include "GameManager.h"
#include "SongManager.h"
#include "GameState.h"
void Course::LoadFromCRSFile( CString sPath, CArray<Song*,Song*> &apSongs ) void Course::LoadFromCRSFile( CString sPath, CArray<Song*,Song*> &apSongs )
@@ -89,12 +92,76 @@ void Course::LoadFromCRSFile( CString sPath, CArray<Song*,Song*> &apSongs )
if( pSong == NULL ) // we didn't find the Song if( pSong == NULL ) // we didn't find the Song
continue; // skip this song continue; // skip this song
DifficultyClass dc = Notes::DifficultyClassFromDescriptionAndMeter( sNotesDescription, 6 ); AddStage( pSong, sNotesDescription );
AddStage( pSong, dc );
} }
else else
LOG->WriteLine( "Unexpected value named '%s'", sValueName ); LOG->WriteLine( "Unexpected value named '%s'", sValueName );
} }
} }
void Course::CreateFromGroupAndDifficultyClass( CString sGroupName, DifficultyClass dc, CArray<Song*,Song*> &apSongsInGroup )
{
CString sShortGroupName = SONGMAN->ShortenGroupName( sGroupName );
m_sName = sShortGroupName + " ";
switch( dc )
{
case CLASS_EASY: m_sName += "Easy"; break;
case CLASS_MEDIUM: m_sName += "Medium"; break;
case CLASS_HARD: m_sName += "Hard"; break;
}
for( int s=0; s<apSongsInGroup.GetSize(); s++ )
{
Song* pSong = apSongsInGroup[s];
AddStage( pSong, DifficultyClassToString(dc) );
}
}
Notes* Course::GetNotesForStage( int iStage )
{
Song* pSong = m_apSongs[iStage];
CString sDescription = m_asDescriptions[iStage];
for( int i=0; i<pSong->m_apNotes.GetSize(); i++ )
{
Notes* pNotes = pSong->m_apNotes[i];
if( 0==stricmp(pNotes->m_sDescription, sDescription) &&
pNotes->m_NotesType == GAMESTATE->GetCurrentStyleDef()->m_NotesType )
return pNotes;
}
// Didn't find a matching description. Try to match the DifficultyClass instead.
DifficultyClass dc = Notes::DifficultyClassFromDescriptionAndMeter( sDescription, 5 );
for( i=0; i<pSong->m_apNotes.GetSize(); i++ )
{
Notes* pNotes = pSong->m_apNotes[i];
if( pNotes->m_DifficultyClass == dc )
return pNotes;
}
return NULL;
}
void Course::GetSongAndNotesForCurrentStyle( CArray<Song*,Song*>& apSongsOut, CArray<Notes*,Notes*> apNotesOut[NUM_PLAYERS] )
{
for( int i=0; i<m_iStages; i++ )
{
Song* pSong = m_apSongs[i];
Notes* pNotes = GetNotesForStage( i );
if( pNotes == NULL )
continue; // skip
apSongsOut.Add( pSong );
for( int p=0; p<NUM_PLAYERS; p++ )
apNotesOut[p].Add( pNotes );
}
}
+8 -4
View File
@@ -32,18 +32,22 @@ public:
CString m_sCDTitlePath; CString m_sCDTitlePath;
int m_iStages; int m_iStages;
Song* m_apSongs[MAX_COURSE_STAGES]; Song* m_apSongs[MAX_COURSE_STAGES];
DifficultyClass m_aDifficultyClasses[MAX_COURSE_STAGES]; CString m_asDescriptions[MAX_COURSE_STAGES];
Notes* GetNotesForStage( int iStage );
bool m_bRepeat; // repeat after last song? bool m_bRepeat; // repeat after last song?
PlayerOptions m_PlayerOptions; PlayerOptions m_PlayerOptions;
void LoadFromCRSFile( CString sPath, CArray<Song*,Song*> &apSongs );
void AddStage( Song* pSong, DifficultyClass dc ) void LoadFromCRSFile( CString sPath, CArray<Song*,Song*> &apSongs );
void CreateFromGroupAndDifficultyClass( CString sGroupName, DifficultyClass dc, CArray<Song*,Song*> &apSongsInGroup );
void AddStage( Song* pSong, CString sDescription )
{ {
ASSERT( m_iStages <= MAX_COURSE_STAGES ); ASSERT( m_iStages <= MAX_COURSE_STAGES );
m_apSongs[m_iStages] = pSong; m_apSongs[m_iStages] = pSong;
m_aDifficultyClasses[m_iStages] = dc; m_asDescriptions[m_iStages] = sDescription;
m_iStages++; m_iStages++;
} }
void GetSongAndNotesForCurrentStyle( CArray<Song*,Song*>& apSongsOut, CArray<Notes*,Notes*> apNotesOut[NUM_PLAYERS] );
}; };
+127 -45
View File
@@ -13,74 +13,156 @@
#include "CourseContentsFrame.h" #include "CourseContentsFrame.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "RageLog.h" #include "RageLog.h"
#include "PrefsManager.h" #include "PrefsManager.h"
#include "Course.h" #include "Course.h"
#include "SongManager.h"
const float TEXT_BANNER_X = 0;
const float TEXT_BANNER_Y = 0;
const float NUMBER_X = -118;
const float NUMBER_Y = 0;
const float FOOT_X = 102;
const float FOOT_Y = 8;
const float DIFFICULTY_X = FOOT_X+18;
const float DIFFICULTY_Y = FOOT_Y;
const float CONTENTS_BAR_WIDTH = 270;
const float CONTENTS_BAR_HEIGHT = 44;
CourseContentDisplay::CourseContentDisplay()
{
m_sprFrame.Load( THEME->GetPathTo(GRAPHIC_SELECT_COURSE_CONTENT_BAR) );
this->AddSubActor( &m_sprFrame );
m_textNumber.Load( THEME->GetPathTo(FONT_HEADER2) );
m_textNumber.SetXY( NUMBER_X, NUMBER_Y );
m_textNumber.TurnShadowOff();
this->AddSubActor( &m_textNumber );
m_TextBanner.SetXY( TEXT_BANNER_X, TEXT_BANNER_Y );
this->AddSubActor( &m_TextBanner );
m_textFoot.Load( THEME->GetPathTo(FONT_METER) );
m_textFoot.SetXY( FOOT_X, FOOT_Y );
m_textFoot.TurnShadowOff();
this->AddSubActor( &m_textFoot );
m_textDifficultyNumber.Load( THEME->GetPathTo(FONT_NORMAL) );
m_textDifficultyNumber.SetXY( DIFFICULTY_X, DIFFICULTY_Y );
m_textDifficultyNumber.SetZoom( 0.8f );
m_textDifficultyNumber.TurnShadowOff();
this->AddSubActor( &m_textDifficultyNumber );
}
void CourseContentDisplay::Load( int iNum, Song* pSong, Notes* pNotes )
{
m_textNumber.SetText( ssprintf("%d", iNum) );
D3DXCOLOR colorGroup = SONGMAN->GetGroupColor( pSong->m_sGroupName );
D3DXCOLOR colorDifficulty = DifficultyClassToColor( pNotes->m_DifficultyClass );
m_TextBanner.LoadFromSong( pSong );
m_TextBanner.SetDiffuseColor( colorGroup );
m_textFoot.SetText( "1" );
m_textFoot.SetDiffuseColor( colorDifficulty );
m_textDifficultyNumber.SetText( ssprintf("%d", pNotes->m_iMeter) );
m_textDifficultyNumber.SetDiffuseColor( colorDifficulty );
}
const float NAME_X = -100;
const float METER_X = +50;
const float GAP_Y = 34;
const float START_Y = 0 - MAX_COURSE_CONTENTS/2*GAP_Y;
CourseContentsFrame::CourseContentsFrame() CourseContentsFrame::CourseContentsFrame()
{ {
for( int i=0; i<MAX_COURSE_CONTENTS; i++ ) m_iNumContents = 0;
{ m_quad.SetDiffuseColor( D3DXCOLOR(0,0,0,0) ); // invisible, since we want to write only to the Zbuffer
m_textContents[i].Load( THEME->GetPathTo(FONT_TEXT_BANNER) );
m_textContents[i].SetHorizAlign( Actor::align_left );
m_textContents[i].SetXY( NAME_X, START_Y + GAP_Y*i );
m_textContents[i].SetText( "" );
m_textContents[i].SetZoom( 0.7f );
this->AddActor( &m_textContents[i] );
m_Meters[i].SetXY( METER_X, START_Y + GAP_Y*i + 10 ); m_fTimeUntilScroll = 0;
this->AddActor( &m_Meters[i] ); m_fItemAtTopOfList = 0;
}
}
void CourseContentsFrame::Update( float fDeltaTime )
{
ActorFrame::Update( fDeltaTime );
} }
void CourseContentsFrame::SetFromCourse( Course* pCourse ) void CourseContentsFrame::SetFromCourse( Course* pCourse )
{ {
ASSERT( pCourse != NULL ); ASSERT( pCourse != NULL );
int i; m_fTimeUntilScroll = 3;
m_fItemAtTopOfList = 0;
// turn all lines "off" m_iNumContents = 0;
for( i=0; i<MAX_COURSE_CONTENTS; i++ )
for( int i=0; i<min(pCourse->m_iStages, MAX_TOTAL_CONTENTS); i++ )
{ {
m_textContents[i].SetText( "" );
m_Meters[i].SetFromNotes( NULL );
}
for( i=0; i<min(pCourse->m_iStages, MAX_COURSE_CONTENTS); i++ )
{
m_textContents[i].SetText( pCourse->m_apSongs[i]->GetFullTitle() );
m_textContents[i].SetDiffuseColor( DifficultyClassToColor(pCourse->m_aDifficultyClasses[i]) );
m_Meters[i].SetFromNotes( NULL );
Song* pSong = pCourse->m_apSongs[i]; Song* pSong = pCourse->m_apSongs[i];
for( int j=0; j<pSong->m_apNotes.GetSize(); j++ ) Notes* pNotes = pCourse->GetNotesForStage(i);
{
Notes* pNotes = pSong->m_apNotes[j]; if( pNotes == NULL )
if( pSong->m_apNotes[j]->m_DifficultyClass == pCourse->m_aDifficultyClasses[i] ) continue; // skip
{
m_Meters[i].SetFromNotes( pNotes ); printf( "Adding song '%s'\n", pSong->m_sMainTitle );
break; m_CourseContentDisplays[m_iNumContents].Load( m_iNumContents+1, pSong, pNotes );
m_iNumContents ++;
} }
printf( "m_iNumContents is %d\n", m_iNumContents );
} }
void CourseContentsFrame::Update( float fDeltaTime )
{
if( m_fTimeUntilScroll > 0 && m_iNumContents > MAX_VISIBLE_CONTENTS)
m_fTimeUntilScroll -= fDeltaTime;
if( m_fTimeUntilScroll <= 0 )
m_fItemAtTopOfList += fDeltaTime;
if( m_fItemAtTopOfList > m_iNumContents )
m_fItemAtTopOfList -= m_iNumContents;
for( int i=0; i<m_iNumContents; i++ )
m_CourseContentDisplays[i].Update( fDeltaTime );
} }
if( pCourse->m_iStages >= MAX_COURSE_CONTENTS ) void CourseContentsFrame::DrawPrimitives()
{ {
m_textContents[MAX_COURSE_CONTENTS-1].SetText( ssprintf("%d more...", pCourse->m_iStages-(MAX_COURSE_CONTENTS-1)) ); // turn on Z buffer to clip items
m_Meters[MAX_COURSE_CONTENTS-1].SetFromNotes( NULL ); LPDIRECT3DDEVICE8 pd3dDevice = DISPLAY->GetDevice();
pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
// write to z buffer so that top and bottom are clipped
m_quad.SetZ( -1 );
CRect rectBarSize(-(int)CONTENTS_BAR_WIDTH/2, -(int)CONTENTS_BAR_HEIGHT/2, (int)CONTENTS_BAR_WIDTH/2, (int)CONTENTS_BAR_HEIGHT/2);
m_quad.StretchTo( rectBarSize );
m_quad.SetY( (-(MAX_VISIBLE_CONTENTS-1)/2 - 1) * CONTENTS_BAR_HEIGHT );
m_quad.Draw();
m_quad.SetY( ((MAX_VISIBLE_CONTENTS-1)/2 + 1) * CONTENTS_BAR_HEIGHT );
m_quad.Draw();
int iItemToDraw = (int)m_fItemAtTopOfList;
float fY = (iItemToDraw-m_fItemAtTopOfList-(MAX_VISIBLE_CONTENTS-1)/2) * CONTENTS_BAR_HEIGHT;
for( int i=0; i<min(MAX_VISIBLE_CONTENTS+1, m_iNumContents); i++ )
{
m_CourseContentDisplays[iItemToDraw].SetY( fY );
m_CourseContentDisplays[iItemToDraw].Draw();
iItemToDraw++;
if( iItemToDraw >= m_iNumContents )
iItemToDraw -= m_iNumContents;
fY += CONTENTS_BAR_HEIGHT;
} }
// turn off Z buffer
pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
} }
+33 -4
View File
@@ -12,22 +12,51 @@
#include "FootMeter.h" #include "FootMeter.h"
#include "BitmapText.h" #include "BitmapText.h"
#include "TextBanner.h"
#include "ActorFrame.h" #include "ActorFrame.h"
#include "Sprite.h"
#include "Quad.h"
class Course; class Course;
class Song;
struct Notes;
const int MAX_VISIBLE_CONTENTS = 5;
const int MAX_TOTAL_CONTENTS = 56;
class CourseContentDisplay : public ActorFrame
{
public:
CourseContentDisplay();
void Load( int iNum, Song* pSong, Notes* pNotes );
Sprite m_sprFrame;
BitmapText m_textNumber;
TextBanner m_TextBanner;
BitmapText m_textFoot;
BitmapText m_textDifficultyNumber;
};
const int MAX_COURSE_CONTENTS = 8;
class CourseContentsFrame : public ActorFrame class CourseContentsFrame : public ActorFrame
{ {
public: public:
CourseContentsFrame(); CourseContentsFrame();
void Update( float fDeltaTime ); virtual void Update( float fDeltaTime );
virtual void DrawPrimitives();
void SetFromCourse( Course* pCourse ); void SetFromCourse( Course* pCourse );
protected: protected:
BitmapText m_textContents[MAX_COURSE_CONTENTS]; Quad m_quad;
FootMeter m_Meters[MAX_COURSE_CONTENTS];
int m_iNumContents;
CourseContentDisplay m_CourseContentDisplays[MAX_TOTAL_CONTENTS];
float m_fTimeUntilScroll;
float m_fItemAtTopOfList; // between 0 and m_iNumContents
}; };
+1 -1
View File
@@ -12,7 +12,7 @@
#include "RageUtil.h" #include "RageUtil.h"
#include "CroppedSprite.h" #include "CroppedSprite.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "RageBitmapTexture.h" #include "RageBitmapTexture.h"
+1 -1
View File
@@ -12,7 +12,7 @@
#include "DifficultyIcon.h" #include "DifficultyIcon.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
+1 -1
View File
@@ -14,7 +14,7 @@
#include "Sprite.h" #include "Sprite.h"
#include "Song.h" #include "Song.h"
#include "BitmapText.h" #include "BitmapText.h"
#include "ThemeManager.h" #include "PrefsManager.h"
class DifficultyIcon : public Sprite class DifficultyIcon : public Sprite
+1 -1
View File
@@ -24,7 +24,7 @@ FocusingSprite::FocusingSprite()
{ {
for( int i=0; i<3; i++ ) for( int i=0; i<3; i++ )
{ {
this->AddActor( &m_sprites[i] ); this->AddSubActor( &m_sprites[i] );
} }
m_fPercentBlurred = 1.0f; m_fPercentBlurred = 1.0f;
+1 -1
View File
@@ -13,7 +13,7 @@
#include "FootMeter.h" #include "FootMeter.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
+1 -1
View File
@@ -13,7 +13,7 @@
#include "Sprite.h" #include "Sprite.h"
#include "Song.h" #include "Song.h"
#include "BitmapText.h" #include "BitmapText.h"
#include "ThemeManager.h" #include "PrefsManager.h"
class FootMeter : public BitmapText class FootMeter : public BitmapText
+15 -2
View File
@@ -353,6 +353,19 @@ inline Game StyleToGame( Style s )
} }
} }
/*
Chris:
Very cool system :-)
However, the NotesType is a property of the StyleDef, so we can look it up there.
Get the the NotesType for a style with:
GAMESTATE->GetCurrentStyleDef()->m_NotesType - or -
GAMEMAN->GetStyleDefForStyle(style)->m_NotesType
I'll add a new method to GAMEMAN called GetStyleThatPlaysNotesType():
Style s = GAMEMAN->GetStyleThatPlaysNotesType( nt );
//////////////////////////////// ////////////////////////////////
// NotesType/Style conversions // NotesType/Style conversions
//////////////////////////////// ////////////////////////////////
@@ -496,7 +509,7 @@ print "\t\tdefault:\treturn NOTES_TYPE_INVALID;
<- End of Perl file <- End of Perl file
*/ */
/*
// //
// NotesTypeToStyle(nt): Converts nt to a Style // NotesTypeToStyle(nt): Converts nt to a Style
// //
@@ -549,7 +562,7 @@ inline NotesType StyleToNotesType ( Style s )
} }
} }
*/
/////////////////////////// ///////////////////////////
// Options stuff // Options stuff
+11 -10
View File
@@ -18,7 +18,7 @@
#include "StyleDef.h" #include "StyleDef.h"
CString GameDef::ElementToGraphicSuffix( const GameButtonGraphic gbg ) CString GameDef::ElementToGraphicSuffix( const SkinElement gbg )
{ {
CString sAssetPath; // fill this in below CString sAssetPath; // fill this in below
@@ -38,10 +38,9 @@ CString GameDef::ElementToGraphicSuffix( const GameButtonGraphic gbg )
return sAssetPath; return sAssetPath;
} }
CString GameDef::GetPathToGraphic( const CString sSkinName, const int iInstrumentButton, const GameButtonGraphic gbg ) CString GameDef::GetPathToGraphic( const CString sSkinName, const CString sButtonName, const SkinElement gbg )
{ {
const CString sSkinDir = ssprintf("Skins\\%s\\%s\\", m_szName, sSkinName); const CString sSkinDir = ssprintf("Skins\\%s\\%s\\", m_szName, sSkinName);
const CString sButtonName = m_szButtonNames[ iInstrumentButton ];
const CString sGraphicSuffix = ElementToGraphicSuffix( gbg ); const CString sGraphicSuffix = ElementToGraphicSuffix( gbg );
CStringArray arrayPossibleFileNames; // fill this with the possible files CStringArray arrayPossibleFileNames; // fill this with the possible files
@@ -58,10 +57,9 @@ CString GameDef::GetPathToGraphic( const CString sSkinName, const int iInstrumen
return ""; return "";
} }
void GameDef::GetTweenColors( const CString sSkinName, const int iInstrumentButton, CArray<D3DXCOLOR,D3DXCOLOR> &arrayTweenColors ) void GameDef::GetTweenColors( const CString sSkinName, const CString sButtonName, CArray<D3DXCOLOR,D3DXCOLOR> &arrayTweenColors )
{ {
const CString sSkinDir = ssprintf("Skins\\%s\\%s\\", m_szName, sSkinName); const CString sSkinDir = ssprintf("Skins\\%s\\%s\\", m_szName, sSkinName);
const CString sButtonName = m_szButtonNames[ iInstrumentButton ];
const CString sColorsFilePath = sSkinDir + sButtonName + ".colors"; const CString sColorsFilePath = sSkinDir + sButtonName + ".colors";
@@ -115,16 +113,19 @@ void GameDef::AssertSkinsAreComplete()
GetSkinNames( asSkinNames ); GetSkinNames( asSkinNames );
for( int i=0; i<asSkinNames.GetSize(); i++ ) for( int i=0; i<asSkinNames.GetSize(); i++ )
AssertSkinIsComplete( asSkinNames[i] );
}
void GameDef::AssertSkinIsComplete( CString sSkin )
{ {
CString sSkin = asSkinNames[i];
CString sGameSkinFolder = "Skins\\" + sSkin + "\\"; CString sGameSkinFolder = "Skins\\" + sSkin + "\\";
for( int i=0; i<NUM_GAME_BUTTON_GRAPHICS; i++ ) for( int j=0; j<NUM_GAME_BUTTON_GRAPHICS; j++ )
{ {
GameButtonGraphic gbg = (GameButtonGraphic)i; SkinElement gbg = (SkinElement)j;
CString sPathToGraphic = GetPathToGraphic( sSkin, INSTRUMENT_1, gbg ); CString sButtonName = m_szButtonNames[j];
CString sPathToGraphic = GetPathToGraphic( sSkin, sButtonName, gbg );
if( !DoesFileExist(sPathToGraphic) ) if( !DoesFileExist(sPathToGraphic) )
throw RageException( "Game button graphic at %s is missing.", sPathToGraphic ); throw RageException( "Game button graphic at %s is missing.", sPathToGraphic );
} }
} }
}
+5 -4
View File
@@ -20,7 +20,7 @@
const int MAX_STYLES_PER_GAME = 10; const int MAX_STYLES_PER_GAME = 10;
enum GameButtonGraphic { enum SkinElement {
GRAPHIC_NOTE_COLOR_PART, GRAPHIC_NOTE_COLOR_PART,
GRAPHIC_NOTE_GRAY_PART, GRAPHIC_NOTE_GRAY_PART,
GRAPHIC_RECEPTOR, GRAPHIC_RECEPTOR,
@@ -57,10 +57,11 @@ public:
void GetSkinNames( CStringArray &asSkinNames ); void GetSkinNames( CStringArray &asSkinNames );
bool HasASkinNamed( CString sSkin ); bool HasASkinNamed( CString sSkin );
void AssertSkinsAreComplete(); void AssertSkinsAreComplete();
void AssertSkinIsComplete( CString sSkin );
CString GetPathToGraphic( const CString sSkinName, const int iInstrumentButton, const GameButtonGraphic gbg ); CString GetPathToGraphic( const CString sSkinName, const CString sButtonName, const SkinElement gbg );
void GetTweenColors( const CString sSkinName, const int iInstrumentButton, CArray<D3DXCOLOR,D3DXCOLOR> &arrayTweenColors ); void GetTweenColors( const CString sSkinName, const CString sButtonName, CArray<D3DXCOLOR,D3DXCOLOR> &arrayTweenColors );
CString ElementToGraphicSuffix( const GameButtonGraphic gbg ); CString ElementToGraphicSuffix( const SkinElement gbg );
inline MenuInput GameInputToMenuInput( const GameInput GameI ) inline MenuInput GameInputToMenuInput( const GameInput GameI )
+71 -41
View File
@@ -12,10 +12,13 @@
#include "GameManager.h" #include "GameManager.h"
#include "PrefsManager.h" #include "PrefsManager.h"
#include "GameConstantsAndTypes.h"
#include "GameState.h"
GameManager* GAMEMAN = NULL; // global and accessable from anywhere in our program GameManager* GAMEMAN = NULL; // global and accessable from anywhere in our program
InstrumentButton DANCE_BUTTON_LEFT = (InstrumentButton)0; InstrumentButton DANCE_BUTTON_LEFT = (InstrumentButton)0;
InstrumentButton DANCE_BUTTON_RIGHT = (InstrumentButton)1; InstrumentButton DANCE_BUTTON_RIGHT = (InstrumentButton)1;
InstrumentButton DANCE_BUTTON_UP = (InstrumentButton)2; InstrumentButton DANCE_BUTTON_UP = (InstrumentButton)2;
@@ -584,34 +587,28 @@ StyleDef g_StyleDefs[NUM_STYLES] =
GameManager::GameManager() GameManager::GameManager()
{ {
m_CurGame = GAME_DANCE;
m_CurStyle = STYLE_NONE;
CStringArray asSkinNames;
GetSkinNames( asSkinNames );
m_sCurrentSkin = PREFSMAN->m_sNoteSkin;
for( int i=0; i<asSkinNames.GetSize(); i++ )
{
if( m_sCurrentSkin == asSkinNames[i] )
goto skin_exists;
}
m_sCurrentSkin = asSkinNames[0];
skin_exists:
m_sMasterPlayerNumber = PLAYER_1;
} }
GameDef* GameManager::GetCurrentGameDef() GameDef* GameManager::GetGameDefForGame( Game g )
{ {
return &g_GameDefs[ m_CurGame ]; ASSERT( g != GAME_INVALID );
return &g_GameDefs[ g ];
} }
StyleDef* GameManager::GetCurrentStyleDef() StyleDef* GameManager::GetStyleDefForStyle( Style s )
{ {
ASSERT( m_CurStyle != STYLE_NONE ); ASSERT( s != STYLE_NONE );
return &g_StyleDefs[ m_CurStyle ]; return &g_StyleDefs[ s ];
}
Style GameManager::GetStyleThatPlaysNotesType( NotesType nt )
{
for( int i=0; i<NUM_STYLES; i++ )
if( g_StyleDefs[i].m_NotesType == nt )
return (Style)i;
return STYLE_NONE;
} }
void GameManager::GetGameNames( CStringArray &AddTo ) void GameManager::GetGameNames( CStringArray &AddTo )
@@ -620,31 +617,64 @@ void GameManager::GetGameNames( CStringArray &AddTo )
AddTo.Add( g_GameDefs[i].m_szName ); AddTo.Add( g_GameDefs[i].m_szName );
} }
void GameManager::GetSkinNames( CStringArray &AddTo )
void GameManager::GetNoteSkinNames( CStringArray &AddTo )
{ {
GetCurrentGameDef()->GetSkinNames( AddTo ); GAMESTATE->GetCurrentGameDef()->GetSkinNames( AddTo );
} }
bool GameManager::IsPlayerEnabled( PlayerNumber pn ) bool GameManager::DoesNoteSkinExist( CString sSkinName )
{ {
if( m_CurStyle == STYLE_NONE ) // if no style set (we're in TitleMenu, ConfigInstruments or something) CStringArray asSkinNames;
return true; // allow input from both sides GetNoteSkinNames( asSkinNames );
for( int i=0; i<asSkinNames.GetSize(); i++ )
return ( pn == m_sMasterPlayerNumber ) || if( 0==stricmp(sSkinName, asSkinNames[i]) )
( GetCurrentStyleDef()->m_StyleType == StyleDef::TWO_PLAYERS_USE_TWO_SIDES ); return true;
}; return false;
CString GameManager::GetPathToGraphic( const PlayerNumber p, const int col, const GameButtonGraphic gbg )
{
StyleInput si( p, col );
GameInput gi = GetCurrentStyleDef()->StyleInputToGameInput( si );
InstrumentButton b = gi.button;
return GetCurrentGameDef()->GetPathToGraphic( m_sCurrentSkin, b, gbg );
} }
void GameManager::GetTweenColors( const PlayerNumber p, const int col, CArray<D3DXCOLOR,D3DXCOLOR> &aTweenColorsAddTo ) void GameManager::SwitchNoteSkin( CString sNewNoteSkin )
{ {
StyleInput StyleI( p, col ); if( sNewNoteSkin == "" || !DoesNoteSkinExist(sNewNoteSkin) )
GameInput GameI = GetCurrentStyleDef()->StyleInputToGameInput( StyleI ); {
GetCurrentGameDef()->GetTweenColors( m_sCurrentSkin, GameI.button, aTweenColorsAddTo ); CStringArray as;
GetNoteSkinNames( as );
m_sCurNoteSkin = as[0];
}
else
m_sCurNoteSkin = sNewNoteSkin;
}
CString GameManager::GetPathTo( Game g, CString sSkinName, CString sButtonName, const SkinElement gbg )
{
return GetGameDefForGame(g)->GetPathToGraphic( sSkinName, sButtonName, gbg );
}
void GameManager::GetTweenColors( Game g, CString sSkinName, CString sButtonName, CArray<D3DXCOLOR,D3DXCOLOR> &aTweenColorsAddTo )
{
GetGameDefForGame(g)->GetTweenColors( sSkinName, sButtonName, aTweenColorsAddTo );
}
CString GameManager::GetPathTo( const int col, const SkinElement gbg ) // looks in GAMESTATE for the current Style
{
StyleDef* pStyleDef = GAMESTATE->GetCurrentStyleDef();
GameDef* pGameDef = GAMESTATE->GetCurrentGameDef();
StyleInput SI( PLAYER_1, col );
GameInput GI = pStyleDef->StyleInputToGameInput( SI );
CString sButtonName = pGameDef->m_szButtonNames[GI.button];
return pGameDef->GetPathToGraphic( m_sCurNoteSkin, sButtonName, gbg );
}
void GameManager::GetTweenColors( const int col, CArray<D3DXCOLOR,D3DXCOLOR> &aTweenColorsAddTo ) // looks in GAMESTATE for the current Style
{
ASSERT( m_sCurNoteSkin != "" ); // if this == NULL, SwitchGame() was never called
StyleDef* pStyleDef = GAMESTATE->GetCurrentStyleDef();
GameDef* pGameDef = GAMESTATE->GetCurrentGameDef();
StyleInput SI( PLAYER_1, col );
GameInput GI = pStyleDef->StyleInputToGameInput( SI );
CString sButtonName = pGameDef->m_szButtonNames[GI.button];
pGameDef->GetTweenColors( m_sCurNoteSkin, sButtonName, aTweenColorsAddTo );
} }
+21 -14
View File
@@ -14,28 +14,35 @@
#include "StyleDef.h" #include "StyleDef.h"
const int MAX_GAME_DEFS = 10;
class GameManager class GameManager
{ {
public: public:
GameManager(); GameManager();
Game m_CurGame; GameDef* GetGameDefForGame( Game g );
Style m_CurStyle; StyleDef* GetStyleDefForStyle( Style s );
NotesType m_CurNotesType; // only used in Edit
CString m_sCurrentSkin;
PlayerNumber m_sMasterPlayerNumber;
GameDef* GetCurrentGameDef(); Style GetStyleThatPlaysNotesType( NotesType nt );
StyleDef* GetCurrentStyleDef();
void GetGameNames( CStringArray &AddTo ); void GetGameNames( CStringArray &AddTo );
void GetSkinNames( CStringArray &AddTo ); bool DoesGameExist( CString sGameName );
bool IsPlayerEnabled( PlayerNumber PlayerNo ); void SwitchGame( Game newGame );
CString GetPathToGraphic( const PlayerNumber p, const int col, const GameButtonGraphic gbg );
void GetTweenColors( const PlayerNumber p, const int col, CArray<D3DXCOLOR,D3DXCOLOR> &aTweenColorsAddTo ); void GetNoteSkinNames( CStringArray &AddTo ); // looks up current Game in GAMESTATE
bool DoesNoteSkinExist( CString sSkinName ); // looks up current Game in GAMESTATE
void SwitchNoteSkin( CString sNewNoteSkin ); // looks up current Game in GAMESTATE
CString GetCurNoteSkin() { return m_sCurNoteSkin; };
CString GetPathTo( const int col, const SkinElement gbg ); // looks in GAMESTATE for the current Style
void GetTweenColors( const int col, CArray<D3DXCOLOR,D3DXCOLOR> &aTweenColorsAddTo ); // looks in GAMESTATE for the current Style
protected:
CString GetPathTo( Game g, CString sSkinName, CString sButtonName, const SkinElement gbg );
void GetTweenColors( Game g, CString sSkinName, CString sButtonName, CArray<D3DXCOLOR,D3DXCOLOR> &aTweenColorsAddTo );
CString m_sCurNoteSkin;
}; };
extern GameManager* GAMEMAN; // global and accessable from anywhere in our program extern GameManager* GAMEMAN; // global and accessable from anywhere in our program
+154
View File
@@ -0,0 +1,154 @@
#include "stdafx.h"
/*
-----------------------------------------------------------------------------
Class: GameState
Desc: See Header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "GameState.h"
#include "IniFile.h"
#include "GameManager.h"
#include "PrefsManager.h"
#include "InputMapper.h"
GameState* GAMESTATE = NULL; // global and accessable from anywhere in our program
GameState::GameState()
{
m_sLoadingMessage = "Initializing hardware...";
Reset();
}
GameState::~GameState()
{
}
void GameState::Reset()
{
int p;
m_pCurSong = NULL;
for( p=0; p<NUM_PLAYERS; p++ )
m_pCurNotes[p] = NULL;
m_pCurCourse = NULL;
m_sPreferredGroup = "";
m_aGameplayStatistics.RemoveAll();
m_CurGame = GAME_DANCE;
m_CurStyle = STYLE_NONE;
m_MasterPlayerNumber = PLAYER_INVALID;
for( p=0; p<NUM_PLAYERS; p++ )
m_PreferredDifficultyClass[p] = CLASS_EASY;
m_SongSortOrder = SORT_GROUP;
m_PlayMode = PLAY_MODE_INVALID;
m_iCurrentStageIndex = 0;
}
void GameState::SwitchGame( Game newGame )
{
ASSERT( newGame >= 0 && newGame < NUM_GAMES );
m_CurGame = newGame;
}
int GameState::GetStageIndex()
{
return m_iCurrentStageIndex;
}
bool GameState::IsFinalStage()
{
if( PREFSMAN->m_bEventMode )
return false;
return m_iCurrentStageIndex == PREFSMAN->m_iNumArcadeStages-1;
}
bool GameState::IsExtraStage()
{
if( PREFSMAN->m_bEventMode )
return false;
return m_iCurrentStageIndex == PREFSMAN->m_iNumArcadeStages;
}
bool GameState::IsExtraStage2()
{
if( PREFSMAN->m_bEventMode )
return false;
return m_iCurrentStageIndex == PREFSMAN->m_iNumArcadeStages+1;
}
CString GameState::GetStageText()
{
if( IsFinalStage() )
return "Final";
else if( IsExtraStage() )
return "Extra";
else if( IsExtraStage2() )
return "Extra 2";
int iStageNo = m_iCurrentStageIndex+1;
CString sNumberSuffix;
if( ( (iStageNo/10) % 10 ) == 1 ) // in the teens (e.g. 19, 213)
{
sNumberSuffix = "th";
}
else // not in the teens
{
const int iLastDigit = iStageNo%10;
switch( iLastDigit )
{
case 1: sNumberSuffix = "st"; break;
case 2: sNumberSuffix = "nd"; break;
case 3: sNumberSuffix = "rd"; break;
default:sNumberSuffix = "th"; break;
}
}
return ssprintf( "%d%s", iStageNo, sNumberSuffix );
}
D3DXCOLOR GameState::GetStageColor()
{
if( IsFinalStage() )
return D3DXCOLOR(1,0.1f,0.1f,1); // red
else if( IsExtraStage() || IsExtraStage2() )
return D3DXCOLOR(1,1,0.3f,1); // yellow
else
return D3DXCOLOR(0.3f,1,0.3f,1); // green
}
GameplayStatistics& GameState::GetLatestGameplayStatistics()
{
ASSERT( m_aGameplayStatistics.GetSize() > 0 );
return m_aGameplayStatistics[ m_aGameplayStatistics.GetSize()-1 ];
}
GameDef* GameState::GetCurrentGameDef()
{
return GAMEMAN->GetGameDefForGame( m_CurGame );
}
StyleDef* GameState::GetCurrentStyleDef()
{
return GAMEMAN->GetStyleDefForStyle( m_CurStyle );
}
bool GameState::IsPlayerEnabled( PlayerNumber pn )
{
if( m_CurStyle == STYLE_NONE ) // if no style set (we're in TitleMenu, ConfigInstruments or something)
return true; // allow input from both sides
return ( pn == m_MasterPlayerNumber ) ||
( GetCurrentStyleDef()->m_StyleType == StyleDef::TWO_PLAYERS_USE_TWO_SIDES );
};
+81
View File
@@ -0,0 +1,81 @@
#pragma once
/*
-----------------------------------------------------------------------------
Class: GameState
Desc: Holds game data that is not saved between sessions.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "GameConstantsAndTypes.h"
#include "GameplayStatistics.h"
class Song;
struct Notes;
class Course;
class GameDef;
class StyleDef;
class GameState
{
public:
GameState();
~GameState();
void Reset();
Song* m_pCurSong;
Notes* m_pCurNotes[NUM_PLAYERS];
Course* m_pCurCourse;
int m_iCoursePossibleDancePoints;
// Info used during gameplay
// Let lots of classes access the music beat here so we don't have to pass it around everywhere
float m_fMusicSeconds;
float m_fMusicBeat;
float m_fCurBPS;
bool m_bFreeze;
CArray<GameplayStatistics,GameplayStatistics> m_aGameplayStatistics; // for passing from Dancing to Results
GameplayStatistics& GetLatestGameplayStatistics();
protected:
Game m_CurGame;
public:
Game GetCurGame() { return m_CurGame; };
void SwitchGame( Game newGame );
Style m_CurStyle;
PlayerNumber m_MasterPlayerNumber;
GameDef* GetCurrentGameDef();
StyleDef* GetCurrentStyleDef();
bool IsPlayerEnabled( PlayerNumber pn );
//bool IsPlayerEnabled( int p ) { return IsPlayerEnabled( (PlayerNumber)p ); }; // for those too lasy to cast all those p's to a PlayerNumber
CString m_sLoadingMessage;
CString m_sPreferredGroup;
DifficultyClass m_PreferredDifficultyClass[NUM_PLAYERS];
SongSortOrder m_SongSortOrder; // used by MusicWheel
PlayMode m_PlayMode;
int m_iCurrentStageIndex; // starts at 0, and is incremented with each Stage Clear
int GetStageIndex();
bool IsFinalStage();
bool IsExtraStage();
bool IsExtraStage2();
CString GetStageText();
D3DXCOLOR GetStageColor();
PlayerOptions m_PlayerOptions[NUM_PLAYERS];
SongOptions m_SongOptions;
};
extern GameState* GAMESTATE; // global and accessable from anywhere in our program
+1 -1
View File
@@ -5,7 +5,7 @@
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
#include "GhostArrow.h" #include "GhostArrow.h"
#include "ThemeManager.h" #include "PrefsManager.h"
const float GRAY_ARROW_TWEEN_TIME = 0.5f; const float GRAY_ARROW_TWEEN_TIME = 0.5f;
+1 -1
View File
@@ -5,7 +5,7 @@
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
#include "GhostArrowBright.h" #include "GhostArrowBright.h"
#include "ThemeManager.h" #include "PrefsManager.h"
const float GRAY_ARROW_TWEEN_TIME = 0.5f; const float GRAY_ARROW_TWEEN_TIME = 0.5f;
+7 -6
View File
@@ -12,11 +12,12 @@
#include "GhostArrowRow.h" #include "GhostArrowRow.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "ColorNote.h" #include "ColorNote.h"
#include "ArrowEffects.h" #include "ArrowEffects.h"
#include "GameManager.h" #include "GameManager.h"
#include "GameState.h"
#include "PrefsManager.h"
GhostArrowRow::GhostArrowRow() GhostArrowRow::GhostArrowRow()
@@ -28,16 +29,16 @@ void GhostArrowRow::Load( PlayerNumber pn, StyleDef* pStyleDef, PlayerOptions po
{ {
m_PlayerOptions = po; m_PlayerOptions = po;
GameDef* pGameDef = GAMEMAN->GetCurrentGameDef(); GameDef* pGameDef = GAMESTATE->GetCurrentGameDef();
m_iNumCols = pStyleDef->m_iColsPerPlayer; m_iNumCols = pStyleDef->m_iColsPerPlayer;
// init arrows // init arrows
for( int c=0; c<m_iNumCols; c++ ) for( int c=0; c<m_iNumCols; c++ )
{ {
m_GhostArrowRow[c].Load( GAMEMAN->GetPathToGraphic(pn, c, GRAPHIC_TAP_EXPLOSION_DIM) ); m_GhostArrowRow[c].Load( GAMEMAN->GetPathTo(c, GRAPHIC_TAP_EXPLOSION_DIM) );
m_GhostArrowRowBright[c].Load( GAMEMAN->GetPathToGraphic(pn, c, GRAPHIC_TAP_EXPLOSION_BRIGHT) ); m_GhostArrowRowBright[c].Load( GAMEMAN->GetPathTo(c, GRAPHIC_TAP_EXPLOSION_BRIGHT) );
m_HoldGhostArrowRow[c].Load( GAMEMAN->GetPathToGraphic(pn, c, GRAPHIC_HOLD_EXPLOSION) ); m_HoldGhostArrowRow[c].Load( GAMEMAN->GetPathTo(c, GRAPHIC_HOLD_EXPLOSION) );
m_GhostArrowRow[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset ); m_GhostArrowRow[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset );
m_GhostArrowRowBright[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset ); m_GhostArrowRowBright[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset );
+1 -1
View File
@@ -15,7 +15,7 @@
#include "GradeDisplay.h" #include "GradeDisplay.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
const float SCROLL_TIME = 5.0f; const float SCROLL_TIME = 5.0f;
+1 -1
View File
@@ -12,7 +12,7 @@
#include "Sprite.h" #include "Sprite.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "Grade.h" #include "Grade.h"
+1 -1
View File
@@ -12,7 +12,7 @@
*/ */
#include "GrayArrow.h" #include "GrayArrow.h"
#include "ThemeManager.h" #include "PrefsManager.h"
const float GRAY_ARROW_POP_UP_TIME = 0.15f; const float GRAY_ARROW_POP_UP_TIME = 0.15f;
+5 -3
View File
@@ -13,10 +13,12 @@
#include "GrayArrowRow.h" #include "GrayArrowRow.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "ColorNote.h" #include "ColorNote.h"
#include "ArrowEffects.h" #include "ArrowEffects.h"
#include "GameManager.h" #include "GameManager.h"
#include "GameState.h"
#include "PrefsManager.h"
GrayArrowRow::GrayArrowRow() GrayArrowRow::GrayArrowRow()
@@ -28,13 +30,13 @@ void GrayArrowRow::Load( PlayerNumber pn, StyleDef* pStyleDef, PlayerOptions po
{ {
m_PlayerOptions = po; m_PlayerOptions = po;
GameDef* pGameDef = GAMEMAN->GetCurrentGameDef(); GameDef* pGameDef = GAMESTATE->GetCurrentGameDef();
m_iNumCols = pStyleDef->m_iColsPerPlayer; m_iNumCols = pStyleDef->m_iColsPerPlayer;
for( int c=0; c<m_iNumCols; c++ ) for( int c=0; c<m_iNumCols; c++ )
{ {
m_GrayArrow[c].Load( GAMEMAN->GetPathToGraphic(pn, c, GRAPHIC_RECEPTOR) ); m_GrayArrow[c].Load( GAMEMAN->GetPathTo(c, GRAPHIC_RECEPTOR) );
m_GrayArrow[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset ); m_GrayArrow[c].SetX( pStyleDef->m_ColumnInfo[pn][c].fXOffset );
} }
+4 -4
View File
@@ -13,7 +13,7 @@
#include "RageUtil.h" #include "RageUtil.h"
#include "GrooveRadar.h" #include "GrooveRadar.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "RageBitmapTexture.h" #include "RageBitmapTexture.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
@@ -22,7 +22,7 @@ float RADAR_VALUE_ROTATION( int iValueIndex ) { return D3DX_PI/2 + D3DX_PI*2 / 5
GrooveRadar::GrooveRadar() GrooveRadar::GrooveRadar()
{ {
this->AddActor( &m_GrooveRadarValueMap ); this->AddSubActor( &m_GrooveRadarValueMap );
for( int c=0; c<NUM_RADAR_CATEGORIES; c++ ) for( int c=0; c<NUM_RADAR_CATEGORIES; c++ )
{ {
@@ -48,7 +48,7 @@ GrooveRadar::GrooveRadar()
m_sprRadarLabels[c].StopAnimating(); m_sprRadarLabels[c].StopAnimating();
m_sprRadarLabels[c].SetState( c ); m_sprRadarLabels[c].SetState( c );
m_sprRadarLabels[c].SetXY( fX, fY ); m_sprRadarLabels[c].SetXY( fX, fY );
this->AddActor( &m_sprRadarLabels[c] ); this->AddSubActor( &m_sprRadarLabels[c] );
} }
} }
@@ -88,7 +88,7 @@ void GrooveRadar::TweenOffScreen()
GrooveRadar::GrooveRadarValueMap::GrooveRadarValueMap() GrooveRadar::GrooveRadarValueMap::GrooveRadarValueMap()
{ {
m_sprRadarBase.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_RADAR_BASE) ); m_sprRadarBase.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_RADAR_BASE) );
this->AddActor( &m_sprRadarBase ); this->AddSubActor( &m_sprRadarBase );
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
+1 -1
View File
@@ -5,7 +5,7 @@
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
#include "HoldGhostArrow.h" #include "HoldGhostArrow.h"
#include "ThemeManager.h" #include "PrefsManager.h"
const float HOLD_GHOST_ARROW_TWEEN_TIME = 0.5f; const float HOLD_GHOST_ARROW_TWEEN_TIME = 0.5f;
+2 -2
View File
@@ -12,7 +12,7 @@
#include "HoldJudgement.h" #include "HoldJudgement.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
const float JUDGEMENT_DISPLAY_TIME = 0.6f; const float JUDGEMENT_DISPLAY_TIME = 0.6f;
@@ -24,7 +24,7 @@ HoldJudgement::HoldJudgement()
m_sprJudgement.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_JUDGEMENT) ); m_sprJudgement.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_JUDGEMENT) );
m_sprJudgement.StopAnimating(); m_sprJudgement.StopAnimating();
m_sprJudgement.TurnShadowOn(); m_sprJudgement.TurnShadowOn();
this->AddActor( &m_sprJudgement ); this->AddSubActor( &m_sprJudgement );
} }
void HoldJudgement::Update( float fDeltaTime ) void HoldJudgement::Update( float fDeltaTime )
+1 -1
View File
@@ -17,7 +17,7 @@
#include "ActorFrame.h" #include "ActorFrame.h"
#include "Song.h" #include "Song.h"
#include "BitmapText.h" #include "BitmapText.h"
#include "ThemeManager.h" #include "PrefsManager.h"
class HoldJudgement : public ActorFrame class HoldJudgement : public ActorFrame
+104 -88
View File
@@ -1,14 +1,16 @@
#include "stdafx.h"
/* /*
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
File: IniFile.h Class: IniFile
Desc: Wrapper for reading and writing an .ini file. Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Adam Clauss
Chris Danford
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#include "stdafx.h"
#include "IniFile.h" #include "IniFile.h"
@@ -45,18 +47,21 @@ void IniFile::SetPath(CString newpath)
//reads ini file specified using IniFile::SetPath() //reads ini file specified using IniFile::SetPath()
//returns true if successful, false otherwise //returns true if successful, false otherwise
BOOL IniFile::ReadFile() bool IniFile::ReadFile()
{ {
CStdioFile file; CStdioFile file;
CFileStatus status;
if (!file.GetStatus(path,status))
return 0;
int curkey = -1, curval = -1;
if (!file.Open(path, CFile::modeRead)) if (!file.Open(path, CFile::modeRead))
{ {
error = "Unable to open ini file."; error = "Unable to open ini file.";
return FALSE; return 0;
} }
CString line;
int curkey = -1, curval = -1;
CString keyname, valuename, value; CString keyname, valuename, value;
CString temp;
CString line;
while (file.ReadString(line)) while (file.ReadString(line))
{ {
if (line != "") if (line != "")
@@ -69,10 +74,7 @@ BOOL IniFile::ReadFile()
} }
else //if a value else //if a value
{ {
int iIndexOfEqual = line.Find("="); valuename = line.Left(line.Find("="));
if( iIndexOfEqual == -1 ) // this is a malformed line
continue;
valuename = line.Left( iIndexOfEqual );
value = line.Right(line.GetLength()-valuename.GetLength()-1); value = line.Right(line.GetLength()-valuename.GetLength()-1);
SetValue(keyname,valuename,value); SetValue(keyname,valuename,value);
} }
@@ -85,36 +87,18 @@ BOOL IniFile::ReadFile()
//writes data stored in class to ini file //writes data stored in class to ini file
void IniFile::WriteFile() void IniFile::WriteFile()
{ {
CStdioFile file; FILE* fp = fopen( path, "w" );
if( !file.Open(path, CFile::modeCreate | CFile::modeWrite ) )
{
error = "Unable to open ini for writing.";
return;
}
// foreach key
for (int keynum = 0; keynum <= names.GetUpperBound(); keynum++) for (int keynum = 0; keynum <= names.GetUpperBound(); keynum++)
{ {
CString sTemp; if (keys[keynum].names.GetSize() != 0)
sTemp.Format( "[%s]\n", names[keynum] );
file.WriteString( sTemp );
CMapStringToString &map = keys[keynum];
// for each value_name/value pair
for( POSITION pos = map.GetStartPosition(); pos != NULL; )
{ {
CString value_name; fprintf( fp, "[%s]\n", names[keynum] );
CString value; for (int valuenum = 0; valuenum <= keys[keynum].names.GetUpperBound(); valuenum++)
map.GetNextAssoc( pos, value_name, value ); fprintf( fp, "%s=%s\n", keys[keynum].names[valuenum], keys[keynum].values[valuenum] );
fprintf( fp, "\n" );
sTemp.Format( "%s=%s\n", value_name, value );
file.WriteString( sTemp );
} }
file.WriteString( "\n" );
} }
fclose( fp );
file.Close();
} }
//deletes all stored ini data //deletes all stored ini data
@@ -130,68 +114,71 @@ int IniFile::GetNumKeys()
return keys.GetSize(); return keys.GetSize();
} }
//returns a pointer to the key for direct modification //returns number of values stored for specified key, or -1 if key found
CMapStringToString* IniFile::GetKeyPointer( CString keyname )
{
int keynum = FindKey(keyname);
if (keynum == -1)
return NULL;
else
return &keys[keynum];
}
//returns number of values stored for specified key, or -1 if key not found
int IniFile::GetNumValues(CString keyname) int IniFile::GetNumValues(CString keyname)
{ {
int keynum = FindKey(keyname); int keynum = FindKey(keyname);
if (keynum == -1) if (keynum == -1)
return -1; return -1;
else else
return keys[keynum].GetCount(); return keys[keynum].names.GetSize();
} }
//gets value of [keyname] valuename = //gets value of [keyname] valuename =
//overloaded to return CString, int, and double //overloaded to return CString, int, and double
bool IniFile::GetValue(CString keyname, CString valuename, CString &value_out) bool IniFile::GetValue(CString keyname, CString valuename, CString& value)
{ {
int keynum = FindKey(keyname);//, valuenum = FindValue(keynum,valuename); int keynum = FindKey(keyname), valuenum = FindValue(keynum,valuename);
if (keynum == -1) if (keynum == -1)
{
error = "Unable to locate specified key.";
return false; return false;
CMapStringToString &map = keys[keynum];
return 1 == map.Lookup(valuename, value_out);
} }
//gets value of [keyname] valuename = if (valuenum == -1)
//overloaded to return CString, int, and double
bool IniFile::GetValueI(CString keyname, CString valuename, int &value_out)
{ {
CString sValue; error = "Unable to locate specified value.";
if( !GetValue(keyname, valuename, sValue) )
return false; return false;
value_out = atoi(sValue); }
value = keys[keynum].values[valuenum];
return true; return true;
} }
//gets value of [keyname] valuename = //gets value of [keyname] valuename =
//overloaded to return CString, int, and double //overloaded to return CString, int, and double
bool IniFile::GetValueF(CString keyname, CString valuename, float &value_out) bool IniFile::GetValueI(CString keyname, CString valuename, int& value)
{ {
CString sValue; CString sValue;
if( !GetValue(keyname, valuename, sValue) ) bool bSuccess = GetValue(keyname,valuename,sValue);
if( !bSuccess )
return false; return false;
value_out = (float)atof(sValue); value = atoi(sValue);
return true; return true;
} }
//gets value of [keyname] valuename = //gets value of [keyname] valuename =
//overloaded to return CString, int, and double //overloaded to return CString, int, and double
bool IniFile::GetValueB(CString keyname, CString valuename, bool &value_out) bool IniFile::GetValueF(CString keyname, CString valuename, float& value)
{ {
CString sValue; CString sValue;
if( !GetValue(keyname, valuename, sValue) ) bool bSuccess = GetValue(keyname,valuename,sValue);
if( !bSuccess )
return false; return false;
value_out = sValue == "1"; value = (float)atof(sValue);
return true;
}
//gets value of [keyname] valuename =
//overloaded to return CString, int, and double
bool IniFile::GetValueB(CString keyname, CString valuename, bool& value)
{
CString sValue;
bool bSuccess = GetValue(keyname,valuename,sValue);
if( !bSuccess )
return false;
value = atoi(sValue) != 0;
return true; return true;
} }
@@ -199,34 +186,40 @@ bool IniFile::GetValueB(CString keyname, CString valuename, bool &value_out)
//specify the optional paramter as false (0) if you do not want it to create //specify the optional paramter as false (0) if you do not want it to create
//the key if it doesn't exist. Returns true if data entered, false otherwise //the key if it doesn't exist. Returns true if data entered, false otherwise
//overloaded to accept CString, int, and double //overloaded to accept CString, int, and double
bool IniFile::SetValue(CString keyname, CString valuename, CString value, BOOL create) bool IniFile::SetValue(CString keyname, CString valuename, CString value, bool create)
{ {
int keynum = FindKey(keyname); int keynum = FindKey(keyname), valuenum = 0;
//find key
if (keynum == -1) //if key doesn't exist if (keynum == -1) //if key doesn't exist
{ {
if (!create) //and user does not want to create it, if (!create) //and user does not want to create it,
return FALSE; //stop entering this key return 0; //stop entering this key
names.SetSize(names.GetSize()+1); names.SetSize(names.GetSize()+1);
keys.SetSize(keys.GetSize()+1); keys.SetSize(keys.GetSize()+1);
keynum = names.GetSize()-1; keynum = names.GetSize()-1;
names[keynum] = keyname; names[keynum] = keyname;
} }
// insert value //find value
CMapStringToString &map = keys[keynum]; valuenum = FindValue(keynum,valuename);
CString oldvalue; if (valuenum == -1)
if( !map.Lookup(valuename, oldvalue) && !create ) {
return FALSE; if (!create)
map[valuename] = value; return 0;
return TRUE; keys[keynum].names.SetSize(keys[keynum].names.GetSize()+1);
keys[keynum].values.SetSize(keys[keynum].names.GetSize()+1);
valuenum = keys[keynum].names.GetSize()-1;
keys[keynum].names[valuenum] = valuename;
}
keys[keynum].values[valuenum] = value;
return 1;
} }
//sets value of [keyname] valuename =. //sets value of [keyname] valuename =.
//specify the optional paramter as false (0) if you do not want it to create //specify the optional paramter as false (0) if you do not want it to create
//the key if it doesn't exist. Returns true if data entered, false otherwise //the key if it doesn't exist. Returns true if data entered, false otherwise
//overloaded to accept CString, int, and double //overloaded to accept CString, int, and double
bool IniFile::SetValueI(CString keyname, CString valuename, int value, BOOL create) bool IniFile::SetValueI(CString keyname, CString valuename, int value, bool create)
{ {
CString temp; CString temp;
temp.Format("%d",value); temp.Format("%d",value);
@@ -237,10 +230,10 @@ bool IniFile::SetValueI(CString keyname, CString valuename, int value, BOOL crea
//specify the optional paramter as false (0) if you do not want it to create //specify the optional paramter as false (0) if you do not want it to create
//the key if it doesn't exist. Returns true if data entered, false otherwise //the key if it doesn't exist. Returns true if data entered, false otherwise
//overloaded to accept CString, int, and double //overloaded to accept CString, int, and double
bool IniFile::SetValueF(CString keyname, CString valuename, double value, BOOL create) bool IniFile::SetValueF(CString keyname, CString valuename, float value, bool create)
{ {
CString temp; CString temp;
temp.Format("%f",value); temp.Format("%e",value);
return SetValue(keyname, valuename, temp, create); return SetValue(keyname, valuename, temp, create);
} }
@@ -248,7 +241,7 @@ bool IniFile::SetValueF(CString keyname, CString valuename, double value, BOOL c
//specify the optional paramter as false (0) if you do not want it to create //specify the optional paramter as false (0) if you do not want it to create
//the key if it doesn't exist. Returns true if data entered, false otherwise //the key if it doesn't exist. Returns true if data entered, false otherwise
//overloaded to accept CString, int, and double //overloaded to accept CString, int, and double
bool IniFile::SetValueB(CString keyname, CString valuename, bool value, BOOL create) bool IniFile::SetValueB(CString keyname, CString valuename, bool value, bool create)
{ {
CString temp; CString temp;
temp.Format("%d",value); temp.Format("%d",value);
@@ -257,19 +250,20 @@ bool IniFile::SetValueB(CString keyname, CString valuename, bool value, BOOL cre
//deletes specified value //deletes specified value
//returns true if value existed and deleted, false otherwise //returns true if value existed and deleted, false otherwise
BOOL IniFile::DeleteValue(CString keyname, CString valuename) bool IniFile::DeleteValue(CString keyname, CString valuename)
{ {
int keynum = FindKey(keyname); int keynum = FindKey(keyname), valuenum = FindValue(keynum,valuename);
if( keynum == -1 ) if (keynum == -1 || valuenum == -1)
return FALSE; return 0;
CMapStringToString &map = keys[keynum]; keys[keynum].names.RemoveAt(valuenum);
return map.RemoveKey( valuename ); keys[keynum].values.RemoveAt(valuenum);
return 1;
} }
//deletes specified key and all values contained within //deletes specified key and all values contained within
//returns true if key existed and deleted, false otherwise //returns true if key existed and deleted, false otherwise
BOOL IniFile::DeleteKey(CString keyname) bool IniFile::DeleteKey(CString keyname)
{ {
int keynum = FindKey(keyname); int keynum = FindKey(keyname);
if (keynum == -1) if (keynum == -1)
@@ -279,6 +273,16 @@ BOOL IniFile::DeleteKey(CString keyname)
return 1; return 1;
} }
//deletes specified key and all values contained within
//returns true if key existed and deleted, false otherwise
IniFile::key* IniFile::GetKey(CString keyname)
{
int keynum = FindKey(keyname);
if (keynum == -1)
return NULL;
return &keys[keynum];
}
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
// Private Functions // Private Functions
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
@@ -294,3 +298,15 @@ int IniFile::FindKey(CString keyname)
return keynum; return keynum;
} }
//returns index of specified value, in the specified key, or -1 if not found
int IniFile::FindValue(int keynum, CString valuename)
{
if (keynum == -1)
return -1;
int valuenum = 0;
while (valuenum < keys[keynum].names.GetSize() && keys[keynum].names[valuenum] != valuename)
valuenum++;
if (valuenum == keys[keynum].names.GetSize())
return -1;
return valuenum;
}
+29 -28
View File
@@ -1,21 +1,16 @@
#pragma once
/* /*
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
File: IniFile.h Class: IniFile
Desc: Wrapper for reading and writing an .ini file. Desc: Wrapper for reading and writing an .ini file.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Adam Clauss
Chris Danford
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#ifndef _INIFILE_H_
#define _INIFILE_H_
#include <afxtempl.h>
//#include <iostream.h>
class IniFile class IniFile
{ {
//all private variables //all private variables
@@ -24,9 +19,18 @@ private:
//stores pathname of ini file to read/write //stores pathname of ini file to read/write
CString path; CString path;
public:
//all keys are of this time //all keys are of this time
typedef CMapStringToString key; struct key
{
//list of values in key
CArray<CString, CString> values;
//corresponding list of value names
CArray<CString, CString> names;
};
private:
//list of keys in ini //list of keys in ini
CArray<key, key> keys; CArray<key, key> keys;
@@ -34,9 +38,10 @@ private:
CArray<CString, CString> names; CArray<CString, CString> names;
//all private functions //all private functions
private: private:
//returns index of specified value, in the specified key, or -1 if not found
int FindValue(int keynum, CString valuename);
//returns index of specified key, or -1 if not found //returns index of specified key, or -1 if not found
int FindKey(CString keyname); int FindKey(CString keyname);
@@ -66,7 +71,7 @@ public:
//reads ini file specified using IniFile::SetPath() //reads ini file specified using IniFile::SetPath()
//returns true if successful, false otherwise //returns true if successful, false otherwise
BOOL ReadFile(); bool ReadFile();
//writes data stored in class to ini file //writes data stored in class to ini file
void WriteFile(); void WriteFile();
@@ -77,37 +82,33 @@ public:
//returns number of keys currently in the ini //returns number of keys currently in the ini
int GetNumKeys(); int GetNumKeys();
//returns a pointer to the key for direct modification
CMapStringToString* GetKeyPointer( CString keyname );
//returns number of values stored for specified key //returns number of values stored for specified key
int GetNumValues(CString keyname); int GetNumValues(CString keyname);
//gets value of [keyname] valuename = //gets value of [keyname] valuename =
//overloaded to return CString, int, and double, //overloaded to return CString, int, and double,
//returns "", or 0 if key/value not found. Sets error member to show problem //returns "", or 0 if key/value not found. Sets error member to show problem
bool GetValue(CString keyname, CString valuename, CString &value_out); bool GetValue(CString key, CString valuename, CString& value);
bool GetValueI(CString keyname, CString valuename, int &value_out); bool GetValueI(CString key, CString valuename, int& value);
bool GetValueF(CString keyname, CString valuename, float &value_out); bool GetValueF(CString key, CString valuename, float& value);
bool GetValueB(CString keyname, CString valuename, bool &value_out); bool GetValueB(CString key, CString valuename, bool& value);
//sets value of [keyname] valuename =. //sets value of [keyname] valuename =.
//specify the optional paramter as false (0) if you do not want it to create //specify the optional paramter as false (0) if you do not want it to create
//the key if it doesn't exist. Returns true if data entered, false otherwise //the key if it doesn't exist. Returns true if data entered, false otherwise
//overloaded to accept CString, int, and double //overloaded to accept CString, int, and double
bool SetValue(CString key, CString valuename, CString value, BOOL create = 1); bool SetValue(CString key, CString valuename, CString value, bool create = 1);
bool SetValueI(CString key, CString valuename, int value, BOOL create = 1); bool SetValueI(CString key, CString valuename, int value, bool create = 1);
bool SetValueF(CString key, CString valuename, double value, BOOL create = 1); bool SetValueF(CString key, CString valuename, float value, bool create = 1);
bool SetValueB(CString key, CString valuename, bool value, BOOL create = 1); bool SetValueB(CString key, CString valuename, bool value, bool create = 1);
//deletes specified value //deletes specified value
//returns true if value existed and deleted, false otherwise //returns true if value existed and deleted, false otherwise
BOOL DeleteValue(CString keyname, CString valuename); bool DeleteValue(CString keyname, CString valuename);
//deletes specified key and all values contained within //deletes specified key and all values contained within
//returns true if key existed and deleted, false otherwise //returns true if key existed and deleted, false otherwise
BOOL DeleteKey(CString keyname); bool DeleteKey(CString keyname);
key* GetKey(CString keyname);
}; };
#endif
+16 -19
View File
@@ -13,6 +13,7 @@
#include "InputMapper.h" #include "InputMapper.h"
#include "IniFile.h" #include "IniFile.h"
#include "GameManager.h" #include "GameManager.h"
#include "GameState.h"
InputMapper* INPUTMAPPER = NULL; // global and accessable from anywhere in our program InputMapper* INPUTMAPPER = NULL; // global and accessable from anywhere in our program
@@ -20,9 +21,6 @@ InputMapper* INPUTMAPPER = NULL; // global and accessable from anywhere in our p
InputMapper::InputMapper() InputMapper::InputMapper()
{ {
m_sCurrentGame = GAMEMAN->GetCurrentGameDef()->m_szName;
ReadMappingsFromDisk();
} }
@@ -38,26 +36,26 @@ void InputMapper::ReadMappingsFromDisk()
ASSERT( GAMEMAN != NULL ); ASSERT( GAMEMAN != NULL );
IniFile ini; IniFile ini;
ini.SetPath( m_sCurrentGame + ".ini" ); ini.SetPath( GAMESTATE->GetCurrentGameDef()->m_szName + CString("Map.ini") );
if( !ini.ReadFile() ) { if( !ini.ReadFile() ) {
return; // load nothing return; // load nothing
//throw RageException( "could not read config file" ); //throw RageException( "could not read config file" );
} }
CMapStringToString* pKey = ini.GetKeyPointer("Input"); IniFile::key* pKey = ini.GetKey( "Input" );
CString name_string, value_string;
if( pKey != NULL ) if( pKey == NULL )
return;
for( int i=0; i<pKey->names.GetSize(); i++ )
{ {
for( POSITION pos = pKey->GetStartPosition(); pos != NULL; ) CString name = pKey->names[i];
{ CString value = pKey->values[i];
pKey->GetNextAssoc( pos, name_string, value_string );
GameInput GameI; GameInput GameI;
GameI.fromString(name_string); GameI.fromString( name );
CStringArray sDeviceInputStrings; CStringArray sDeviceInputStrings;
split( value_string, ",", sDeviceInputStrings, false ); split( value, ",", sDeviceInputStrings, false );
for( int i=0; i<sDeviceInputStrings.GetSize() && i<NUM_GAME_TO_DEVICE_SLOTS; i++ ) for( int i=0; i<sDeviceInputStrings.GetSize() && i<NUM_GAME_TO_DEVICE_SLOTS; i++ )
{ {
@@ -68,13 +66,12 @@ void InputMapper::ReadMappingsFromDisk()
} }
} }
} }
}
void InputMapper::SaveMappingsToDisk() void InputMapper::SaveMappingsToDisk()
{ {
IniFile ini; IniFile ini;
ini.SetPath( m_sCurrentGame + ".ini" ); ini.SetPath( GAMESTATE->GetCurrentGameDef()->m_szName + CString("Map.ini") );
// ini.ReadFile(); // don't read the file so that we overwrite everything there // ini.ReadFile(); // don't read the file so that we overwrite everything there
@@ -235,31 +232,31 @@ DeviceInput InputMapper::MenuToDevice( MenuInput MenuI )
void InputMapper::GameToStyle( GameInput GameI, StyleInput &StyleI ) void InputMapper::GameToStyle( GameInput GameI, StyleInput &StyleI )
{ {
if( GAMEMAN->m_CurStyle == STYLE_NONE ) if( GAMESTATE->m_CurStyle == STYLE_NONE )
{ {
StyleI.MakeBlank(); StyleI.MakeBlank();
return; return;
} }
StyleDef* pStyleDef = GAMEMAN->GetCurrentStyleDef(); StyleDef* pStyleDef = GAMESTATE->GetCurrentStyleDef();
StyleI = pStyleDef->GameInputToStyleInput( GameI ); StyleI = pStyleDef->GameInputToStyleInput( GameI );
} }
void InputMapper::GameToMenu( GameInput GameI, MenuInput &MenuI ) void InputMapper::GameToMenu( GameInput GameI, MenuInput &MenuI )
{ {
GameDef* pGameDef = GAMEMAN->GetCurrentGameDef(); GameDef* pGameDef = GAMESTATE->GetCurrentGameDef();
MenuI = pGameDef->GameInputToMenuInput( GameI ); MenuI = pGameDef->GameInputToMenuInput( GameI );
} }
void InputMapper::StyleToGame( StyleInput StyleI, GameInput &GameI ) void InputMapper::StyleToGame( StyleInput StyleI, GameInput &GameI )
{ {
StyleDef* pStyleDef = GAMEMAN->GetCurrentStyleDef(); StyleDef* pStyleDef = GAMESTATE->GetCurrentStyleDef();
GameI = pStyleDef->StyleInputToGameInput( StyleI ); GameI = pStyleDef->StyleInputToGameInput( StyleI );
} }
void InputMapper::MenuToGame( MenuInput MenuI, GameInput &GameI ) void InputMapper::MenuToGame( MenuInput MenuI, GameInput &GameI )
{ {
GameDef* pGameDef = GAMEMAN->GetCurrentGameDef(); GameDef* pGameDef = GAMESTATE->GetCurrentGameDef();
GameI = pGameDef->MenuInputToGameInput( MenuI ); GameI = pGameDef->MenuInputToGameInput( MenuI );
} }
-9
View File
@@ -29,13 +29,6 @@ public:
InputMapper(); InputMapper();
~InputMapper(); ~InputMapper();
void SwitchGame( CString sNewGame )
{
SaveMappingsToDisk();
m_sCurrentGame = sNewGame;
ReadMappingsFromDisk();
};
void ReadMappingsFromDisk(); void ReadMappingsFromDisk();
void SaveMappingsToDisk(); void SaveMappingsToDisk();
@@ -63,8 +56,6 @@ public:
protected: protected:
CString m_sCurrentGame;
// all the DeviceInputs that map to a GameInput // all the DeviceInputs that map to a GameInput
DeviceInput m_GItoDI[MAX_INSTRUMENTS][MAX_INSTRUMENT_BUTTONS][NUM_GAME_TO_DEVICE_SLOTS]; DeviceInput m_GItoDI[MAX_INSTRUMENTS][MAX_INSTRUMENT_BUTTONS][NUM_GAME_TO_DEVICE_SLOTS];
+7 -6
View File
@@ -1,19 +1,20 @@
#include "stdafx.h" #include "stdafx.h"
/* /*
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
File: Judgement.h Class: Judgement
Desc: A graphic displayed in the Judgement during Dancing. Desc: See header
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#include "Judgement.h" #include "Judgement.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "GameManager.h" #include "GameState.h"
const float JUDGEMENT_DISPLAY_TIME = 0.8f; const float JUDGEMENT_DISPLAY_TIME = 0.8f;
@@ -24,7 +25,7 @@ Judgement::Judgement()
m_sprJudgement.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_JUDGEMENT) ); m_sprJudgement.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_JUDGEMENT) );
m_sprJudgement.StopAnimating(); m_sprJudgement.StopAnimating();
m_sprJudgement.TurnShadowOn(); m_sprJudgement.TurnShadowOn();
this->AddActor( &m_sprJudgement ); this->AddSubActor( &m_sprJudgement );
} }
void Judgement::Update( float fDeltaTime ) void Judgement::Update( float fDeltaTime )
@@ -59,7 +60,7 @@ void Judgement::SetJudgement( TapNoteScore score )
default: ASSERT( false ); default: ASSERT( false );
} }
if ( GAMEMAN->m_CurGame == GAME_EZ2 ) // Resize Judgement graphics for Ez2. if ( GAMESTATE->GetCurGame() == GAME_EZ2 ) // Resize Judgement graphics for Ez2.
{ {
m_sprJudgement.SetHeight( 22.0f * 2.1f ); m_sprJudgement.SetHeight( 22.0f * 2.1f );
m_sprJudgement.SetWidth( 143.0f * 2.1f ); m_sprJudgement.SetWidth( 143.0f * 2.1f );
+1 -1
View File
@@ -17,7 +17,7 @@
#include "ActorFrame.h" #include "ActorFrame.h"
#include "Song.h" #include "Song.h"
#include "BitmapText.h" #include "BitmapText.h"
#include "ThemeManager.h" #include "PrefsManager.h"
class Judgement : public ActorFrame class Judgement : public ActorFrame
+10 -5
View File
@@ -10,9 +10,11 @@
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#include "ActorFrame.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "NoteData.h" #include "ActorFrame.h"
class Song;
class LifeMeter : public ActorFrame class LifeMeter : public ActorFrame
@@ -21,15 +23,18 @@ public:
LifeMeter() { m_fSongBeat = 0; }; LifeMeter() { m_fSongBeat = 0; };
virtual ~LifeMeter() {}; virtual ~LifeMeter() {};
void SetPlayerOptions(const PlayerOptions &po) { m_po = po; } virtual void Load( PlayerNumber p, const PlayerOptions &po ) { m_PlayerNumber = p; m_po = po; }
void SetBeat( float fSongBeat ) { m_fSongBeat = fSongBeat; }; virtual void SetBeat( float fSongBeat ) { m_fSongBeat = fSongBeat; };
virtual void NextSong( Song* pSong ) {};
virtual void ChangeLife( TapNoteScore score ) = 0; virtual void ChangeLife( TapNoteScore score ) = 0;
virtual bool IsInDanger() = 0; virtual bool IsInDanger() = 0;
virtual bool IsHot() = 0; virtual bool IsHot() = 0;
virtual bool HasFailed() = 0; virtual bool IsFailing() = 0;
virtual bool FailedEarlier() = 0;
protected: protected:
float m_fSongBeat; float m_fSongBeat;
PlayerNumber m_PlayerNumber;
PlayerOptions m_po; PlayerOptions m_po;
}; };
+117 -34
View File
@@ -11,31 +11,65 @@
*/ */
#include "LifeMeterBar.h" #include "LifeMeterBar.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "GameManager.h"
const int NUM_SECTIONS = 3; const int NUM_LIFE_STREAM_SECTIONS = 3;
const float SECTION_WIDTH = 1.0f/NUM_SECTIONS; const float LIFE_STREAM_SECTION_WIDTH = 1.0f/NUM_LIFE_STREAM_SECTIONS;
const float METER_WIDTH = 258;
const float METER_HEIGHT = 20;
const float DANGER_THRESHOLD = -0.3f; const float DANGER_THRESHOLD = 0.4f;
const float FAIL_THRESHOLD = 0; const float FAIL_THRESHOLD = 0;
LifeMeterBar::LifeMeterBar() LifeMeterBar::LifeMeterBar()
{ {
m_fLifePercentage = 0.5f; m_fLifePercentage = 0.5f;
m_fTrailingLifePercentage = 0; m_fTrailingLifePercentage = 0;
m_fLifeVelocity = 0; m_fLifeVelocity = 0;
m_bHasFailed = false; m_fHotAlpha = 0;
m_bFailedEarlier = false;
m_frame;
m_quadBlackBackground.SetDiffuseColor( D3DXCOLOR(0,0,0,1) );
m_quadBlackBackground.SetZoomX( METER_WIDTH );
m_quadBlackBackground.SetZoomY( METER_HEIGHT );
m_frame.AddSubActor( &m_quadBlackBackground );
m_sprStreamNormal.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_LIFEMETER_STREAM_NORMAL) );
m_frame.AddSubActor( &m_sprStreamNormal );
m_sprStreamHot.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_LIFEMETER_STREAM_HOT) );
m_frame.AddSubActor( &m_sprStreamHot );
m_sprFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_LIFEMETER_BAR) );
m_frame.AddSubActor( &m_sprFrame );
this->AddSubActor( &m_frame );
ResetBarVelocity(); ResetBarVelocity();
} }
void LifeMeterBar::Load( PlayerNumber p, const PlayerOptions &po )
{
LifeMeter::Load( p, po );
if( p == PLAYER_2 )
m_frame.SetZoomX( -1 );
}
void LifeMeterBar::ChangeLife( TapNoteScore score ) void LifeMeterBar::ChangeLife( TapNoteScore score )
{ {
bool bWasHot = IsHot(); bool bWasHot = IsHot();
float fDeltaLife; float fDeltaLife;
switch( m_PlayerOptions.m_DrainType )
{
case PlayerOptions::DRAIN_NORMAL:
switch( score ) switch( score )
{ {
case TNS_PERFECT: fDeltaLife = +0.008f; break; case TNS_PERFECT: fDeltaLife = +0.008f; break;
@@ -44,15 +78,30 @@ void LifeMeterBar::ChangeLife( TapNoteScore score )
case TNS_BOO: fDeltaLife = -0.040f; break; case TNS_BOO: fDeltaLife = -0.040f; break;
case TNS_MISS: fDeltaLife = -0.080f; break; case TNS_MISS: fDeltaLife = -0.080f; break;
} }
if( IsHot() && score < TNS_GOOD ) if( IsHot() && score < TNS_GOOD )
fDeltaLife = -0.10f; // make it take a while to get back to "doing great" fDeltaLife = -0.10f; // make it take a while to get back to "doing great"
break;
case PlayerOptions::DRAIN_NO_RECOVER:
switch( score )
{
case TNS_PERFECT: fDeltaLife = +0.000f; break;
case TNS_GREAT: fDeltaLife = +0.000f; break;
case TNS_GOOD: fDeltaLife = +0.000f; break;
case TNS_BOO: fDeltaLife = -0.040f; break;
case TNS_MISS: fDeltaLife = -0.080f; break;
}
break;
case PlayerOptions::DRAIN_SUDDEN_DEATH:
fDeltaLife = -1;
break;
}
m_fLifePercentage += fDeltaLife; m_fLifePercentage += fDeltaLife;
m_fLifePercentage = min( m_fLifePercentage, 1 ); CLAMP( m_fLifePercentage, 0, 1 );
if( m_fLifePercentage < FAIL_THRESHOLD ) if( m_fLifePercentage < FAIL_THRESHOLD )
m_bHasFailed = true; m_bFailedEarlier = true;
ResetBarVelocity(); ResetBarVelocity();
} }
@@ -75,13 +124,20 @@ bool LifeMeterBar::IsInDanger()
return m_fLifePercentage < DANGER_THRESHOLD; return m_fLifePercentage < DANGER_THRESHOLD;
} }
bool LifeMeterBar::HasFailed() bool LifeMeterBar::IsFailing()
{ {
return m_bHasFailed; return m_fLifePercentage <= 0;
}
bool LifeMeterBar::FailedEarlier()
{
return m_bFailedEarlier;
} }
void LifeMeterBar::Update( float fDeltaTime ) void LifeMeterBar::Update( float fDeltaTime )
{ {
ActorFrame::Update( fDeltaTime );
float fDelta = m_fLifePercentage - m_fTrailingLifePercentage; float fDelta = m_fLifePercentage - m_fTrailingLifePercentage;
m_fLifeVelocity += fDelta * fDeltaTime; // accelerate m_fLifeVelocity += fDelta * fDeltaTime; // accelerate
m_fLifeVelocity *= 1-fDeltaTime; // dampen m_fLifeVelocity *= 1-fDeltaTime; // dampen
@@ -91,9 +147,50 @@ void LifeMeterBar::Update( float fDeltaTime )
if( fDelta * fNewDelta < 0 ) // the deltas have different signs if( fDelta * fNewDelta < 0 ) // the deltas have different signs
m_fLifeVelocity /= 4; // make some drag m_fLifeVelocity /= 4; // make some drag
m_fTrailingLifePercentage = clamp( m_fTrailingLifePercentage, 0, 1 ); CLAMP( m_fTrailingLifePercentage, 0, 1 );
// set custom texture coords
CRect rectSize(
-METER_WIDTH/2,
-METER_HEIGHT/2,
-METER_WIDTH/2 + METER_WIDTH * m_fTrailingLifePercentage,
-METER_HEIGHT/2 + METER_HEIGHT );
float fPrecentOffset = TIMER->GetTimeSinceStart();
fPrecentOffset -= (int)fPrecentOffset;
FRECT frectCustomTexCoords(
0 - fPrecentOffset,
0,
m_fTrailingLifePercentage - fPrecentOffset,
1 );
m_sprStreamNormal.StretchTo( rectSize );
m_sprStreamNormal.SetCustomTextureRect( frectCustomTexCoords );
m_sprStreamHot.StretchTo( rectSize );
m_sprStreamHot.SetCustomTextureRect( frectCustomTexCoords );
m_fHotAlpha += IsHot() ? +fDeltaTime*2 : -fDeltaTime*2;
CLAMP( m_fHotAlpha, 0, 1 );
m_sprStreamHot.SetDiffuseColor( D3DXCOLOR(1,1,1,m_fHotAlpha) );
} }
void LifeMeterBar::DrawPrimitives()
{
float fPercentRed = IsInDanger() ? sinf( TIMER->GetTimeSinceStart()*D3DX_PI*4 )/2+0.5f : 0;
m_quadBlackBackground.SetDiffuseColor( D3DXCOLOR(fPercentRed*0.8f,0,0,1) );
ActorFrame::DrawPrimitives();
}
/*
Chris:
I'm making the coloring of the lifemeter a property of the theme.
That's where it belongs anyway...
const D3DXCOLOR COLOR_EZ2NORMAL_1 = D3DXCOLOR(0.7f,0.4f,0,1); const D3DXCOLOR COLOR_EZ2NORMAL_1 = D3DXCOLOR(0.7f,0.4f,0,1);
const D3DXCOLOR COLOR_EZ2NORMAL_2 = D3DXCOLOR(0.8f,0.4f,0,1); const D3DXCOLOR COLOR_EZ2NORMAL_2 = D3DXCOLOR(0.8f,0.4f,0,1);
const D3DXCOLOR COLOR_EZ2NEARFULL_1 = D3DXCOLOR(0.7f,0.6f,0,1); const D3DXCOLOR COLOR_EZ2NEARFULL_1 = D3DXCOLOR(0.7f,0.6f,0,1);
@@ -107,11 +204,11 @@ const D3DXCOLOR COLOR_NORMAL_2 = D3DXCOLOR(0,1,0,1);
const D3DXCOLOR COLOR_FULL_1 = D3DXCOLOR(1,0,0,1); const D3DXCOLOR COLOR_FULL_1 = D3DXCOLOR(1,0,0,1);
const D3DXCOLOR COLOR_FULL_2 = D3DXCOLOR(1,1,0,1); const D3DXCOLOR COLOR_FULL_2 = D3DXCOLOR(1,1,0,1);
D3DXCOLOR LifeMeterBar::GetColor( float fPercentIntoSection ) D3DXCOLOR LifeStream::GetColor( float fPercentIntoSection )
{ {
float fPercentColor1 = fabsf( fPercentIntoSection*2 - 1 ); float fPercentColor1 = fabsf( fPercentIntoSection*2 - 1 );
fPercentColor1 *= fPercentColor1 * fPercentColor1 * fPercentColor1; // make the color bunch around one side fPercentColor1 *= fPercentColor1 * fPercentColor1 * fPercentColor1; // make the color bunch around one side
if (GAMEMAN->m_CurGame != GAME_EZ2) if (GAMESTATE->m_CurGame != GAME_EZ2)
{ {
if( m_fLifePercentage == 1 ) if( m_fLifePercentage == 1 )
return COLOR_FULL_1 * fPercentColor1 + COLOR_FULL_2 * (1-fPercentColor1); return COLOR_FULL_1 * fPercentColor1 + COLOR_FULL_2 * (1-fPercentColor1);
@@ -131,9 +228,8 @@ D3DXCOLOR LifeMeterBar::GetColor( float fPercentIntoSection )
} }
} }
void LifeMeterBar::DrawPrimitives() void LifeStream::DrawPrimitives()
{ {
// make the object in logical units centered at the origin // make the object in logical units centered at the origin
LPDIRECT3DVERTEXBUFFER8 pVB = DISPLAY->GetVertexBuffer(); LPDIRECT3DVERTEXBUFFER8 pVB = DISPLAY->GetVertexBuffer();
RAGEVERTEX* v; RAGEVERTEX* v;
@@ -141,7 +237,7 @@ void LifeMeterBar::DrawPrimitives()
int iNumV = 0; int iNumV = 0;
float fPercentIntoSection = (TIMER->GetTimeSinceStart()/0.3f* (IsHot() ? 2 : 1) )*SECTION_WIDTH; float fPercentIntoSection = (TIMER->GetTimeSinceStart()/0.3f* (m_bIsHot ? 2 : 1) )*LIFE_STREAM_SECTION_WIDTH;
fPercentIntoSection -= (int)fPercentIntoSection; fPercentIntoSection -= (int)fPercentIntoSection;
fPercentIntoSection = 1-fPercentIntoSection; fPercentIntoSection = 1-fPercentIntoSection;
fPercentIntoSection -= (int)fPercentIntoSection; fPercentIntoSection -= (int)fPercentIntoSection;
@@ -167,13 +263,13 @@ void LifeMeterBar::DrawPrimitives()
{ {
const float fPercentToAdd = 0.5f-fPercentIntoSection; const float fPercentToAdd = 0.5f-fPercentIntoSection;
fPercentIntoSection += fPercentToAdd; fPercentIntoSection += fPercentToAdd;
fX += fPercentToAdd*SECTION_WIDTH; fX += fPercentToAdd*LIFE_STREAM_SECTION_WIDTH;
} }
else if( fPercentIntoSection < 1.0f ) else if( fPercentIntoSection < 1.0f )
{ {
const float fPercentToAdd = 1.0f-fPercentIntoSection; const float fPercentToAdd = 1.0f-fPercentIntoSection;
fPercentIntoSection = 0; fPercentIntoSection = 0;
fX += fPercentToAdd*SECTION_WIDTH; fX += fPercentToAdd*LIFE_STREAM_SECTION_WIDTH;
} }
else else
ASSERT( false ); ASSERT( false );
@@ -181,7 +277,7 @@ void LifeMeterBar::DrawPrimitives()
const float fXToSubtract = fX - (m_fTrailingLifePercentage-0.5f); const float fXToSubtract = fX - (m_fTrailingLifePercentage-0.5f);
fX -= fXToSubtract; fX -= fXToSubtract;
fPercentIntoSection -= fXToSubtract/SECTION_WIDTH; fPercentIntoSection -= fXToSubtract/LIFE_STREAM_SECTION_WIDTH;
if( fPercentIntoSection < 0 ) if( fPercentIntoSection < 0 )
fPercentIntoSection += 1; fPercentIntoSection += 1;
@@ -196,20 +292,6 @@ void LifeMeterBar::DrawPrimitives()
v[iNumV++].color = color; v[iNumV++].color = color;
v[iNumV++].color = color; v[iNumV++].color = color;
//
// draw black filler
//
v[iNumV++].p = D3DXVECTOR3( fX, -0.5f, 0 );
v[iNumV++].p = D3DXVECTOR3( fX, 0.5f, 0 );
v[iNumV++].p = D3DXVECTOR3( 0.5f, -0.5f, 0 );
v[iNumV++].p = D3DXVECTOR3( 0.5f, 0.5f, 0 );
iNumV -= 4;
const D3DXCOLOR colorBlack = D3DXCOLOR(0,0,0,1);
v[iNumV++].color = colorBlack;
v[iNumV++].color = colorBlack;
v[iNumV++].color = colorBlack;
v[iNumV++].color = colorBlack;
pVB->Unlock(); pVB->Unlock();
@@ -236,3 +318,4 @@ void LifeMeterBar::DrawPrimitives()
pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, iNumV-2 ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, iNumV-2 );
} }
*/
+15 -3
View File
@@ -20,20 +20,32 @@ class LifeMeterBar : public LifeMeter
public: public:
LifeMeterBar(); LifeMeterBar();
virtual void Load( PlayerNumber p, const PlayerOptions &po );
virtual void Update( float fDeltaTime ); virtual void Update( float fDeltaTime );
virtual void DrawPrimitives(); virtual void DrawPrimitives();
virtual void ChangeLife( TapNoteScore score ); virtual void ChangeLife( TapNoteScore score );
virtual bool IsInDanger(); virtual bool IsInDanger();
virtual bool IsHot(); virtual bool IsHot();
virtual bool HasFailed(); virtual bool IsFailing();
virtual bool FailedEarlier();
private: private:
D3DXCOLOR GetColor( float fPercentIntoSection );
void ResetBarVelocity(); void ResetBarVelocity();
ActorFrame m_frame; // hold everything and mirror this for PLAYER_2 instead of mirroring all the individual Actors
Quad m_quadBlackBackground;
Sprite m_sprStreamNormal;
Sprite m_sprStreamHot;
Sprite m_sprFrame;
PlayerOptions m_PlayerOptions;
float m_fLifePercentage; float m_fLifePercentage;
float m_fTrailingLifePercentage; // this approaches m_fLifePercentage float m_fTrailingLifePercentage; // this approaches m_fLifePercentage
float m_fLifeVelocity; // how m_fTrailingLifePercentage approaches m_fLifePercentage float m_fLifeVelocity; // how m_fTrailingLifePercentage approaches m_fLifePercentage
bool m_bHasFailed; // set this to true when life dips below 0 float m_fHotAlpha;
bool m_bFailedEarlier; // set this to true when life dips below 0
}; };
+176
View File
@@ -0,0 +1,176 @@
#include "stdafx.h"
/*
-----------------------------------------------------------------------------
Class: LifeMeterBattery
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "LifeMeterBattery.h"
#include "PrefsManager.h"
#include "GameState.h"
const float BATTERY_X[NUM_PLAYERS] = { -92, +92 };
const float NUM_X[NUM_PLAYERS] = { BATTERY_X[0], BATTERY_X[1] };
const float NUM_Y = +2;
const float PERCENT_X[NUM_PLAYERS] = { +28, -28 };
const float PERCENT_Y = 0;
const float BATTERY_BLINK_TIME = 1.2f;
LifeMeterBattery::LifeMeterBattery()
{
m_iMaxLives = 3;
m_iLivesLeft = m_iMaxLives;
m_bFailedEarlier = false;
m_fBatteryBlinkTime = 0;
m_sprFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_LIFEMETER_ONI) );
this->AddSubActor( &m_sprFrame );
m_sprBattery.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_LIFEMETER_BATTERY) );
m_sprBattery.StopAnimating();
this->AddSubActor( &m_sprBattery );
m_textNumLives.Load( THEME->GetPathTo(FONT_HEADER1) );
m_textNumLives.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); // pink
m_textNumLives.SetZoom( 1.1f );
m_textNumLives.TurnShadowOff();
this->AddSubActor( &m_textNumLives );
m_textPercent.Load( THEME->GetPathTo(FONT_SCORE_NUMBERS) );
m_textPercent.TurnShadowOff();
m_textPercent.SetZoom( 0.7f );
m_textPercent.SetText( "0.00" );
this->AddSubActor( &m_textPercent );
m_soundGainLife.Load( THEME->GetPathTo(SOUND_GAMEPLAY_ONI_GAIN_LIFE) );
m_soundLoseLife.Load( THEME->GetPathTo(SOUND_GAMEPLAY_ONI_LOSE_LIFE) );
Refresh();
}
void LifeMeterBattery::Load( PlayerNumber p, const PlayerOptions &po )
{
LifeMeter::Load( p, po );
m_sprFrame.SetZoomX( p==PLAYER_1 ? 1.0f : -1.0f );
m_sprBattery.SetZoomX( p==PLAYER_1 ? 1.0f : -1.0f );
m_sprBattery.SetX( BATTERY_X[p] );
m_textNumLives.SetX( NUM_X[p] );
m_textNumLives.SetY( NUM_Y );
m_textPercent.SetX( PERCENT_X[p] );
m_textPercent.SetY( PERCENT_Y );
m_textPercent.SetDiffuseColor( PlayerToColor(p) ); // light blue
}
void LifeMeterBattery::NextSong( Song* pSong )
{
if( m_bFailedEarlier )
return;
m_iLivesLeft++;
m_soundGainLife.Play();
Refresh();
}
void LifeMeterBattery::ChangeLife( TapNoteScore score )
{
if( m_bFailedEarlier )
return;
if( GAMESTATE->m_aGameplayStatistics.GetSize() > 0 )
{
int iActualDancePoints = 0;
for( int i=0; i<GAMESTATE->m_aGameplayStatistics.GetSize(); i++ )
iActualDancePoints += GAMESTATE->m_aGameplayStatistics[i].iActualDancePoints[m_PlayerNumber];
int iPossibleDancePoints = GAMESTATE->m_iCoursePossibleDancePoints;
float fPercentDancePoints = iActualDancePoints / (float)iPossibleDancePoints + 0.0001f; // correct for rounding errors
m_textPercent.SetText( ssprintf("%1.2f", fPercentDancePoints) );
}
switch( score )
{
case TNS_PERFECT:
case TNS_GREAT:
break;
case TNS_GOOD:
case TNS_BOO:
case TNS_MISS:
m_iLivesLeft--;
m_soundLoseLife.Play();
Refresh();
m_fBatteryBlinkTime = BATTERY_BLINK_TIME;
break;
}
if( m_iLivesLeft == -1 )
m_bFailedEarlier = true;
}
bool LifeMeterBattery::IsInDanger()
{
return false;
}
bool LifeMeterBattery::IsHot()
{
return false;
}
bool LifeMeterBattery::IsFailing()
{
return m_bFailedEarlier;
}
bool LifeMeterBattery::FailedEarlier()
{
return m_bFailedEarlier;
}
void LifeMeterBattery::Refresh()
{
if( m_iLivesLeft <= 3 )
{
m_textNumLives.SetText( "" );
m_sprBattery.SetState( max(m_iLivesLeft,0) );
}
else
{
m_textNumLives.SetText( ssprintf("x%d", m_iLivesLeft) );
m_sprBattery.SetState( 3 );
}
}
void LifeMeterBattery::Update( float fDeltaTime )
{
if( m_iLivesLeft == -1 )
{
m_sprBattery.SetState( 0 );
}
else if( m_fBatteryBlinkTime > 0 )
{
m_fBatteryBlinkTime -= fDeltaTime;
int iFrameNo = m_iLivesLeft + int(m_fBatteryBlinkTime*15)%2;
CLAMP( iFrameNo, 0, 3 );
m_sprBattery.SetState( iFrameNo );
if( m_fBatteryBlinkTime < 0 )
{
m_fBatteryBlinkTime = 0;
m_sprBattery.SetState( max(m_iLivesLeft,0) );
}
}
}
+53
View File
@@ -0,0 +1,53 @@
#pragma once
/*
-----------------------------------------------------------------------------
Class: LifeMeterBattery
Desc: The battery life meter used in Oni.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "LifeMeter.h"
#include "Sprite.h"
#include "BitmapText.h"
#include "RageSoundSample.h"
class LifeMeterBattery : public LifeMeter
{
public:
LifeMeterBattery();
virtual void Load( PlayerNumber p, const PlayerOptions &po );
virtual void Update( float fDeltaTime );
virtual void NextSong( Song* pSong );
virtual void ChangeLife( TapNoteScore score );
virtual bool IsInDanger();
virtual bool IsHot();
virtual bool IsFailing();
virtual bool FailedEarlier();
void Refresh();
private:
int m_iLivesLeft;
int m_iMaxLives;
bool m_bFailedEarlier;
float m_fBatteryBlinkTime; // if > 0 battery is blinking
Sprite m_sprFrame;
Sprite m_sprBattery;
BitmapText m_textNumLives;
BitmapText m_textPercent;
RageSoundSample m_soundLoseLife;
RageSoundSample m_soundGainLife;
};
+23 -22
View File
@@ -17,10 +17,11 @@
#include "ScreenManager.h" #include "ScreenManager.h"
#include "ScreenGameplay.h" #include "ScreenGameplay.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "RageLog.h" #include "RageLog.h"
#include "RageLog.h" #include "RageLog.h"
#include "GameManager.h" #include "GameManager.h"
#include "GameState.h"
const float HELP_X = CENTER_X; const float HELP_X = CENTER_X;
@@ -38,28 +39,28 @@ const float CREDIT_Y[NUM_PLAYERS] = {SCREEN_BOTTOM-8, SCREEN_BOTTOM-8};
MenuElements::MenuElements() MenuElements::MenuElements()
{ {
m_frameTopBar.AddActor( &m_sprTopEdge ); m_frameTopBar.AddSubActor( &m_sprTopEdge );
m_frameTopBar.AddActor( &m_sprStyleIcon ); m_frameTopBar.AddSubActor( &m_sprStyleIcon );
m_frameTopBar.AddActor( &m_MenuTimer ); m_frameTopBar.AddSubActor( &m_MenuTimer );
m_frameBottomBar.AddActor( &m_sprBottomEdge ); m_frameBottomBar.AddSubActor( &m_sprBottomEdge );
this->AddActor( &m_sprBG ); this->AddSubActor( &m_sprBG );
this->AddActor( &m_frameTopBar ); this->AddSubActor( &m_frameTopBar );
this->AddActor( &m_frameBottomBar ); this->AddSubActor( &m_frameBottomBar );
this->AddActor( &m_textHelp ); this->AddSubActor( &m_textHelp );
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
this->AddActor( &m_textCreditInfo[p] ); this->AddSubActor( &m_textCreditInfo[p] );
m_KeepAlive.SetZ( -2 ); m_KeepAlive.SetZ( -2 );
m_KeepAlive.SetOpened(); m_KeepAlive.SetOpened();
this->AddActor( &m_KeepAlive ); this->AddSubActor( &m_KeepAlive );
m_Wipe.SetZ( -2 ); m_Wipe.SetZ( -2 );
m_Wipe.SetOpened(); m_Wipe.SetOpened();
this->AddActor( &m_Wipe ); this->AddSubActor( &m_Wipe );
this->AddActor( &m_Invisible ); this->AddSubActor( &m_Invisible );
} }
void MenuElements::Load( CString sBackgroundPath, CString sTopEdgePath, CString sHelpText, bool bShowStyleIcon, bool bTimerEnabled, int iTimerSeconds ) void MenuElements::Load( CString sBackgroundPath, CString sTopEdgePath, CString sHelpText, bool bShowStyleIcon, bool bTimerEnabled, int iTimerSeconds )
@@ -80,10 +81,10 @@ void MenuElements::Load( CString sBackgroundPath, CString sTopEdgePath, CString
m_sprStyleIcon.StopAnimating(); m_sprStyleIcon.StopAnimating();
m_sprStyleIcon.SetXY( STYLE_ICON_LOCAL_X, STYLE_ICON_LOCAL_Y ); m_sprStyleIcon.SetXY( STYLE_ICON_LOCAL_X, STYLE_ICON_LOCAL_Y );
m_sprStyleIcon.SetZ( -1 ); m_sprStyleIcon.SetZ( -1 );
if( GAMEMAN->m_CurStyle == STYLE_NONE || !bShowStyleIcon ) if( GAMESTATE->m_CurStyle == STYLE_NONE || !bShowStyleIcon )
m_sprStyleIcon.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); m_sprStyleIcon.SetDiffuseColor( D3DXCOLOR(1,1,1,0) );
else else
m_sprStyleIcon.SetState( GAMEMAN->m_CurStyle ); m_sprStyleIcon.SetState( GAMESTATE->m_CurStyle );
m_MenuTimer.SetXY( TIMER_LOCAL_X, TIMER_LOCAL_Y ); m_MenuTimer.SetXY( TIMER_LOCAL_X, TIMER_LOCAL_Y );
m_MenuTimer.SetZ( -1 ); m_MenuTimer.SetZ( -1 );
@@ -100,13 +101,13 @@ void MenuElements::Load( CString sBackgroundPath, CString sTopEdgePath, CString
m_sprBottomEdge.Load( THEME->GetPathTo(GRAPHIC_MENU_BOTTOM_EDGE) ); m_sprBottomEdge.Load( THEME->GetPathTo(GRAPHIC_MENU_BOTTOM_EDGE) );
m_sprBottomEdge.TurnShadowOff(); m_sprBottomEdge.TurnShadowOff();
m_textHelp.Load( THEME->GetPathTo(FONT_NORMAL) );
m_textHelp.SetXY( HELP_X, HELP_Y ); m_textHelp.SetXY( HELP_X, HELP_Y );
m_textHelp.SetZ( -1 ); // m_textHelp.SetZ( -1 );
m_textHelp.SetText( sHelpText ); CStringArray asHelpTips;
split( sHelpText, "\n", asHelpTips );
m_textHelp.SetTips( asHelpTips );
//m_textHelp.SetText( sHelpText );
m_textHelp.SetZoom( 0.5f ); m_textHelp.SetZoom( 0.5f );
m_textHelp.SetEffectBlinking();
m_textHelp.TurnShadowOff();
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
@@ -114,9 +115,9 @@ void MenuElements::Load( CString sBackgroundPath, CString sTopEdgePath, CString
m_textCreditInfo[p].SetXY( CREDIT_X[p], CREDIT_Y[p] ); m_textCreditInfo[p].SetXY( CREDIT_X[p], CREDIT_Y[p] );
m_textCreditInfo[p].SetZ( -1 ); m_textCreditInfo[p].SetZ( -1 );
if( GAMEMAN->m_CurStyle == STYLE_NONE ) if( GAMESTATE->m_CurStyle == STYLE_NONE )
m_textCreditInfo[p].SetText( "PRESS START" ); m_textCreditInfo[p].SetText( "PRESS START" );
else if( GAMEMAN->IsPlayerEnabled( (PlayerNumber)p ) ) else if( GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
m_textCreditInfo[p].SetText( "" ); m_textCreditInfo[p].SetText( "" );
else // not enabled else // not enabled
m_textCreditInfo[p].SetText( "NOT PRESENT" ); m_textCreditInfo[p].SetText( "NOT PRESENT" );
+2 -1
View File
@@ -21,6 +21,7 @@
#include "TransitionFadeWipe.h" #include "TransitionFadeWipe.h"
#include "TransitionKeepAlive.h" #include "TransitionKeepAlive.h"
#include "TransitionInvisible.h" #include "TransitionInvisible.h"
#include "TipDisplay.h"
const float MENU_ELEMENTS_TWEEN_TIME = 0.30f; const float MENU_ELEMENTS_TWEEN_TIME = 0.30f;
@@ -69,7 +70,7 @@ protected:
// stuff in the main frame // stuff in the main frame
Sprite m_sprBG; Sprite m_sprBG;
BitmapText m_textHelp; TipDisplay m_textHelp;
BitmapText m_textCreditInfo[NUM_PLAYERS]; BitmapText m_textCreditInfo[NUM_PLAYERS];
TransitionFadeWipe m_Wipe; TransitionFadeWipe m_Wipe;
+3 -3
View File
@@ -13,7 +13,7 @@
#include "MenuTimer.h" #include "MenuTimer.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "ScreenManager.h" #include "ScreenManager.h"
#include "AnnouncerManager.h" #include "AnnouncerManager.h"
@@ -28,12 +28,12 @@ MenuTimer::MenuTimer()
m_textDigit1.Load( THEME->GetPathTo(FONT_TIMER_NUMBERS) ); m_textDigit1.Load( THEME->GetPathTo(FONT_TIMER_NUMBERS) );
m_textDigit1.TurnShadowOff(); m_textDigit1.TurnShadowOff();
m_textDigit1.SetXY( -18, 0 ); m_textDigit1.SetXY( -18, 0 );
this->AddActor( &m_textDigit1 ); this->AddSubActor( &m_textDigit1 );
m_textDigit2.Load( THEME->GetPathTo(FONT_TIMER_NUMBERS) ); m_textDigit2.Load( THEME->GetPathTo(FONT_TIMER_NUMBERS) );
m_textDigit2.TurnShadowOff(); m_textDigit2.TurnShadowOff();
m_textDigit2.SetXY( +18, 0 ); m_textDigit2.SetXY( +18, 0 );
this->AddActor( &m_textDigit2 ); this->AddSubActor( &m_textDigit2 );
m_soundBeep.Load( THEME->GetPathTo(SOUND_MENU_TIMER) ); m_soundBeep.Load( THEME->GetPathTo(SOUND_MENU_TIMER) );
} }
+125
View File
@@ -0,0 +1,125 @@
#include "stdafx.h"
/*
-----------------------------------------------------------------------------
Class: MsdFile
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "MsdFile.h"
MsdFile::MsdFile()
{
m_szFileString = NULL;
int m_iNumValues = 0;
}
MsdFile::~MsdFile()
{
if( m_szFileString )
delete m_szFileString;
}
//returns true if successful, false otherwise
bool MsdFile::ReadFile( CString sNewPath )
{
if( m_szFileString )
delete m_szFileString;
// Get file size in bytes
HANDLE hFile = CreateFile(
sNewPath, // pointer to name of the file
GENERIC_READ, // access (read-write) mode
FILE_SHARE_READ|FILE_SHARE_WRITE, // share mode
NULL, // pointer to security attributes
OPEN_EXISTING, // how to create
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL // handle to file with attributes to
);
int iBufferSize = GetFileSize( hFile, NULL ) + 1;
CloseHandle( hFile );
// allocate a string to hold the file
m_szFileString = new char[iBufferSize];
FILE* fp = fopen(sNewPath, "r");
if( fp == NULL )
return false;
int iBytesRead = fread( m_szFileString, 1, iBufferSize, fp );
ASSERT( iBufferSize > iBytesRead );
m_iNumValues = 0;
for( int i=0; i<iBytesRead; i++ )
{
switch( m_szFileString[i] )
{
case '#': // begins a new value
{
m_iNumValues++;
int iCurValueIndex = m_iNumValues-1;
m_iNumParams[iCurValueIndex] = 1;
m_szValuesAndParams[iCurValueIndex][0] = &m_szFileString[i+1];
}
break;
case ':': // begins a new parameter
{
m_szFileString[i] = '\0';
int iCurValueIndex = m_iNumValues-1;
m_iNumParams[iCurValueIndex] ++;
int iCurParamIndex = m_iNumParams[iCurValueIndex]-1;
m_szValuesAndParams[iCurValueIndex][iCurParamIndex] = &m_szFileString[i+1];
}
break;
case ';': // ends a value
{
m_szFileString[i] = '\0';
// fast forward until just before the next '#'
while( m_szFileString[i+1] != '#' && i<iBytesRead )
i++;
}
break;
case '/':
if( m_szFileString[i+1] == '/' )
{
// advance until new line
for( ; i<iBytesRead; i++ )
{
if( m_szFileString[i] == '\n' )
break;
else
m_szFileString[i] = ' ';
}
}
// fall through. If we didn't take the if above, then this '/' is part of a parameter!
default:
; // do nothing
}
}
m_szFileString[i] = '\0';
int iCurValueIndex = m_iNumValues-1;
int iCurParamIndex = m_iNumParams[iCurValueIndex]-1;
for( i=0; i<m_iNumValues; i++ )
{
for( int j=0; j<m_iNumParams[i]; j++ )
{
m_sValuesAndParams[i][j] = m_szValuesAndParams[i][j];
}
}
fclose( fp );
return true;
}
+36
View File
@@ -0,0 +1,36 @@
#pragma once
/*
-----------------------------------------------------------------------------
Class: MsdFile
Desc: Wrapper for reading and writing an .sm, .dwi, .or msd file.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
const int MAX_VALUES = 50;
const int MAX_PARAMS_PER_VALUE = 10;
class MsdFile
{
public:
MsdFile();
//default destructor
virtual ~MsdFile();
//reads ini file specified using MsdFile::SetPath()
//returns true if successful, false otherwise
bool ReadFile( CString sFilePath );
char* m_szFileString;
char* m_szValuesAndParams[MAX_VALUES][MAX_PARAMS_PER_VALUE];
CString m_sValuesAndParams[MAX_VALUES][MAX_PARAMS_PER_VALUE];
int m_iNumValues; // tells how many values are valid
int m_iNumParams[MAX_VALUES]; // tells how many params this value has
};
+1 -1
View File
@@ -16,7 +16,7 @@ class MusicStatusDisplay;
#include "Sprite.h" #include "Sprite.h"
#include "ThemeManager.h" #include "PrefsManager.h"
enum MusicStatusDisplayType { TYPE_NEW, TYPE_NONE, TYPE_CROWN1, TYPE_CROWN2, TYPE_CROWN3 }; enum MusicStatusDisplayType { TYPE_NEW, TYPE_NONE, TYPE_CROWN1, TYPE_CROWN2, TYPE_CROWN3 };
+28 -27
View File
@@ -14,11 +14,12 @@
#include "RageUtil.h" #include "RageUtil.h"
#include "SongManager.h" #include "SongManager.h"
#include "GameManager.h" #include "GameManager.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "RageMusic.h" #include "RageMusic.h"
#include "ScreenManager.h" // for sending SM_PlayMusicSample #include "ScreenManager.h" // for sending SM_PlayMusicSample
#include "RageLog.h" #include "RageLog.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "GameState.h"
const float FADE_TIME = 1.0f; const float FADE_TIME = 1.0f;
@@ -200,7 +201,7 @@ void WheelItemDisplay::RefreshGrades()
// Refresh Grades // Refresh Grades
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled( (PlayerNumber)p ) ) if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
{ {
m_GradeDisplay[p].SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); m_GradeDisplay[p].SetDiffuseColor( D3DXCOLOR(1,1,1,0) );
continue; continue;
@@ -208,8 +209,8 @@ void WheelItemDisplay::RefreshGrades()
if( m_pSong ) // this is a song display if( m_pSong ) // this is a song display
{ {
const DifficultyClass dc = PREFSMAN->m_PreferredDifficultyClass[p]; const DifficultyClass dc = GAMESTATE->m_PreferredDifficultyClass[p];
const Grade grade = m_pSong->GetGradeForDifficultyClass( GAMEMAN->GetCurrentStyleDef()->m_NotesType, dc ); const Grade grade = m_pSong->GetGradeForDifficultyClass( GAMESTATE->GetCurrentStyleDef()->m_NotesType, dc );
m_GradeDisplay[p].SetGrade( grade ); m_GradeDisplay[p].SetGrade( grade );
m_GradeDisplay[p].SetDiffuseColor( PlayerToColor((PlayerNumber)p) ); m_GradeDisplay[p].SetDiffuseColor( PlayerToColor((PlayerNumber)p) );
} }
@@ -301,25 +302,25 @@ MusicWheel::MusicWheel()
// for debugging // for debugging
if( GAMEMAN->m_CurStyle == STYLE_NONE ) if( GAMESTATE->m_CurStyle == STYLE_NONE )
GAMEMAN->m_CurStyle = STYLE_DANCE_SINGLE; GAMESTATE->m_CurStyle = STYLE_DANCE_SINGLE;
m_frameOverlay.SetXY( 0, 0 ); m_frameOverlay.SetXY( 0, 0 );
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled((PlayerNumber)p) ) if( !GAMESTATE->IsPlayerEnabled((PlayerNumber)p) )
continue; // skip continue; // skip
m_sprHighScoreFrame[p].Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SCORE_FRAME) ); m_sprHighScoreFrame[p].Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SCORE_FRAME) );
m_sprHighScoreFrame[p].SetXY( SCORE_X, SCORE_Y[p] ); m_sprHighScoreFrame[p].SetXY( SCORE_X, SCORE_Y[p] );
m_frameOverlay.AddActor( &m_sprHighScoreFrame[p] ); m_frameOverlay.AddSubActor( &m_sprHighScoreFrame[p] );
m_HighScore[p].SetXY( SCORE_X, SCORE_Y[p]*0.97f ); m_HighScore[p].SetXY( SCORE_X, SCORE_Y[p]*0.97f );
m_HighScore[p].SetZoom( 0.6f ); m_HighScore[p].SetZoom( 0.6f );
m_HighScore[p].SetDiffuseColor( PlayerToColor(p) ); m_HighScore[p].SetDiffuseColor( PlayerToColor(p) );
m_frameOverlay.AddActor( &m_HighScore[p] ); m_frameOverlay.AddSubActor( &m_HighScore[p] );
} }
m_sprHighScoreFrame[1].SetZoomY( -1 ); // flip vertically m_sprHighScoreFrame[1].SetZoomY( -1 ); // flip vertically
@@ -329,17 +330,17 @@ MusicWheel::MusicWheel()
m_sprSelectionOverlay.SetXY( 0, 0 ); m_sprSelectionOverlay.SetXY( 0, 0 );
m_sprSelectionOverlay.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); m_sprSelectionOverlay.SetDiffuseColor( D3DXCOLOR(1,1,1,1) );
m_sprSelectionOverlay.SetEffectGlowing( 1.0f, D3DXCOLOR(1,1,1,0.4f), D3DXCOLOR(1,1,1,1) ); m_sprSelectionOverlay.SetEffectGlowing( 1.0f, D3DXCOLOR(1,1,1,0.4f), D3DXCOLOR(1,1,1,1) );
m_frameOverlay.AddActor( &m_sprSelectionOverlay ); m_frameOverlay.AddSubActor( &m_sprSelectionOverlay );
m_MusicSortDisplay.SetXY( SORT_ICON_ON_SCREEN_X, SORT_ICON_ON_SCREEN_Y ); m_MusicSortDisplay.SetXY( SORT_ICON_ON_SCREEN_X, SORT_ICON_ON_SCREEN_Y );
m_MusicSortDisplay.SetEffectGlowing( 1.0f ); m_MusicSortDisplay.SetEffectGlowing( 1.0f );
m_frameOverlay.AddActor( &m_MusicSortDisplay ); m_frameOverlay.AddSubActor( &m_MusicSortDisplay );
this->AddActor( &m_frameOverlay ); this->AddSubActor( &m_frameOverlay );
m_ScrollBar.SetX( SCROLLBAR_X ); m_ScrollBar.SetX( SCROLLBAR_X );
this->AddActor( &m_ScrollBar ); this->AddSubActor( &m_ScrollBar );
m_soundChangeMusic.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_CHANGE_MUSIC), 16 ); m_soundChangeMusic.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_CHANGE_MUSIC), 16 );
@@ -359,7 +360,7 @@ MusicWheel::MusicWheel()
m_SortOrder = PREFSMAN->m_SongSortOrder; m_SortOrder = GAMESTATE->m_SongSortOrder;
m_MusicSortDisplay.Set( m_SortOrder ); m_MusicSortDisplay.Set( m_SortOrder );
m_MusicSortDisplay.SetXY( SORT_ICON_ON_SCREEN_X, SORT_ICON_ON_SCREEN_Y ); m_MusicSortDisplay.SetXY( SORT_ICON_ON_SCREEN_X, SORT_ICON_ON_SCREEN_Y );
@@ -380,23 +381,23 @@ MusicWheel::MusicWheel()
BuildWheelItemDatas( m_WheelItemDatas[so], SongSortOrder(so) ); BuildWheelItemDatas( m_WheelItemDatas[so], SongSortOrder(so) );
// select a song if none are selected // select a song if none are selected
if( SONGMAN->m_pCurSong == NULL && // if there is no currently selected song if( GAMESTATE->m_pCurSong == NULL && // if there is no currently selected song
SONGMAN->m_pSongs.GetSize() > 0 ) // and there is at least one song SONGMAN->m_pSongs.GetSize() > 0 ) // and there is at least one song
{ {
CArray<Song*, Song*> arraySongs; CArray<Song*, Song*> arraySongs;
SONGMAN->GetSongsInGroup( SONGMAN->m_sPreferredGroup, arraySongs ); SONGMAN->GetSongsInGroup( GAMESTATE->m_sPreferredGroup, arraySongs );
if( arraySongs.GetSize() > 0 ) if( arraySongs.GetSize() > 0 )
SONGMAN->SetCurrentSong( arraySongs[0] ); // select the first song GAMESTATE->m_pCurSong = arraySongs[0]; // select the first song
} }
if( SONGMAN->m_pCurSong != NULL ) if( GAMESTATE->m_pCurSong != NULL )
{ {
// find the previously selected song (if any) // find the previously selected song (if any)
for( int i=0; i<GetCurWheelItemDatas().GetSize(); i++ ) for( int i=0; i<GetCurWheelItemDatas().GetSize(); i++ )
{ {
if( GetCurWheelItemDatas()[i].m_pSong == SONGMAN->GetCurrentSong() ) if( GetCurWheelItemDatas()[i].m_pSong == GAMESTATE->m_pCurSong )
{ {
m_iSelection = i; // select it m_iSelection = i; // select it
m_sExpandedSectionName = GetCurWheelItemDatas()[m_iSelection].m_sSectionName; // make its group the currently expanded group m_sExpandedSectionName = GetCurWheelItemDatas()[m_iSelection].m_sSectionName; // make its group the currently expanded group
@@ -412,14 +413,14 @@ MusicWheel::MusicWheel()
MusicWheel::~MusicWheel() MusicWheel::~MusicWheel()
{ {
PREFSMAN->m_SongSortOrder = m_SortOrder; GAMESTATE->m_SongSortOrder = m_SortOrder;
} }
void MusicWheel::BuildWheelItemDatas( CArray<WheelItemData, WheelItemData&> &arrayWheelItemDatas, SongSortOrder so, bool bRoulette ) void MusicWheel::BuildWheelItemDatas( CArray<WheelItemData, WheelItemData&> &arrayWheelItemDatas, SongSortOrder so, bool bRoulette )
{ {
int i; int i;
switch( PREFSMAN->m_PlayMode ) switch( GAMESTATE->m_PlayMode )
{ {
case PLAY_MODE_ARCADE: case PLAY_MODE_ARCADE:
{ {
@@ -434,7 +435,7 @@ void MusicWheel::BuildWheelItemDatas( CArray<WheelItemData, WheelItemData&> &arr
Song* pSong = SONGMAN->m_pSongs[i]; Song* pSong = SONGMAN->m_pSongs[i];
CArray<Notes*, Notes*> arraySteps; CArray<Notes*, Notes*> arraySteps;
pSong->GetNotesThatMatch( GAMEMAN->GetCurrentStyleDef()->m_NotesType, arraySteps ); pSong->GetNotesThatMatch( GAMESTATE->GetCurrentStyleDef()->m_NotesType, arraySteps );
if( arraySteps.GetSize() > 0 ) if( arraySteps.GetSize() > 0 )
arraySongs.Add( pSong ); arraySongs.Add( pSong );
@@ -477,7 +478,7 @@ void MusicWheel::BuildWheelItemDatas( CArray<WheelItemData, WheelItemData&> &arr
{ {
case SORT_MOST_PLAYED: bUseSections = false; break; case SORT_MOST_PLAYED: bUseSections = false; break;
case SORT_BPM: bUseSections = false; break; case SORT_BPM: bUseSections = false; break;
case SORT_GROUP: bUseSections = SONGMAN->m_sPreferredGroup != "ALL MUSIC"; break; case SORT_GROUP: bUseSections = GAMESTATE->m_sPreferredGroup != "ALL MUSIC"; break;
case SORT_TITLE: bUseSections = true; break; case SORT_TITLE: bUseSections = true; break;
default: ASSERT( false ); default: ASSERT( false );
} }
@@ -568,7 +569,7 @@ void MusicWheel::BuildWheelItemDatas( CArray<WheelItemData, WheelItemData&> &arr
arrayWheelItemDatas.SetSize( 1 ); arrayWheelItemDatas.SetSize( 1 );
arrayWheelItemDatas[0].Load( TYPE_SECTION, NULL, "NO SONGS", NULL, D3DXCOLOR(1,0,0,1) ); arrayWheelItemDatas[0].Load( TYPE_SECTION, NULL, "NO SONGS", NULL, D3DXCOLOR(1,0,0,1) );
} }
else if( PREFSMAN->m_PlayMode == PLAY_MODE_ARCADE && !bRoulette ) else if( GAMESTATE->m_PlayMode == PLAY_MODE_ARCADE && !bRoulette )
{ {
arrayWheelItemDatas.SetSize( arrayWheelItemDatas.GetSize()+1 ); arrayWheelItemDatas.SetSize( arrayWheelItemDatas.GetSize()+1 );
arrayWheelItemDatas[arrayWheelItemDatas.GetSize()-1].Load( TYPE_ROULETTE, NULL, "", NULL, D3DXCOLOR(1,0,0,1) ); arrayWheelItemDatas[arrayWheelItemDatas.GetSize()-1].Load( TYPE_ROULETTE, NULL, "", NULL, D3DXCOLOR(1,0,0,1) );
@@ -667,9 +668,9 @@ void MusicWheel::RebuildWheelItemDisplays()
void MusicWheel::NotesChanged( PlayerNumber pn ) // update grade graphics and top score void MusicWheel::NotesChanged( PlayerNumber pn ) // update grade graphics and top score
{ {
DifficultyClass dc = PREFSMAN->m_PreferredDifficultyClass[pn]; DifficultyClass dc = GAMESTATE->m_PreferredDifficultyClass[pn];
Song* pSong = SONGMAN->GetCurrentSong(); Song* pSong = GAMESTATE->m_pCurSong;
Notes* m_pNotes = SONGMAN->GetCurrentNotes( pn ); Notes* m_pNotes = GAMESTATE->m_pCurNotes[ pn ];
if( m_pNotes ) if( m_pNotes )
m_HighScore[pn].SetScore( (float)m_pNotes->m_iTopScore ); m_HighScore[pn].SetScore( (float)m_pNotes->m_iTopScore );
+2 -2
View File
@@ -23,7 +23,7 @@
#include "MusicSortDisplay.h" #include "MusicSortDisplay.h"
#include "MusicStatusDisplay.h" #include "MusicStatusDisplay.h"
#include "Screen.h" // for ScreenMessage #include "Screen.h" // for ScreenMessage
#include "ScoreDisplayRolling.h" #include "ScoreDisplayNormal.h"
#include "ScrollBar.h" #include "ScrollBar.h"
#include "Course.h" #include "Course.h"
@@ -137,7 +137,7 @@ protected:
// Actors inside of m_frameOverlay // Actors inside of m_frameOverlay
Sprite m_sprSelectionOverlay; Sprite m_sprSelectionOverlay;
Sprite m_sprHighScoreFrame[NUM_PLAYERS]; Sprite m_sprHighScoreFrame[NUM_PLAYERS];
ScoreDisplayRolling m_HighScore[NUM_PLAYERS]; ScoreDisplayNormal m_HighScore[NUM_PLAYERS];
CArray<WheelItemData, WheelItemData&> m_WheelItemDatas[NUM_SORT_ORDERS]; CArray<WheelItemData, WheelItemData&> m_WheelItemDatas[NUM_SORT_ORDERS];
+1 -1
View File
@@ -13,7 +13,7 @@
#include "NoteData.h" #include "NoteData.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "ArrowEffects.h" #include "ArrowEffects.h"
#include "PrefsManager.h" #include "PrefsManager.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
+8 -8
View File
@@ -13,11 +13,11 @@
#include "NoteField.h" #include "NoteField.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "ArrowEffects.h" #include "ArrowEffects.h"
#include "PrefsManager.h" #include "PrefsManager.h"
#include "GameManager.h" #include "GameManager.h"
#include "SongManager.h" #include "GameState.h"
const float HOLD_NOTE_BITS_PER_BEAT = 6; const float HOLD_NOTE_BITS_PER_BEAT = 6;
const float HOLD_NOTE_BITS_PER_ROW = HOLD_NOTE_BITS_PER_BEAT / ELEMENTS_PER_BEAT; const float HOLD_NOTE_BITS_PER_ROW = HOLD_NOTE_BITS_PER_BEAT / ELEMENTS_PER_BEAT;
@@ -54,10 +54,10 @@ void NoteField::Load( NoteData* pNoteData, PlayerNumber p, StyleDef* pStyleDef,
for( int c=0; c<m_iNumTracks; c++ ) for( int c=0; c<m_iNumTracks; c++ )
{ {
CArray<D3DXCOLOR,D3DXCOLOR> arrayTweenColors; CArray<D3DXCOLOR,D3DXCOLOR> arrayTweenColors;
GAMEMAN->GetTweenColors( p, c, arrayTweenColors ); GAMEMAN->GetTweenColors( c, arrayTweenColors );
m_ColorNote[c].m_sprColorPart.Load( GAMEMAN->GetPathToGraphic( p, c, GRAPHIC_NOTE_COLOR_PART) ); m_ColorNote[c].m_sprColorPart.Load( GAMEMAN->GetPathTo(c, GRAPHIC_NOTE_COLOR_PART) );
m_ColorNote[c].m_sprGrayPart.Load( GAMEMAN->GetPathToGraphic( p, c, GRAPHIC_NOTE_GRAY_PART) ); m_ColorNote[c].m_sprGrayPart.Load( GAMEMAN->GetPathTo(c, GRAPHIC_NOTE_GRAY_PART) );
} }
@@ -65,7 +65,7 @@ void NoteField::Load( NoteData* pNoteData, PlayerNumber p, StyleDef* pStyleDef,
m_HoldNoteLife[i] = 1; // start with full life m_HoldNoteLife[i] = 1; // start with full life
ASSERT( m_iNumTracks == GAMEMAN->GetCurrentStyleDef()->m_iColsPerPlayer ); ASSERT( m_iNumTracks == GAMESTATE->GetCurrentStyleDef()->m_iColsPerPlayer );
} }
void NoteField::Update( float fDeltaTime, float fSongBeat ) void NoteField::Update( float fDeltaTime, float fSongBeat )
@@ -214,7 +214,7 @@ void NoteField::DrawPrimitives()
// //
// BPM text // BPM text
// //
CArray<BPMSegment,BPMSegment&> &aBPMSegments = SONGMAN->GetCurrentSong()->m_BPMSegments; CArray<BPMSegment,BPMSegment&> &aBPMSegments = GAMESTATE->m_pCurSong->m_BPMSegments;
for( i=0; i<aBPMSegments.GetSize(); i++ ) for( i=0; i<aBPMSegments.GetSize(); i++ )
{ {
DrawBPMText( BeatToNoteRow(aBPMSegments[i].m_fStartBeat), aBPMSegments[i].m_fBPM ); DrawBPMText( BeatToNoteRow(aBPMSegments[i].m_fStartBeat), aBPMSegments[i].m_fBPM );
@@ -223,7 +223,7 @@ void NoteField::DrawPrimitives()
// //
// Freeze text // Freeze text
// //
CArray<StopSegment,StopSegment&> &aStopSegments = SONGMAN->GetCurrentSong()->m_StopSegments; CArray<StopSegment,StopSegment&> &aStopSegments = GAMESTATE->m_pCurSong->m_StopSegments;
for( i=0; i<aStopSegments.GetSize(); i++ ) for( i=0; i<aStopSegments.GetSize(); i++ )
{ {
DrawFreezeText( BeatToNoteRow(aStopSegments[i].m_fStartBeat), aStopSegments[i].m_fStopSeconds ); DrawFreezeText( BeatToNoteRow(aStopSegments[i].m_fStartBeat), aStopSegments[i].m_fStopSeconds );
+1 -1
View File
@@ -15,7 +15,7 @@
#include "ActorFrame.h" #include "ActorFrame.h"
#include "Song.h" #include "Song.h"
#include "BitmapText.h" #include "BitmapText.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "StyleDef.h" #include "StyleDef.h"
#include "ColorNote.h" #include "ColorNote.h"
#include "BitmapText.h" #include "BitmapText.h"
+19 -9
View File
@@ -412,7 +412,6 @@ bool Notes::LoadFromDWITokens(
NoteData* pNoteData = new NoteData; NoteData* pNoteData = new NoteData;
ASSERT( pNoteData ); ASSERT( pNoteData );
printf( "sizeof NoteData = %d\n", sizeof(NoteData) );
pNoteData->m_iNumTracks = mapDanceNoteToNoteDataColumn.GetCount(); pNoteData->m_iNumTracks = mapDanceNoteToNoteDataColumn.GetCount();
for( int pad=0; pad<2; pad++ ) // foreach pad for( int pad=0; pad<2; pad++ ) // foreach pad
@@ -528,15 +527,23 @@ bool Notes::LoadFromDWITokens(
} }
void Notes::LoadFromSMTokens( void Notes::LoadFromSMTokens(
const CString &sNotesType, CString sNotesType,
const CString &sDescription, CString sDescription,
const CString &sDifficultyClass, CString sDifficultyClass,
const CString &sMeter, CString sMeter,
const CString &sRadarValues, CString sRadarValues,
const CString &sNoteData CString sNoteData
) )
{ {
LOG->WriteLine( "Notes::LoadFromSMTokens()" ); sNotesType.TrimLeft();
sNotesType.TrimRight();
sDescription.TrimLeft();
sDescription.TrimRight();
sDifficultyClass.TrimLeft();
sDifficultyClass.TrimRight();
// LOG->WriteLine( "Notes::LoadFromSMTokens()" );
m_NotesType = StringToNotesType(sNotesType); m_NotesType = StringToNotesType(sNotesType);
m_sDescription = sDescription; m_sDescription = sDescription;
@@ -603,18 +610,21 @@ DifficultyClass Notes::DifficultyClassFromDescriptionAndMeter( CString sDescript
{ {
sDescription.MakeLower(); sDescription.MakeLower();
const CString sDescriptionParts[NUM_DIFFICULTY_CLASSES][3] = { const CString sDescriptionParts[NUM_DIFFICULTY_CLASSES][4] = {
{ {
"easy",
"basic", "basic",
"light", "light",
"SDFKSJDKFJS", "SDFKSJDKFJS",
}, },
{ {
"medium",
"another", "another",
"trick", "trick",
"standard", "standard",
}, },
{ {
"hard",
"ssr", "ssr",
"maniac", "maniac",
"heavy", "heavy",
+6 -6
View File
@@ -33,12 +33,12 @@ public:
CString sStepData1, const CString sStepData2 CString sStepData1, const CString sStepData2
); );
void LoadFromSMTokens( void LoadFromSMTokens(
const CString &sNotesType, CString sNotesType,
const CString &sDescription, CString sDescription,
const CString &sDifficultyClass, CString sDifficultyClass,
const CString &sMeter, CString sMeter,
const CString &sRadarValues, CString sRadarValues,
const CString &sNoteDataOut CString sNoteDataOut
); );
void WriteSMNotesTag( FILE* fp ); void WriteSMNotesTag( FILE* fp );
+51 -46
View File
@@ -14,12 +14,13 @@
#include "Math.h" // for fabs() #include "Math.h" // for fabs()
#include "Player.h" #include "Player.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ArrowEffects.h" #include "ArrowEffects.h"
#include "GameManager.h" #include "GameManager.h"
#include "InputMapper.h" #include "InputMapper.h"
#include "SongManager.h" #include "SongManager.h"
#include "GameState.h"
// these two items are in the // these two items are in the
@@ -42,20 +43,22 @@ Player::Player()
m_pLifeMeter = NULL; m_pLifeMeter = NULL;
m_pScore = NULL; m_pScore = NULL;
this->AddActor( &m_GrayArrowRow ); this->AddSubActor( &m_GrayArrowRow );
this->AddActor( &m_NoteField ); this->AddSubActor( &m_NoteField );
this->AddActor( &m_GhostArrowRow ); this->AddSubActor( &m_GhostArrowRow );
m_frameJudgeAndCombo.AddActor( &m_Judgement ); m_frameJudgement.AddSubActor( &m_Judgement );
m_frameJudgeAndCombo.AddActor( &m_Combo ); this->AddSubActor( &m_frameJudgement );
this->AddActor( &m_frameJudgeAndCombo );
m_frameCombo.AddSubActor( &m_Combo );
this->AddSubActor( &m_frameCombo );
for( int c=0; c<MAX_NOTE_TRACKS; c++ ) for( int c=0; c<MAX_NOTE_TRACKS; c++ )
this->AddActor( &m_HoldJudgement[c] ); this->AddSubActor( &m_HoldJudgement[c] );
} }
void Player::Load( PlayerNumber player_no, StyleDef* pStyleDef, NoteData* pNoteData, const PlayerOptions& po, LifeMeterBar* pLM, ScoreDisplayRolling* pScore, int iOriginalNumNotes, int iNotesMeter ) void Player::Load( PlayerNumber player_no, StyleDef* pStyleDef, NoteData* pNoteData, const PlayerOptions& po, LifeMeter* pLM, ScoreDisplay* pScore, int iOriginalNumNotes, int iNotesMeter )
{ {
//LOG->WriteLine( "Player::Load()", ); //LOG->WriteLine( "Player::Load()", );
this->CopyAll( pNoteData ); this->CopyAll( pNoteData );
@@ -84,7 +87,8 @@ void Player::Load( PlayerNumber player_no, StyleDef* pStyleDef, NoteData* pNoteD
m_GrayArrowRow.Load( player_no, pStyleDef, po ); m_GrayArrowRow.Load( player_no, pStyleDef, po );
m_GhostArrowRow.Load( player_no, pStyleDef, po ); m_GhostArrowRow.Load( player_no, pStyleDef, po );
m_frameJudgeAndCombo.SetY( FRAME_JUDGE_AND_COMBO_Y ); m_frameJudgement.SetY( FRAME_JUDGE_AND_COMBO_Y );
m_frameCombo.SetY( FRAME_JUDGE_AND_COMBO_Y );
m_Combo.SetY( po.m_bReverseScroll ? -COMBO_Y_OFFSET : COMBO_Y_OFFSET ); m_Combo.SetY( po.m_bReverseScroll ? -COMBO_Y_OFFSET : COMBO_Y_OFFSET );
m_Judgement.SetY( po.m_bReverseScroll ? -JUDGEMENT_Y_OFFSET : JUDGEMENT_Y_OFFSET ); m_Judgement.SetY( po.m_bReverseScroll ? -JUDGEMENT_Y_OFFSET : JUDGEMENT_Y_OFFSET );
@@ -102,6 +106,7 @@ void Player::Update( float fDeltaTime, float fSongBeat, float fMaxBeatDifference
{ {
//LOG->WriteLine( "Player::Update(%f, %f, %f)", fDeltaTime, fSongBeat, fMaxBeatDifference ); //LOG->WriteLine( "Player::Update(%f, %f, %f)", fDeltaTime, fSongBeat, fMaxBeatDifference );
m_fSongBeat = fSongBeat; // save song beat
// //
// Check for TapNote misses // Check for TapNote misses
@@ -125,7 +130,7 @@ void Player::Update( float fDeltaTime, float fSongBeat, float fMaxBeatDifference
float fEndBeat = NoteRowToBeat( (float)hn.m_iEndIndex ); float fEndBeat = NoteRowToBeat( (float)hn.m_iEndIndex );
const StyleInput StyleI( m_PlayerNumber, hn.m_iTrack ); const StyleInput StyleI( m_PlayerNumber, hn.m_iTrack );
const GameInput GameI = GAMEMAN->GetCurrentStyleDef()->StyleInputToGameInput( StyleI ); const GameInput GameI = GAMESTATE->GetCurrentStyleDef()->StyleInputToGameInput( StyleI );
// update the life // update the life
@@ -162,6 +167,7 @@ void Player::Update( float fDeltaTime, float fSongBeat, float fMaxBeatDifference
if( fLife == 0 ) // the player has not pressed the button for a long time! if( fLife == 0 ) // the player has not pressed the button for a long time!
{ {
hns = HNS_NG; hns = HNS_NG;
GAMESTATE->GetLatestGameplayStatistics().iActualDancePoints[m_PlayerNumber] += HoldNoteScoreToDancePoints( hns );
m_Combo.EndCombo(); m_Combo.EndCombo();
m_HoldJudgement[hn.m_iTrack].SetHoldJudgement( HNS_NG ); m_HoldJudgement[hn.m_iTrack].SetHoldJudgement( HNS_NG );
} }
@@ -172,6 +178,7 @@ void Player::Update( float fDeltaTime, float fSongBeat, float fMaxBeatDifference
// At this point fLife > 0, or else we would have marked it NG above // At this point fLife > 0, or else we would have marked it NG above
fLife = 1; fLife = 1;
hns = HNS_OK; hns = HNS_OK;
GAMESTATE->GetLatestGameplayStatistics().iActualDancePoints[m_PlayerNumber] += HoldNoteScoreToDancePoints( hns );
m_HoldJudgement[hn.m_iTrack].SetHoldJudgement( HNS_OK ); m_HoldJudgement[hn.m_iTrack].SetHoldJudgement( HNS_OK );
m_NoteField.SetHoldNoteLife( i, fLife ); // update the NoteField display m_NoteField.SetHoldNoteLife( i, fLife ); // update the NoteField display
} }
@@ -181,7 +188,8 @@ void Player::Update( float fDeltaTime, float fSongBeat, float fMaxBeatDifference
ActorFrame::Update( fDeltaTime ); ActorFrame::Update( fDeltaTime );
m_frameJudgeAndCombo.Update( fDeltaTime ); m_frameJudgement.Update( fDeltaTime );
m_frameCombo.Update( fDeltaTime );
if( m_pLifeMeter ) if( m_pLifeMeter )
m_pLifeMeter->SetBeat( fSongBeat ); m_pLifeMeter->SetBeat( fSongBeat );
@@ -189,9 +197,6 @@ void Player::Update( float fDeltaTime, float fSongBeat, float fMaxBeatDifference
m_GrayArrowRow.Update( fDeltaTime, fSongBeat ); m_GrayArrowRow.Update( fDeltaTime, fSongBeat );
m_NoteField.Update( fDeltaTime, fSongBeat ); m_NoteField.Update( fDeltaTime, fSongBeat );
m_GhostArrowRow.Update( fDeltaTime, fSongBeat ); m_GhostArrowRow.Update( fDeltaTime, fSongBeat );
m_fSongBeat = fSongBeat; // save song beat
} }
void Player::DrawPrimitives() void Player::DrawPrimitives()
@@ -222,6 +227,8 @@ void Player::DrawPrimitives()
DISPLAY->GetDevice()->SetTransform( D3DTS_PROJECTION, &matNewProj ); DISPLAY->GetDevice()->SetTransform( D3DTS_PROJECTION, &matNewProj );
} }
m_frameCombo.Draw();
m_GrayArrowRow.Draw(); m_GrayArrowRow.Draw();
m_NoteField.Draw(); m_NoteField.Draw();
m_GhostArrowRow.Draw(); m_GhostArrowRow.Draw();
@@ -237,7 +244,7 @@ void Player::DrawPrimitives()
DISPLAY->GetDevice()->SetRenderState( D3DRS_ZWRITEENABLE, TRUE ); DISPLAY->GetDevice()->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
} }
m_frameJudgeAndCombo.Draw(); m_frameJudgement.Draw();
for( int c=0; c<m_iNumTracks; c++ ) for( int c=0; c<m_iNumTracks; c++ )
m_HoldJudgement[c].Draw(); m_HoldJudgement[c].Draw();
@@ -359,6 +366,9 @@ void Player::OnRowDestroyed( float fSongBeat, int col, float fMaxBeatDiff, int i
if( m_pScore ) if( m_pScore )
m_pScore->AddToScore( score, m_Combo.GetCurrentCombo() ); // update score - called once per note in this row m_pScore->AddToScore( score, m_Combo.GetCurrentCombo() ); // update score - called once per note in this row
// update dance points for Oni lifemeter
GAMESTATE->GetLatestGameplayStatistics().iActualDancePoints[m_PlayerNumber] += TapNoteScoreToDancePoints( score );
// update combo - called once per note in this row // update combo - called once per note in this row
switch( score ) switch( score )
{ {
@@ -383,9 +393,13 @@ void Player::OnRowDestroyed( float fSongBeat, int col, float fMaxBeatDiff, int i
case TNS_GOOD: fStartZoom = 1.2f; break; case TNS_GOOD: fStartZoom = 1.2f; break;
case TNS_BOO: fStartZoom = 1.0f; break; case TNS_BOO: fStartZoom = 1.0f; break;
} }
m_frameJudgeAndCombo.SetZoom( fStartZoom ); m_frameJudgement.SetZoom( fStartZoom );
m_frameJudgeAndCombo.BeginTweening( 0.2f ); m_frameJudgement.BeginTweening( 0.2f );
m_frameJudgeAndCombo.SetTweenZoom( 1 ); m_frameJudgement.SetTweenZoom( 1 );
m_frameCombo.SetZoom( fStartZoom );
m_frameCombo.BeginTweening( 0.2f );
m_frameCombo.SetTweenZoom( 1 );
} }
@@ -443,16 +457,12 @@ void Player::CrossedRow( int iNoteRow, float fSongBeat, float fMaxBeatDiff )
GameplayStatistics Player::GetGameplayStatistics( Song* pS, Notes* pN ) void Player::SaveGameplayStatistics()
{ {
GameplayStatistics GSreturn; GameplayStatistics& GS = GAMESTATE->m_aGameplayStatistics[GAMESTATE->m_aGameplayStatistics.GetSize()-1];
int p = m_PlayerNumber;
GSreturn.pSong = pS; GS.iActualDancePoints[p] = 0;
Notes* pNotes = pN;
GSreturn.dc = pNotes->m_DifficultyClass;
GSreturn.meter = pNotes->m_iMeter;
GSreturn.iPossibleDancePoints = ((NoteData*)this)->GetPossibleDancePoints();
GSreturn.iActualDancePoints = 0;
for( int t=0; t<MAX_NOTE_TRACKS; t++ ) for( int t=0; t<MAX_NOTE_TRACKS; t++ )
{ {
@@ -463,41 +473,36 @@ GameplayStatistics Player::GetGameplayStatistics( Song* pS, Notes* pN )
switch( m_TapNoteScores[t][r] ) switch( m_TapNoteScores[t][r] )
{ {
case TNS_PERFECT: GSreturn.perfect++; break; case TNS_PERFECT: GS.perfect[p]++; break;
case TNS_GREAT: GSreturn.great++; break; case TNS_GREAT: GS.great[p]++; break;
case TNS_GOOD: GSreturn.good++; break; case TNS_GOOD: GS.good[p]++; break;
case TNS_BOO: GSreturn.boo++; break; case TNS_BOO: GS.boo[p]++; break;
case TNS_MISS: GSreturn.miss++; break; case TNS_MISS: GS.miss[p]++; break;
case TNS_NONE: break; case TNS_NONE: break;
default: ASSERT( false ); default: ASSERT( false );
} }
GSreturn.iActualDancePoints += TapNoteScoreToDancePoints( m_TapNoteScores[t][r] ); GS.iActualDancePoints[p] += TapNoteScoreToDancePoints( m_TapNoteScores[t][r] );
} }
} }
for( int i=0; i<m_iNumHoldNotes; i++ ) for( int i=0; i<m_iNumHoldNotes; i++ )
{ {
switch( m_HoldNoteScores[i] ) switch( m_HoldNoteScores[i] )
{ {
case HNS_NG: GSreturn.ng++; break; case HNS_NG: GS.ng[p]++; break;
case HNS_OK: GSreturn.ok++; break; case HNS_OK: GS.ok[p]++; break;
case HNS_NONE: break; case HNS_NONE: break;
default: ASSERT( false ); default: ASSERT( false );
} }
GSreturn.iActualDancePoints += HoldNoteScoreToDancePoints( m_HoldNoteScores[i] ); GS.iActualDancePoints[p] += HoldNoteScoreToDancePoints( m_HoldNoteScores[i] );
} }
GSreturn.max_combo = m_Combo.GetMaxCombo(); GS.max_combo[p] = m_Combo.GetMaxCombo();
GSreturn.score = m_pScore ? m_pScore->GetScore() : 0; GS.score[p] = m_pScore ? m_pScore->GetScore() : 0;
GSreturn.failed = m_pLifeMeter ? m_pLifeMeter->HasFailed() : false; GS.failed[p] = m_pLifeMeter ? m_pLifeMeter->FailedEarlier() : false;
for( int r=0; r<NUM_RADAR_VALUES; r++ ) for( int r=0; r<NUM_RADAR_VALUES; r++ )
{ {
GSreturn.fRadarPossible[r] = this->GetRadarValue( (RadarCategory)r, pS->m_fMusicLengthSeconds ); GS.fRadarActual[p][r] = this->GetActualRadarValue( (RadarCategory)r, GAMESTATE->m_pCurSong->m_fMusicLengthSeconds );
GSreturn.fRadarActual[r] = this->GetActualRadarValue( (RadarCategory)r, pS->m_fMusicLengthSeconds ); CLAMP( GS.fRadarActual[p][r], 0, 1 );
GSreturn.fRadarPossible[r] = clamp( GSreturn.fRadarPossible[r], 0, 1 );
GSreturn.fRadarActual[r] = clamp( GSreturn.fRadarActual[r], 0, 1 );
} }
return GSreturn;
} }
+11 -7
View File
@@ -1,7 +1,7 @@
#pragma once #pragma once
/* /*
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
File: Player.h Class: Player
Desc: Object that accepts pad input, knocks down ColorNotes that were stepped on, Desc: Object that accepts pad input, knocks down ColorNotes that were stepped on,
and keeps score for the player. and keeps score for the player.
@@ -23,7 +23,7 @@
#include "HoldGhostArrow.h" #include "HoldGhostArrow.h"
#include "ActorFrame.h" #include "ActorFrame.h"
#include "RandomSample.h" #include "RandomSample.h"
#include "ScoreDisplayRolling.h" #include "ScoreDisplay.h"
#include "LifeMeterBar.h" #include "LifeMeterBar.h"
#include "Judgement.h" #include "Judgement.h"
#include "HoldJudgement.h" #include "HoldJudgement.h"
@@ -44,12 +44,12 @@ public:
void Update( float fDeltaTime, float fSongBeat, float fMaxBeatDifference ); void Update( float fDeltaTime, float fSongBeat, float fMaxBeatDifference );
void DrawPrimitives(); void DrawPrimitives();
void Load( PlayerNumber player_no, StyleDef *pStyleDef, NoteData* pNoteData, const PlayerOptions& po, LifeMeterBar* pLM, ScoreDisplayRolling* pScore, int iOriginalNumNotes, int iNotesMeter ); void Load( PlayerNumber player_no, StyleDef *pStyleDef, NoteData* pNoteData, const PlayerOptions& po, LifeMeter* pLM, ScoreDisplay* pScore, int iOriginalNumNotes, int iNotesMeter );
void CrossedRow( int iNoteRow, float fSongBeat, float fMaxBeatDiff ); void CrossedRow( int iNoteRow, float fSongBeat, float fMaxBeatDiff );
void HandlePlayerStep( float fSongBeat, int col, float fMaxBeatDiff ); void HandlePlayerStep( float fSongBeat, int col, float fMaxBeatDiff );
int UpdateTapNotesMissedOlderThan( float fMissIfOlderThanThisBeat ); int UpdateTapNotesMissedOlderThan( float fMissIfOlderThanThisBeat );
GameplayStatistics GetGameplayStatistics( Song* pS, Notes* pN ); void SaveGameplayStatistics();
void SetOverrideAdd( float fAdd ) { m_NoteField.m_fOverrideAdd = fAdd; }; void SetOverrideAdd( float fAdd ) { m_NoteField.m_fOverrideAdd = fAdd; };
float GetOverrideAdd() { return m_NoteField.m_fOverrideAdd; }; float GetOverrideAdd() { return m_NoteField.m_fOverrideAdd; };
@@ -74,10 +74,14 @@ protected:
GhostArrowRow m_GhostArrowRow; GhostArrowRow m_GhostArrowRow;
HoldJudgement m_HoldJudgement[MAX_NOTE_TRACKS]; HoldJudgement m_HoldJudgement[MAX_NOTE_TRACKS];
ActorFrame m_frameJudgeAndCombo;
ActorFrame m_frameJudgement;
Judgement m_Judgement; Judgement m_Judgement;
ActorFrame m_frameCombo;
Combo m_Combo; Combo m_Combo;
LifeMeterBar* m_pLifeMeter;
ScoreDisplayRolling* m_pScore; LifeMeter* m_pLifeMeter;
ScoreDisplay* m_pScore;
}; };
+52 -79
View File
@@ -13,6 +13,7 @@
#include "PrefsManager.h" #include "PrefsManager.h"
#include "IniFile.h" #include "IniFile.h"
#include "GameManager.h" #include "GameManager.h"
#include "GameState.h"
PrefsManager* PREFSMAN = NULL; // global and accessable from anywhere in our program PrefsManager* PREFSMAN = NULL; // global and accessable from anywhere in our program
@@ -21,8 +22,9 @@ PrefsManager* PREFSMAN = NULL; // global and accessable from anywhere in our pro
PrefsManager::PrefsManager() PrefsManager::PrefsManager()
{ {
m_bWindowed = false; m_bWindowed = false;
m_bHighDetail = true; m_iDisplayResolution = 640;
m_bHighTextureDetail = false; m_iTextureResolution = 512;
m_iRefreshRate = 60;
m_bIgnoreJoyAxes = false; m_bIgnoreJoyAxes = false;
m_bShowFPS = false; m_bShowFPS = false;
m_BackgroundMode = BGMODE_ANIMATIONS; m_BackgroundMode = BGMODE_ANIMATIONS;
@@ -33,21 +35,16 @@ PrefsManager::PrefsManager()
m_bAutoPlay = false; m_bAutoPlay = false;
m_fJudgeWindow = 0.18f; m_fJudgeWindow = 0.18f;
for( int p=0; p<NUM_PLAYERS; p++ ) ReadGlobalPrefsFromDisk( true );
m_PreferredDifficultyClass[p] = CLASS_EASY;
m_SongSortOrder = SORT_GROUP;
m_PlayMode = PLAY_MODE_INVALID;
m_iCurrentStageIndex = 0;
ReadPrefsFromDisk();
} }
PrefsManager::~PrefsManager() PrefsManager::~PrefsManager()
{ {
SavePrefsToDisk(); SaveGlobalPrefsToDisk();
SaveGamePrefsToDisk();
} }
void PrefsManager::ReadPrefsFromDisk() void PrefsManager::ReadGlobalPrefsFromDisk( bool bSwitchToLastPlayedGame )
{ {
IniFile ini; IniFile ini;
ini.SetPath( "StepMania.ini" ); ini.SetPath( "StepMania.ini" );
@@ -55,8 +52,9 @@ void PrefsManager::ReadPrefsFromDisk()
return; // could not read config file, load nothing return; // could not read config file, load nothing
ini.GetValueB( "Options", "Windowed", m_bWindowed ); ini.GetValueB( "Options", "Windowed", m_bWindowed );
ini.GetValueB( "Options", "HighDetail", m_bHighDetail ); ini.GetValueI( "Options", "DisplayResolution", m_iDisplayResolution );
ini.GetValueB( "Options", "HighTextureDetail", m_bHighTextureDetail ); ini.GetValueI( "Options", "TextureResolution", m_iTextureResolution );
ini.GetValueI( "Options", "RefreshRate", m_iRefreshRate );
ini.GetValueB( "Options", "IgnoreJoyAxes", m_bIgnoreJoyAxes ); ini.GetValueB( "Options", "IgnoreJoyAxes", m_bIgnoreJoyAxes );
ini.GetValueB( "Options", "ShowFPS", m_bShowFPS ); ini.GetValueB( "Options", "ShowFPS", m_bShowFPS );
ini.GetValueI( "Options", "BackgroundMode", (int&)m_BackgroundMode ); ini.GetValueI( "Options", "BackgroundMode", (int&)m_BackgroundMode );
@@ -67,23 +65,28 @@ void PrefsManager::ReadPrefsFromDisk()
ini.GetValueB( "Options", "AutoPlay", m_bAutoPlay ); ini.GetValueB( "Options", "AutoPlay", m_bAutoPlay );
ini.GetValueF( "Options", "JudgeWindow", m_fJudgeWindow ); ini.GetValueF( "Options", "JudgeWindow", m_fJudgeWindow );
ini.GetValue( "Options", "Announcer", m_sAnnouncer );
ini.GetValue( "Options", "NoteSkin", m_sNoteSkin );
CString sAdditionalSongFolders; CString sAdditionalSongFolders;
ini.GetValue( "Options", "SongFolders", sAdditionalSongFolders ); ini.GetValue( "Options", "SongFolders", sAdditionalSongFolders );
split( sAdditionalSongFolders, ",", m_asSongFolders, true ); split( sAdditionalSongFolders, ",", m_asSongFolders, true );
if( bSwitchToLastPlayedGame )
{
Game game;
if( ini.GetValueI("Options", "Game", (int&)game) )
GAMESTATE->SwitchGame( game );
}
} }
void PrefsManager::SavePrefsToDisk() void PrefsManager::SaveGlobalPrefsToDisk()
{ {
IniFile ini; IniFile ini;
ini.SetPath( "StepMania.ini" ); ini.SetPath( "StepMania.ini" );
ini.SetValueB( "Options", "Windowed", m_bWindowed ); ini.SetValueB( "Options", "Windowed", m_bWindowed );
ini.SetValueB( "Options", "HighDetail", m_bHighDetail ); ini.SetValueI( "Options", "DisplayResolution", m_iDisplayResolution );
ini.SetValueB( "Options", "HighTextureDetail", m_bHighTextureDetail ); ini.SetValueI( "Options", "TextureResolution", m_iTextureResolution );
ini.SetValueI( "Options", "RefreshRate", m_iRefreshRate );
ini.SetValueB( "Options", "IgnoreJoyAxes", m_bIgnoreJoyAxes ); ini.SetValueB( "Options", "IgnoreJoyAxes", m_bIgnoreJoyAxes );
ini.SetValueB( "Options", "ShowFPS", m_bShowFPS ); ini.SetValueB( "Options", "ShowFPS", m_bShowFPS );
ini.SetValueI( "Options", "BackgroundMode", m_BackgroundMode); ini.SetValueI( "Options", "BackgroundMode", m_BackgroundMode);
@@ -94,78 +97,48 @@ void PrefsManager::SavePrefsToDisk()
ini.SetValueB( "Options", "AutoPlay", m_bAutoPlay ); ini.SetValueB( "Options", "AutoPlay", m_bAutoPlay );
ini.SetValueF( "Options", "JudgeWindow", m_fJudgeWindow ); ini.SetValueF( "Options", "JudgeWindow", m_fJudgeWindow );
ini.SetValue( "Options", "Announcer", m_sAnnouncer );
ini.SetValue( "Options", "NoteSkin", m_sNoteSkin );
ini.SetValue( "Options", "SongFolders", join(",", m_asSongFolders) ); ini.SetValue( "Options", "SongFolders", join(",", m_asSongFolders) );
ini.SetValueI( "Options", "Game", GAMESTATE->GetCurGame() );
ini.WriteFile(); ini.WriteFile();
} }
int PrefsManager::GetStageIndex() void PrefsManager::ReadGamePrefsFromDisk()
{ {
return m_iCurrentStageIndex; if( !GAMESTATE )
} return;
bool PrefsManager::IsFinalStage() CString sGameName = GAMESTATE->GetCurrentGameDef()->m_szName;
{ IniFile ini;
if( PREFSMAN->m_bEventMode ) ini.SetPath( sGameName + "Prefs.ini" );
return false; if( !ini.ReadFile() )
return m_iCurrentStageIndex == m_iNumArcadeStages-1; return; // could not read config file, load nothing
}
bool PrefsManager::IsExtraStage() CString sAnnouncer, sTheme, sNoteSkin;
{
if( PREFSMAN->m_bEventMode )
return false;
return m_iCurrentStageIndex == m_iNumArcadeStages;
}
bool PrefsManager::IsExtraStage2() ini.GetValue( "Options", "Announcer", sAnnouncer );
{ ini.GetValue( "Options", "Theme", sTheme );
if( PREFSMAN->m_bEventMode ) ini.GetValue( "Options", "NoteSkin", sNoteSkin );
return false;
return m_iCurrentStageIndex == m_iNumArcadeStages+1;
}
CString PrefsManager::GetStageText()
{
if( IsFinalStage() )
return "Final";
else if( IsExtraStage() )
return "Extra";
else if( IsExtraStage2() )
return "Extra 2";
int iStageNo = m_iCurrentStageIndex+1; ANNOUNCER->SwitchAnnouncer( sAnnouncer );
THEME->SwitchTheme( sTheme );
CString sNumberSuffix; GAMEMAN->SwitchNoteSkin( sNoteSkin );
if( ( (iStageNo/10) % 10 ) == 1 ) // in the teens (e.g. 19, 213)
{
sNumberSuffix = "th";
}
else // not in the teens
{
const int iLastDigit = iStageNo%10;
switch( iLastDigit )
{
case 1: sNumberSuffix = "st"; break;
case 2: sNumberSuffix = "nd"; break;
case 3: sNumberSuffix = "rd"; break;
default:sNumberSuffix = "th"; break;
}
}
return ssprintf( "%d%s", iStageNo, sNumberSuffix );
} }
D3DXCOLOR PrefsManager::GetStageColor() void PrefsManager::SaveGamePrefsToDisk()
{ {
if( IsFinalStage() ) if( !GAMESTATE )
return D3DXCOLOR(1,0.1f,0.1f,1); // red return;
else if( IsExtraStage() || IsExtraStage2() )
return D3DXCOLOR(1,1,0.3f,1); // yellow
else
return D3DXCOLOR(0.3f,1,0.3f,1); // green
}
CString sGameName = GAMESTATE->GetCurrentGameDef()->m_szName;
IniFile ini;
ini.SetPath( sGameName + "Prefs.ini" );
ini.SetValue( "Options", "Announcer", ANNOUNCER->GetCurAnnouncerName() );
ini.SetValue( "Options", "Theme", THEME->GetCurThemeName() );
ini.SetValue( "Options", "NoteSkin", GAMEMAN->GetCurNoteSkin() );
ini.WriteFile();
}
+30 -27
View File
@@ -3,9 +3,7 @@
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Class: PrefsManager Class: PrefsManager
Desc: Holds user-chosen preferences and saves it between sessions. This class Desc: Holds user-chosen preferences that are saved between sessions.
also has temporary holders for information that passed between windows - e.g.
GameplayStatistics.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford Chris Danford
@@ -15,7 +13,9 @@
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
const int NUM_PAD_TO_DEVICE_SLOTS = 3; // three device inputs may map to one pad input #include "AnnouncerManager.h"
#include "ThemeManager.h"
#include "GameManager.h"
class PrefsManager class PrefsManager
@@ -28,8 +28,9 @@ public:
// GameOptions (ARE saved between sessions) // GameOptions (ARE saved between sessions)
bool m_bWindowed; bool m_bWindowed;
bool m_bHighDetail; int m_iDisplayResolution;
bool m_bHighTextureDetail; int m_iTextureResolution;
int m_iRefreshRate;
bool m_bIgnoreJoyAxes; bool m_bIgnoreJoyAxes;
bool m_bShowFPS; bool m_bShowFPS;
BackgroundMode m_BackgroundMode; BackgroundMode m_BackgroundMode;
@@ -40,32 +41,34 @@ public:
bool m_bAutoPlay; bool m_bAutoPlay;
float m_fJudgeWindow; float m_fJudgeWindow;
// AppearanceOptions (ARE saved between sessions)
CString m_sAnnouncer;
CString m_sNoteSkin;
CStringArray m_asSongFolders; CStringArray m_asSongFolders;
void ReadPrefsFromDisk(); int GetDisplayHeight()
void SavePrefsToDisk(); {
switch( m_iDisplayResolution )
{
case 1280: return 1024; break;
case 1024: return 768; break;
case 800: return 600; break;
case 640: return 480; break;
case 512: return 384; break;
case 400: return 300; break;
case 320: return 240; break;
default: throw RageException( "Invalid DisplayWidth '%d'", m_iDisplayResolution ); return 480;
}
}
void ReadGlobalPrefsFromDisk( bool bSwitchToLastPlayedGame );
void SaveGlobalPrefsToDisk();
// Options that are NOT saved between sessions // AppearanceOptions (ARE saved between sessions, and saved per game)
DifficultyClass m_PreferredDifficultyClass[NUM_PLAYERS]; // CString m_sAnnouncer; // need to make sure to call ANNOUNCER->SwitchAnnouncer() when this changes
SongSortOrder m_SongSortOrder; // used by MusicWheel and should be saved until the app exits // CString m_sTheme; // need to make sure to call THEME->SwitchTheme() when this changes
PlayMode m_PlayMode; // CString m_sNoteSkin;
int m_iCurrentStageIndex; // starts at 0, and is incremented with each Stage Clear
int GetStageIndex(); void ReadGamePrefsFromDisk();
bool IsFinalStage(); void SaveGamePrefsToDisk();
bool IsExtraStage();
bool IsExtraStage2();
CString GetStageText();
D3DXCOLOR GetStageColor();
PlayerOptions m_PlayerOptions[NUM_PLAYERS];
SongOptions m_SongOptions;
}; };
+13 -10
View File
@@ -103,9 +103,12 @@ RageDisplay::~RageDisplay()
// Desc: // Desc:
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool RageDisplay::SwitchDisplayMode( bool RageDisplay::SwitchDisplayMode(
const bool bWindowed, const DWORD dwWidth, const DWORD dwHeight, const DWORD dwBPP ) const bool bWindowed, const int iWidth, const int iHeight, const int iBPP, const int iFullScreenHz )
{ {
LOG->WriteLine( "RageDisplay::SwitchDisplayModes( %d, %u, %u, %u )", bWindowed, dwWidth, dwHeight, dwBPP ); LOG->WriteLine( "RageDisplay::SwitchDisplayModes( %d, %d, %d, %d, %d )", bWindowed, iWidth, iHeight, iBPP, iFullScreenHz );
if( !bWindowed )
SetCursor( NULL );
HRESULT hr; HRESULT hr;
@@ -126,7 +129,7 @@ bool RageDisplay::SwitchDisplayMode(
else // full screen else // full screen
{ {
// add only the formats that match dwBPP // add only the formats that match dwBPP
switch( dwBPP ) switch( iBPP )
{ {
case 16: case 16:
arrayBackBufferFormats.Add( D3DFMT_R5G6B5 ); arrayBackBufferFormats.Add( D3DFMT_R5G6B5 );
@@ -139,7 +142,7 @@ bool RageDisplay::SwitchDisplayMode(
arrayBackBufferFormats.Add( D3DFMT_A8R8G8B8 ); arrayBackBufferFormats.Add( D3DFMT_A8R8G8B8 );
break; break;
default: default:
throw RageException( ssprintf("Invalid BPP '%u' specified", dwBPP) ); throw RageException( ssprintf("Invalid BPP '%u' specified", iBPP) );
return false; return false;
} }
} }
@@ -184,7 +187,7 @@ bool RageDisplay::SwitchDisplayMode(
if( i == arrayBackBufferFormats.GetSize() ) // we didn't find an appropriate format if( i == arrayBackBufferFormats.GetSize() ) // we didn't find an appropriate format
{ {
LOG->WriteLineHr( hr, "failed to find an appropriate format for %d, %u, %u, %u.", bWindowed, dwWidth, dwHeight, dwBPP ); LOG->WriteLineHr( hr, "failed to find an appropriate format for %d, %u, %u, %u.", bWindowed, iWidth, iHeight, iBPP );
return false; return false;
} }
@@ -193,8 +196,8 @@ bool RageDisplay::SwitchDisplayMode(
// Set up presentation parameters for the display // Set up presentation parameters for the display
ZeroMemory( &m_d3dpp, sizeof(m_d3dpp) ); ZeroMemory( &m_d3dpp, sizeof(m_d3dpp) );
m_d3dpp.BackBufferWidth = dwWidth; m_d3dpp.BackBufferWidth = iWidth;
m_d3dpp.BackBufferHeight = dwHeight; m_d3dpp.BackBufferHeight = iHeight;
m_d3dpp.BackBufferFormat = fmtBackBuffer; m_d3dpp.BackBufferFormat = fmtBackBuffer;
m_d3dpp.BackBufferCount = 1; m_d3dpp.BackBufferCount = 1;
m_d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; m_d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
@@ -204,7 +207,7 @@ bool RageDisplay::SwitchDisplayMode(
m_d3dpp.EnableAutoDepthStencil = TRUE; m_d3dpp.EnableAutoDepthStencil = TRUE;
m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16; m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
m_d3dpp.Flags = 0; m_d3dpp.Flags = 0;
m_d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; m_d3dpp.FullScreen_RefreshRateInHz = bWindowed ? D3DPRESENT_RATE_DEFAULT : iFullScreenHz;
m_d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; m_d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
LOG->WriteLine( "Present Parameters: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d", LOG->WriteLine( "Present Parameters: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",
@@ -245,7 +248,7 @@ bool RageDisplay::SwitchDisplayMode(
D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED,
&m_d3dpp, &m_pd3dDevice) ) ) &m_d3dpp, &m_pd3dDevice) ) )
{ {
LOG->WriteLineHr( hr, "failed to create device: %d, %u, %u, %u.", bWindowed, dwWidth, dwHeight, dwBPP ); LOG->WriteLineHr( hr, "failed to create device: %d, %u, %u, %u.", bWindowed, iWidth, iHeight, iBPP );
return false; return false;
} }
LOG->WriteLine( LOG->WriteLine(
@@ -261,7 +264,7 @@ bool RageDisplay::SwitchDisplayMode(
// device is already created. Just reset it. // device is already created. Just reset it.
if( FAILED( hr = m_pd3dDevice->Reset( &m_d3dpp ) ) ) if( FAILED( hr = m_pd3dDevice->Reset( &m_d3dpp ) ) )
{ {
LOG->WriteLineHr( hr, "failed to reset device: %d, %u, %u, %u.", bWindowed, dwWidth, dwHeight, dwBPP ); LOG->WriteLineHr( hr, "failed to reset device: %d, %u, %u, %u.", bWindowed, iWidth, iHeight, iBPP );
return false; return false;
} }
} }
+1 -1
View File
@@ -41,7 +41,7 @@ public:
RageDisplay( HWND hWnd ); RageDisplay( HWND hWnd );
~RageDisplay(); ~RageDisplay();
bool SwitchDisplayMode( bool SwitchDisplayMode(
const bool bWindowed, const DWORD dwWidth, const DWORD dwHeight, const DWORD dwBPP ); const bool bWindowed, const int iWidth, const int iHeight, const int iBPP, const int iFullScreenHz );
LPDIRECT3D8 GetD3D() { return m_pd3d; }; LPDIRECT3D8 GetD3D() { return m_pd3d; };
inline LPDIRECT3DDEVICE8 GetDevice() { return m_pd3dDevice; }; inline LPDIRECT3DDEVICE8 GetDevice() { return m_pd3dDevice; };
-2
View File
@@ -31,8 +31,6 @@ RageLog::RageLog()
// delete old log files // delete old log files
DeleteFile( LOG_FILE_NAME ); DeleteFile( LOG_FILE_NAME );
ShowConsole();
// Open log file and leave it open. Let the OS close it when the app exits // Open log file and leave it open. Let the OS close it when the app exits
m_fileLog = fopen( LOG_FILE_NAME, "w" ); m_fileLog = fopen( LOG_FILE_NAME, "w" );
+135 -15
View File
@@ -12,7 +12,9 @@
*/ */
#include "RageUtil.h" #include "RageUtil.h"
#include "RageCRC32.h" // Backend for GetHashForString
ULONG randseed = time(NULL);
bool IsAnInt( LPCTSTR s ) bool IsAnInt( LPCTSTR s )
@@ -21,10 +23,8 @@ bool IsAnInt( LPCTSTR s )
return false; return false;
for( UINT i=0; i<strlen(s); i++ ) for( UINT i=0; i<strlen(s); i++ )
{
if( s[i] < '0' || s[i] > '9' ) if( s[i] < '0' || s[i] > '9' )
return false; return false;
}
return true; return true;
} }
@@ -286,16 +286,6 @@ void GetDirListing( CString sPath, CStringArray &AddTo, bool bOnlyDirs, bool bRe
::FindClose( hFind ); ::FindClose( hFind );
} }
//-----------------------------------------------------------------------------
// Name: GetCrc32ForString( CString s)
// Desc: Coerces CString into an unsigned char array and runs CRC-32 on it.
//-----------------------------------------------------------------------------
unsigned int GetCrc32ForString( CString s )
{
// A CString has built in length data! Isn't that great?
return GetCrc32((unsigned char*)s.GetBuffer(s.GetLength()), s.GetLength());
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Name: GetHashForString( CString s ) // Name: GetHashForString( CString s )
// Desc: This new version of GetHashForString uses a stronger hashing algorithm // Desc: This new version of GetHashForString uses a stronger hashing algorithm
@@ -305,9 +295,139 @@ unsigned int GetCrc32ForString( CString s )
// characters in the CString are recast as unsigned char and that the // characters in the CString are recast as unsigned char and that the
// unsigned int result from the hash is recast as a signed int). // unsigned int result from the hash is recast as a signed int).
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
int GetHashForString ( CString s ) int GetHashForString ( CString string )
{ {
return (int)abs(GetCrc32((unsigned char*)s.GetBuffer(s.GetLength()), s.GetLength())); /*
* RageCRC32.cpp
*
* Original code
* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
* code or tables extracted from it, as desired without restriction.
*
* Code was extracted from IETF Internet Draft
* draft-ietf-tsvwg-sctpcsum-00 at URI
* http://www.ietf.org/proceedings/01dec/I-D/draft-ietf-tsvwg-sctpcsum-00.txt
*
* Adaptation
* Copyright (C) 2002 Peter S. May.
* SourceForge ID: drokulix
*
* - Header file added
* - Name of function changed to GetCrc32
* - Values in table changed from long int to int
*
* Chris:
* Moved this code out of RageCRC32 since it's not terribly long. Thanks Dro Kulix!
*/
/*
* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
* code or tables extracted from it, as desired without restriction.
*
* First, the polynomial itself and its table of feedback terms. The
* polynomial is
* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
*
* Note that we take it "backwards" and put the highest-order term in
* the lowest-order bit. The X^32 term is "implied"; the LSB is the
* X^31 term, etc. The X^0 term (usually shown as "+1") results in
* the MSB being 1
*
* Note that the usual hardware shift register implementation, which
* is what we're using (we're merely optimizing it by doing eight-bit
* chunks at a time) shifts bits into the lowest-order term. In our
* implementation, that means shifting towards the right. Why do we
* do it this way? Because the calculated CRC must be transmitted in
* order from highest-order term to lowest-order term. UARTs transmit
* characters in order from LSB to MSB. By storing the CRC this way
* we hand it to the UART in the order low-byte to high-byte; the UART
* sends each low-bit to hight-bit; and the result is transmission bit
* by bit from highest- to lowest-order term without requiring any bit
* shuffling on our part. Reception works similarly
*
* The feedback terms table consists of 256, 32-bit entries. Notes
*
* The table can be generated at runtime if desired; code to do so
* is shown later. It might not be obvious, but the feedback
* terms simply represent the results of eight shift/xor opera
* tions for all combinations of data and CRC register values
*
* The values must be right-shifted by eight bits by the "updcrc
* logic; the shift must be unsigned (bring in zeroes). On some
* hardware you could probably optimize the shift in assembler by
* using byte-swap instructions
* polynomial $edb88320
*/
static const unsigned int crc32_tab[] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
0x2d02ef8d
};
/* Return a 32-bit CRC of the contents of the buffer. */
//unsigned int
//GetCrc32(const unsigned char *s, unsigned int len)
//{
const char* s = string;
int len = string.GetLength();
unsigned int crc32val = 0;
for( int i=0; i<len; i++ )
crc32val = crc32_tab[(crc32val ^ s[i]) & 0xff] ^ (crc32val >> 8);
return crc32val;
//}
} }
int GetHashForFile( CString sPath ) int GetHashForFile( CString sPath )
+46 -5
View File
@@ -3,7 +3,7 @@
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
File: RageUtil File: RageUtil
Desc: Miscellaneous helper functions. Desc: Miscellaneous helper macros and functions.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford Chris Danford
@@ -18,10 +18,8 @@
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } } #define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
#define ZERO(x) memset(&x, 0, sizeof(x))
//-----------------------------------------------------------------------------
// Other Macros
//-----------------------------------------------------------------------------
#define RECTWIDTH(rect) ((rect).right - (rect).left) #define RECTWIDTH(rect) ((rect).right - (rect).left)
#define RECTHEIGHT(rect) ((rect).bottom - (rect).top) #define RECTHEIGHT(rect) ((rect).bottom - (rect).top)
inline int RECTCENTERX(RECT rect) { return rect.left + (rect.right-rect.left)/2; } inline int RECTCENTERX(RECT rect) { return rect.left + (rect.right-rect.left)/2; }
@@ -37,11 +35,55 @@ inline int RECTCENTERY(RECT rect) { return rect.top + (rect.bottom-rect.top)/2;
#define clamp(val,low,high) ( max( (low), min((val),(high)) ) ) #define clamp(val,low,high) ( max( (low), min((val),(high)) ) )
#define PI D3DX_PI
#define DEG (PI / 180.0f)
#define RAD (180.0f / PI)
// Scales x so that l1 corresponds to l2 and h1 corresponds to h2. Does not modify x, MUST assign the result to something!
#define SCALE(x, l1, h1, l2, h2) (((x) - (l1)) / ((h1) - (l1)) * ((h2) - (l2)) + (l2))
// Clamps x
#define CLAMP(x, l, h) {if (x > h) x = h; else if (x < l) x = l;}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Misc helper functions // Misc helper functions
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Fast random number generators
// Taken from "Numerical Recipes in C"
extern ULONG randseed;
inline ULONG Random()
{
randseed = 1664525L * randseed + 1013904223L;
return randseed;
}
inline float RandomFloat()
{
randseed = 1664525L * randseed + 1013904223L;
ULONG itemp = 0x3f800000 | (0x007fffff & randseed);
return (*(float *)&itemp) - 1.0f;
}
// Returns a float between dLow and dHigh inclusive
inline float RandomFloat(float fLow, float fHigh)
{
return RandomFloat() * (fHigh - fLow) + fLow;
}
// Returns an integer between nLow and nHigh inclusive
inline int RandomInt(int nLow, int nHigh)
{
return ((Random() >> 2) % (nHigh - nLow + 1)) + nLow;
}
// Debug new for memory leak tracing
//#ifdef _DEBUG
//#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
//#endif
// Simple function for generating random numbers // Simple function for generating random numbers
inline float randomf( const float low=-1.0f, const float high=1.0f ) inline float randomf( const float low=-1.0f, const float high=1.0f )
{ {
@@ -98,7 +140,6 @@ CString join(
void GetDirListing( CString sPath, CStringArray &AddTo, bool bOnlyDirs=false, bool bReturnPathToo=false ); void GetDirListing( CString sPath, CStringArray &AddTo, bool bOnlyDirs=false, bool bReturnPathToo=false );
int GetHashForString( CString s ); int GetHashForString( CString s );
unsigned int GetCrc32ForString( CString s );
int GetHashForFile( CString sPath ); int GetHashForFile( CString sPath );
int GetHashForDirectory( CString sDir ); // a hash value that remains the same as long as nothing in the directory has changed int GetHashForDirectory( CString sDir ); // a hash value that remains the same as long as nothing in the directory has changed
+3
View File
@@ -31,6 +31,9 @@ RandomSample::~RandomSample()
bool RandomSample::LoadSoundDir( CString sDir ) bool RandomSample::LoadSoundDir( CString sDir )
{ {
if( sDir == "" )
return true;
// make sure there's a backslash at the end of this path // make sure there's a backslash at the end of this path
if( sDir[sDir.GetLength()-1] != '\\' ) if( sDir[sDir.GetLength()-1] != '\\' )
sDir += "\\"; sDir += "\\";
+18
View File
@@ -0,0 +1,18 @@
#include "stdafx.h"
/*
-----------------------------------------------------------------------------
Class: ScoreDisplay.h
Desc: A graphic displayed in the ScoreDisplay during Dancing.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "ScoreDisplay.h"
#include "RageUtil.h"
#include "RageLog.h"
#include "PrefsManager.h"
#include "RageLog.h"
#include "GameState.h"
+33
View File
@@ -0,0 +1,33 @@
#pragma once
/*
-----------------------------------------------------------------------------
Class: ScoreDisplay
Desc: A graphic displayed in the ScoreDisplay during Dancing.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "Sprite.h"
#include "Song.h"
#include "ActorFrame.h"
#include "BitmapText.h"
class ScoreDisplay : public BitmapText
{
public:
virtual void Init( PlayerNumber pn, PlayerOptions po, int iOriginalNumNotes, int iNotesMeter ) = 0;
virtual void SetScore( float fNewScore ) = 0;
virtual int GetScore() = 0;
virtual void AddToScore( TapNoteScore score, int iCurCombo ) = 0;
virtual void Update( float fDeltaTime ) = 0;
virtual void Draw() = 0;
protected:
};
+159
View File
@@ -0,0 +1,159 @@
#include "stdafx.h"
/*
-----------------------------------------------------------------------------
Class: ScoreDisplayNormal.h
Desc: A graphic displayed in the ScoreDisplayNormal during Dancing.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "ScoreDisplayNormal.h"
#include "RageUtil.h"
#include "RageLog.h"
#include "PrefsManager.h"
#include "RageLog.h"
#include "GameState.h"
const float SCORE_TWEEN_TIME = 0.5f;
ScoreDisplayNormal::ScoreDisplayNormal()
{
LOG->WriteLine( "ScoreDisplayNormal::ScoreDisplayNormal()" );
// init the text
Load( THEME->GetPathTo(FONT_SCORE_NUMBERS) );
TurnShadowOff();
m_fTrailingScore = 0;
SetScore( 0 );
}
void ScoreDisplayNormal::Init( PlayerNumber pn, PlayerOptions po, int iOriginalNumNotes, int iNotesMeter )
{
m_PlayerNumber = pn;
m_PlayerOptions = po;
m_iTotalNotes = iOriginalNumNotes;
m_iNotesMeter = iNotesMeter;
//for( int i=0; i<iOriginalNumNotes; i++ )
// AddToScore( TNS_GREAT, i );
}
void ScoreDisplayNormal::SetScore( float fNewScore )
{
m_fScore = fNewScore;
float fDelta = (float)m_fScore - m_fTrailingScore;
m_fScoreVelocity = fDelta / SCORE_TWEEN_TIME; // in score units per second
}
int ScoreDisplayNormal::GetScore()
{
return (int)m_fScore;
}
void ScoreDisplayNormal::Update( float fDeltaTime )
{
BitmapText::Update( fDeltaTime );
float fDeltaBefore = (float)m_fScore - m_fTrailingScore;
m_fTrailingScore += m_fScoreVelocity * fDeltaTime;
float fDeltaAfter = (float)m_fScore - m_fTrailingScore;
if( fDeltaBefore * fDeltaAfter < 0 ) // the sign changed
{
m_fTrailingScore = (float)m_fScore;
m_fScoreVelocity = 0;
}
}
void ScoreDisplayNormal::Draw()
{
if( m_fScore == 0 )
{
CString sFormat = ssprintf( "%%%d.0d", NUM_SCORE_DIGITS );
SetText( ssprintf(sFormat, 0) );
}
else
{
CString sFormat = ssprintf( "%%%d.0f", NUM_SCORE_DIGITS );
SetText( ssprintf(sFormat, m_fTrailingScore) );
}
BitmapText::Draw();
}
void ScoreDisplayNormal::AddToScore( TapNoteScore score, int iCurCombo )
{
//A single step's points are calculated as follows:
//
//Let p = score multiplier (Perfect = 10, Great = 5, other = 0)
//N = total number of steps and freeze steps
//n = number of the current step or freeze step (varies from 1 to N)
//B = Base value of the song (1,000,000 X the number of feet difficulty) - All edit data is rated as 5 feet
//So, the score for one step is:
//one_step_score = p * (B/S) * n
//Where S = The sum of all integers from 1 to N (the total number of steps/freeze steps)
//
//*IMPORTANT* : Double steps (U+L, D+R, etc.) count as two steps instead of one, so if you get a double L+R on the 112th step of a song, you score is calculated with a Perfect/Great/whatever for both the 112th and 113th steps. Got it? Now, through simple algebraic manipulation
//S = 1+...+N = (1+N)*N/2 (1 through N added together)
//Okay, time for an example:
//
//So, for example, suppose we wanted to calculate the step score of a "Great" on the 57th step of a 441 step, 8-foot difficulty song (I'm just making this one up):
//
//S = (1 + 441)*441 / 2
//= 194,222 / 2
//= 97,461
//StepScore = p * (B/S) * n
//= 5 * (8,000,000 / 97,461) * 57
//= 5 * (82) * 57 (The 82 is rounded down from 82.08411...)
//= 23,370
//Remember this is just the score for the step, not the cumulative score up to the 57th step. Also, please note that I am currently checking into rounding errors with the system and if there are any, how they are resolved in the system.
//
//Note: if you got all Perfect on this song, you would get (p=10)*B, which is 80,000,000. In fact, the maximum possible score for any song is the number of feet difficulty X 10,000,000.
if( PREFSMAN->m_bAutoPlay )
return; // No Scoring on Autoplay!
static int iNumTimesCalled = 0;
iNumTimesCalled ++;
LOG->WriteLine("Called %d times - param %d.",iNumTimesCalled, iCurCombo);
int p; // score multiplier
switch( score )
{
case TNS_PERFECT: p = 10; break;
case TNS_GREAT: p = 5; break;
default: p = 0; break;
}
int N = m_iTotalNotes;
int n = iCurCombo+1;
int B = m_iNotesMeter * 1000000;
float S = (1+N)*N/2.0f;
int one_step_score = roundf( p * (B/S) * n );
m_fScore += one_step_score;
ASSERT( m_fScore >= 0 );
// HACK: The final total is slightly off because of rounding errors
if( fabsf(m_fScore-B*10) < 100.0f )
m_fScore = (float)B*10;
this->SetScore( m_fScore );
}
+43
View File
@@ -0,0 +1,43 @@
#pragma once
/*
-----------------------------------------------------------------------------
Class: ScoreDisplayNormal
Desc: A graphic displayed in the ScoreDisplayNormal during Dancing.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "ScoreDisplay.h"
const int NUM_SCORE_DIGITS = 9;
class ScoreDisplayNormal : public ScoreDisplay
{
public:
ScoreDisplayNormal();
virtual void Init( PlayerNumber pn, PlayerOptions po, int iOriginalNumNotes, int iNotesMeter );
virtual void SetScore( float fNewScore );
virtual int GetScore();
virtual void AddToScore( TapNoteScore score, int iCurCombo );
virtual void Update( float fDeltaTime );
virtual void Draw();
protected:
PlayerNumber m_PlayerNumber;
PlayerOptions m_PlayerOptions;
int m_iTotalNotes;
int m_iNotesMeter;
float m_fScore;
float m_fTrailingScore;
float m_fScoreVelocity;
};
+152
View File
@@ -0,0 +1,152 @@
#include "stdafx.h"
/*
-----------------------------------------------------------------------------
Class: ScoreDisplayOni.h
Desc: A graphic displayed in the ScoreDisplayOni during Dancing.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "ScoreDisplayOni.h"
#include "RageUtil.h"
#include "RageLog.h"
#include "PrefsManager.h"
#include "RageLog.h"
#include "GameState.h"
const float SCORE_TWEEN_TIME = 0.5f;
ScoreDisplayOni::ScoreDisplayOni()
{
LOG->WriteLine( "ScoreDisplayOni::ScoreDisplayOni()" );
// init the text
Load( THEME->GetPathTo(FONT_SCORE_NUMBERS) );
TurnShadowOff();
m_fTrailingScore = 0;
SetScore( 0 );
}
void ScoreDisplayOni::Init( PlayerNumber pn, PlayerOptions po, int iOriginalNumNotes, int iNotesMeter )
{
m_PlayerNumber = pn;
m_PlayerOptions = po;
m_iTotalNotes = iOriginalNumNotes;
m_iNotesMeter = iNotesMeter;
//for( int i=0; i<iOriginalNumNotes; i++ )
// AddToScore( TNS_GREAT, i );
}
void ScoreDisplayOni::SetScore( float fNewScore )
{
m_fScore = fNewScore;
float fDelta = (float)m_fScore - m_fTrailingScore;
m_fScoreVelocity = fDelta / SCORE_TWEEN_TIME; // in score units per second
}
int ScoreDisplayOni::GetScore()
{
return (int)m_fScore;
}
void ScoreDisplayOni::Update( float fDeltaTime )
{
BitmapText::Update( fDeltaTime );
float fDeltaBefore = (float)m_fScore - m_fTrailingScore;
m_fTrailingScore += m_fScoreVelocity * fDeltaTime;
float fDeltaAfter = (float)m_fScore - m_fTrailingScore;
if( fDeltaBefore * fDeltaAfter < 0 ) // the sign changed
{
m_fTrailingScore = (float)m_fScore;
m_fScoreVelocity = 0;
}
}
void ScoreDisplayOni::Draw()
{
float fSecsIntoPlay = 0;
for( int i=0; i<GAMESTATE->m_aGameplayStatistics.GetSize(); i++ )
fSecsIntoPlay += GAMESTATE->m_aGameplayStatistics[i].fSecsIntoPlay[m_PlayerNumber];
int iMinsDisplay = (int)fSecsIntoPlay/60;
int iSecsDisplay = (int)fSecsIntoPlay - iMinsDisplay*60;
int iLeftoverDisplay = int( (fSecsIntoPlay - iMinsDisplay*60 - iSecsDisplay) * 100 );
SetText( ssprintf( "%02d:%02d:%02d", iMinsDisplay, iSecsDisplay, iLeftoverDisplay ) );
BitmapText::Draw();
}
void ScoreDisplayOni::AddToScore( TapNoteScore score, int iCurCombo )
{
//A single step's points are calculated as follows:
//
//Let p = score multiplier (Perfect = 10, Great = 5, other = 0)
//N = total number of steps and freeze steps
//n = number of the current step or freeze step (varies from 1 to N)
//B = Base value of the song (1,000,000 X the number of feet difficulty) - All edit data is rated as 5 feet
//So, the score for one step is:
//one_step_score = p * (B/S) * n
//Where S = The sum of all integers from 1 to N (the total number of steps/freeze steps)
//
//*IMPORTANT* : Double steps (U+L, D+R, etc.) count as two steps instead of one, so if you get a double L+R on the 112th step of a song, you score is calculated with a Perfect/Great/whatever for both the 112th and 113th steps. Got it? Now, through simple algebraic manipulation
//S = 1+...+N = (1+N)*N/2 (1 through N added together)
//Okay, time for an example:
//
//So, for example, suppose we wanted to calculate the step score of a "Great" on the 57th step of a 441 step, 8-foot difficulty song (I'm just making this one up):
//
//S = (1 + 441)*441 / 2
//= 194,222 / 2
//= 97,461
//StepScore = p * (B/S) * n
//= 5 * (8,000,000 / 97,461) * 57
//= 5 * (82) * 57 (The 82 is rounded down from 82.08411...)
//= 23,370
//Remember this is just the score for the step, not the cumulative score up to the 57th step. Also, please note that I am currently checking into rounding errors with the system and if there are any, how they are resolved in the system.
//
//Note: if you got all Perfect on this song, you would get (p=10)*B, which is 80,000,000. In fact, the maximum possible score for any song is the number of feet difficulty X 10,000,000.
static int iNumTimesCalled = 0;
iNumTimesCalled ++;
LOG->WriteLine("Called %d times - param %d.",iNumTimesCalled, iCurCombo);
int p; // score multiplier
switch( score )
{
case TNS_PERFECT: p = 10; break;
case TNS_GREAT: p = 5; break;
default: p = 0; break;
}
int N = m_iTotalNotes;
int n = iCurCombo+1;
int B = m_iNotesMeter * 1000000;
float S = (1+N)*N/2.0f;
int one_step_score = roundf( p * (B/S) * n );
m_fScore += one_step_score;
ASSERT( m_fScore >= 0 );
// HACK: The final total is slightly off because of rounding errors
if( fabsf(m_fScore-B*10) < 100.0f )
m_fScore = (float)B*10;
this->SetScore( m_fScore );
}
+42
View File
@@ -0,0 +1,42 @@
#pragma once
/*
-----------------------------------------------------------------------------
Class: ScoreDisplayOni
Desc: A graphic displayed in the ScoreDisplayOni during Dancing.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "Song.h"
#include "ScoreDisplay.h"
class ScoreDisplayOni : public ScoreDisplay
{
public:
ScoreDisplayOni();
virtual void Init( PlayerNumber pn, PlayerOptions po, int iOriginalNumNotes, int iNotesMeter );
virtual void SetScore( float fNewScore );
virtual int GetScore();
virtual void AddToScore( TapNoteScore score, int iCurCombo );
virtual void Update( float fDeltaTime );
virtual void Draw();
protected:
PlayerNumber m_PlayerNumber;
PlayerOptions m_PlayerOptions;
int m_iTotalNotes;
int m_iNotesMeter;
float m_fScore;
float m_fTrailingScore;
float m_fScoreVelocity;
};
+2 -1
View File
@@ -12,6 +12,7 @@
#include "Screen.h" #include "Screen.h"
#include "GameManager.h" #include "GameManager.h"
#include "GameState.h"
Screen::Screen() Screen::Screen()
{ {
@@ -51,7 +52,7 @@ void Screen::Input( const DeviceInput& DeviceI, const InputEventType type, const
if( !MenuI.IsValid() ) if( !MenuI.IsValid() )
return; return;
if( !GAMEMAN->IsPlayerEnabled(MenuI.player) ) if( !GAMESTATE->IsPlayerEnabled(MenuI.player) )
return; return;
switch( MenuI.button ) switch( MenuI.button )
+44 -11
View File
@@ -21,21 +21,24 @@
#include "ScreenTitleMenu.h" #include "ScreenTitleMenu.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "StepMania.h" #include "StepMania.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "RageLog.h" #include "RageLog.h"
#include "AnnouncerManager.h" #include "AnnouncerManager.h"
#include "GameManager.h" #include "GameManager.h"
#include "GameState.h"
enum { enum {
AO_ANNOUNCER = 0, AO_ANNOUNCER = 0,
AO_THEME,
AO_SKIN, AO_SKIN,
NUM_APPEARANCE_OPTIONS_LINES NUM_APPEARANCE_OPTIONS_LINES
}; };
OptionLineData g_AppearanceOptionsLines[NUM_APPEARANCE_OPTIONS_LINES] = { OptionLineData g_AppearanceOptionsLines[NUM_APPEARANCE_OPTIONS_LINES] = {
{ "Announcer", 1, {"OFF"} }, // fill this in on ImportOptions() { "Announcer", 1, {"OFF"} }, // fill this in on ImportOptions()
{ "Theme", 0, {""} }, // fill this in on ImportOptions()
{ "Note Skin", 0, {""} }, // fill this in on ImportOptions() { "Note Skin", 0, {""} }, // fill this in on ImportOptions()
}; };
@@ -57,7 +60,9 @@ ScreenAppearanceOptions::ScreenAppearanceOptions() :
void ScreenAppearanceOptions::ImportOptions() void ScreenAppearanceOptions::ImportOptions()
{ {
//
// fill in announcer names // fill in announcer names
//
CStringArray arrayAnnouncerNames; CStringArray arrayAnnouncerNames;
ANNOUNCER->GetAnnouncerNames( arrayAnnouncerNames ); ANNOUNCER->GetAnnouncerNames( arrayAnnouncerNames );
@@ -71,7 +76,7 @@ void ScreenAppearanceOptions::ImportOptions()
m_iSelectedOption[0][AO_ANNOUNCER] = -1; m_iSelectedOption[0][AO_ANNOUNCER] = -1;
for( i=1; i<m_OptionLineData[AO_ANNOUNCER].iNumOptions; i++ ) for( i=1; i<m_OptionLineData[AO_ANNOUNCER].iNumOptions; i++ )
{ {
if( stricmp(m_OptionLineData[AO_ANNOUNCER].szOptionsText[i], ANNOUNCER->GetCurrentAnnouncerName())==0 ) if( 0==stricmp(m_OptionLineData[AO_ANNOUNCER].szOptionsText[i], ANNOUNCER->GetCurAnnouncerName()) )
{ {
m_iSelectedOption[0][AO_ANNOUNCER] = i; m_iSelectedOption[0][AO_ANNOUNCER] = i;
break; break;
@@ -81,9 +86,37 @@ void ScreenAppearanceOptions::ImportOptions()
m_iSelectedOption[0][AO_ANNOUNCER] = 0; m_iSelectedOption[0][AO_ANNOUNCER] = 0;
//
// fill in theme names
//
CStringArray arrayThemeNames;
THEME->GetThemeNames( arrayThemeNames );
m_OptionLineData[AO_THEME].iNumOptions = arrayThemeNames.GetSize() + 1;
for( i=0; i<arrayThemeNames.GetSize(); i++ )
strcpy( m_OptionLineData[AO_THEME].szOptionsText[i+1], arrayThemeNames[i] );
// highlight currently selected theme
m_iSelectedOption[0][AO_THEME] = -1;
for( i=1; i<m_OptionLineData[AO_THEME].iNumOptions; i++ )
{
if( 0==stricmp(m_OptionLineData[AO_THEME].szOptionsText[i], THEME->GetCurThemeName()) )
{
m_iSelectedOption[0][AO_THEME] = i;
break;
}
}
if( m_iSelectedOption[0][AO_THEME] == -1 )
m_iSelectedOption[0][AO_THEME] = 0;
//
// fill in skin names // fill in skin names
//
CStringArray arraySkinNames; CStringArray arraySkinNames;
GAMEMAN->GetSkinNames( arraySkinNames ); GAMEMAN->GetNoteSkinNames( arraySkinNames );
m_OptionLineData[AO_SKIN].iNumOptions = arraySkinNames.GetSize(); m_OptionLineData[AO_SKIN].iNumOptions = arraySkinNames.GetSize();
@@ -94,7 +127,7 @@ void ScreenAppearanceOptions::ImportOptions()
m_iSelectedOption[0][AO_SKIN] = -1; m_iSelectedOption[0][AO_SKIN] = -1;
for( i=0; i<m_OptionLineData[AO_SKIN].iNumOptions; i++ ) for( i=0; i<m_OptionLineData[AO_SKIN].iNumOptions; i++ )
{ {
if( stricmp(m_OptionLineData[AO_SKIN].szOptionsText[i], GAMEMAN->m_sCurrentSkin)==0 ) if( 0==stricmp(m_OptionLineData[AO_SKIN].szOptionsText[i], GAMEMAN->GetCurNoteSkin()) )
{ {
m_iSelectedOption[0][AO_SKIN] = i; m_iSelectedOption[0][AO_SKIN] = i;
break; break;
@@ -110,26 +143,26 @@ void ScreenAppearanceOptions::ExportOptions()
CString sNewAnnouncer = m_OptionLineData[AO_ANNOUNCER].szOptionsText[iSelectedAnnouncer]; CString sNewAnnouncer = m_OptionLineData[AO_ANNOUNCER].szOptionsText[iSelectedAnnouncer];
if( iSelectedAnnouncer == 0 ) if( iSelectedAnnouncer == 0 )
sNewAnnouncer = ""; sNewAnnouncer = "";
PREFSMAN->m_sAnnouncer = sNewAnnouncer;
ANNOUNCER->SwitchAnnouncer( sNewAnnouncer ); ANNOUNCER->SwitchAnnouncer( sNewAnnouncer );
int iSelectedTheme = m_iSelectedOption[0][AO_THEME];
CString sNewTheme = m_OptionLineData[AO_THEME].szOptionsText[iSelectedTheme];
THEME->SwitchTheme( sNewTheme );
int iSelectedSkin = m_iSelectedOption[0][AO_SKIN]; int iSelectedSkin = m_iSelectedOption[0][AO_SKIN];
CString sNewSkin = m_OptionLineData[AO_SKIN].szOptionsText[iSelectedSkin]; CString sNewSkin = m_OptionLineData[AO_SKIN].szOptionsText[iSelectedSkin];
PREFSMAN->m_sNoteSkin = sNewSkin; GAMEMAN->SwitchNoteSkin( sNewSkin );
GAMEMAN->m_sCurrentSkin = sNewSkin;
} }
void ScreenAppearanceOptions::GoToPrevState() void ScreenAppearanceOptions::GoToPrevState()
{ {
SCREENMAN->SetNewScreen( new ScreenTitleMenu ); GoToNextState();
PREFSMAN->SavePrefsToDisk();
} }
void ScreenAppearanceOptions::GoToNextState() void ScreenAppearanceOptions::GoToNextState()
{ {
SCREENMAN->SetNewScreen( new ScreenTitleMenu ); SCREENMAN->SetNewScreen( new ScreenTitleMenu );
PREFSMAN->SavePrefsToDisk(); PREFSMAN->SaveGlobalPrefsToDisk();
} }
+3 -3
View File
@@ -14,7 +14,7 @@ Desc: Screen that displays while resources are being loaded.
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ScreenSelectStyle.h" #include "ScreenSelectStyle.h"
#include "RageTextureManager.h" #include "RageTextureManager.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "AnnouncerManager.h" #include "AnnouncerManager.h"
@@ -27,10 +27,10 @@ ScreenCaution::ScreenCaution()
{ {
m_sprCaution.Load( THEME->GetPathTo(GRAPHIC_CAUTION) ); m_sprCaution.Load( THEME->GetPathTo(GRAPHIC_CAUTION) );
m_sprCaution.StretchTo( CRect(0,0,640,480) ); m_sprCaution.StretchTo( CRect(0,0,640,480) );
this->AddActor( &m_sprCaution ); this->AddSubActor( &m_sprCaution );
m_Wipe.OpenWipingRight( SM_DoneOpening ); m_Wipe.OpenWipingRight( SM_DoneOpening );
this->AddActor( &m_Wipe ); this->AddSubActor( &m_Wipe );
this->SendScreenMessage( SM_StartClosing, 3 ); this->SendScreenMessage( SM_StartClosing, 3 );
} }
+18 -16
View File
@@ -17,11 +17,13 @@
#include "ScreenSelectMusic.h" #include "ScreenSelectMusic.h"
#include "ScreenEvaluation.h" #include "ScreenEvaluation.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "GameManager.h" #include "GameManager.h"
#include "ScreenEditMenu.h" #include "ScreenEditMenu.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "RageLog.h" #include "RageLog.h"
#include "GameState.h"
#include "GameState.h"
// //
@@ -87,9 +89,9 @@ ScreenEdit::ScreenEdit()
{ {
LOG->WriteLine( "ScreenEdit::ScreenEdit()" ); LOG->WriteLine( "ScreenEdit::ScreenEdit()" );
m_pSong = SONGMAN->GetCurrentSong(); m_pSong = GAMESTATE->m_pCurSong;
m_pNotes = SONGMAN->m_pCurNotes[PLAYER_1]; m_pNotes = GAMESTATE->m_pCurNotes[PLAYER_1];
if( m_pNotes == NULL ) if( m_pNotes == NULL )
{ {
m_pNotes = new Notes; m_pNotes = new Notes;
@@ -107,7 +109,7 @@ ScreenEdit::ScreenEdit()
// GAMEMAN->m_CurStyle is set to the target game style // GAMEMAN->m_CurStyle is set to the target game style
// of the current edit. Naturally, this is where we'll // of the current edit. Naturally, this is where we'll
// want to extract the NotesType for a (NEW) sequence. // want to extract the NotesType for a (NEW) sequence.
m_pNotes->m_NotesType = StyleToNotesType( GAMEMAN->m_CurStyle ); m_pNotes->m_NotesType = GAMESTATE->GetCurrentStyleDef()->m_NotesType;
m_pSong->m_apNotes.Add( m_pNotes ); m_pSong->m_apNotes.Add( m_pNotes );
} }
@@ -134,27 +136,27 @@ ScreenEdit::ScreenEdit()
m_GranularityIndicator.SetZoom( 0.5f ); m_GranularityIndicator.SetZoom( 0.5f );
m_GrayArrowRowEdit.SetXY( EDIT_X, EDIT_GRAY_Y ); m_GrayArrowRowEdit.SetXY( EDIT_X, EDIT_GRAY_Y );
m_GrayArrowRowEdit.Load( PLAYER_1, GAMEMAN->GetCurrentStyleDef(), m_PlayerOptions ); m_GrayArrowRowEdit.Load( PLAYER_1, GAMESTATE->GetCurrentStyleDef(), m_PlayerOptions );
m_GrayArrowRowEdit.SetZoom( 0.5f ); m_GrayArrowRowEdit.SetZoom( 0.5f );
m_NoteFieldEdit.SetXY( EDIT_X, EDIT_GRAY_Y ); m_NoteFieldEdit.SetXY( EDIT_X, EDIT_GRAY_Y );
m_NoteFieldEdit.SetZoom( 0.5f ); m_NoteFieldEdit.SetZoom( 0.5f );
m_NoteFieldEdit.Load( &noteData, PLAYER_1, GAMEMAN->GetCurrentStyleDef(), m_PlayerOptions, 10, 12, NoteField::MODE_EDITING ); m_NoteFieldEdit.Load( &noteData, PLAYER_1, GAMESTATE->GetCurrentStyleDef(), m_PlayerOptions, 10, 12, NoteField::MODE_EDITING );
m_rectRecordBack.StretchTo( CRect(SCREEN_LEFT, SCREEN_TOP, SCREEN_RIGHT, SCREEN_BOTTOM) ); m_rectRecordBack.StretchTo( CRect(SCREEN_LEFT, SCREEN_TOP, SCREEN_RIGHT, SCREEN_BOTTOM) );
m_rectRecordBack.SetDiffuseColor( D3DXCOLOR(0,0,0,0) ); m_rectRecordBack.SetDiffuseColor( D3DXCOLOR(0,0,0,0) );
m_GrayArrowRowRecord.SetXY( EDIT_X, EDIT_GRAY_Y ); m_GrayArrowRowRecord.SetXY( EDIT_X, EDIT_GRAY_Y );
m_GrayArrowRowRecord.Load( PLAYER_1, GAMEMAN->GetCurrentStyleDef(), m_PlayerOptions ); m_GrayArrowRowRecord.Load( PLAYER_1, GAMESTATE->GetCurrentStyleDef(), m_PlayerOptions );
m_GrayArrowRowRecord.SetZoom( 1.0f ); m_GrayArrowRowRecord.SetZoom( 1.0f );
m_NoteFieldRecord.SetXY( EDIT_X, EDIT_GRAY_Y ); m_NoteFieldRecord.SetXY( EDIT_X, EDIT_GRAY_Y );
m_NoteFieldRecord.SetZoom( 1.0f ); m_NoteFieldRecord.SetZoom( 1.0f );
m_NoteFieldRecord.Load( &noteData, PLAYER_1, GAMEMAN->GetCurrentStyleDef(), m_PlayerOptions, 2, 5, NoteField::MODE_EDITING ); m_NoteFieldRecord.Load( &noteData, PLAYER_1, GAMESTATE->GetCurrentStyleDef(), m_PlayerOptions, 2, 5, NoteField::MODE_EDITING );
m_Clipboard.m_iNumTracks = m_NoteFieldEdit.m_iNumTracks; m_Clipboard.m_iNumTracks = m_NoteFieldEdit.m_iNumTracks;
m_Player.Load( PLAYER_1, GAMEMAN->GetCurrentStyleDef(), &noteData, PlayerOptions(), NULL, NULL, 1, 1 ); m_Player.Load( PLAYER_1, GAMESTATE->GetCurrentStyleDef(), &noteData, PlayerOptions(), NULL, NULL, 1, 1 );
m_Player.SetXY( PLAYER_X, PLAYER_Y ); m_Player.SetXY( PLAYER_X, PLAYER_Y );
m_Fade.SetClosed(); m_Fade.SetClosed();
@@ -314,7 +316,7 @@ void ScreenEdit::Update( float fDeltaTime )
m_fBeat, m_fBeat,
m_NoteFieldEdit.m_fBeginMarker, m_NoteFieldEdit.m_fEndMarker, m_NoteFieldEdit.m_fBeginMarker, m_NoteFieldEdit.m_fEndMarker,
DifficultyClassToString( m_pNotes->m_DifficultyClass ), DifficultyClassToString( m_pNotes->m_DifficultyClass ),
SONGMAN->GetCurrentNotes(PLAYER_1) ? SONGMAN->GetCurrentNotes(PLAYER_1)->m_sDescription : "no description", GAMESTATE->m_pCurNotes[PLAYER_1] ? GAMESTATE->m_pCurNotes[PLAYER_1]->m_sDescription : "no description",
iNumTapNotes, iNumHoldNotes, iNumTapNotes, iNumHoldNotes,
m_pSong->m_fBeat0OffsetInSeconds, m_pSong->m_fBeat0OffsetInSeconds,
m_pSong->m_fMusicSampleStartSeconds, m_pSong->m_fMusicSampleLengthSeconds m_pSong->m_fMusicSampleStartSeconds, m_pSong->m_fMusicSampleLengthSeconds
@@ -423,21 +425,21 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ
case DIK_S: case DIK_S:
{ {
// copy edit into current Notes // copy edit into current Notes
Song* pSong = SONGMAN->GetCurrentSong(); Song* pSong = GAMESTATE->m_pCurSong;
Notes* pNotes = SONGMAN->GetCurrentNotes(PLAYER_1); Notes* pNotes = GAMESTATE->m_pCurNotes[PLAYER_1];
if( pNotes == NULL ) if( pNotes == NULL )
{ {
// allocate a new Notes // allocate a new Notes
pNotes = new Notes; pNotes = new Notes;
pSong->m_apNotes.Add( pNotes ); pSong->m_apNotes.Add( pNotes );
pNotes->m_NotesType = GAMEMAN->m_CurNotesType; pNotes->m_NotesType = GAMEMAN->GetStyleDefForStyle( GAMESTATE->m_CurStyle )->m_NotesType;
pNotes->m_sDescription = "Untitled"; pNotes->m_sDescription = "Untitled";
pNotes->m_iMeter = 1; pNotes->m_iMeter = 1;
} }
pNotes->SetNoteData( (NoteData*)&m_NoteFieldEdit ); pNotes->SetNoteData( (NoteData*)&m_NoteFieldEdit );
SONGMAN->GetCurrentSong()->SaveToSMFile(); GAMESTATE->m_pCurSong->SaveToSMFile();
} }
break; break;
case DIK_UP: case DIK_UP:
@@ -567,7 +569,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ
m_Mode = MODE_PLAY; m_Mode = MODE_PLAY;
m_Player.Load( PLAYER_1, GAMEMAN->GetCurrentStyleDef(), (NoteData*)&m_NoteFieldEdit, PlayerOptions(), NULL, NULL, 1, 1 ); m_Player.Load( PLAYER_1, GAMESTATE->GetCurrentStyleDef(), (NoteData*)&m_NoteFieldEdit, PlayerOptions(), NULL, NULL, 1, 1 );
m_rectRecordBack.BeginTweening( 0.5f ); m_rectRecordBack.BeginTweening( 0.5f );
m_rectRecordBack.SetTweenDiffuseColor( D3DXCOLOR(0,0,0,0.5f) ); m_rectRecordBack.SetTweenDiffuseColor( D3DXCOLOR(0,0,0,0.5f) );
@@ -882,7 +884,7 @@ void ScreenEdit::InputPlay( const DeviceInput& DeviceI, const InputEventType typ
float fSongBeat, fBPS; float fSongBeat, fBPS;
bool bFreeze; bool bFreeze;
m_pSong->GetBeatAndBPSFromElapsedTime( m_soundMusic.GetPositionSeconds(), fSongBeat, fBPS, bFreeze ); m_pSong->GetBeatAndBPSFromElapsedTime( m_soundMusic.GetPositionSeconds(), fSongBeat, fBPS, bFreeze );
const float fMaxBeatDifference = fBPS * PREFSMAN->m_fJudgeWindow / PREFSMAN->m_SongOptions.m_fMusicRate; const float fMaxBeatDifference = fBPS * PREFSMAN->m_fJudgeWindow / GAMESTATE->m_SongOptions.m_fMusicRate;
switch( StyleI.player ) switch( StyleI.player )
{ {
+25 -25
View File
@@ -16,10 +16,11 @@
#include "ScreenEdit.h" #include "ScreenEdit.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "GameManager.h" #include "GameManager.h"
#include "ScreenPrompt.h" #include "ScreenPrompt.h"
#include "RageLog.h" #include "RageLog.h"
#include "GameState.h"
// //
@@ -70,33 +71,33 @@ ScreenEditMenu::ScreenEditMenu()
m_textGroup.Load( THEME->GetPathTo(FONT_HEADER1) ); m_textGroup.Load( THEME->GetPathTo(FONT_HEADER1) );
m_textGroup.SetXY( GROUP_X, GROUP_Y ); m_textGroup.SetXY( GROUP_X, GROUP_Y );
m_textGroup.SetDiffuseColor( D3DXCOLOR(0.7f,0.7f,0.7f,1) ); m_textGroup.SetDiffuseColor( D3DXCOLOR(0.7f,0.7f,0.7f,1) );
this->AddActor( &m_textGroup ); this->AddSubActor( &m_textGroup );
m_Banner.SetXY( SONG_BANNER_X, SONG_BANNER_Y ); m_Banner.SetXY( SONG_BANNER_X, SONG_BANNER_Y );
this->AddActor( &m_Banner ); this->AddSubActor( &m_Banner );
m_TextBanner.SetXY( SONG_TEXT_BANNER_X, SONG_TEXT_BANNER_Y ); m_TextBanner.SetXY( SONG_TEXT_BANNER_X, SONG_TEXT_BANNER_Y );
this->AddActor( &m_TextBanner ); this->AddSubActor( &m_TextBanner );
m_sprArrowLeft.Load( THEME->GetPathTo(GRAPHIC_ARROWS_LEFT) ); m_sprArrowLeft.Load( THEME->GetPathTo(GRAPHIC_ARROWS_LEFT) );
m_sprArrowLeft.SetXY( ARROWS_X[0], ARROWS_Y[0] ); m_sprArrowLeft.SetXY( ARROWS_X[0], ARROWS_Y[0] );
m_sprArrowLeft.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); m_sprArrowLeft.SetDiffuseColor( D3DXCOLOR(1,1,1,0) );
this->AddActor( &m_sprArrowLeft ); this->AddSubActor( &m_sprArrowLeft );
m_sprArrowRight.Load( THEME->GetPathTo(GRAPHIC_ARROWS_RIGHT) ); m_sprArrowRight.Load( THEME->GetPathTo(GRAPHIC_ARROWS_RIGHT) );
m_sprArrowRight.SetXY( ARROWS_X[1], ARROWS_Y[1] ); m_sprArrowRight.SetXY( ARROWS_X[1], ARROWS_Y[1] );
m_sprArrowRight.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); m_sprArrowRight.SetDiffuseColor( D3DXCOLOR(1,1,1,0) );
this->AddActor( &m_sprArrowRight ); this->AddSubActor( &m_sprArrowRight );
m_textNotesType.Load( THEME->GetPathTo(FONT_HEADER1) ); m_textNotesType.Load( THEME->GetPathTo(FONT_HEADER1) );
m_textNotesType.SetXY( GAME_STYLE_X, GAME_STYLE_Y ); m_textNotesType.SetXY( GAME_STYLE_X, GAME_STYLE_Y );
m_textNotesType.SetDiffuseColor( D3DXCOLOR(0.7f,0.7f,0.7f,1) ); m_textNotesType.SetDiffuseColor( D3DXCOLOR(0.7f,0.7f,0.7f,1) );
this->AddActor( &m_textNotesType ); this->AddSubActor( &m_textNotesType );
m_textNotes.Load( THEME->GetPathTo(FONT_HEADER1) ); m_textNotes.Load( THEME->GetPathTo(FONT_HEADER1) );
m_textNotes.SetXY( STEPS_X, STEPS_Y ); m_textNotes.SetXY( STEPS_X, STEPS_Y );
m_textNotes.SetDiffuseColor( D3DXCOLOR(0.7f,0.7f,0.7f,1) ); m_textNotes.SetDiffuseColor( D3DXCOLOR(0.7f,0.7f,0.7f,1) );
this->AddActor( &m_textNotes ); this->AddSubActor( &m_textNotes );
AfterRowChange(); AfterRowChange();
@@ -107,7 +108,7 @@ ScreenEditMenu::ScreenEditMenu()
m_textExplanation.SetXY( EXPLANATION_X, EXPLANATION_Y ); m_textExplanation.SetXY( EXPLANATION_X, EXPLANATION_Y );
m_textExplanation.SetText( EXPLANATION_TEXT ); m_textExplanation.SetText( EXPLANATION_TEXT );
m_textExplanation.SetZoom( 0.7f ); m_textExplanation.SetZoom( 0.7f );
this->AddActor( &m_textExplanation ); this->AddSubActor( &m_textExplanation );
m_Menu.Load( m_Menu.Load(
THEME->GetPathTo(GRAPHIC_EDIT_BACKGROUND), THEME->GetPathTo(GRAPHIC_EDIT_BACKGROUND),
@@ -115,11 +116,11 @@ ScreenEditMenu::ScreenEditMenu()
ssprintf("%s %s change music START to continue", CString(char(1)), CString(char(2)) ), ssprintf("%s %s change music START to continue", CString(char(1)), CString(char(2)) ),
false, true, 40 false, true, 40
); );
this->AddActor( &m_Menu ); this->AddSubActor( &m_Menu );
m_Fade.SetOpened(); m_Fade.SetOpened();
this->AddActor( &m_Fade); this->AddSubActor( &m_Fade);
m_soundChangeMusic.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_CHANGE_MUSIC) ); m_soundChangeMusic.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_CHANGE_MUSIC) );
@@ -163,20 +164,16 @@ void ScreenEditMenu::HandleScreenMessage( const ScreenMessage SM )
case SM_GoToNextState: case SM_GoToNextState:
// set the current style based on the notes type // set the current style based on the notes type
//switch( GetSelectedNotesType() )
//{
//case NOTES_TYPE_DANCE_SINGLE: GAMEMAN->m_CurStyle = STYLE_DANCE_SINGLE; break;
//case NOTES_TYPE_DANCE_DOUBLE: GAMEMAN->m_CurStyle = STYLE_DANCE_DOUBLE; break;
//case NOTES_TYPE_DANCE_COUPLE: GAMEMAN->m_CurStyle = STYLE_DANCE_COUPLE; break;
//case NOTES_TYPE_DANCE_SOLO: GAMEMAN->m_CurStyle = STYLE_DANCE_SOLO; break;
//case NOTES_TYPE_PUMP_SINGLE: GAMEMAN->m_CurStyle = STYLE_PUMP_SINGLE; break;
//case NOTES_TYPE_PUMP_DOUBLE: GAMEMAN->m_CurStyle = STYLE_PUMP_DOUBLE; break;
//}
// Dro Kulix: // Dro Kulix:
// A centralized solution for this switching mess... // A centralized solution for this switching mess...
// (See GameConstantsAndTypes.h) // (See GameConstantsAndTypes.h)
GAMEMAN->m_CurStyle = NotesTypeToStyle( GetSelectedNotesType() ); //
// Chris:
// Find the first Style that will play the selected notes type.
// Set the current Style, then let ScreenEdit infer the desired
// NotesType from that Style.
NotesType nt = GetSelectedNotesType();
GAMESTATE->m_CurStyle = GAMEMAN->GetStyleThatPlaysNotesType( nt );
SCREENMAN->SetNewScreen( new ScreenEdit ); SCREENMAN->SetNewScreen( new ScreenEdit );
break; break;
@@ -349,9 +346,12 @@ void ScreenEditMenu::MenuStart( const PlayerNumber p )
MUSIC->Stop(); MUSIC->Stop();
SONGMAN->SetCurrentSong( GetSelectedSong() ); GAMESTATE->m_pCurSong = GetSelectedSong();
GAMEMAN->m_CurNotesType = GetSelectedNotesType();
SONGMAN->SetCurrentNotes( PLAYER_1, GetSelectedNotes() ); // find the first style that matches this notes type
GameDef* pGameDef = GAMESTATE->GetCurrentGameDef();
GAMESTATE->m_CurStyle = GAMEMAN->GetStyleThatPlaysNotesType( GetSelectedNotesType() );
GAMESTATE->m_pCurNotes[PLAYER_1] = GetSelectedNotes();
m_soundSelect.PlayRandom(); m_soundSelect.PlayRandom();
+167 -153
View File
@@ -18,10 +18,11 @@
#include "RageUtil.h" #include "RageUtil.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "Notes.h" #include "Notes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "RageLog.h" #include "RageLog.h"
#include "AnnouncerManager.h" #include "AnnouncerManager.h"
#include "ScreenMusicScroll.h" #include "ScreenMusicScroll.h"
#include "GameState.h"
const float BANNER_X = CENTER_X; const float BANNER_X = CENTER_X;
@@ -66,7 +67,7 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
/////////////////////////// ///////////////////////////
// Set m_ResultMode. This enum will make our life easier later when we init different pieces depending on context. // Set m_ResultMode. This enum will make our life easier later when we init different pieces depending on context.
/////////////////////////// ///////////////////////////
switch( PREFSMAN->m_PlayMode ) switch( GAMESTATE->m_PlayMode )
{ {
case PLAY_MODE_ARCADE: case PLAY_MODE_ARCADE:
m_ResultMode = bSummary ? RM_ARCADE_SUMMARY : RM_ARCADE_STAGE; m_ResultMode = bSummary ? RM_ARCADE_SUMMARY : RM_ARCADE_STAGE;
@@ -83,78 +84,103 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
/////////////////////////// ///////////////////////////
// Calculate total statistics depending on m_ResultMode // Calculate total statistics depending on m_ResultMode
/////////////////////////// ///////////////////////////
GameplayStatistics total_statistics[NUM_PLAYERS]; GameplayStatistics totalGS;
for( p=0; p<NUM_PLAYERS; p++ )
{
PlayerNumber pn = (PlayerNumber)p;
if( !GAMEMAN->IsPlayerEnabled(pn) )
continue; // skip
switch( m_ResultMode ) switch( m_ResultMode )
{ {
case RM_ARCADE_STAGE: case RM_ARCADE_STAGE:
total_statistics[p] = SONGMAN->GetLatestGameplayStatistics((PlayerNumber)p); {
// take the latest GameplayStatistics
totalGS = GAMESTATE->m_aGameplayStatistics[GAMESTATE->m_aGameplayStatistics.GetSize()-1];
}
break; break;
case RM_ARCADE_SUMMARY: case RM_ARCADE_SUMMARY:
{
int iStageIndex = PREFSMAN->GetStageIndex();
int s = 0;
for( int i=max(0,iStageIndex-STAGES_TO_SHOW_IN_SUMMARY); i<=iStageIndex; i++, s++ )
{
total_statistics[p] = SONGMAN->GetLatestGameplayStatistics((PlayerNumber)p);
}
}
break;
case RM_ONI: case RM_ONI:
{ {
int iStageIndex = PREFSMAN->GetStageIndex(); int iFirstToTakeFrom;
int s = 0; switch( m_ResultMode )
for( int i=0; i<=iStageIndex; i++ ) {
total_statistics[p] = SONGMAN->GetLatestGameplayStatistics((PlayerNumber)p); case RM_ARCADE_SUMMARY:
iFirstToTakeFrom = max( 0, GAMESTATE->m_aGameplayStatistics.GetSize()-STAGES_TO_SHOW_IN_SUMMARY );
break;
case RM_ONI:
iFirstToTakeFrom = 0;
break;
default:
ASSERT(0);
}
for( int i=iFirstToTakeFrom; i<GAMESTATE->m_aGameplayStatistics.GetSize(); i++ )
totalGS += GAMESTATE->m_aGameplayStatistics[i];
// Chris:
// ugly... GameplayStatistics::operator+= simply sums the radar values, so we need
// to divide by the number of stages taken from to normalize the values.
int iNumTakenFrom = GAMESTATE->m_aGameplayStatistics.GetSize() - iFirstToTakeFrom;
for( int p=0; p<NUM_PLAYERS; p++ )
{
for( int r=0; r<NUM_RADAR_CATEGORIES; r++ )
{
totalGS.fRadarActual[p][r] /= iNumTakenFrom;
totalGS.fRadarPossible[p][r] /= iNumTakenFrom;
}
}
} }
break; break;
} }
// Andy:
// Fake COOL! / GOOD / OOPS for Ez2dancer using the DDR Rankings.
if( GAMESTATE->GetCurGame() == GAME_EZ2 )
{
for( int p=0; p<NUM_PLAYERS; p++ )
{
totalGS.perfect[p] += totalGS.great[p];
totalGS.great[p] = 0;
totalGS.miss[p] += totalGS.boo[p];
totalGS.boo[p] = 0;
}
} }
if (GAMEMAN->m_CurGame != GAME_EZ2 )
{
/////////////////////////// ///////////////////////////
// Init the song banners depending on m_ResultMode // Init the song banners depending on m_ResultMode
/////////////////////////// ///////////////////////////
if( GAMESTATE->GetCurGame() != GAME_EZ2 )
{
switch( m_ResultMode ) switch( m_ResultMode )
{ {
case RM_ARCADE_STAGE: case RM_ARCADE_STAGE:
m_BannerWithFrame[0].LoadFromSong( SONGMAN->GetCurrentSong() ); m_BannerWithFrame[0].LoadFromSong( GAMESTATE->m_pCurSong );
m_BannerWithFrame[0].SetXY( BANNER_X, BANNER_Y ); m_BannerWithFrame[0].SetXY( BANNER_X, BANNER_Y );
this->AddActor( &m_BannerWithFrame[0] ); this->AddSubActor( &m_BannerWithFrame[0] );
break; break;
case RM_ARCADE_SUMMARY: case RM_ARCADE_SUMMARY:
{ {
// crop down to 3 // crop down to 3
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
if( SONGMAN->m_aGameplayStatistics[p].GetSize() > STAGES_TO_SHOW_IN_SUMMARY ) {
SONGMAN->m_aGameplayStatistics[p].RemoveAt( 0, SONGMAN->m_aGameplayStatistics[p].GetSize() - STAGES_TO_SHOW_IN_SUMMARY ); if( GAMESTATE->m_aGameplayStatistics.GetSize() > STAGES_TO_SHOW_IN_SUMMARY )
GAMESTATE->m_aGameplayStatistics.RemoveAt( 0, GAMESTATE->m_aGameplayStatistics.GetSize() - STAGES_TO_SHOW_IN_SUMMARY );
}
const int iSongsToShow = SONGMAN->m_aGameplayStatistics[0].GetSize(); const int iSongsToShow = GAMESTATE->m_aGameplayStatistics.GetSize();
ASSERT( iSongsToShow > 0 ); ASSERT( iSongsToShow > 0 );
for( int i=0; i<iSongsToShow; i++ ) for( int i=0; i<iSongsToShow; i++ )
{ {
GameplayStatistics &GS = SONGMAN->m_aGameplayStatistics[0][i]; GameplayStatistics &GS = GAMESTATE->m_aGameplayStatistics[i];
m_BannerWithFrame[i].LoadFromSong( GS.pSong ); m_BannerWithFrame[i].LoadFromSong( GS.pSong );
float fBannerOffset = i - (iSongsToShow-1)/2.0f; float fBannerOffset = i - (iSongsToShow-1)/2.0f;
m_BannerWithFrame[i].SetXY( BANNER_X + fBannerOffset*32, BANNER_Y + fBannerOffset*16 ); m_BannerWithFrame[i].SetXY( BANNER_X + fBannerOffset*32, BANNER_Y + fBannerOffset*16 );
m_BannerWithFrame[i].SetZoom( 0.70f ); m_BannerWithFrame[i].SetZoom( 0.70f );
this->AddActor( &m_BannerWithFrame[i] ); this->AddSubActor( &m_BannerWithFrame[i] );
} }
} }
break; break;
case RM_ONI: case RM_ONI:
m_BannerWithFrame[0].LoadFromGroup( SONGMAN->m_sPreferredGroup ); m_BannerWithFrame[0].LoadFromGroup( GAMESTATE->m_sPreferredGroup );
m_BannerWithFrame[0].SetXY( BANNER_X, BANNER_Y ); m_BannerWithFrame[0].SetXY( BANNER_X, BANNER_Y );
this->AddActor( &m_BannerWithFrame[0] ); this->AddSubActor( &m_BannerWithFrame[0] );
break; break;
} }
} }
@@ -170,19 +196,19 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
"Press START to continue.", "Press START to continue.",
false, true, 40 false, true, 40
); );
this->AddActor( &m_Menu ); this->AddSubActor( &m_Menu );
for( l=0; l<NUM_JUDGE_LINES; l++ ) for( l=0; l<NUM_JUDGE_LINES; l++ )
{ {
if (GAMEMAN->m_CurGame != GAME_EZ2) if (GAMESTATE->GetCurGame() != GAME_EZ2)
{ {
m_sprJudgeLabels[l].Load( THEME->GetPathTo(GRAPHIC_EVALUATION_JUDGE_LABELS) ); m_sprJudgeLabels[l].Load( THEME->GetPathTo(GRAPHIC_EVALUATION_JUDGE_LABELS) );
m_sprJudgeLabels[l].StopAnimating(); m_sprJudgeLabels[l].StopAnimating();
m_sprJudgeLabels[l].SetState( l ); m_sprJudgeLabels[l].SetState( l );
m_sprJudgeLabels[l].SetXY( JUDGE_LABELS_X, JUDGE_START_Y + l*JUDGE_SPACING ); m_sprJudgeLabels[l].SetXY( JUDGE_LABELS_X, JUDGE_START_Y + l*JUDGE_SPACING );
m_sprJudgeLabels[l].SetZoom( 1.0f ); m_sprJudgeLabels[l].SetZoom( 1.0f );
this->AddActor( &m_sprJudgeLabels[l] ); this->AddSubActor( &m_sprJudgeLabels[l] );
} }
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
@@ -196,23 +222,23 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
// RE-ARRANGE the scoreboard for EZ2Dancer Scoring // RE-ARRANGE the scoreboard for EZ2Dancer Scoring
if (l == 0 && GAMEMAN->m_CurGame == GAME_EZ2) // Change Position For Ez2dancer if (l == 0 && GAMESTATE->GetCurGame() == GAME_EZ2) // Change Position For Ez2dancer
{ {
m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p], JUDGE_EZ2_COOL_Y); m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p], JUDGE_EZ2_COOL_Y);
} }
else if (l == 2 && GAMEMAN->m_CurGame == GAME_EZ2) else if (l == 2 && GAMESTATE->GetCurGame() == GAME_EZ2)
{ {
m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p], JUDGE_EZ2_COOL_Y + 55); m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p], JUDGE_EZ2_COOL_Y + 55);
} }
else if (l == 4 && GAMEMAN->m_CurGame == GAME_EZ2) else if (l == 4 && GAMESTATE->GetCurGame() == GAME_EZ2)
{ {
m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p], JUDGE_EZ2_COOL_Y + 120); m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p], JUDGE_EZ2_COOL_Y + 120);
} }
else if ((l == 1 || l == 3 ) && GAMEMAN->m_CurGame == GAME_EZ2) else if ((l == 1 || l == 3 ) && GAMESTATE->GetCurGame() == GAME_EZ2)
{ {
m_textJudgeNumbers[l][p].SetZoomX(0); // Hide These Ones m_textJudgeNumbers[l][p].SetZoomX(0); // Hide These Ones
} }
else if (l == 5 && GAMEMAN->m_CurGame == GAME_EZ2 ) // sneakily use this one for the max combo. else if (l == 5 && GAMESTATE->GetCurGame() == GAME_EZ2 ) // sneakily use this one for the max combo.
{ {
if (p == PLAYER_1 ) if (p == PLAYER_1 )
{ {
@@ -224,117 +250,75 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
} }
} }
this->AddActor( &m_textJudgeNumbers[l][p] ); this->AddSubActor( &m_textJudgeNumbers[l][p] );
} }
} }
if (GAMEMAN->m_CurGame != GAME_EZ2) if (GAMESTATE->GetCurGame() != GAME_EZ2)
{ {
m_sprScoreLabel.Load( THEME->GetPathTo(GRAPHIC_EVALUATION_SCORE_LABELS) ); m_sprScoreLabel.Load( THEME->GetPathTo(GRAPHIC_EVALUATION_SCORE_LABELS) );
m_sprScoreLabel.StopAnimating(); m_sprScoreLabel.StopAnimating();
m_sprScoreLabel.SetXY( SCORE_LABEL_X, SCORE_Y ); m_sprScoreLabel.SetXY( SCORE_LABEL_X, SCORE_Y );
m_sprScoreLabel.SetZoom( 1.0f ); m_sprScoreLabel.SetZoom( 1.0f );
this->AddActor( &m_sprScoreLabel ); this->AddSubActor( &m_sprScoreLabel );
} }
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled( (PlayerNumber)p ) || GAMEMAN->m_CurGame == GAME_EZ2 ) if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) || GAMESTATE->GetCurGame() == GAME_EZ2 )
continue; // skip continue; // skip
m_ScoreDisplay[p].SetXY( SCORE_DISPLAY_X[p], SCORE_Y ); m_ScoreDisplay[p].SetXY( SCORE_DISPLAY_X[p], SCORE_Y );
m_ScoreDisplay[p].SetZoomY( 0.9f ); m_ScoreDisplay[p].SetZoomY( 0.9f );
m_ScoreDisplay[p].SetDiffuseColor( PlayerToColor(p) ); m_ScoreDisplay[p].SetDiffuseColor( PlayerToColor(p) );
this->AddActor( &m_ScoreDisplay[p] ); this->AddSubActor( &m_ScoreDisplay[p] );
} }
//
// Calculate grades
//
Grade grade[NUM_PLAYERS]; Grade grade[NUM_PLAYERS];
Grade max_grade = GRADE_NO_DATA;
for( p=0; p<NUM_PLAYERS; p++ )
{
PlayerNumber pn = (PlayerNumber)p;
grade[p] = !GAMESTATE->IsPlayerEnabled(pn) ? GRADE_NO_DATA : totalGS.GetGrade(pn);
max_grade = max( max_grade, grade[p] );
}
////////////////////////// //////////////////////////
// Set Numbers // Set Numbers
////////////////////////// //////////////////////////
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled( (PlayerNumber)p ) ) if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
continue; // skip continue; // skip
GameplayStatistics GS[NUM_PLAYERS]; // fill this in depending on m_ResultMode m_textJudgeNumbers[0][p].SetText( ssprintf("%4d", totalGS.perfect[p]) );
m_textJudgeNumbers[1][p].SetText( ssprintf("%4d", totalGS.great[p]) );
m_textJudgeNumbers[2][p].SetText( ssprintf("%4d", totalGS.good[p]) );
m_textJudgeNumbers[3][p].SetText( ssprintf("%4d", totalGS.boo[p]) );
m_textJudgeNumbers[4][p].SetText( ssprintf("%4d", totalGS.miss[p]) );
m_textJudgeNumbers[5][p].SetText( ssprintf("%4d", totalGS.ok[p]) );
switch( m_ResultMode ) m_ScoreDisplay[p].SetScore( (float)totalGS.max_combo[p] * 1000 );
{ m_ScoreDisplay[p].SetScore( (float)totalGS.score[p] );
case RM_ARCADE_STAGE:
{
GS[p] = SONGMAN->m_aGameplayStatistics[p][SONGMAN->m_aGameplayStatistics[p].GetSize()-1];
}
break;
case RM_ARCADE_SUMMARY:
case RM_ONI:
{
const int iSongsToShow = SONGMAN->m_aGameplayStatistics[0].GetSize();
ASSERT( iSongsToShow > 0 );
for( int i=0; i<iSongsToShow; i++ )
{
GameplayStatistics &GSstage = SONGMAN->m_aGameplayStatistics[p][i];
GS[p].iPossibleDancePoints += GSstage.iPossibleDancePoints;
GS[p].iActualDancePoints += GSstage.iActualDancePoints;
GS[p].perfect += GSstage.perfect;
GS[p].great += GSstage.great;
GS[p].good += GSstage.good;
GS[p].boo += GSstage.boo;
GS[p].miss += GSstage.miss;
GS[p].ok += GSstage.ok;
GS[p].ng += GSstage.ng;
GS[p].max_combo = max( GS[p].max_combo, GSstage.max_combo );
GS[p].score += GSstage.score;
for( int i=0; i<NUM_RADAR_VALUES; i++ )
{
GS[p].fRadarPossible[i] += GSstage.fRadarPossible[i];
GS[p].fRadarActual[i] += GSstage.fRadarActual[i];
}
}
for( i=0; i<NUM_RADAR_VALUES; i++ )
{
GS[p].fRadarPossible[i] /= iSongsToShow;
GS[p].fRadarActual[i] /= iSongsToShow;
}
}
break;
}
if (GAMEMAN->m_CurGame == GAME_EZ2) // Fake COOL! / GOOD / OOPS for Ez2dancer using the DDR Rankings.
{
GS[p].perfect += GS[p].great;
GS[p].great = 0;
GS[p].miss += GS[p].boo;
GS[p].boo = 0;
}
grade[p] = GS[p].GetGrade();
m_textJudgeNumbers[0][p].SetText( ssprintf("%4d", GS[p].perfect) );
m_textJudgeNumbers[1][p].SetText( ssprintf("%4d", GS[p].great) );
m_textJudgeNumbers[2][p].SetText( ssprintf("%4d", GS[p].good) );
m_textJudgeNumbers[3][p].SetText( ssprintf("%4d", GS[p].boo) );
m_textJudgeNumbers[4][p].SetText( ssprintf("%4d", GS[p].miss) );
m_textJudgeNumbers[5][p].SetText( ssprintf("%4d", GS[p].ok) );
// SNEAKY! We take the max combo, and put it into element 5, because Ez2dancer // SNEAKY! We take the max combo, and put it into element 5, because Ez2dancer
// doesn't care for OK's and plus this text element is already nicely aligned =) // doesn't care for OK's and plus this text element is already nicely aligned =)
if (GAMEMAN->m_CurGame == GAME_EZ2) if (GAMESTATE->GetCurGame() == GAME_EZ2)
{ {
m_textJudgeNumbers[5][p].SetText( ssprintf("%4d", GS[p].max_combo) ); m_textJudgeNumbers[5][p].SetText( ssprintf("%4d", totalGS.max_combo[p]) );
} }
m_ScoreDisplay[p].SetScore( (float)GS[p].max_combo * 1000 ); m_ScoreDisplay[p].SetScore( (float)totalGS.max_combo[p] * 1000 );
m_ScoreDisplay[p].SetScore( (float)GS[p].score ); m_ScoreDisplay[p].SetScore( (float)totalGS.score[p] );
m_BonusInfoFrame[p].SetBonusInfo( (PlayerNumber)p, GS[p].fRadarPossible, GS[p].fRadarActual, GS[p].max_combo );
m_BonusInfoFrame[p].SetBonusInfo( (PlayerNumber)p, totalGS.fRadarPossible[p], totalGS.fRadarActual[p], totalGS.max_combo[p] );
switch( m_ResultMode ) switch( m_ResultMode )
{ {
@@ -343,15 +327,15 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
// update song stats // update song stats
//////////////////////// ////////////////////////
Notes* pNotes = SONGMAN->GetCurrentNotes((PlayerNumber)p); Notes* pNotes = GAMESTATE->m_pCurNotes[p];
pNotes->m_iNumTimesPlayed++; pNotes->m_iNumTimesPlayed++;
if( GS[p].max_combo > pNotes->m_iMaxCombo ) if( totalGS.max_combo[p] > pNotes->m_iMaxCombo )
pNotes->m_iMaxCombo = GS[p].max_combo; pNotes->m_iMaxCombo = totalGS.max_combo[p];
if( GS[p].score > pNotes->m_iTopScore ) if( totalGS.score[p] > pNotes->m_iTopScore )
{ {
pNotes->m_iTopScore = (int)GS[p].score; pNotes->m_iTopScore = (int)totalGS.score[p];
m_bNewRecord[p] = true; m_bNewRecord[p] = true;
} }
@@ -363,20 +347,16 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
Grade max_grade = GRADE_NO_DATA;
for( p=0; p<NUM_PLAYERS; p++ )
max_grade = max( max_grade, grade[p] );
m_bTryExtraStage = false; m_bTryExtraStage = false;
if( (PREFSMAN->IsFinalStage() || PREFSMAN->IsExtraStage()) && m_ResultMode==RM_ARCADE_STAGE ) if( (GAMESTATE->IsFinalStage() || GAMESTATE->IsExtraStage()) && m_ResultMode==RM_ARCADE_STAGE )
{ {
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled( (PlayerNumber)p ) ) if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
continue; // skip continue; // skip
if( SONGMAN->GetCurrentNotes((PlayerNumber)p)->m_DifficultyClass == CLASS_HARD && grade[p] >= GRADE_AA ) if( GAMESTATE->m_pCurNotes[p]->m_DifficultyClass == CLASS_HARD && grade[p] >= GRADE_AA )
m_bTryExtraStage = true; m_bTryExtraStage = true;
} }
} }
@@ -387,32 +367,41 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled( (PlayerNumber)p ) ) if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
continue; // skip continue; // skip
if ( GAMEMAN->m_CurGame != GAME_EZ2)
if ( GAMESTATE->GetCurGame() != GAME_EZ2)
{ {
m_sprGradeFrame[p].Load( THEME->GetPathTo(GRAPHIC_EVALUATION_GRADE_FRAME) ); m_sprGradeFrame[p].Load( THEME->GetPathTo(GRAPHIC_EVALUATION_GRADE_FRAME) );
m_sprGradeFrame[p].StopAnimating(); m_sprGradeFrame[p].StopAnimating();
m_sprGradeFrame[p].SetState( p ); m_sprGradeFrame[p].SetState( p );
m_sprGradeFrame[p].SetXY( GRADE_X[p], GRADE_Y ); m_sprGradeFrame[p].SetXY( GRADE_X[p], GRADE_Y );
this->AddActor( &m_sprGradeFrame[p] ); this->AddSubActor( &m_sprGradeFrame[p] );
} }
switch( m_ResultMode ) switch( m_ResultMode )
{ {
case RM_ONI: case RM_ONI:
{
m_textOniPercent[p].Load( THEME->GetPathTo(FONT_HEADER1) ); m_textOniPercent[p].Load( THEME->GetPathTo(FONT_HEADER1) );
m_textOniPercent[p].SetXY( GRADE_X[p], GRADE_Y ); m_textOniPercent[p].SetXY( GRADE_X[p], GRADE_Y );
m_textOniPercent[p].SetShadowLength( 2 ); m_textOniPercent[p].SetShadowLength( 2 );
m_textOniPercent[p].SetZoomX( 1.5f ); m_textOniPercent[p].SetZoomX( 1.3f );
m_textOniPercent[p].SetZoomY( 3 ); m_textOniPercent[p].SetZoomY( 2.5f );
m_textOniPercent[p].SetEffectGlowing( 1.0f ); m_textOniPercent[p].SetEffectGlowing( 1.0f );
m_textOniPercent[p].SetText( "100.0%" );
this->AddActor( &m_textOniPercent[p] ); int iActualDancePoints = 0;
for( int i=0; i<GAMESTATE->m_aGameplayStatistics.GetSize(); i++ )
iActualDancePoints += GAMESTATE->m_aGameplayStatistics[i].iActualDancePoints[p];
int iPossibleDancePoints = GAMESTATE->m_iCoursePossibleDancePoints;
float fPercentDancePoints = iActualDancePoints / (float)iPossibleDancePoints + 0.0001f; // correct for rounding errors
m_textOniPercent[p].SetText( ssprintf("%.1f%%", fPercentDancePoints*100) );
this->AddSubActor( &m_textOniPercent[p] );
}
break; break;
case RM_ARCADE_STAGE: case RM_ARCADE_STAGE:
case RM_ARCADE_SUMMARY: case RM_ARCADE_SUMMARY:
if (GAMEMAN->m_CurGame != GAME_EZ2 ) if (GAMESTATE->GetCurGame() != GAME_EZ2 )
{ {
m_Grades[p].SetXY( GRADE_X[p], GRADE_Y ); m_Grades[p].SetXY( GRADE_X[p], GRADE_Y );
m_Grades[p].SetZ( -2 ); m_Grades[p].SetZ( -2 );
@@ -437,15 +426,15 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
m_Grades[p].SetTweenZoom( 2 ); m_Grades[p].SetTweenZoom( 2 );
} }
this->AddActor( &m_Grades[p] ); this->AddSubActor( &m_Grades[p] );
break; break;
} }
if ( GAMEMAN->m_CurGame == GAME_EZ2) if ( GAMESTATE->GetCurGame() == GAME_EZ2)
continue; continue;
m_BonusInfoFrame[p].SetXY( BONUS_FRAME_X[p], BONUS_FRAME_Y ); m_BonusInfoFrame[p].SetXY( BONUS_FRAME_X[p], BONUS_FRAME_Y );
this->AddActor( &m_BonusInfoFrame[p] ); this->AddSubActor( &m_BonusInfoFrame[p] );
m_bNewRecord[p] = false; m_bNewRecord[p] = false;
@@ -457,7 +446,7 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
m_textNewRecord[p].SetText( "IT'S A NEW RECORD!" ); m_textNewRecord[p].SetText( "IT'S A NEW RECORD!" );
m_textNewRecord[p].SetZoom( 0.5f ); m_textNewRecord[p].SetZoom( 0.5f );
m_textNewRecord[p].SetEffectGlowing( 1.0f ); m_textNewRecord[p].SetEffectGlowing( 1.0f );
this->AddActor( &m_textNewRecord[p] ); this->AddSubActor( &m_textNewRecord[p] );
} }
} }
@@ -466,21 +455,25 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
{ {
m_textTryExtraStage.Load( THEME->GetPathTo(FONT_HEADER1) ); m_textTryExtraStage.Load( THEME->GetPathTo(FONT_HEADER1) );
m_textTryExtraStage.SetXY( TRY_EXTRA_STAGE_X, TRY_EXTRA_STAGE_Y ); m_textTryExtraStage.SetXY( TRY_EXTRA_STAGE_X, TRY_EXTRA_STAGE_Y );
if( PREFSMAN->IsExtraStage() ) if( GAMESTATE->IsExtraStage() )
m_textTryExtraStage.SetText( "Try Another Extra Stage!" ); m_textTryExtraStage.SetText( "Try Another Extra Stage!" );
else else
m_textTryExtraStage.SetText( "Try Extra Stage!" ); m_textTryExtraStage.SetText( "Try Extra Stage!" );
m_textTryExtraStage.SetZoom( 1 ); m_textTryExtraStage.SetZoom( 1 );
m_textTryExtraStage.SetEffectGlowing( 1.0f ); m_textTryExtraStage.SetEffectGlowing( 1.0f );
this->AddActor( &m_textTryExtraStage ); this->AddSubActor( &m_textTryExtraStage );
SOUND->PlayOnceStreamed( THEME->GetPathTo(SOUND_EVALUATION_EXTRA_STAGE) ); SOUND->PlayOnceStreamed( THEME->GetPathTo(SOUND_EVALUATION_EXTRA_STAGE) );
} }
else else
{ {
switch( m_ResultMode )
{
case RM_ARCADE_STAGE:
switch( max_grade ) switch( max_grade )
{ {
case GRADE_E: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_E) ); break;
case GRADE_D: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_D) ); break; case GRADE_D: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_D) ); break;
case GRADE_C: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_C) ); break; case GRADE_C: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_C) ); break;
case GRADE_B: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_B) ); break; case GRADE_B: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_B) ); break;
@@ -491,11 +484,32 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary )
default: default:
ASSERT(0); // invalid grade ASSERT(0); // invalid grade
} }
break;
case RM_ONI:
case RM_ARCADE_SUMMARY:
switch( max_grade )
{
case GRADE_E: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_FINAL_E) ); break;
case GRADE_D: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_FINAL_D) ); break;
case GRADE_C: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_FINAL_C) ); break;
case GRADE_B: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_FINAL_B) ); break;
case GRADE_A: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_FINAL_A) ); break;
case GRADE_AA: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_FINAL_AA) ); break;
case GRADE_AAA: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_EVALUATION_FINAL_AAA) ); break;
case GRADE_NO_DATA:
default:
ASSERT(0); // invalid grade
}
break;
default:
ASSERT(0);
}
} }
m_Menu.TweenOnScreenFromBlack( SM_None ); m_Menu.TweenOnScreenFromBlack( SM_None );
} }
void ScreenEvaluation::TweenOnScreen() void ScreenEvaluation::TweenOnScreen()
{ {
int i, p; int i, p;
@@ -515,7 +529,7 @@ void ScreenEvaluation::TweenOnScreen()
for( i=0; i<NUM_JUDGE_LINES; i++ ) for( i=0; i<NUM_JUDGE_LINES; i++ )
{ {
if (GAMEMAN->m_CurGame != GAME_EZ2) if (GAMESTATE->GetCurGame() != GAME_EZ2)
{ {
fOriginalY = m_sprJudgeLabels[i].GetY(); fOriginalY = m_sprJudgeLabels[i].GetY();
m_sprJudgeLabels[i].SetY( fOriginalY + SCREEN_HEIGHT ); m_sprJudgeLabels[i].SetY( fOriginalY + SCREEN_HEIGHT );
@@ -534,7 +548,7 @@ void ScreenEvaluation::TweenOnScreen()
} }
} }
if (GAMEMAN->m_CurGame != GAME_EZ2) if (GAMESTATE->GetCurGame() != GAME_EZ2)
{ {
fOriginalY = m_sprScoreLabel.GetY(); fOriginalY = m_sprScoreLabel.GetY();
@@ -590,7 +604,7 @@ void ScreenEvaluation::TweenOffScreen()
for( i=0; i<NUM_JUDGE_LINES; i++ ) for( i=0; i<NUM_JUDGE_LINES; i++ )
{ {
if (GAMEMAN->m_CurGame != GAME_EZ2) if (GAMESTATE->GetCurGame() != GAME_EZ2)
{ {
m_sprJudgeLabels[i].BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END ); m_sprJudgeLabels[i].BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END );
m_sprJudgeLabels[i].SetTweenZoomY( 0 ); m_sprJudgeLabels[i].SetTweenZoomY( 0 );
@@ -603,7 +617,7 @@ void ScreenEvaluation::TweenOffScreen()
} }
} }
if (GAMEMAN->m_CurGame != GAME_EZ2) if (GAMESTATE->GetCurGame() != GAME_EZ2)
{ {
m_sprScoreLabel.BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END ); m_sprScoreLabel.BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END );
m_sprScoreLabel.SetTweenZoomY( 0 ); m_sprScoreLabel.SetTweenZoomY( 0 );
@@ -690,7 +704,7 @@ void ScreenEvaluation::MenuStart( const PlayerNumber p )
if( PREFSMAN->m_bEventMode ) if( PREFSMAN->m_bEventMode )
{ {
PREFSMAN->m_iCurrentStageIndex++; GAMESTATE->m_iCurrentStageIndex++;
m_Menu.TweenOffScreenToMenu( SM_GoToSelectMusic ); m_Menu.TweenOffScreenToMenu( SM_GoToSelectMusic );
return; return;
} }
@@ -703,19 +717,19 @@ void ScreenEvaluation::MenuStart( const PlayerNumber p )
case RM_ARCADE_STAGE: case RM_ARCADE_STAGE:
if( m_bTryExtraStage ) if( m_bTryExtraStage )
{ {
PREFSMAN->m_iCurrentStageIndex++; GAMESTATE->m_iCurrentStageIndex++;
m_Menu.TweenOffScreenToMenu( SM_GoToSelectMusic ); m_Menu.TweenOffScreenToMenu( SM_GoToSelectMusic );
} }
else if( else if(
PREFSMAN->m_iCurrentStageIndex == PREFSMAN->m_iNumArcadeStages-1 || GAMESTATE->m_iCurrentStageIndex == PREFSMAN->m_iNumArcadeStages-1 ||
PREFSMAN->IsExtraStage() || GAMESTATE->IsExtraStage() ||
PREFSMAN->IsExtraStage2() ) GAMESTATE->IsExtraStage2() )
{ {
m_Menu.TweenOffScreenToMenu( SM_GoToFinalEvaluation ); m_Menu.TweenOffScreenToMenu( SM_GoToFinalEvaluation );
} }
else else
{ {
PREFSMAN->m_iCurrentStageIndex++; GAMESTATE->m_iCurrentStageIndex++;
m_Menu.TweenOffScreenToMenu( SM_GoToSelectMusic ); m_Menu.TweenOffScreenToMenu( SM_GoToSelectMusic );
} }
+2 -2
View File
@@ -18,7 +18,7 @@
#include "GradeDisplay.h" #include "GradeDisplay.h"
#include "MenuElements.h" #include "MenuElements.h"
#include "Banner.h" #include "Banner.h"
#include "ScoreDisplayRolling.h" #include "ScoreDisplayNormal.h"
#include "BonusInfoFrame.h" #include "BonusInfoFrame.h"
#include "BannerWithFrame.h" #include "BannerWithFrame.h"
@@ -58,7 +58,7 @@ protected:
BitmapText m_textJudgeNumbers[NUM_JUDGE_LINES][NUM_PLAYERS]; BitmapText m_textJudgeNumbers[NUM_JUDGE_LINES][NUM_PLAYERS];
Sprite m_sprScoreLabel; Sprite m_sprScoreLabel;
ScoreDisplayRolling m_ScoreDisplay[NUM_PLAYERS]; ScoreDisplayNormal m_ScoreDisplay[NUM_PLAYERS];
bool m_bNewRecord[NUM_PLAYERS]; bool m_bNewRecord[NUM_PLAYERS];
BitmapText m_textNewRecord[NUM_PLAYERS]; BitmapText m_textNewRecord[NUM_PLAYERS];
+16 -13
View File
@@ -15,13 +15,14 @@ Andrew Livy
#include "ScreenTitleMenu.h" #include "ScreenTitleMenu.h"
#include "ScreenCaution.h" #include "ScreenCaution.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "ScreenSelectDifficulty.h" #include "ScreenSelectDifficulty.h"
#include "ScreenSandbox.h" #include "ScreenSandbox.h"
#include "GameManager.h" #include "GameManager.h"
#include "RageLog.h" #include "RageLog.h"
#include "AnnouncerManager.h" #include "AnnouncerManager.h"
#include "ScreenEz2SelectStyle.h" #include "ScreenEz2SelectStyle.h"
#include "GameState.h"
/* Constants */ /* Constants */
@@ -58,9 +59,9 @@ ScreenEz2SelectPlayer::ScreenEz2SelectPlayer()
LOG->WriteLine( "ScreenEz2SelectPlayer::ScreenEz2SelectPlayer()" ); LOG->WriteLine( "ScreenEz2SelectPlayer::ScreenEz2SelectPlayer()" );
ez2_lasttimercheck[0] = TIMER->GetTimeSinceStart(); ez2_lasttimercheck[0] = TIMER->GetTimeSinceStart();
ez2_lasttimercheck[1] = 0.0f; ez2_lasttimercheck[1] = 0.0f;
m_iSelectedStyle=3; // set to invalid style m_iSelectedStyle=0;
GAMEMAN->m_CurStyle = STYLE_NONE; GAMESTATE->m_CurStyle = STYLE_NONE;
GAMEMAN->m_sMasterPlayerNumber = PLAYER_INVALID; GAMESTATE->m_MasterPlayerNumber = PLAYER_INVALID;
// Load in the sprites we will be working with. // Load in the sprites we will be working with.
for( int i=0; i<NUM_EZ2_GRAPHICS; i++ ) for( int i=0; i<NUM_EZ2_GRAPHICS; i++ )
@@ -84,7 +85,7 @@ ScreenEz2SelectPlayer::ScreenEz2SelectPlayer()
m_sprOpt[i].Load( sPadGraphicPath ); m_sprOpt[i].Load( sPadGraphicPath );
m_sprOpt[i].SetXY( OPT_X[i], OPT_Y[i] ); m_sprOpt[i].SetXY( OPT_X[i], OPT_Y[i] );
m_sprOpt[i].SetZoom( 1 ); m_sprOpt[i].SetZoom( 1 );
this->AddActor( &m_sprOpt[i] ); this->AddSubActor( &m_sprOpt[i] );
} }
@@ -94,7 +95,7 @@ ScreenEz2SelectPlayer::ScreenEz2SelectPlayer()
ssprintf("Press %c on the pad you wish to play on", char(4) ), ssprintf("Press %c on the pad you wish to play on", char(4) ),
false, true, 40 false, true, 40
); );
this->AddActor( &m_Menu ); this->AddSubActor( &m_Menu );
m_soundChange.Load( THEME->GetPathTo(SOUND_SELECT_STYLE_CHANGE) ); m_soundChange.Load( THEME->GetPathTo(SOUND_SELECT_STYLE_CHANGE) );
m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) );
@@ -181,18 +182,18 @@ void ScreenEz2SelectPlayer::DrawPrimitives()
if (m_iSelectedStyle == 0) // only the left pad was selected if (m_iSelectedStyle == 0) // only the left pad was selected
{ {
GAMEMAN->m_sMasterPlayerNumber = PLAYER_1; GAMESTATE->m_MasterPlayerNumber = PLAYER_1;
GAMEMAN->m_CurStyle = STYLE_EZ2_SINGLE; GAMESTATE->m_CurStyle = STYLE_EZ2_SINGLE;
} }
else if (m_iSelectedStyle == 1) // only the right pad was selected else if (m_iSelectedStyle == 1) // only the right pad was selected
{ {
GAMEMAN->m_sMasterPlayerNumber = PLAYER_2; GAMESTATE->m_MasterPlayerNumber = PLAYER_2;
GAMEMAN->m_CurStyle = STYLE_EZ2_SINGLE; GAMESTATE->m_CurStyle = STYLE_EZ2_SINGLE;
} }
else // they both selected else // they both selected
{ {
GAMEMAN->m_sMasterPlayerNumber = PLAYER_1; GAMESTATE->m_MasterPlayerNumber = PLAYER_1;
GAMEMAN->m_CurStyle = STYLE_EZ2_SINGLE_VERSUS; GAMESTATE->m_CurStyle = STYLE_EZ2_SINGLE_VERSUS;
} }
MUSIC->Stop(); MUSIC->Stop();
@@ -287,9 +288,11 @@ void ScreenEz2SelectPlayer::MenuStart( PlayerNumber p )
} }
// figure out whether we should add a player into the fray or not // figure out whether we should add a player into the fray or not
// if( GAMEMAN->m_sMasterPlayerNumber != PLAYER_2 && GAMEMAN->m_sMasterPlayerNumber != PLAYER_1 ) // if( GAMESTATE->m_MasterPlayerNumber != PLAYER_2 && GAMESTATE->m_MasterPlayerNumber != PLAYER_1 )
if (m_iSelectedStyle == 3) if (m_iSelectedStyle == 3)
{ {
GAMESTATE->m_MasterPlayerNumber = p;
if (p == PLAYER_1) if (p == PLAYER_1)
{ {
m_iSelectedStyle = 0; m_iSelectedStyle = 0;
+22 -21
View File
@@ -18,7 +18,7 @@ and sloppy and err needs cleaning up ;)
#include "ScreenTitleMenu.h" #include "ScreenTitleMenu.h"
#include "ScreenCaution.h" #include "ScreenCaution.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "ScreenSelectDifficulty.h" #include "ScreenSelectDifficulty.h"
#include "ScreenSandbox.h" #include "ScreenSandbox.h"
#include "GameManager.h" #include "GameManager.h"
@@ -27,6 +27,7 @@ and sloppy and err needs cleaning up ;)
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "Background.h" #include "Background.h"
#include "ScreenSelectGroup.h" #include "ScreenSelectGroup.h"
#include "GameState.h"
/* Constants */ /* Constants */
@@ -146,7 +147,7 @@ ScreenEz2SelectStyle::ScreenEz2SelectStyle()
m_sprBackground[i].Load( sPadGraphicPath ); m_sprBackground[i].Load( sPadGraphicPath );
m_sprBackground[i].SetXY( CENTER_X, CENTER_Y ); m_sprBackground[i].SetXY( CENTER_X, CENTER_Y );
m_sprBackground[i].SetZoom( 1 ); m_sprBackground[i].SetZoom( 1 );
this->AddActor( &m_sprBackground[i] ); this->AddSubActor( &m_sprBackground[i] );
} }
for( i=0; i<NUM_EZ2STYLE_GRAPHICS; i++ ) for( i=0; i<NUM_EZ2STYLE_GRAPHICS; i++ )
@@ -170,7 +171,7 @@ ScreenEz2SelectStyle::ScreenEz2SelectStyle()
m_sprOpt[i].Load( sPadGraphicPath ); m_sprOpt[i].Load( sPadGraphicPath );
m_sprOpt[i].SetXY( OPT_X[i], OPT_Y[i] ); m_sprOpt[i].SetXY( OPT_X[i], OPT_Y[i] );
m_sprOpt[i].SetZoom( 1 ); m_sprOpt[i].SetZoom( 1 );
this->AddActor( &m_sprOpt[i] ); this->AddSubActor( &m_sprOpt[i] );
} }
for( i=0; i<NUM_EZ2P_GRAPHICS; i++ ) for( i=0; i<NUM_EZ2P_GRAPHICS; i++ )
@@ -194,16 +195,16 @@ ScreenEz2SelectStyle::ScreenEz2SelectStyle()
m_sprPly[i].Load( sPadGraphicPath ); m_sprPly[i].Load( sPadGraphicPath );
m_sprPly[i].SetXY( OPT_XP[i], OPT_YP[i] ); m_sprPly[i].SetXY( OPT_XP[i], OPT_YP[i] );
m_sprPly[i].SetZoom( 1 ); m_sprPly[i].SetZoom( 1 );
this->AddActor( &m_sprPly[i] ); this->AddSubActor( &m_sprPly[i] );
} }
m_Menu.Load( m_Menu.Load(
THEME->GetPathTo(GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_0), THEME->GetPathTo(GRAPHIC_SELECT_STYLE_BACKGROUND),
THEME->GetPathTo(GRAPHIC_SELECT_STYLE_TOP_EDGE), THEME->GetPathTo(GRAPHIC_SELECT_STYLE_TOP_EDGE),
ssprintf("Use %c %c to select, then press START", char(1), char(2) ), ssprintf("Use %c %c to select, then press START", char(1), char(2) ),
false, true, 40 false, true, 40
); );
this->AddActor( &m_Menu ); this->AddSubActor( &m_Menu );
m_soundChange.Load( THEME->GetPathTo(SOUND_SELECT_STYLE_CHANGE) ); m_soundChange.Load( THEME->GetPathTo(SOUND_SELECT_STYLE_CHANGE) );
m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) );
@@ -218,7 +219,7 @@ ScreenEz2SelectStyle::ScreenEz2SelectStyle()
MUSIC->Play( true ); MUSIC->Play( true );
} }
if ( GAMEMAN->m_sMasterPlayerNumber == PLAYER_1 && GAMEMAN->m_CurStyle == STYLE_EZ2_SINGLE) //if p1 already selected hide graphic. if ( GAMESTATE->m_MasterPlayerNumber == PLAYER_1 && GAMESTATE->m_CurStyle == STYLE_EZ2_SINGLE) //if p1 already selected hide graphic.
{ {
m_iSelectedPlayer = 0; m_iSelectedPlayer = 0;
m_sprPly[1].BeginTweening( 0 ); m_sprPly[1].BeginTweening( 0 );
@@ -226,7 +227,7 @@ ScreenEz2SelectStyle::ScreenEz2SelectStyle()
m_sprPly[2].BeginTweening( 0 ); m_sprPly[2].BeginTweening( 0 );
m_sprPly[2].SetTweenZoomY( 0 ); m_sprPly[2].SetTweenZoomY( 0 );
} }
else if ( GAMEMAN->m_sMasterPlayerNumber == PLAYER_2 && GAMEMAN->m_CurStyle == STYLE_EZ2_SINGLE) //if p2 already selected hide graphic. else if ( GAMESTATE->m_MasterPlayerNumber == PLAYER_2 && GAMESTATE->m_CurStyle == STYLE_EZ2_SINGLE) //if p2 already selected hide graphic.
{ {
m_iSelectedPlayer = 1; m_iSelectedPlayer = 1;
m_sprPly[3].BeginTweening( 0 ); m_sprPly[3].BeginTweening( 0 );
@@ -256,7 +257,7 @@ ScreenEz2SelectStyle::ScreenEz2SelectStyle()
MenuLeft( PLAYER_1 ); // shift left so that we're clean again. MenuLeft( PLAYER_1 ); // shift left so that we're clean again.
} }
GAMEMAN->m_CurStyle = STYLE_NONE; // why reset this? because we want player2 to be able to input at this stage. GAMESTATE->m_CurStyle = STYLE_NONE; // why reset this? because we want player2 to be able to input at this stage.
m_Menu.TweenOnScreenFromBlack( SM_None ); m_Menu.TweenOnScreenFromBlack( SM_None );
@@ -324,7 +325,6 @@ void ScreenEz2SelectStyle::HandleScreenMessage( const ScreenMessage SM )
if (m_iSelectedStyle == 0) // easy if (m_iSelectedStyle == 0) // easy
{ {
GAMEMAN->m_CurStyle = STYLE_EZ2_SINGLE_VERSUS;
} }
else if (m_iSelectedStyle == 1) // hard else if (m_iSelectedStyle == 1) // hard
{ {
@@ -334,7 +334,7 @@ void ScreenEz2SelectStyle::HandleScreenMessage( const ScreenMessage SM )
} }
else if (m_iSelectedStyle == 2) // real else if (m_iSelectedStyle == 2) // real
{ {
GAMEMAN->m_CurStyle = STYLE_EZ2_REAL_VERSUS; GAMESTATE->m_CurStyle = STYLE_EZ2_REAL_VERSUS;
//m_soundInvalid.PlayRandom(); //m_soundInvalid.PlayRandom();
//return; //return;
} }
@@ -352,17 +352,17 @@ void ScreenEz2SelectStyle::HandleScreenMessage( const ScreenMessage SM )
} }
else if (m_iSelectedStyle == 2) // real else if (m_iSelectedStyle == 2) // real
{ {
GAMEMAN->m_CurStyle = STYLE_EZ2_REAL; GAMESTATE->m_CurStyle = STYLE_EZ2_REAL;
} }
else // club else // club
{ {
GAMEMAN->m_CurStyle = STYLE_EZ2_DOUBLE; GAMESTATE->m_CurStyle = STYLE_EZ2_DOUBLE;
GAMEMAN->m_sMasterPlayerNumber = PLAYER_1; GAMESTATE->m_MasterPlayerNumber = PLAYER_1;
} }
} }
m_soundSelect.PlayRandom(); m_soundSelect.PlayRandom();
PREFSMAN->m_PlayMode = PLAY_MODE_ARCADE; GAMESTATE->m_PlayMode = PLAY_MODE_ARCADE;
SCREENMAN->SetNewScreen( new ScreenSelectGroup ); SCREENMAN->SetNewScreen( new ScreenSelectGroup );
break; break;
@@ -388,7 +388,7 @@ void ScreenEz2SelectStyle::MenuBack( const PlayerNumber p )
MUSIC->Stop(); MUSIC->Stop();
m_Menu.TweenOffScreenToBlack( SM_GoToPrevState, true ); m_Menu.TweenOffScreenToBlack( SM_GoToPrevState, true );
GAMEMAN->m_CurStyle = STYLE_NONE; // Make sure that both players can scroll around title menu... GAMESTATE->m_CurStyle = STYLE_NONE; // Make sure that both players can scroll around title menu...
// m_Fade.CloseWipingLeft( SM_GoToPrevState ); // m_Fade.CloseWipingLeft( SM_GoToPrevState );
@@ -687,7 +687,7 @@ presses the button bound to start
************************************/ ************************************/
void ScreenEz2SelectStyle::MenuStart( PlayerNumber p ) void ScreenEz2SelectStyle::MenuStart( PlayerNumber p )
{ {
// GAMEMAN->m_CurStyle = DANCE_STYLES[m_iSelectedStyle]; // GAMESTATE->m_CurStyle = DANCE_STYLES[m_iSelectedStyle];
if ((m_iSelectedPlayer == 0 && p == PLAYER_2) || (m_iSelectedPlayer == 1 && p == PLAYER_1)) if ((m_iSelectedPlayer == 0 && p == PLAYER_2) || (m_iSelectedPlayer == 1 && p == PLAYER_1))
{ {
@@ -742,14 +742,15 @@ void ScreenEz2SelectStyle::MenuStart( PlayerNumber p )
} }
else if (m_iSelectedStyle == 2) // real else if (m_iSelectedStyle == 2) // real
{ {
GAMEMAN->m_CurStyle = STYLE_EZ2_REAL; GAMESTATE->m_CurStyle = STYLE_EZ2_REAL;
//m_soundInvalid.PlayRandom(); //m_soundInvalid.PlayRandom();
//return; //return;
} }
else // club else // club
{ {
GAMEMAN->m_CurStyle = STYLE_EZ2_DOUBLE; GAMESTATE->m_CurStyle = STYLE_EZ2_DOUBLE;
GAMEMAN->m_sMasterPlayerNumber = PLAYER_1; GAMESTATE->m_CurStyle = STYLE_EZ2_DOUBLE;
GAMESTATE->m_MasterPlayerNumber = PLAYER_1;
//m_soundInvalid.PlayRandom(); //m_soundInvalid.PlayRandom();
//return; //return;
} }
@@ -758,7 +759,7 @@ void ScreenEz2SelectStyle::MenuStart( PlayerNumber p )
this->ClearMessageQueue(); this->ClearMessageQueue();
PREFSMAN->m_PlayMode = PLAY_MODE_ARCADE; GAMESTATE->m_PlayMode = PLAY_MODE_ARCADE;
m_Menu.TweenOffScreenToMenu( SM_GoToNextState ); m_Menu.TweenOffScreenToMenu( SM_GoToNextState );
+11 -3
View File
@@ -11,7 +11,7 @@
*/ */
#include "ScreenGameOver.h" #include "ScreenGameOver.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "RageLog.h" #include "RageLog.h"
#include "TransitionFadeWipe.h" #include "TransitionFadeWipe.h"
#include "Sprite.h" #include "Sprite.h"
@@ -19,6 +19,8 @@
#include "ScreenManager.h" #include "ScreenManager.h"
#include "ScreenTitleMenu.h" #include "ScreenTitleMenu.h"
#include "AnnouncerManager.h" #include "AnnouncerManager.h"
#include "GameState.h"
const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 1); const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 1);
const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2);
@@ -27,9 +29,11 @@ const ScreenMessage SM_PlayAnnouncer = ScreenMessage(SM_User + 3);
ScreenGameOver::ScreenGameOver() ScreenGameOver::ScreenGameOver()
{ {
m_bClosing = false;
m_sprGameOver.Load( THEME->GetPathTo(GRAPHIC_GAME_OVER) ); m_sprGameOver.Load( THEME->GetPathTo(GRAPHIC_GAME_OVER) );
m_sprGameOver.SetXY( CENTER_X, CENTER_Y ); m_sprGameOver.SetXY( CENTER_X, CENTER_Y );
this->AddActor( &m_sprGameOver ); this->AddSubActor( &m_sprGameOver );
// tween game over // tween game over
m_sprGameOver.SetAddColor( D3DXCOLOR(1,1,1,0) ); m_sprGameOver.SetAddColor( D3DXCOLOR(1,1,1,0) );
@@ -45,7 +49,7 @@ ScreenGameOver::ScreenGameOver()
m_sprGameOver.SetTweenAddColor( D3DXCOLOR(1,1,1,0) ); m_sprGameOver.SetTweenAddColor( D3DXCOLOR(1,1,1,0) );
// BUGFIX by ANDY: Stage will now reset back to 0 when game ends. // BUGFIX by ANDY: Stage will now reset back to 0 when game ends.
PREFSMAN->m_iCurrentStageIndex = 0; GAMESTATE->m_iCurrentStageIndex = 0;
this->SendScreenMessage( SM_PlayAnnouncer, 0.5 ); this->SendScreenMessage( SM_PlayAnnouncer, 0.5 );
this->SendScreenMessage( SM_StartFadingOut, 5 ); this->SendScreenMessage( SM_StartFadingOut, 5 );
@@ -60,6 +64,7 @@ void ScreenGameOver::HandleScreenMessage( const ScreenMessage SM )
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_GAME_OVER) ); SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_GAME_OVER) );
break; break;
case SM_StartFadingOut: case SM_StartFadingOut:
m_bClosing = true;
m_sprGameOver.BeginTweening( 0.8f ); m_sprGameOver.BeginTweening( 0.8f );
m_sprGameOver.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,0) ); m_sprGameOver.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,0) );
this->SendScreenMessage( SM_GoToNextState, 0.8f ); this->SendScreenMessage( SM_GoToNextState, 0.8f );
@@ -72,6 +77,9 @@ void ScreenGameOver::HandleScreenMessage( const ScreenMessage SM )
void ScreenGameOver::MenuStart( PlayerNumber p ) void ScreenGameOver::MenuStart( PlayerNumber p )
{ {
if( m_bClosing )
return;
this->ClearMessageQueue(); this->ClearMessageQueue();
this->SendScreenMessage( SM_StartFadingOut, 0 ); this->SendScreenMessage( SM_StartFadingOut, 0 );
} }
+2
View File
@@ -23,6 +23,8 @@ public:
virtual void MenuStart( const PlayerNumber p ); virtual void MenuStart( const PlayerNumber p );
private: private:
bool m_bClosing;
Sprite m_sprGameOver; Sprite m_sprGameOver;
}; };
+221 -151
View File
@@ -17,19 +17,24 @@
#include "ScreenSelectMusic.h" #include "ScreenSelectMusic.h"
#include "ScreenEvaluation.h" #include "ScreenEvaluation.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "GameManager.h" #include "GameManager.h"
#include "SongManager.h" #include "SongManager.h"
#include "RageLog.h" #include "RageLog.h"
#include "AnnouncerManager.h" #include "AnnouncerManager.h"
#include "ScreenGameOver.h" #include "ScreenGameOver.h"
#include "LifeMeterBar.h"
#include "LifeMeterBattery.h"
#include "GameState.h"
#include "ScoreDisplayNormal.h"
#include "ScoreDisplayOni.h"
// //
// Defines specific to GameScreenTitleMenu // Defines
// //
const float LIFE_LOCAL_X[NUM_PLAYERS] = { -180, +180 }; const float LIFE_LOCAL_X[NUM_PLAYERS] = { -180, +180 };
const float LIFE_LOCAL_Y[NUM_PLAYERS] = { -10, -10 }; const float LIFE_LOCAL_Y[NUM_PLAYERS] = { -8, -8 };
const float STAGE_NUMBER_LOCAL_X = 0; const float STAGE_NUMBER_LOCAL_X = 0;
const float STAGE_NUMBER_LOCAL_Y = +20; const float STAGE_NUMBER_LOCAL_Y = +20;
@@ -50,12 +55,13 @@ const float DIFFICULTY_Y[NUM_PLAYERS] = { SCREEN_BOTTOM-70, SCREEN_BOTTOM-70 };
const float DEBUG_X = CENTER_X; const float DEBUG_X = CENTER_X;
const float DEBUG_Y = CENTER_Y-70; const float DEBUG_Y = CENTER_Y-70;
const float TIME_BETWEEN_DANCING_COMMENTS = 15; const float TIME_BETWEEN_DANCING_COMMENTS = 13;
// received while STATE_DANCING // received while STATE_DANCING
const ScreenMessage SM_NotesEnded = ScreenMessage(SM_User+102); const ScreenMessage SM_NotesEnded = ScreenMessage(SM_User+102);
const ScreenMessage SM_LifeIs0 = ScreenMessage(SM_User+103); const ScreenMessage SM_LastNotesEnded = ScreenMessage(SM_User+103);
const ScreenMessage SM_LifeIs0 = ScreenMessage(SM_User+104);
// received while STATE_OUTRO // received while STATE_OUTRO
@@ -75,37 +81,33 @@ ScreenGameplay::ScreenGameplay()
{ {
LOG->WriteLine( "ScreenGameplay::ScreenGameplay()" ); LOG->WriteLine( "ScreenGameplay::ScreenGameplay()" );
m_pCurSong = NULL; switch( GAMESTATE->m_PlayMode )
switch( PREFSMAN->m_PlayMode )
{ {
case PLAY_MODE_ARCADE: case PLAY_MODE_ARCADE:
{ {
m_apSongQueue.Add( SONGMAN->GetCurrentSong() ); m_apSongQueue.Add( GAMESTATE->m_pCurSong );
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
m_apNotesQueue[p].Add( SONGMAN->GetCurrentNotes(PlayerNumber(p)) ); m_apNotesQueue[p].Add( GAMESTATE->m_pCurNotes[p] );
} }
break; break;
case PLAY_MODE_ONI: case PLAY_MODE_ONI:
{ {
Course* pCourse = SONGMAN->m_pCurCourse; Course* pCourse = GAMESTATE->m_pCurCourse;
ASSERT( pCourse != NULL ); ASSERT( pCourse != NULL );
for( int i=0; i<pCourse->m_iStages; i++ )
{
Song* pSong = pCourse->m_apSongs[i];
DifficultyClass dc = pCourse->m_aDifficultyClasses[i];
for( int j=0; j<pSong->m_apNotes.GetSize(); j++ ) m_apSongQueue.RemoveAll();
{
Notes* pNotes = pSong->m_apNotes[j];
if( pSong->m_apNotes[j]->m_DifficultyClass == dc )
{
m_apSongQueue.Add( pSong );
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
m_apNotesQueue[p].Add( pNotes ); m_apNotesQueue[p].RemoveAll();
break;
} pCourse->GetSongAndNotesForCurrentStyle( m_apSongQueue, m_apNotesQueue );
}
// store possible dance points in GAMESTATE
GAMESTATE->m_iCoursePossibleDancePoints = 0;
for( int i=0; i<m_apNotesQueue[PLAYER_1].GetSize(); i++ )
{
NoteData nd;
m_apNotesQueue[PLAYER_1][i]->GetNoteData( &nd );
GAMESTATE->m_iCoursePossibleDancePoints += nd.GetPossibleDancePoints();
} }
} }
break; break;
@@ -118,62 +120,65 @@ ScreenGameplay::ScreenGameplay()
m_Background.SetDiffuseColor( D3DXCOLOR(0.4f,0.4f,0.4f,1) ); m_Background.SetDiffuseColor( D3DXCOLOR(0.4f,0.4f,0.4f,1) );
this->AddActor( &m_Background ); this->AddSubActor( &m_Background );
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled(PlayerNumber(p)) ) if( !GAMESTATE->IsPlayerEnabled(PlayerNumber(p)) )
continue; continue;
m_Player[p].SetX( (float) GAMEMAN->GetCurrentStyleDef()->m_iCenterX[p] ); m_Player[p].SetX( (float) GAMESTATE->GetCurrentStyleDef()->m_iCenterX[p] );
this->AddActor( &m_Player[p] ); this->AddSubActor( &m_Player[p] );
} }
////////////////////////////////// //////////////////////////////////
// Add all Actors to m_frameTop // Add all Actors to m_frameTop
////////////////////////////////// //////////////////////////////////
this->AddActor( &m_frameTop ); this->AddSubActor( &m_frameTop );
// LifeMeter goes underneath top frame
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
{ {
m_quadLifeMeterBG[p].SetXY( LIFE_LOCAL_X[p], LIFE_LOCAL_Y[p] ); switch( GAMESTATE->m_PlayMode )
m_quadLifeMeterBG[p].SetDiffuseColor( D3DXCOLOR(0,0,0,1) );
m_quadLifeMeterBG[p].SetZoomX( 256 );
m_quadLifeMeterBG[p].SetZoomY( (p==PLAYER_1) ? 20.0f : -20.0f );
m_frameTop.AddActor( &m_quadLifeMeterBG[p] );
if( !GAMEMAN->IsPlayerEnabled(PlayerNumber(p)) )
continue;
m_LifeMeter[p].SetPlayerOptions( PREFSMAN->m_PlayerOptions[p] );
m_LifeMeter[p].SetXY( LIFE_LOCAL_X[p], LIFE_LOCAL_Y[p] );
m_LifeMeter[p].SetZoomX( 256 );
m_LifeMeter[p].SetZoomY( (p==PLAYER_1) ? 20.0f : -20.0f );
m_frameTop.AddActor( &m_LifeMeter[p] );
if ( GAMEMAN->m_CurGame == GAME_EZ2 )
{ {
m_ScoreDisplay[p].SetXY( SCORE_LOCALEZ2_X[p], SCORE_LOCALEZ2_Y[p] ); case PLAY_MODE_ARCADE:
m_ScoreDisplay[p].SetZoom( 0.5f ); m_pLifeMeter[p] = new LifeMeterBar;
m_ScoreDisplay[p].SetDiffuseColor( PlayerToColor(p) ); break;
m_frameTop.AddActor( &m_ScoreDisplay[p] ); case PLAY_MODE_ONI:
m_pLifeMeter[p] = new LifeMeterBattery;
break;
default:
ASSERT(0);
}
m_pLifeMeter[p]->Load( (PlayerNumber)p, GAMESTATE->m_PlayerOptions[p] );
m_pLifeMeter[p]->SetXY( LIFE_LOCAL_X[p], LIFE_LOCAL_Y[p] );
m_frameTop.AddSubActor( m_pLifeMeter[p] );
if( GAMESTATE->GetCurGame() == GAME_EZ2 )
{
m_pScoreDisplay[p]->SetXY( SCORE_LOCALEZ2_X[p], SCORE_LOCALEZ2_Y[p] );
m_pScoreDisplay[p]->SetZoom( 0.5f );
m_pScoreDisplay[p]->SetDiffuseColor( PlayerToColor(p) );
m_frameTop.AddSubActor( m_pScoreDisplay[p] );
} }
} }
// TopFrame goes above LifeMeter // TopFrame goes above LifeMeter
m_sprTopFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_TOP_FRAME_ARCADE) ); m_sprTopFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_TOP_FRAME) );
m_frameTop.AddActor( &m_sprTopFrame ); m_frameTop.AddSubActor( &m_sprTopFrame );
m_frameTop.SetXY( CENTER_X, SCREEN_TOP + m_sprTopFrame.GetZoomedHeight()/2 ); m_frameTop.SetXY( CENTER_X, SCREEN_TOP + m_sprTopFrame.GetZoomedHeight()/2 );
m_textStageNumber.Load( THEME->GetPathTo(FONT_HEADER2) ); m_textStageNumber.Load( THEME->GetPathTo(FONT_HEADER2) );
m_textStageNumber.TurnShadowOff(); m_textStageNumber.TurnShadowOff();
if ( GAMEMAN->m_CurGame == GAME_EZ2 ) m_textStageNumber.SetXY( STAGE_NUMBER_LOCAL_X, STAGE_NUMBER_LOCAL_Y );
m_textStageNumber.SetText( GAMESTATE->GetStageText() );
m_textStageNumber.SetDiffuseColor( GAMESTATE->GetStageColor() );
if( GAMESTATE->GetCurGame() == GAME_EZ2 )
{ {
m_textStageNumber.SetXY( STAGE_NUMBER_LOCAL_X, STAGE_NUMBER_LOCALEZ2_Y ); m_textStageNumber.SetXY( STAGE_NUMBER_LOCAL_X, STAGE_NUMBER_LOCALEZ2_Y );
} }
@@ -181,61 +186,96 @@ ScreenGameplay::ScreenGameplay()
{ {
m_textStageNumber.SetXY( STAGE_NUMBER_LOCAL_X, STAGE_NUMBER_LOCAL_Y ); m_textStageNumber.SetXY( STAGE_NUMBER_LOCAL_X, STAGE_NUMBER_LOCAL_Y );
} }
m_textStageNumber.SetText( PREFSMAN->GetStageText() ); m_textStageNumber.SetText( GAMESTATE->GetStageText() );
m_textStageNumber.SetDiffuseColor( PREFSMAN->GetStageColor() ); m_textStageNumber.SetDiffuseColor( GAMESTATE->GetStageColor() );
m_frameTop.AddActor( &m_textStageNumber );
m_frameTop.AddSubActor( &m_textStageNumber );
////////////////////////////////// //////////////////////////////////
// Add all Actors to m_frameBottom // Add all Actors to m_frameBottom
////////////////////////////////// //////////////////////////////////
this->AddActor( &m_frameBottom ); this->AddSubActor( &m_frameBottom );
if ( GAMEMAN->m_CurGame != GAME_EZ2 ) m_sprBottomFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_BOTTOM_FRAME) );
m_frameBottom.AddSubActor( &m_sprBottomFrame );
m_frameBottom.SetXY( CENTER_X, SCREEN_BOTTOM - m_sprBottomFrame.GetZoomedHeight()/2 );
if( GAMESTATE->GetCurGame() != GAME_EZ2 )
{ {
m_sprBottomFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_BOTTOM_FRAME) ); m_sprBottomFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_BOTTOM_FRAME) );
m_frameBottom.AddActor( &m_sprBottomFrame ); m_frameBottom.AddSubActor( &m_sprBottomFrame );
m_frameBottom.SetXY( CENTER_X, SCREEN_BOTTOM - m_sprBottomFrame.GetZoomedHeight()/2 ); m_frameBottom.SetXY( CENTER_X, SCREEN_BOTTOM - m_sprBottomFrame.GetZoomedHeight()/2 );
} }
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled(PlayerNumber(p)) ) switch( GAMESTATE->m_PlayMode )
continue;
if ( GAMEMAN->m_CurGame != GAME_EZ2 )
{ {
m_ScoreDisplay[p].SetXY( SCORE_LOCAL_X[p], SCORE_LOCAL_Y[p] ); case PLAY_MODE_ARCADE:
m_ScoreDisplay[p].SetZoom( 0.8f ); m_pScoreDisplay[p] = new ScoreDisplayNormal;
m_ScoreDisplay[p].SetDiffuseColor( PlayerToColor(p) ); break;
m_frameBottom.AddActor( &m_ScoreDisplay[p] ); case PLAY_MODE_ONI:
m_pScoreDisplay[p] = new ScoreDisplayOni;
break;
default:
ASSERT(0);
}
m_pScoreDisplay[p]->Init( (PlayerNumber)p, GAMESTATE->m_PlayerOptions[p], 100, 7 );
m_pScoreDisplay[p]->SetXY( SCORE_LOCAL_X[p], SCORE_LOCAL_Y[p] );
m_pScoreDisplay[p]->SetZoom( 0.8f );
m_pScoreDisplay[p]->SetDiffuseColor( PlayerToColor(p) );
m_frameBottom.AddSubActor( m_pScoreDisplay[p] );
m_textPlayerOptions[p].Load( THEME->GetPathTo(FONT_NORMAL) );
if( !GAMESTATE->IsPlayerEnabled(PlayerNumber(p)) )
continue;
if( GAMESTATE->GetCurGame() != GAME_EZ2 )
{
m_pScoreDisplay[p]->SetXY( SCORE_LOCAL_X[p], SCORE_LOCAL_Y[p] );
m_pScoreDisplay[p]->SetZoom( 0.8f );
m_pScoreDisplay[p]->SetDiffuseColor( PlayerToColor(p) );
m_frameBottom.AddSubActor( m_pScoreDisplay[p] );
} }
m_textPlayerOptions[p].Load( THEME->GetPathTo(FONT_NORMAL) ); m_textPlayerOptions[p].Load( THEME->GetPathTo(FONT_NORMAL) );
m_textPlayerOptions[p].TurnShadowOff(); m_textPlayerOptions[p].TurnShadowOff();
m_textPlayerOptions[p].SetXY( PLAYER_OPTIONS_LOCAL_X[p], PLAYER_OPTIONS_LOCAL_Y[p] ); m_textPlayerOptions[p].SetXY( PLAYER_OPTIONS_LOCAL_X[p], PLAYER_OPTIONS_LOCAL_Y[p] );
m_textPlayerOptions[p].SetZoom( 0.5f ); m_textPlayerOptions[p].SetZoom( 0.5f );
m_textPlayerOptions[p].SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); m_textPlayerOptions[p].SetDiffuseColor( D3DXCOLOR(1,1,1,1) );
m_textPlayerOptions[p].SetText( PREFSMAN->m_PlayerOptions[p].GetString() ); m_textPlayerOptions[p].SetText( GAMESTATE->m_PlayerOptions[p].GetString() );
m_frameBottom.AddActor( &m_textPlayerOptions[p] ); m_frameBottom.AddSubActor( &m_textPlayerOptions[p] );
} }
// Get the current StyleDef definition (used below) // Get the current StyleDef definition (used below)
StyleDef* pStyleDef = GAMEMAN->GetCurrentStyleDef(); StyleDef* pStyleDef = GAMESTATE->GetCurrentStyleDef();
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled(PlayerNumber(p)) ) if( !GAMESTATE->IsPlayerEnabled(PlayerNumber(p)) )
continue; continue;
if (GAMEMAN->m_CurGame != GAME_EZ2)
{
float fDifficultyY = DIFFICULTY_Y[p]; float fDifficultyY = DIFFICULTY_Y[p];
if( PREFSMAN->m_PlayerOptions[p].m_bReverseScroll ) if( GAMESTATE->m_PlayerOptions[p].m_bReverseScroll )
fDifficultyY = SCREEN_HEIGHT - DIFFICULTY_Y[p]; fDifficultyY = SCREEN_HEIGHT - DIFFICULTY_Y[p];
m_DifficultyBanner[p].SetXY( DIFFICULTY_X[p], fDifficultyY ); m_DifficultyBanner[p].SetXY( DIFFICULTY_X[p], fDifficultyY );
this->AddActor( &m_DifficultyBanner[p] ); this->AddSubActor( &m_DifficultyBanner[p] );
if( GAMESTATE->GetCurGame() != GAME_EZ2 )
{
float fDifficultyY = DIFFICULTY_Y[p];
if( GAMESTATE->m_PlayerOptions[p].m_bReverseScroll )
fDifficultyY = SCREEN_HEIGHT - DIFFICULTY_Y[p];
m_DifficultyBanner[p].SetXY( DIFFICULTY_X[p], fDifficultyY );
this->AddSubActor( &m_DifficultyBanner[p] );
} }
} }
@@ -243,42 +283,42 @@ ScreenGameplay::ScreenGameplay()
m_textDebug.Load( THEME->GetPathTo(FONT_NORMAL) ); m_textDebug.Load( THEME->GetPathTo(FONT_NORMAL) );
m_textDebug.SetXY( DEBUG_X, DEBUG_Y ); m_textDebug.SetXY( DEBUG_X, DEBUG_Y );
m_textDebug.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); m_textDebug.SetDiffuseColor( D3DXCOLOR(1,1,1,1) );
this->AddActor( &m_textDebug ); this->AddSubActor( &m_textDebug );
m_StarWipe.SetClosed(); m_StarWipe.SetClosed();
this->AddActor( &m_StarWipe ); this->AddSubActor( &m_StarWipe );
m_sprReady.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_READY) ); m_sprReady.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_READY) );
m_sprReady.SetXY( CENTER_X, CENTER_Y ); m_sprReady.SetXY( CENTER_X, CENTER_Y );
m_sprReady.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); m_sprReady.SetDiffuseColor( D3DXCOLOR(1,1,1,0) );
this->AddActor( &m_sprReady ); this->AddSubActor( &m_sprReady );
m_sprHereWeGo.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_HERE_WE_GO) ); m_sprHereWeGo.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_HERE_WE_GO) );
m_sprHereWeGo.SetXY( CENTER_X, CENTER_Y ); m_sprHereWeGo.SetXY( CENTER_X, CENTER_Y );
m_sprHereWeGo.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); m_sprHereWeGo.SetDiffuseColor( D3DXCOLOR(1,1,1,0) );
this->AddActor( &m_sprHereWeGo ); this->AddSubActor( &m_sprHereWeGo );
m_sprCleared.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_CLEARED) ); m_sprCleared.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_CLEARED) );
m_sprCleared.SetXY( CENTER_X, CENTER_Y ); m_sprCleared.SetXY( CENTER_X, CENTER_Y );
m_sprCleared.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); m_sprCleared.SetDiffuseColor( D3DXCOLOR(1,1,1,0) );
this->AddActor( &m_sprCleared ); this->AddSubActor( &m_sprCleared );
m_sprFailed.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_FAILED) ); m_sprFailed.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_FAILED) );
m_sprFailed.SetXY( CENTER_X, CENTER_Y ); m_sprFailed.SetXY( CENTER_X, CENTER_Y );
m_sprFailed.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); m_sprFailed.SetDiffuseColor( D3DXCOLOR(1,1,1,0) );
this->AddActor( &m_sprFailed ); this->AddSubActor( &m_sprFailed );
m_soundFail.Load( THEME->GetPathTo(SOUND_GAMEPLAY_FAILED) ); m_soundFail.Load( THEME->GetPathTo(SOUND_GAMEPLAY_FAILED) );
m_announcerReady.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_READY) ); m_announcerReady.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_READY) );
if( PREFSMAN->IsExtraStage() || PREFSMAN->IsExtraStage2() ) if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() )
m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_HERE_WE_GO_EXTRA) ); m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_HERE_WE_GO_EXTRA) );
else if( PREFSMAN->IsFinalStage() ) else if( GAMESTATE->IsFinalStage() )
m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_HERE_WE_GO_FINAL) ); m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_HERE_WE_GO_FINAL) );
else else
m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_HERE_WE_GO_NORMAL) ); m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_HERE_WE_GO_NORMAL) );
@@ -304,7 +344,7 @@ ScreenGameplay::ScreenGameplay()
m_soundAssistTick.Load( THEME->GetPathTo(SOUND_GAMEPLAY_ASSIST_TICK) ); m_soundAssistTick.Load( THEME->GetPathTo(SOUND_GAMEPLAY_ASSIST_TICK) );
LoadNextSong(); LoadNextSong( false );
// Send some messages every have second to we can get the introduction rolling // Send some messages every have second to we can get the introduction rolling
for( int i=0; i<30; i++ ) for( int i=0; i<30; i++ )
@@ -314,85 +354,95 @@ ScreenGameplay::ScreenGameplay()
ScreenGameplay::~ScreenGameplay() ScreenGameplay::~ScreenGameplay()
{ {
LOG->WriteLine( "ScreenGameplay::~ScreenGameplay()" ); LOG->WriteLine( "ScreenGameplay::~ScreenGameplay()" );
for( int p=0; p<NUM_PLAYERS; p++ )
{
delete m_pLifeMeter[p];
delete m_pScoreDisplay[p];
}
m_soundMusic.Stop(); m_soundMusic.Stop();
} }
void ScreenGameplay::SaveSummary() void ScreenGameplay::LoadNextSong( bool bPlayMusic )
{ {
// save score summaries if( m_apSongQueue.GetSize() == 0 )
if( m_pCurSong != NULL )
{ {
for( int p=0; p<NUM_PLAYERS; p++ ) this->SendScreenMessage( SM_LastNotesEnded, 0 );
{ return;
if( !GAMEMAN->IsPlayerEnabled((PlayerNumber)p) )
continue; // skip
SONGMAN->m_aGameplayStatistics[p].Add( m_Player[p].GetGameplayStatistics( m_pCurSong, m_pCurNotes[p]) );
}
m_pCurSong = NULL;
for( p=0; p<NUM_PLAYERS; p++ )
m_pCurNotes[p] = NULL;
}
} }
void ScreenGameplay::LoadNextSong()
{
int p; int p;
// add a new GameplayStatistic for this song
GAMESTATE->m_aGameplayStatistics.Add( GameplayStatistics() );
SaveSummary(); GAMESTATE->m_pCurSong = m_apSongQueue[0];
m_apSongQueue.RemoveAt(0);
m_pCurSong = m_apSongQueue[m_apSongQueue.GetSize()-1];
m_apSongQueue.RemoveAt(m_apSongQueue.GetSize()-1);
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
{ {
m_pCurNotes[p] = m_apNotesQueue[p][m_apNotesQueue[p].GetSize()-1]; GAMESTATE->m_pCurNotes[p] = m_apNotesQueue[p][0];
m_apNotesQueue[p].RemoveAt(m_apNotesQueue[p].GetSize()-1); m_apNotesQueue[p].RemoveAt(0);
} }
// Get the current StyleDef definition (used below) // Get the current StyleDef definition (used below)
StyleDef* pStyleDef = GAMEMAN->GetCurrentStyleDef(); StyleDef* pStyleDef = GAMESTATE->GetCurrentStyleDef();
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled(PlayerNumber(p)) ) if( !GAMESTATE->IsPlayerEnabled(PlayerNumber(p)) )
continue; continue;
m_DifficultyBanner[p].SetFromNotes( PlayerNumber(p), m_pCurNotes[p] ); m_DifficultyBanner[p].SetFromNotes( PlayerNumber(p), GAMESTATE->m_pCurNotes[p] );
NoteData originalNoteData; NoteData originalNoteData;
m_pCurNotes[p]->GetNoteData( &originalNoteData ); GAMESTATE->m_pCurNotes[p]->GetNoteData( &originalNoteData );
NoteData newNoteData; NoteData newNoteData;
pStyleDef->GetTransformedNoteDataForStyle( (PlayerNumber)p, &originalNoteData, &newNoteData ); pStyleDef->GetTransformedNoteDataForStyle( (PlayerNumber)p, &originalNoteData, &newNoteData );
// Fill in info about these notes in the latest GameplayStatistics
GAMESTATE->GetLatestGameplayStatistics().dc[p] = GAMESTATE->m_pCurNotes[p]->m_DifficultyClass;
GAMESTATE->GetLatestGameplayStatistics().meter[p] = GAMESTATE->m_pCurNotes[p]->m_iMeter;
GAMESTATE->GetLatestGameplayStatistics().iPossibleDancePoints[p] = newNoteData.GetPossibleDancePoints();
for( int r=0; r<NUM_RADAR_VALUES; r++ )
GAMESTATE->GetLatestGameplayStatistics().fRadarPossible[p][r] = newNoteData.GetRadarValue( (RadarCategory)r, GAMESTATE->m_pCurSong->m_fMusicLengthSeconds );
m_Player[p].Load( m_Player[p].Load(
(PlayerNumber)p, (PlayerNumber)p,
GAMEMAN->GetCurrentStyleDef(), GAMESTATE->GetCurrentStyleDef(),
&newNoteData, &newNoteData,
PREFSMAN->m_PlayerOptions[p], GAMESTATE->m_PlayerOptions[p],
&m_LifeMeter[p], m_pLifeMeter[p],
&m_ScoreDisplay[p], m_pScoreDisplay[p],
originalNoteData.GetNumTapNotes(), originalNoteData.GetNumTapNotes(),
m_pCurNotes[p]->m_iMeter GAMESTATE->m_pCurNotes[p]->m_iMeter
); );
} }
m_soundMusic.Load( m_pCurSong->GetMusicPath(), true ); // enable accurate sync
float fStartSeconds = min( 0, m_pCurSong->GetElapsedTimeFromBeat(m_pCurSong->m_fFirstBeat-4) );
m_soundMusic.SetPositionSeconds( fStartSeconds );
m_soundMusic.SetPlaybackRate( PREFSMAN->m_SongOptions.m_fMusicRate );
m_Background.LoadFromSong( m_pCurSong ); m_Background.LoadFromSong( GAMESTATE->m_pCurSong );
m_Background.SetDiffuseColor( D3DXCOLOR(0.5f,0.5f,0.5f,1) ); m_Background.SetDiffuseColor( D3DXCOLOR(0.5f,0.5f,0.5f,1) );
m_Background.BeginTweeningQueued( 2 ); m_Background.BeginTweeningQueued( 2 );
m_Background.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) ); m_Background.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) );
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 );
if( bPlayMusic )
m_soundMusic.Play();
if( bPlayMusic )
for( int p=0; p<NUM_PLAYERS; p++ )
if( GAMESTATE->IsPlayerEnabled(PlayerNumber(p)) )
m_pLifeMeter[p]->NextSong( NULL );
} }
@@ -403,14 +453,21 @@ void ScreenGameplay::Update( float fDeltaTime )
m_soundMusic.Update( fDeltaTime ); m_soundMusic.Update( fDeltaTime );
if( m_pCurSong == NULL ) if( GAMESTATE->m_pCurSong == NULL )
return; return;
float fPositionSeconds = m_soundMusic.GetPositionSeconds(); float fPositionSeconds = m_soundMusic.GetPositionSeconds();
float fSongBeat, fBPS; float fSongBeat, fBPS;
bool bFreeze; bool bFreeze;
m_pCurSong->GetBeatAndBPSFromElapsedTime( fPositionSeconds, fSongBeat, fBPS, bFreeze ); GAMESTATE->m_pCurSong->GetBeatAndBPSFromElapsedTime( fPositionSeconds, fSongBeat, fBPS, bFreeze );
// update the global music statistics for other classes to access
GAMESTATE->m_fMusicSeconds = fPositionSeconds;
GAMESTATE->m_fMusicBeat = fSongBeat;
GAMESTATE->m_fCurBPS = fBPS;
GAMESTATE->m_bFreeze = bFreeze;
m_Background.SetSongBeat( fSongBeat, bFreeze, fPositionSeconds ); m_Background.SetSongBeat( fSongBeat, bFreeze, fPositionSeconds );
@@ -418,44 +475,44 @@ void ScreenGameplay::Update( float fDeltaTime )
//LOG->WriteLine( "m_fOffsetInBeats = %f, m_fBeatsPerSecond = %f, m_Music.GetPositionSeconds = %f", m_fOffsetInBeats, m_fBeatsPerSecond, m_Music.GetPositionSeconds() ); //LOG->WriteLine( "m_fOffsetInBeats = %f, m_fBeatsPerSecond = %f, m_Music.GetPositionSeconds = %f", m_fOffsetInBeats, m_fBeatsPerSecond, m_Music.GetPositionSeconds() );
const float fMaxBeatDifference = fBPS * PREFSMAN->m_fJudgeWindow * PREFSMAN->m_SongOptions.m_fMusicRate; const float fMaxBeatDifference = fBPS * PREFSMAN->m_fJudgeWindow * GAMESTATE->m_SongOptions.m_fMusicRate;
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled(PlayerNumber(p)) ) if( !GAMESTATE->IsPlayerEnabled(PlayerNumber(p)) )
continue; continue;
m_Player[p].Update( fDeltaTime, fSongBeat, fMaxBeatDifference ); m_Player[p].Update( fDeltaTime, fSongBeat, fMaxBeatDifference );
} }
// check for fail // check for fail
switch( PREFSMAN->m_SongOptions.m_FailType ) switch( GAMESTATE->m_SongOptions.m_FailType )
{ {
case SongOptions::FAIL_ARCADE: case SongOptions::FAIL_ARCADE:
case SongOptions::FAIL_END_OF_SONG: case SongOptions::FAIL_END_OF_SONG:
{
if( m_bBothHaveFailed ) if( m_bBothHaveFailed )
break; // if they have already failed, don't bother checking again break; // if they have already failed, don't bother checking again
{
// check for both players fail // check for both players fail
bool bAllInDanger = true; bool bAllInDanger = true;
bool bAllFailed = true; bool bAllAreFailing = true;
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled(PlayerNumber(p)) ) if( !GAMESTATE->IsPlayerEnabled(PlayerNumber(p)) )
continue; continue;
if( !m_LifeMeter[p].IsInDanger() ) if( !m_pLifeMeter[p]->IsInDanger() )
bAllInDanger = false; bAllInDanger = false;
if( !m_LifeMeter[p].HasFailed() ) if( !m_pLifeMeter[p]->IsFailing() )
bAllFailed = false; bAllAreFailing = false;
} }
if( bAllInDanger ) m_Background.TurnDangerOn(); if( bAllInDanger ) m_Background.TurnDangerOn();
else m_Background.TurnDangerOff(); else m_Background.TurnDangerOff();
if( bAllFailed ) if( bAllAreFailing )
{ {
m_bBothHaveFailed = true; m_bBothHaveFailed = true;
SCREENMAN->SendMessageToTopScreen( SM_LifeIs0, 0 ); SCREENMAN->SendMessageToTopScreen( SM_LifeIs0, 0 );
@@ -466,13 +523,18 @@ void ScreenGameplay::Update( float fDeltaTime )
break; break;
} }
// update seconds into play
for( p=0; p<NUM_PLAYERS; p++ )
if( GAMESTATE->IsPlayerEnabled((PlayerNumber)p) && !m_pLifeMeter[p]->FailedEarlier() )
GAMESTATE->GetLatestGameplayStatistics().fSecsIntoPlay[p] = max( GAMESTATE->GetLatestGameplayStatistics().fSecsIntoPlay[p], GAMESTATE->m_fMusicSeconds );
switch( m_DancingState ) switch( m_DancingState )
{ {
case STATE_DANCING: case STATE_DANCING:
// Check for end of song // Check for end of song
if( fSongBeat > m_pCurSong->m_fLastBeat+4 ) if( fSongBeat > GAMESTATE->m_pCurSong->m_fLastBeat+4 )
this->SendScreenMessage( SM_NotesEnded, 0 ); this->SendScreenMessage( SM_NotesEnded, 0 );
// Check to see if it's time to play a gameplay comment // Check to see if it's time to play a gameplay comment
@@ -483,12 +545,12 @@ void ScreenGameplay::Update( float fDeltaTime )
bool bAllInDanger = true; bool bAllInDanger = true;
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
if( !m_LifeMeter[p].IsInDanger() ) if( !m_pLifeMeter[p]->IsInDanger() )
bAllInDanger = false; bAllInDanger = false;
bool bOneIsHot = false; bool bOneIsHot = false;
for( p=0; p<NUM_PLAYERS; p++ ) for( p=0; p<NUM_PLAYERS; p++ )
if( m_LifeMeter[p].IsHot() ) if( m_pLifeMeter[p]->IsHot() )
bOneIsHot = true; bOneIsHot = true;
if( bOneIsHot ) if( bOneIsHot )
@@ -512,7 +574,7 @@ void ScreenGameplay::Update( float fDeltaTime )
{ {
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled( (PlayerNumber)p ) ) if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
continue; // skip continue; // skip
m_Player[p].CrossedRow( r, fSongBeat, fMaxBeatDifference ); m_Player[p].CrossedRow( r, fSongBeat, fMaxBeatDifference );
@@ -529,10 +591,10 @@ void ScreenGameplay::Update( float fDeltaTime )
// Sound cards have a latency between when a sample is Play()ed and when the sound // 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 // will start coming out the speaker. Compensate for this by boosting
// fPositionSeconds ahead // fPositionSeconds ahead
if( PREFSMAN->m_SongOptions.m_AssistType == SongOptions::ASSIST_TICK ) if( GAMESTATE->m_SongOptions.m_AssistType == SongOptions::ASSIST_TICK )
{ {
fPositionSeconds += (SOUND->GetPlayLatency()+0.04f) * m_soundMusic.GetPlaybackRate(); // HACK: Add 0.04 seconds to make them play a tiny bit earlier fPositionSeconds += (SOUND->GetPlayLatency()+0.04f) * m_soundMusic.GetPlaybackRate(); // HACK: Add 0.04 seconds to make them play a tiny bit earlier
m_pCurSong->GetBeatAndBPSFromElapsedTime( fPositionSeconds, fSongBeat, fBPS, bFreeze ); GAMESTATE->m_pCurSong->GetBeatAndBPSFromElapsedTime( fPositionSeconds, fSongBeat, fBPS, bFreeze );
int iRowNow = BeatToNoteRowNotRounded( fSongBeat ); int iRowNow = BeatToNoteRowNotRounded( fSongBeat );
static int iRowLastCrossed = 0; static int iRowLastCrossed = 0;
@@ -543,7 +605,7 @@ void ScreenGameplay::Update( float fDeltaTime )
{ {
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled( (PlayerNumber)p ) ) if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
continue; // skip continue; // skip
m_Player[p].CrossedRow( r, fSongBeat, fMaxBeatDifference ); m_Player[p].CrossedRow( r, fSongBeat, fMaxBeatDifference );
@@ -564,7 +626,7 @@ void ScreenGameplay::Update( float fDeltaTime )
{ {
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
if( !GAMEMAN->IsPlayerEnabled((PlayerNumber)p) ) if( !GAMESTATE->IsPlayerEnabled((PlayerNumber)p) )
continue; continue;
float fOverrideAdd = m_Player[p].GetOverrideAdd(); float fOverrideAdd = m_Player[p].GetOverrideAdd();
@@ -595,7 +657,7 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ
float fSongBeat, fBPS; float fSongBeat, fBPS;
bool bFreeze; bool bFreeze;
m_pCurSong->GetBeatAndBPSFromElapsedTime( m_soundMusic.GetPositionSeconds(), fSongBeat, fBPS, bFreeze ); GAMESTATE->m_pCurSong->GetBeatAndBPSFromElapsedTime( m_soundMusic.GetPositionSeconds(), fSongBeat, fBPS, bFreeze );
// Handle special keys to adjust the offset // Handle special keys to adjust the offset
@@ -616,9 +678,9 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ
if( type == IET_FAST_REPEAT ) if( type == IET_FAST_REPEAT )
fOffsetDelta *= 40; fOffsetDelta *= 40;
m_pCurSong->m_fBeat0OffsetInSeconds += fOffsetDelta; GAMESTATE->m_pCurSong->m_fBeat0OffsetInSeconds += fOffsetDelta;
m_textDebug.SetText( ssprintf("Offset = %f.", m_pCurSong->m_fBeat0OffsetInSeconds) ); m_textDebug.SetText( ssprintf("Offset = %f.", GAMESTATE->m_pCurSong->m_fBeat0OffsetInSeconds) );
m_textDebug.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); m_textDebug.SetDiffuseColor( D3DXCOLOR(1,1,1,1) );
m_textDebug.StopTweening(); m_textDebug.StopTweening();
m_textDebug.BeginTweeningQueued( 3 ); // sleep m_textDebug.BeginTweeningQueued( 3 ); // sleep
@@ -637,13 +699,13 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ
SCREENMAN->SendMessageToTopScreen( SM_BeginFailed, 0 ); SCREENMAN->SendMessageToTopScreen( SM_BeginFailed, 0 );
} }
const float fMaxBeatDifference = fBPS * PREFSMAN->m_fJudgeWindow * PREFSMAN->m_SongOptions.m_fMusicRate; const float fMaxBeatDifference = fBPS * PREFSMAN->m_fJudgeWindow * GAMESTATE->m_SongOptions.m_fMusicRate;
if( type == IET_FIRST_PRESS ) if( type == IET_FIRST_PRESS )
{ {
if( StyleI.IsValid() ) if( StyleI.IsValid() )
{ {
if( GAMEMAN->IsPlayerEnabled( StyleI.player ) ) if( GAMESTATE->IsPlayerEnabled( StyleI.player ) )
m_Player[StyleI.player].HandlePlayerStep( fSongBeat, StyleI.col, fMaxBeatDifference ); m_Player[StyleI.player].HandlePlayerStep( fSongBeat, StyleI.col, fMaxBeatDifference );
} }
} }
@@ -669,11 +731,12 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
m_sprReady.StartBlurring(); m_sprReady.StartBlurring();
break; break;
case SM_User+5: case SM_User+5:
{
m_sprHereWeGo.StartFocusing(); m_sprHereWeGo.StartFocusing();
m_announcerHereWeGo.PlayRandom(); m_announcerHereWeGo.PlayRandom();
m_Background.FadeIn(); m_Background.FadeIn();
m_soundMusic.Play(); m_soundMusic.Play();
m_soundMusic.SetPlaybackRate( PREFSMAN->m_SongOptions.m_fMusicRate ); }
break; break;
case SM_User+6: case SM_User+6:
break; break;
@@ -688,11 +751,19 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
// received while STATE_DANCING // received while STATE_DANCING
case SM_LifeIs0: case SM_LifeIs0:
if( PREFSMAN->m_SongOptions.m_FailType == SongOptions::FAIL_ARCADE ) // fail them now! if( GAMESTATE->m_SongOptions.m_FailType == SongOptions::FAIL_ARCADE ) // fail them now!
this->SendScreenMessage( SM_BeginFailed, 0 ); this->SendScreenMessage( SM_BeginFailed, 0 );
m_DancingState = STATE_OUTRO; m_DancingState = STATE_OUTRO;
break; break;
case SM_NotesEnded: case SM_NotesEnded:
{
for( int p=0; p<NUM_PLAYERS; p++ )
if( GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) )
m_Player[p].SaveGameplayStatistics();
LoadNextSong( true );
}
break;
case SM_LastNotesEnded:
if( m_DancingState == STATE_OUTRO ) // gameplay already ended if( m_DancingState == STATE_OUTRO ) // gameplay already ended
return; // ignore return; // ignore
@@ -797,7 +868,6 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
SCREENMAN->SendMessageToTopScreen( SM_GoToResults, 1 ); SCREENMAN->SendMessageToTopScreen( SM_GoToResults, 1 );
break; break;
case SM_GoToResults: case SM_GoToResults:
SaveSummary();
SCREENMAN->SetNewScreen( new ScreenEvaluation(false) ); SCREENMAN->SetNewScreen( new ScreenEvaluation(false) );
break; break;
@@ -827,7 +897,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
m_sprFailed.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,0.7f) ); // and fade in m_sprFailed.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,0.7f) ); // and fade in
// BUGFIX by ANDY: Stage will now reset back to 0 when game ends. // BUGFIX by ANDY: Stage will now reset back to 0 when game ends.
PREFSMAN->m_iCurrentStageIndex = 0; GAMESTATE->m_iCurrentStageIndex = 0;
SCREENMAN->SendMessageToTopScreen( SM_PlayFailComment, 1.5f ); SCREENMAN->SendMessageToTopScreen( SM_PlayFailComment, 1.5f );
SCREENMAN->SendMessageToTopScreen( SM_HideFailed, 3.0f ); SCREENMAN->SendMessageToTopScreen( SM_HideFailed, 3.0f );
+6 -9
View File
@@ -21,8 +21,8 @@
#include "RageMusic.h" #include "RageMusic.h"
#include "MotionBlurSprite.h" #include "MotionBlurSprite.h"
#include "Background.h" #include "Background.h"
#include "LifeMeterBar.h" #include "LifeMeter.h"
#include "ScoreDisplayRolling.h" #include "ScoreDisplay.h"
#include "DifficultyBanner.h" #include "DifficultyBanner.h"
@@ -61,14 +61,12 @@ public:
private: private:
void TweenOnScreen(); void TweenOnScreen();
void TweenOffScreen(); void TweenOffScreen();
void SaveSummary();
void LoadNextSong(); void LoadNextSong( bool bPlayMusic );
DancingState m_DancingState; DancingState m_DancingState;
Song* m_pCurSong;
Notes* m_pCurNotes[NUM_PLAYERS];
CArray<Song*,Song*> m_apSongQueue; // nearest songs are on back of queue CArray<Song*,Song*> m_apSongQueue; // nearest songs are on back of queue
CArray<Notes*,Notes*> m_apNotesQueue[NUM_PLAYERS]; // nearest notes are on back of queue CArray<Notes*,Notes*> m_apNotesQueue[NUM_PLAYERS]; // nearest notes are on back of queue
bool m_bBothHaveFailed; bool m_bBothHaveFailed;
@@ -80,13 +78,12 @@ private:
ActorFrame m_frameTop; ActorFrame m_frameTop;
Sprite m_sprTopFrame; Sprite m_sprTopFrame;
Quad m_quadLifeMeterBG[NUM_PLAYERS]; // just a black quad to fill in hole for the life meter LifeMeter* m_pLifeMeter[NUM_PLAYERS];
LifeMeterBar m_LifeMeter[NUM_PLAYERS];
BitmapText m_textStageNumber; BitmapText m_textStageNumber;
ActorFrame m_frameBottom; ActorFrame m_frameBottom;
Sprite m_sprBottomFrame; Sprite m_sprBottomFrame;
ScoreDisplayRolling m_ScoreDisplay[NUM_PLAYERS]; ScoreDisplay* m_pScoreDisplay[NUM_PLAYERS];
BitmapText m_textPlayerOptions[NUM_PLAYERS]; BitmapText m_textPlayerOptions[NUM_PLAYERS];
BitmapText m_textDebug; BitmapText m_textDebug;
+32
View File
@@ -0,0 +1,32 @@
#include "stdafx.h"
/*
-----------------------------------------------------------------------------
Class: ScreenLoading
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "ScreenLoading.h"
#include "GameState.h"
ScreenLoading::ScreenLoading()
{
m_sprLoading.Load( THEME->GetPathTo(GRAPHIC_LOADING) );
m_sprLoading.SetXY( CENTER_X, CENTER_Y );
this->AddSubActor( &m_sprLoading );
m_textMessage.Load( THEME->GetPathTo(FONT_NORMAL) );
m_textMessage.SetXY( CENTER_X, CENTER_Y );
this->AddSubActor( &m_textMessage );
}
void ScreenLoading::DrawPrimitives()
{
m_textMessage.SetText( GAMESTATE->m_sLoadingMessage );
Screen::DrawPrimitives();
}
+29
View File
@@ -0,0 +1,29 @@
#pragma once
/*
-----------------------------------------------------------------------------
Class: ScreenLoading
Desc: Shows while game loads.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "Screen.h"
#include "BitmapText.h"
#include "Sprite.h"
class ScreenLoading : public Screen
{
public:
ScreenLoading();
virtual void DrawPrimitives();
protected:
BitmapText m_textMessage;
Sprite m_sprLoading;
};
+1 -1
View File
@@ -12,7 +12,7 @@
#include "ScreenManager.h" #include "ScreenManager.h"
#include "IniFile.h" #include "IniFile.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "RageLog.h" #include "RageLog.h"
+10 -12
View File
@@ -14,13 +14,14 @@
#include "ScreenMusicScroll.h" #include "ScreenMusicScroll.h"
#include "ScreenManager.h" #include "ScreenManager.h"
#include "PrefsManager.h" #include "PrefsManager.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "ScreenSelectMusic.h" #include "ScreenSelectMusic.h"
#include "ScreenTitleMenu.h" #include "ScreenTitleMenu.h"
#include "GameManager.h" #include "GameManager.h"
#include "RageLog.h" #include "RageLog.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "SongManager.h" #include "SongManager.h"
#include "GameState.h"
const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 1); const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 1);
@@ -60,8 +61,9 @@ const CString CREDIT_LINES[] =
"", "",
"PROGRAMMING:", "PROGRAMMING:",
"Chris Danford", "Chris Danford",
"Ben Nordstrom",
"Lord Frieza (Andrew Livy)", "Lord Frieza (Andrew Livy)",
"Dro Kulix",
"Ben Nordstrom",
"Parasyte (Chris Gomez)", "Parasyte (Chris Gomez)",
"angedelamort (Sauleil Lamarre)", "angedelamort (Sauleil Lamarre)",
"Edwin Evans", "Edwin Evans",
@@ -112,8 +114,7 @@ const CString CREDIT_LINES[] =
"", "",
"", "",
"", "",
"If your name is missing from this list,", "Please, join the StepMania team and help us out!"
" send me an e-mail!",
" -Chris" " -Chris"
}; };
const int NUM_CREDIT_LINES = sizeof(CREDIT_LINES) / sizeof(CString); const int NUM_CREDIT_LINES = sizeof(CREDIT_LINES) / sizeof(CString);
@@ -125,12 +126,9 @@ ScreenMusicScroll::ScreenMusicScroll()
int i; int i;
// BUGFIX by ANDY: Stage will now reset back to 0 when game ends.
PREFSMAN->m_iCurrentStageIndex = 0;
m_sprBackground.Load( THEME->GetPathTo(GRAPHIC_MUSIC_SCROLL_BACKGROUND) ); m_sprBackground.Load( THEME->GetPathTo(GRAPHIC_MUSIC_SCROLL_BACKGROUND) );
m_sprBackground.StretchTo( CRect(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); m_sprBackground.StretchTo( CRect(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) );
this->AddActor( &m_sprBackground ); this->AddSubActor( &m_sprBackground );
CArray<Song*, Song*> arraySongs; CArray<Song*, Song*> arraySongs;
@@ -153,7 +151,7 @@ ScreenMusicScroll::ScreenMusicScroll()
{ {
m_textLines[m_iNumLines].Load( THEME->GetPathTo(FONT_NORMAL) ); m_textLines[m_iNumLines].Load( THEME->GetPathTo(FONT_NORMAL) );
m_textLines[m_iNumLines].SetText( CREDIT_LINES[i] ); m_textLines[m_iNumLines].SetText( CREDIT_LINES[i] );
// this->AddActor( &m_textLines[m_iNumLines] ); // this->AddSubActor( &m_textLines[m_iNumLines] );
m_iNumLines++; m_iNumLines++;
} }
@@ -169,9 +167,9 @@ ScreenMusicScroll::ScreenMusicScroll()
this->SendScreenMessage( SM_StartFadingOut, 0.3f * i + 3.0f ); this->SendScreenMessage( SM_StartFadingOut, 0.3f * i + 3.0f );
this->AddActor( &m_Fade ); this->AddSubActor( &m_Fade );
if ( GAMEMAN->m_CurGame != GAME_EZ2 ) if ( GAMESTATE->GetCurGame() != GAME_EZ2 )
{ {
m_soundMusic.Load( THEME->GetPathTo(SOUND_MUSIC_SCROLL_MUSIC) ); m_soundMusic.Load( THEME->GetPathTo(SOUND_MUSIC_SCROLL_MUSIC) );
} }
@@ -181,7 +179,7 @@ ScreenMusicScroll::ScreenMusicScroll()
} }
m_Fade.OpenWipingRight(); m_Fade.OpenWipingRight();
if ( GAMEMAN->m_CurGame != GAME_EZ2 ) if ( GAMESTATE->GetCurGame() != GAME_EZ2 )
{ {
m_soundMusic.Play( true ); m_soundMusic.Play( true );
} }
+9 -9
View File
@@ -17,7 +17,7 @@
#include "ScreenManager.h" #include "ScreenManager.h"
#include "PrefsManager.h" #include "PrefsManager.h"
#include "ScreenGameplay.h" #include "ScreenGameplay.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "RageLog.h" #include "RageLog.h"
@@ -53,7 +53,7 @@ ScreenOptions::ScreenOptions( CString sBackgroundPath, CString sTopEdgePath )
ssprintf("%s %s to change line %s %s to select between options then press START", CString(char(3)), CString(char(4)), CString(char(1)), CString(char(2)) ), ssprintf("%s %s to change line %s %s to select between options then press START", CString(char(3)), CString(char(4)), CString(char(1)), CString(char(2)) ),
false, true, 40 false, true, 40
); );
this->AddActor( &m_Menu ); this->AddSubActor( &m_Menu );
m_Menu.TweenOnScreenFromBlack( SM_None ); m_Menu.TweenOnScreenFromBlack( SM_None );
// init row numbers and element colors // init row numbers and element colors
@@ -62,32 +62,32 @@ ScreenOptions::ScreenOptions( CString sBackgroundPath, CString sTopEdgePath )
m_iCurrentRow[p] = 0; m_iCurrentRow[p] = 0;
m_SelectionHighlight[p].SetDiffuseColor( PlayerToColor((PlayerNumber)p) ); m_SelectionHighlight[p].SetDiffuseColor( PlayerToColor((PlayerNumber)p) );
this->AddActor( &m_SelectionHighlight[p] ); this->AddSubActor( &m_SelectionHighlight[p] );
for( int l=0; l<MAX_OPTION_LINES; l++ ) for( int l=0; l<MAX_OPTION_LINES; l++ )
{ {
m_iSelectedOption[p][l] = 0; m_iSelectedOption[p][l] = 0;
m_OptionUnderline[p][l].SetDiffuseColor( PlayerToColor(p) ); m_OptionUnderline[p][l].SetDiffuseColor( PlayerToColor(p) );
this->AddActor( &m_OptionUnderline[p][l] ); this->AddSubActor( &m_OptionUnderline[p][l] );
} }
} }
// add sub actors // add sub actors
for( int i=0; i<MAX_OPTION_LINES; i++ ) // foreach line for( int i=0; i<MAX_OPTION_LINES; i++ ) // foreach line
{ {
this->AddActor( &m_textOptionLineTitles[i] ); this->AddSubActor( &m_textOptionLineTitles[i] );
for( int j=0; j<MAX_OPTIONS_PER_LINE; j++ ) for( int j=0; j<MAX_OPTIONS_PER_LINE; j++ )
{ {
m_textOptions[i][j].SetZ( -1 ); m_textOptions[i][j].SetZ( -1 );
this->AddActor( &m_textOptions[i][j] ); // this array has to be big enough to hold all of the options this->AddSubActor( &m_textOptions[i][j] ); // this array has to be big enough to hold all of the options
} }
} }
m_Wipe.OpenWipingRight(SM_None); m_Wipe.OpenWipingRight(SM_None);
this->AddActor( &m_Wipe ); this->AddSubActor( &m_Wipe );
} }
void ScreenOptions::Init( InputMode im, OptionLineData optionLineData[], int iNumOptionLines ) void ScreenOptions::Init( InputMode im, OptionLineData optionLineData[], int iNumOptionLines )
@@ -149,7 +149,7 @@ void ScreenOptions::InitOptionsText()
title.SetXY( LABELS_X, fY ); title.SetXY( LABELS_X, fY );
title.SetZoom( 0.7f ); title.SetZoom( 0.7f );
title.SetVertAlign( Actor::align_middle ); title.SetVertAlign( Actor::align_middle );
this->AddActor( &title ); this->AddSubActor( &title );
// init all text in this line and count the width of the line // init all text in this line and count the width of the line
float fX = 150; // indent 70 pixels float fX = 150; // indent 70 pixels
@@ -162,7 +162,7 @@ void ScreenOptions::InitOptionsText()
option.SetText( optline.szOptionsText[j] ); option.SetText( optline.szOptionsText[j] );
option.SetZoom( 0.65f ); option.SetZoom( 0.65f );
option.SetShadowLength( 2 ); option.SetShadowLength( 2 );
this->AddActor( &option ); this->AddSubActor( &option );
// set the XY position of each item in the line // set the XY position of each item in the line
float fItemWidth = option.GetWidestLineWidthInSourcePixels() * option.GetZoomX(); float fItemWidth = option.GetWidestLineWidthInSourcePixels() * option.GetZoomX();
+22 -17
View File
@@ -18,10 +18,11 @@
#include "ScreenGameplay.h" #include "ScreenGameplay.h"
#include "ScreenSongOptions.h" #include "ScreenSongOptions.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "ScreenSelectMusic.h" #include "ScreenSelectMusic.h"
#include "RageLog.h" #include "RageLog.h"
#include "GameManager.h" #include "GameManager.h"
#include "GameState.h"
enum { enum {
@@ -38,7 +39,7 @@ enum {
NUM_PLAYER_OPTIONS_LINES NUM_PLAYER_OPTIONS_LINES
}; };
OptionLineData g_PlayerOptionsLines[NUM_PLAYER_OPTIONS_LINES] = { OptionLineData g_PlayerOptionsLines[NUM_PLAYER_OPTIONS_LINES] = {
{ "Speed", 6, {"x1","x1.5","x2","x3","x5","x8"} }, { "Speed", 8, {"x0.5","x0.75","x1","x1.5","x2","x3","x5","x8"} },
{ "Effect", 6, {"OFF","BOOST","WAVE", "DRUNK", "DIZZY", "SPACE"} }, { "Effect", 6, {"OFF","BOOST","WAVE", "DRUNK", "DIZZY", "SPACE"} },
{ "Appear", 4, {"VISIBLE","HIDDEN","SUDDEN","STEALTH"} }, { "Appear", 4, {"VISIBLE","HIDDEN","SUDDEN","STEALTH"} },
{ "Turn", 5, {"OFF","MIRROR","LEFT","RIGHT","SHUFFLE"} }, { "Turn", 5, {"OFF","MIRROR","LEFT","RIGHT","SHUFFLE"} },
@@ -72,15 +73,17 @@ void ScreenPlayerOptions::ImportOptions()
{ {
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
PlayerOptions &po = PREFSMAN->m_PlayerOptions[p]; PlayerOptions &po = GAMESTATE->m_PlayerOptions[p];
if( po.m_fArrowScrollSpeed == 1.0f ) m_iSelectedOption[p][PO_SPEED] = 0; if( po.m_fArrowScrollSpeed == 0.5f ) m_iSelectedOption[p][PO_SPEED] = 0;
else if( po.m_fArrowScrollSpeed == 1.5f ) m_iSelectedOption[p][PO_SPEED] = 1; else if( po.m_fArrowScrollSpeed == 0.75f) m_iSelectedOption[p][PO_SPEED] = 1;
else if( po.m_fArrowScrollSpeed == 2.0f ) m_iSelectedOption[p][PO_SPEED] = 2; else if( po.m_fArrowScrollSpeed == 1.0f ) m_iSelectedOption[p][PO_SPEED] = 2;
else if( po.m_fArrowScrollSpeed == 3.0f ) m_iSelectedOption[p][PO_SPEED] = 3; else if( po.m_fArrowScrollSpeed == 1.5f ) m_iSelectedOption[p][PO_SPEED] = 3;
else if( po.m_fArrowScrollSpeed == 5.0f ) m_iSelectedOption[p][PO_SPEED] = 4; else if( po.m_fArrowScrollSpeed == 2.0f ) m_iSelectedOption[p][PO_SPEED] = 4;
else if( po.m_fArrowScrollSpeed == 8.0f ) m_iSelectedOption[p][PO_SPEED] = 5; else if( po.m_fArrowScrollSpeed == 3.0f ) m_iSelectedOption[p][PO_SPEED] = 5;
else m_iSelectedOption[p][PO_SPEED] = 0; else if( po.m_fArrowScrollSpeed == 5.0f ) m_iSelectedOption[p][PO_SPEED] = 6;
else if( po.m_fArrowScrollSpeed == 8.0f ) m_iSelectedOption[p][PO_SPEED] = 7;
else m_iSelectedOption[p][PO_SPEED] = 2;
m_iSelectedOption[p][PO_EFFECT] = po.m_EffectType; m_iSelectedOption[p][PO_EFFECT] = po.m_EffectType;
m_iSelectedOption[p][PO_APPEAR] = po.m_AppearanceType; m_iSelectedOption[p][PO_APPEAR] = po.m_AppearanceType;
@@ -98,16 +101,18 @@ void ScreenPlayerOptions::ExportOptions()
{ {
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
PlayerOptions &po = PREFSMAN->m_PlayerOptions[p]; PlayerOptions &po = GAMESTATE->m_PlayerOptions[p];
switch( m_iSelectedOption[p][PO_SPEED] ) switch( m_iSelectedOption[p][PO_SPEED] )
{ {
case 0: po.m_fArrowScrollSpeed = 1.0f; break; case 0: po.m_fArrowScrollSpeed = 0.5f; break;
case 1: po.m_fArrowScrollSpeed = 1.5f; break; case 1: po.m_fArrowScrollSpeed = 0.75f; break;
case 2: po.m_fArrowScrollSpeed = 2.0f; break; case 2: po.m_fArrowScrollSpeed = 1.0f; break;
case 3: po.m_fArrowScrollSpeed = 3.0f; break; case 3: po.m_fArrowScrollSpeed = 1.5f; break;
case 4: po.m_fArrowScrollSpeed = 5.0f; break; case 4: po.m_fArrowScrollSpeed = 2.0f; break;
case 5: po.m_fArrowScrollSpeed = 8.0f; break; case 5: po.m_fArrowScrollSpeed = 3.0f; break;
case 6: po.m_fArrowScrollSpeed = 5.0f; break;
case 7: po.m_fArrowScrollSpeed = 8.0f; break;
} }
+6 -6
View File
@@ -16,7 +16,7 @@
#include "RageMusic.h" #include "RageMusic.h"
#include "ScreenTitleMenu.h" #include "ScreenTitleMenu.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
ScreenPrompt::ScreenPrompt( CString sText, PromptType pt, bool* pbAnswer ) ScreenPrompt::ScreenPrompt( CString sText, PromptType pt, bool* pbAnswer )
{ {
@@ -37,7 +37,7 @@ ScreenPrompt::ScreenPrompt( CString sText, PromptType pt, bool* pbAnswer )
m_Fade.SetOpened(); m_Fade.SetOpened();
m_Fade.CloseWipingRight(); m_Fade.CloseWipingRight();
m_Fade.SetZ(-2); m_Fade.SetZ(-2);
this->AddActor( &m_Fade ); this->AddSubActor( &m_Fade );
CStringArray arrayTextLines; CStringArray arrayTextLines;
split( sText, "\n", arrayTextLines ); split( sText, "\n", arrayTextLines );
@@ -47,7 +47,7 @@ ScreenPrompt::ScreenPrompt( CString sText, PromptType pt, bool* pbAnswer )
m_textQuestion[i].SetText( arrayTextLines[i] ); m_textQuestion[i].SetText( arrayTextLines[i] );
m_textQuestion[i].SetXY( CENTER_X, CENTER_Y-50 + i*27 - arrayTextLines.GetSize()*27/2 ); m_textQuestion[i].SetXY( CENTER_X, CENTER_Y-50 + i*27 - arrayTextLines.GetSize()*27/2 );
m_textQuestion[i].SetZ(-2); m_textQuestion[i].SetZ(-2);
this->AddActor( &m_textQuestion[i] ); this->AddSubActor( &m_textQuestion[i] );
} }
m_rectAnswerBox.SetDiffuseColor( D3DXCOLOR(0.5f,0.5f,1.0f,0.7f) ); m_rectAnswerBox.SetDiffuseColor( D3DXCOLOR(0.5f,0.5f,1.0f,0.7f) );
@@ -55,7 +55,7 @@ ScreenPrompt::ScreenPrompt( CString sText, PromptType pt, bool* pbAnswer )
m_rectAnswerBox.SetZoomX( m_textAnswer[*m_pbAnswer].GetWidestLineWidthInSourcePixels()+10.0f ); m_rectAnswerBox.SetZoomX( m_textAnswer[*m_pbAnswer].GetWidestLineWidthInSourcePixels()+10.0f );
m_rectAnswerBox.SetZoomY( 30 ); m_rectAnswerBox.SetZoomY( 30 );
m_rectAnswerBox.SetZ(-2); m_rectAnswerBox.SetZ(-2);
this->AddActor( &m_rectAnswerBox ); this->AddSubActor( &m_rectAnswerBox );
m_textAnswer[0].Load( THEME->GetPathTo(FONT_HEADER1) ); m_textAnswer[0].Load( THEME->GetPathTo(FONT_HEADER1) );
m_textAnswer[1].Load( THEME->GetPathTo(FONT_HEADER1) ); m_textAnswer[1].Load( THEME->GetPathTo(FONT_HEADER1) );
@@ -63,8 +63,8 @@ ScreenPrompt::ScreenPrompt( CString sText, PromptType pt, bool* pbAnswer )
m_textAnswer[1].SetY( CENTER_Y+120 ); m_textAnswer[1].SetY( CENTER_Y+120 );
m_textAnswer[0].SetZ(-2); m_textAnswer[0].SetZ(-2);
m_textAnswer[1].SetZ(-2); m_textAnswer[1].SetZ(-2);
this->AddActor( &m_textAnswer[0] ); this->AddSubActor( &m_textAnswer[0] );
this->AddActor( &m_textAnswer[1] ); this->AddSubActor( &m_textAnswer[1] );
+19 -5
View File
@@ -16,21 +16,34 @@
#include "ScreenTitleMenu.h" #include "ScreenTitleMenu.h"
#include "ScreenSelectMusic.h" #include "ScreenSelectMusic.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ThemeManager.h" #include "PrefsManager.h"
#include "Quad.h" #include "Quad.h"
ScreenSandbox::ScreenSandbox() ScreenSandbox::ScreenSandbox()
{ {
m_text.Load( THEME->GetPathTo(FONT_NORMAL) ); // m_text.Load( THEME->GetPathTo(FONT_NORMAL) );
m_text.SetXY( CENTER_X, CENTER_Y ); m_text.SetXY( CENTER_X, CENTER_Y );
this->AddActor( &m_text ); CStringArray as;
as.Add( "Testing... Attention please." );
m_text.SetTips( as );
m_text.SetXY( CENTER_X, CENTER_Y );
this->AddSubActor( &m_text );
m_Menu.Load(
THEME->GetPathTo(GRAPHIC_SELECT_STYLE_BACKGROUND),
THEME->GetPathTo(GRAPHIC_SELECT_STYLE_TOP_EDGE),
ssprintf("Use %c %c to select, then press START", char(1), char(2) ),
false, true, 40
);
this->AddSubActor( &m_Menu );
m_Menu.TweenOnScreenFromBlack( SM_None );
m_sound.Load( THEME->GetPathTo(SOUND_MENU_MUSIC) ); m_sound.Load( THEME->GetPathTo(SOUND_MENU_MUSIC) );
m_sound.SetPositionSeconds( -10 ); m_sound.SetPositionSeconds( -10 );
m_sound.Play(); m_sound.Play();
//this->AddActor( &m_spr ); //this->AddSubActor( &m_spr );
} }
@@ -38,12 +51,13 @@ void ScreenSandbox::Update( float fDeltaTime )
{ {
Screen::Update( fDeltaTime ); Screen::Update( fDeltaTime );
m_sound.Update( fDeltaTime ); m_sound.Update( fDeltaTime );
m_text.SetText( ssprintf("%f", m_sound.GetPositionSeconds()) );
} }
void ScreenSandbox::DrawPrimitives() void ScreenSandbox::DrawPrimitives()
{ {
m_Menu.DrawBottomLayer();
Screen::DrawPrimitives(); Screen::DrawPrimitives();
m_Menu.DrawTopLayer();
} }
void ScreenSandbox::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) void ScreenSandbox::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )

Some files were not shown because too many files have changed in this diff Show More