re-wrote score/statistics tracking
This commit is contained in:
@@ -73,9 +73,7 @@ CString AnnouncerManager::GetAnnouncerDirFromName( CString sAnnouncerName )
|
||||
|
||||
void AnnouncerManager::SwitchAnnouncer( CString sNewAnnouncerName )
|
||||
{
|
||||
if( sNewAnnouncerName == "" )
|
||||
m_sCurAnnouncerName = "";
|
||||
else if( !DoesAnnouncerExist(sNewAnnouncerName) )
|
||||
if( !DoesAnnouncerExist(sNewAnnouncerName) )
|
||||
m_sCurAnnouncerName = "";
|
||||
else
|
||||
m_sCurAnnouncerName = sNewAnnouncerName;
|
||||
@@ -138,6 +136,7 @@ CString AnnouncerManager::GetPathTo( AnnouncerElement ae, CString sAnnouncerName
|
||||
case ANNOUNCER_SELECT_DIFFICULTY_COMMENT_HARD: sAssetDir = "select difficulty comment hard"; break;
|
||||
case ANNOUNCER_SELECT_DIFFICULTY_COMMENT_MEDIUM:sAssetDir = "select difficulty comment medium"; break;
|
||||
case ANNOUNCER_SELECT_DIFFICULTY_COMMENT_ONI: sAssetDir = "select difficulty comment oni"; break;
|
||||
case ANNOUNCER_SELECT_DIFFICULTY_COMMENT_ENDLESS:sAssetDir = "select difficulty comment endless"; break;
|
||||
case ANNOUNCER_SELECT_DIFFICULTY_CHALLENGE: sAssetDir = "select difficulty challenge"; break;
|
||||
case ANNOUNCER_SELECT_DIFFICULTY_INTRO: sAssetDir = "select difficulty intro"; break;
|
||||
case ANNOUNCER_SELECT_GROUP_COMMENT_ALL_MUSIC: sAssetDir = "select group comment all music"; break;
|
||||
@@ -161,7 +160,8 @@ CString AnnouncerManager::GetPathTo( AnnouncerElement ae, CString sAnnouncerName
|
||||
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_STAGE_ONI: sAssetDir = "stage oni"; break;
|
||||
case ANNOUNCER_STAGE_ENDLESS: sAssetDir = "stage endless"; break;
|
||||
case ANNOUNCER_TITLE_MENU_ATTRACT: sAssetDir = "title menu attract"; break;
|
||||
case ANNOUNCER_TITLE_MENU_GAME_NAME: sAssetDir = "title menu game name"; break;
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@ enum AnnouncerElement {
|
||||
ANNOUNCER_SELECT_DIFFICULTY_COMMENT_HARD,
|
||||
ANNOUNCER_SELECT_DIFFICULTY_COMMENT_MEDIUM,
|
||||
ANNOUNCER_SELECT_DIFFICULTY_COMMENT_ONI,
|
||||
ANNOUNCER_SELECT_DIFFICULTY_COMMENT_ENDLESS,
|
||||
ANNOUNCER_SELECT_DIFFICULTY_CHALLENGE,
|
||||
ANNOUNCER_SELECT_DIFFICULTY_INTRO,
|
||||
ANNOUNCER_SELECT_GROUP_COMMENT_ALL_MUSIC,
|
||||
@@ -81,7 +82,8 @@ enum AnnouncerElement {
|
||||
ANNOUNCER_STAGE_FINAL,
|
||||
ANNOUNCER_STAGE_EXTRA,
|
||||
ANNOUNCER_STAGE_ANOTHER_EXTRA,
|
||||
ANNOUNCER_STAGE_CHALLENGE,
|
||||
ANNOUNCER_STAGE_ONI,
|
||||
ANNOUNCER_STAGE_ENDLESS,
|
||||
ANNOUNCER_TITLE_MENU_ATTRACT,
|
||||
ANNOUNCER_TITLE_MENU_GAME_NAME,
|
||||
|
||||
|
||||
@@ -19,11 +19,12 @@
|
||||
#include "RageTimer.h"
|
||||
|
||||
|
||||
float ArrowGetYOffset( const PlayerOptions& po, float fStepIndex, float fSongBeat )
|
||||
float ArrowGetYOffset( const PlayerNumber pn, float fStepIndex )
|
||||
{
|
||||
float fSongBeat = GAMESTATE->m_fSongBeat;
|
||||
float fBeatsUntilStep = NoteRowToBeat( fStepIndex ) - fSongBeat;
|
||||
float fYOffset = fBeatsUntilStep * ARROW_GAP;
|
||||
switch( po.m_EffectType )
|
||||
switch( GAMESTATE->m_PlayerOptions[pn].m_EffectType )
|
||||
{
|
||||
case PlayerOptions::EFFECT_BOOST:
|
||||
fYOffset *= 1.4f / ((fYOffset+SCREEN_HEIGHT/1.6f)/SCREEN_HEIGHT);
|
||||
@@ -35,8 +36,9 @@ float ArrowGetYOffset( const PlayerOptions& po, float fStepIndex, float fSongBea
|
||||
return fYOffset;
|
||||
}
|
||||
|
||||
float ArrowGetXPos( const PlayerOptions& po, int iColNum, float fYOffset, float fSongBeat )
|
||||
float ArrowGetXPos( const PlayerNumber pn, int iColNum, float fYOffset )
|
||||
{
|
||||
float fSongBeat = GAMESTATE->m_fSongBeat;
|
||||
float fPixelOffsetFromCenter = GAMESTATE->GetCurrentStyleDef()->m_ColumnInfo[PLAYER_1][iColNum].fXOffset;
|
||||
|
||||
// BUG OR FEATURE??? THIS IS WHERE THE REAL COLUMN PLACEMENT HAPPENS!!!
|
||||
@@ -68,7 +70,7 @@ float ArrowGetXPos( const PlayerOptions& po, int iColNum, float fYOffset, float
|
||||
}
|
||||
*/
|
||||
|
||||
switch( po.m_EffectType )
|
||||
switch( GAMESTATE->m_PlayerOptions[pn].m_EffectType )
|
||||
{
|
||||
case PlayerOptions::EFFECT_DRUNK:
|
||||
fPixelOffsetFromCenter += cosf( TIMER->GetTimeSinceStart()/4 + iColNum*0.4f + fYOffset/SCREEN_HEIGHT*4) * ARROW_SIZE/3;
|
||||
@@ -77,11 +79,11 @@ float ArrowGetXPos( const PlayerOptions& po, int iColNum, float fYOffset, float
|
||||
return fPixelOffsetFromCenter;
|
||||
}
|
||||
|
||||
float ArrowGetRotation( const PlayerOptions& po, int iColNum, float fYOffset )
|
||||
float ArrowGetRotation( const PlayerNumber pn, int iColNum, float fYOffset )
|
||||
{
|
||||
float fRotation = 0; //StyleDef.m_ColumnToRotation[iColNum];
|
||||
|
||||
switch( po.m_EffectType )
|
||||
switch( GAMESTATE->m_PlayerOptions[pn].m_EffectType )
|
||||
{
|
||||
case PlayerOptions::EFFECT_DIZZY:
|
||||
fRotation += fYOffset/SCREEN_HEIGHT*6;
|
||||
@@ -91,12 +93,12 @@ float ArrowGetRotation( const PlayerOptions& po, int iColNum, float fYOffset )
|
||||
return fRotation;
|
||||
}
|
||||
|
||||
float ArrowGetYPos( const PlayerOptions& po, float fYOffset )
|
||||
float ArrowGetYPos( const PlayerNumber pn, float fYOffset )
|
||||
{
|
||||
return fYOffset * po.m_fArrowScrollSpeed * (po.m_bReverseScroll ? -1 : 1 );
|
||||
return fYOffset * GAMESTATE->m_PlayerOptions[pn].m_fArrowScrollSpeed * (GAMESTATE->m_PlayerOptions[pn].m_bReverseScroll ? -1 : 1 );
|
||||
}
|
||||
|
||||
float ArrowGetAlpha( const PlayerOptions& po, float fYPos )
|
||||
float ArrowGetAlpha( const PlayerNumber pn, float fYPos )
|
||||
{
|
||||
float fAlpha;
|
||||
static float blinktimer=0;
|
||||
@@ -104,7 +106,7 @@ float ArrowGetAlpha( const PlayerOptions& po, float fYPos )
|
||||
blinktimer = TIMER->GetTimeSinceStart();
|
||||
|
||||
static int blinkstate=2;
|
||||
switch( po.m_AppearanceType )
|
||||
switch( GAMESTATE->m_PlayerOptions[pn].m_AppearanceType )
|
||||
{
|
||||
case PlayerOptions::APPEARANCE_VISIBLE:
|
||||
fAlpha = 1;
|
||||
|
||||
@@ -87,8 +87,11 @@ void Course::LoadFromCRSFile( CString sPath, CArray<Song*,Song*> &apSongs )
|
||||
}
|
||||
|
||||
|
||||
void Course::CreateFromGroupAndDifficultyClass( CString sGroupName, DifficultyClass dc, CArray<Song*,Song*> &apSongsInGroup )
|
||||
void Course::CreateEndlessCourseFromGroupAndDifficultyClass( CString sGroupName, DifficultyClass dc, CArray<Song*,Song*> &apSongsInGroup )
|
||||
{
|
||||
m_bRepeat = true;
|
||||
m_bRandomize = true;
|
||||
m_iLives = -1;
|
||||
CString sShortGroupName = SONGMAN->ShortenGroupName( sGroupName );
|
||||
|
||||
m_sName = sShortGroupName + " ";
|
||||
|
||||
@@ -26,6 +26,7 @@ public:
|
||||
{
|
||||
m_iStages = 0;
|
||||
m_bRepeat = false;
|
||||
m_bRandomize = false;
|
||||
m_iLives = 4;
|
||||
for( int i=0; i<MAX_COURSE_STAGES; i++ )
|
||||
m_apSongs[i] = NULL;
|
||||
@@ -39,6 +40,7 @@ public:
|
||||
CString m_asDescriptions[MAX_COURSE_STAGES];
|
||||
Notes* GetNotesForStage( int iStage );
|
||||
bool m_bRepeat; // repeat after last song?
|
||||
bool m_bRandomize; // play the songs in a random order
|
||||
int m_iLives; // -1 means use bar life meter
|
||||
CString m_sModifiers; // contains player options and song options
|
||||
|
||||
@@ -46,7 +48,7 @@ public:
|
||||
void GetSongOptions( SongOptions* pSO_out);
|
||||
|
||||
void LoadFromCRSFile( CString sPath, CArray<Song*,Song*> &apSongs );
|
||||
void CreateFromGroupAndDifficultyClass( CString sGroupName, DifficultyClass dc, CArray<Song*,Song*> &apSongsInGroup );
|
||||
void CreateEndlessCourseFromGroupAndDifficultyClass( CString sGroupName, DifficultyClass dc, CArray<Song*,Song*> &apSongsInGroup );
|
||||
|
||||
void AddStage( Song* pSong, CString sDescription )
|
||||
{
|
||||
|
||||
@@ -109,8 +109,8 @@ void CourseContentsFrame::SetFromCourse( Course* pCourse )
|
||||
printf( "Adding song '%s'\n", pSong->m_sMainTitle );
|
||||
m_CourseContentDisplays[m_iNumContents].Load( m_iNumContents+1, pSong, pNotes );
|
||||
m_CourseContentDisplays[m_iNumContents].SetXY( 0, -((MAX_VISIBLE_CONTENTS-1)/2) * CONTENTS_BAR_HEIGHT );
|
||||
m_CourseContentDisplays[m_iNumContents].BeginTweening( i*0.1f );
|
||||
m_CourseContentDisplays[m_iNumContents].SetTweenY( (-(MAX_VISIBLE_CONTENTS-1)/2 + i) * CONTENTS_BAR_HEIGHT );
|
||||
m_CourseContentDisplays[m_iNumContents].BeginTweening( m_iNumContents*0.1f );
|
||||
m_CourseContentDisplays[m_iNumContents].SetTweenY( (-(MAX_VISIBLE_CONTENTS-1)/2 + m_iNumContents) * CONTENTS_BAR_HEIGHT );
|
||||
|
||||
m_iNumContents ++;
|
||||
}
|
||||
@@ -162,9 +162,7 @@ void CourseContentsFrame::DrawPrimitives()
|
||||
if( m_fTimeUntilScroll <= 0 )
|
||||
m_CourseContentDisplays[iItemToDraw].SetY( fY );
|
||||
m_CourseContentDisplays[iItemToDraw].Draw();
|
||||
iItemToDraw++;
|
||||
if( iItemToDraw >= m_iNumContents )
|
||||
iItemToDraw -= m_iNumContents;
|
||||
iItemToDraw = (iItemToDraw+1) % m_iNumContents;
|
||||
fY += CONTENTS_BAR_HEIGHT;
|
||||
}
|
||||
|
||||
|
||||
+173
-18
@@ -15,6 +15,7 @@
|
||||
#include "GameManager.h"
|
||||
#include "PrefsManager.h"
|
||||
#include "InputMapper.h"
|
||||
#include "Song.h"
|
||||
|
||||
|
||||
GameState* GAMESTATE = NULL; // global and accessable from anywhere in our program
|
||||
@@ -22,6 +23,7 @@ GameState* GAMESTATE = NULL; // global and accessable from anywhere in our progr
|
||||
|
||||
GameState::GameState()
|
||||
{
|
||||
m_CurGame = GAME_DANCE;
|
||||
m_sLoadingMessage = "Initializing hardware...";
|
||||
m_CurGame = GAME_DANCE;
|
||||
Reset();
|
||||
@@ -35,29 +37,136 @@ void GameState::Reset()
|
||||
{
|
||||
int p;
|
||||
|
||||
m_CurStyle = STYLE_NONE;
|
||||
m_MasterPlayerNumber = PLAYER_INVALID;
|
||||
m_sPreferredGroup = "";
|
||||
for( p=0; p<NUM_PLAYERS; p++ )
|
||||
m_PreferredDifficultyClass[p] = CLASS_INVALID;
|
||||
m_SongSortOrder = SORT_GROUP;
|
||||
m_PlayMode = PLAY_MODE_INVALID;
|
||||
m_bEditing = false;
|
||||
m_iCurrentStageIndex = 0;
|
||||
|
||||
|
||||
m_pCurSong = NULL;
|
||||
for( p=0; p<NUM_PLAYERS; p++ )
|
||||
m_pCurNotes[p] = NULL;
|
||||
m_pCurCourse = NULL;
|
||||
m_sPreferredGroup = "";
|
||||
|
||||
m_aGameplayStatistics.RemoveAll();
|
||||
|
||||
// We can simply reset it cause it would override the selection the user just did
|
||||
// Moved to the constructor for now
|
||||
//m_CurGame = GAME_DANCE;
|
||||
m_fMusicSeconds = 0;
|
||||
m_fSongBeat = 0;
|
||||
m_fCurBPS = 0;
|
||||
m_bFreeze = 0;
|
||||
|
||||
|
||||
m_CurStyle = STYLE_NONE;
|
||||
m_MasterPlayerNumber = PLAYER_INVALID;
|
||||
m_apSongsPlayed.RemoveAll();
|
||||
|
||||
for( p=0; p<NUM_PLAYERS; p++ )
|
||||
{
|
||||
m_fSecondsBeforeFail[p] = -1;
|
||||
m_iStagesIntoCourse[p] = 0;
|
||||
}
|
||||
m_bUsedAutoPlayer = false;
|
||||
|
||||
|
||||
for( p=0; p<NUM_PLAYERS; p++ )
|
||||
m_PreferredDifficultyClass[p] = CLASS_EASY;
|
||||
m_SongSortOrder = SORT_GROUP;
|
||||
m_PlayMode = PLAY_MODE_INVALID;
|
||||
m_iCurrentStageIndex = 0;
|
||||
{
|
||||
int s;
|
||||
|
||||
m_iPossibleDancePoints[p] = 0;
|
||||
m_iActualDancePoints[p] = 0;
|
||||
for( s=0; s<NUM_TAP_NOTE_SCORES; s++ )
|
||||
m_TapNoteScores[p][s] = 0;
|
||||
for( s=0; s<NUM_HOLD_NOTE_SCORES; s++ )
|
||||
m_HoldNoteScores[p][s] = 0;
|
||||
m_iMaxCombo[p] = 0;
|
||||
m_fScore[p] = 0;
|
||||
for( int r=0; r<NUM_RADAR_VALUES; r++ )
|
||||
{
|
||||
m_fRadarPossible[p][r] = 0;
|
||||
m_fRadarActual[p][r] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for( p=0; p<NUM_PLAYERS; p++ )
|
||||
{
|
||||
int s;
|
||||
|
||||
m_iAccumPossibleDancePoints[p] = 0;
|
||||
m_iAccumActualDancePoints[p] = 0;
|
||||
for( s=0; s<NUM_TAP_NOTE_SCORES; s++ )
|
||||
m_AccumTapNoteScores[p][s] = 0;
|
||||
for( s=0; s<NUM_HOLD_NOTE_SCORES; s++ )
|
||||
m_AccumHoldNoteScores[p][s] = 0;
|
||||
m_iAccumMaxCombo[p] = 0;
|
||||
m_fAccumScore[p] = 0;
|
||||
for( int r=0; r<NUM_RADAR_VALUES; r++ )
|
||||
{
|
||||
m_fAccumRadarPossible[p][r] = 0;
|
||||
m_fAccumRadarActual[p][r] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for( p=0; p<NUM_PLAYERS; p++ )
|
||||
m_PlayerOptions[p] = PlayerOptions();
|
||||
m_SongOptions = SongOptions();
|
||||
}
|
||||
|
||||
void GameState::ResetMusicStatistics()
|
||||
{
|
||||
m_fMusicSeconds = 0;
|
||||
m_fSongBeat = 0;
|
||||
m_fCurBPS = 10;
|
||||
m_bFreeze = false;
|
||||
}
|
||||
|
||||
void GameState::AccumulateStageStatistics()
|
||||
{
|
||||
for( int p=0; p<NUM_PLAYERS; p++ )
|
||||
{
|
||||
int s;
|
||||
|
||||
m_iAccumPossibleDancePoints[p] += m_iPossibleDancePoints[p];
|
||||
m_iAccumActualDancePoints[p] += m_iActualDancePoints[p];
|
||||
for( s=0; s<NUM_TAP_NOTE_SCORES; s++ )
|
||||
m_AccumTapNoteScores[p][s] += m_TapNoteScores[p][s];
|
||||
for( s=0; s<NUM_HOLD_NOTE_SCORES; s++ )
|
||||
m_AccumHoldNoteScores[p][s] += m_HoldNoteScores[p][s];
|
||||
m_iAccumMaxCombo[p] += m_iMaxCombo[p];
|
||||
m_fAccumScore[p] += m_fScore[p];
|
||||
for( int r=0; r<NUM_RADAR_VALUES; r++ )
|
||||
{
|
||||
m_fAccumRadarPossible[p][r] = m_fRadarPossible[p][r];
|
||||
m_fAccumRadarActual[p][r] = m_fRadarActual[p][r];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GameState::ResetStageStatistics()
|
||||
{
|
||||
for( int p=0; p<NUM_PLAYERS; p++ )
|
||||
{
|
||||
int s;
|
||||
|
||||
m_iPossibleDancePoints[p] = 0;
|
||||
m_iActualDancePoints[p] = 0;
|
||||
for( s=0; s<NUM_TAP_NOTE_SCORES; s++ )
|
||||
m_TapNoteScores[p][s] = 0;
|
||||
for( s=0; s<NUM_HOLD_NOTE_SCORES; s++ )
|
||||
m_HoldNoteScores[p][s] = 0;
|
||||
m_iMaxCombo[p] = 0;
|
||||
m_fScore[p] = 0;
|
||||
for( int r=0; r<NUM_RADAR_VALUES; r++ )
|
||||
{
|
||||
m_fRadarPossible[p][r] = 0;
|
||||
m_fRadarActual[p][r] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int GameState::GetStageIndex()
|
||||
{
|
||||
return m_iCurrentStageIndex;
|
||||
@@ -86,6 +195,29 @@ bool GameState::IsExtraStage2()
|
||||
|
||||
CString GameState::GetStageText()
|
||||
{
|
||||
switch( m_PlayMode )
|
||||
{
|
||||
case PLAY_MODE_ONI:
|
||||
case PLAY_MODE_ENDLESS:
|
||||
{
|
||||
CString sText;
|
||||
for( int p=0; p<NUM_PLAYERS; p++ )
|
||||
{
|
||||
if( this->IsPlayerEnabled(p) )
|
||||
sText += ssprintf("%d ", m_iStagesIntoCourse[p]);
|
||||
else
|
||||
sText += "a ";
|
||||
}
|
||||
sText.TrimRight();
|
||||
sText.Replace('a',' ');
|
||||
return sText;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
; // fall through
|
||||
}
|
||||
|
||||
|
||||
if( IsFinalStage() )
|
||||
return "Final";
|
||||
else if( IsExtraStage() )
|
||||
@@ -125,12 +257,6 @@ D3DXCOLOR GameState::GetStageColor()
|
||||
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 );
|
||||
@@ -148,4 +274,33 @@ bool GameState::IsPlayerEnabled( PlayerNumber pn )
|
||||
|
||||
return ( pn == m_MasterPlayerNumber ) ||
|
||||
( GetCurrentStyleDef()->m_StyleType == StyleDef::TWO_PLAYERS_USE_TWO_SIDES );
|
||||
};
|
||||
}
|
||||
|
||||
float GameState::GetElapsedSeconds()
|
||||
{
|
||||
switch( m_PlayMode )
|
||||
{
|
||||
case PLAY_MODE_ARCADE:
|
||||
return max( 0, m_fMusicSeconds );
|
||||
case PLAY_MODE_ONI:
|
||||
case PLAY_MODE_ENDLESS:
|
||||
{
|
||||
float fSecondsTotal = 0;
|
||||
for( int i=0; i<m_apSongsPlayed.GetSize(); i++ )
|
||||
fSecondsTotal += m_apSongsPlayed[i]->m_fMusicLengthSeconds;
|
||||
fSecondsTotal += max( 0, m_fMusicSeconds );
|
||||
return fSecondsTotal;
|
||||
}
|
||||
default:
|
||||
ASSERT(0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
float GameState::GetPlayerSurviveTime( PlayerNumber p )
|
||||
{
|
||||
if( m_fSecondsBeforeFail[p] != -1 )
|
||||
return m_fSecondsBeforeFail[p];
|
||||
else
|
||||
return GetElapsedSeconds();
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ public:
|
||||
// Statistics for: Arcade: for the current stage. Oni/Endless: for current course
|
||||
//
|
||||
int m_iPossibleDancePoints[NUM_PLAYERS];
|
||||
int m_iActualDancePoints[NUM_PLAYERS]; // In Endless, possible dance points is -1.
|
||||
int m_iActualDancePoints[NUM_PLAYERS];
|
||||
int m_TapNoteScores[NUM_PLAYERS][NUM_TAP_NOTE_SCORES];
|
||||
int m_HoldNoteScores[NUM_PLAYERS][NUM_HOLD_NOTE_SCORES];
|
||||
int m_iMaxCombo[NUM_PLAYERS];
|
||||
@@ -106,7 +106,7 @@ public:
|
||||
// Only used in final evaluation screen in play mode Arcade.
|
||||
// Before being displayed, these values should be normalized by dividing by number of stages
|
||||
int m_iAccumPossibleDancePoints[NUM_PLAYERS];
|
||||
int m_iAccumActualDancePoints[NUM_PLAYERS]; // In Endless, possible dance points is -1.
|
||||
int m_iAccumActualDancePoints[NUM_PLAYERS];
|
||||
int m_AccumTapNoteScores[NUM_PLAYERS][NUM_TAP_NOTE_SCORES];
|
||||
int m_AccumHoldNoteScores[NUM_PLAYERS][NUM_HOLD_NOTE_SCORES];
|
||||
int m_iAccumMaxCombo[NUM_PLAYERS];
|
||||
|
||||
@@ -28,9 +28,11 @@ void GrayArrow::Update( float fDeltaTime )
|
||||
{
|
||||
Sprite::Update( fDeltaTime );
|
||||
|
||||
int iNewState = (int)( fmod(GAMESTATE->m_fSongBeat,1) * Sprite::GetNumStates() );
|
||||
if( iNewState < 0 )
|
||||
iNewState += Sprite::GetNumStates();
|
||||
float fPercentIntoBeat = fmodf(GAMESTATE->m_fSongBeat,1);
|
||||
if( fPercentIntoBeat < 0 )
|
||||
fPercentIntoBeat += 1;
|
||||
int iNewState = fPercentIntoBeat<0.25f ? 0 : 1;
|
||||
CLAMP( iNewState, 0, Sprite::GetNumStates() );
|
||||
SetState( iNewState );
|
||||
}
|
||||
|
||||
|
||||
@@ -30,14 +30,19 @@ const float FAIL_THRESHOLD = 0;
|
||||
|
||||
LifeMeterBar::LifeMeterBar()
|
||||
{
|
||||
m_fLifePercentage = 0.5f;
|
||||
switch( GAMESTATE->m_SongOptions.m_DrainType )
|
||||
{
|
||||
case SongOptions::DRAIN_NORMAL: m_fLifePercentage = 0.5f; break;
|
||||
case SongOptions::DRAIN_NO_RECOVER: m_fLifePercentage = 1.0f; break;
|
||||
case SongOptions::DRAIN_SUDDEN_DEATH: m_fLifePercentage = 1.0f; break;
|
||||
default: ASSERT(0);
|
||||
}
|
||||
|
||||
m_fTrailingLifePercentage = 0;
|
||||
m_fLifeVelocity = 0;
|
||||
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 );
|
||||
@@ -95,8 +100,17 @@ void LifeMeterBar::ChangeLife( TapNoteScore score )
|
||||
}
|
||||
break;
|
||||
case SongOptions::DRAIN_SUDDEN_DEATH:
|
||||
fDeltaLife = -1;
|
||||
switch( score )
|
||||
{
|
||||
case TNS_PERFECT: fDeltaLife = +0; break;
|
||||
case TNS_GREAT: fDeltaLife = +0; break;
|
||||
case TNS_GOOD: fDeltaLife = -1; break;
|
||||
case TNS_BOO: fDeltaLife = -1; break;
|
||||
case TNS_MISS: fDeltaLife = -1; break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -125,8 +125,6 @@ void LifeMeterBattery::OnDancePointsChange()
|
||||
CString sNumToDisplay = ssprintf("%03.1f", fNumToDisplay);
|
||||
if( sNumToDisplay.GetLength() == 3 )
|
||||
sNumToDisplay = "0" + sNumToDisplay;
|
||||
if( iPossibleDancePoints == -1 )
|
||||
sNumToDisplay = "??.?";
|
||||
m_textPercent.SetText( sNumToDisplay );
|
||||
}
|
||||
|
||||
|
||||
@@ -520,8 +520,8 @@ void MusicWheel::BuildWheelItemDatas( CArray<WheelItemData, WheelItemData&> &arr
|
||||
case PLAY_MODE_ONI:
|
||||
{
|
||||
CArray<Course*,Course*> apCourses;
|
||||
for( int i=0; i<SONGMAN->m_aCourses.GetSize(); i++ )
|
||||
apCourses.Add( &SONGMAN->m_aCourses[i] );
|
||||
for( int i=0; i<SONGMAN->m_aOniCourses.GetSize(); i++ )
|
||||
apCourses.Add( &SONGMAN->m_aOniCourses[i] );
|
||||
|
||||
SortCoursePointerArrayByDifficulty( apCourses );
|
||||
|
||||
@@ -532,6 +532,19 @@ void MusicWheel::BuildWheelItemDatas( CArray<WheelItemData, WheelItemData&> &arr
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PLAY_MODE_ENDLESS:
|
||||
{
|
||||
CArray<Course*,Course*> apCourses;
|
||||
for( int i=0; i<SONGMAN->m_aEndlessCourses.GetSize(); i++ )
|
||||
apCourses.Add( &SONGMAN->m_aEndlessCourses[i] );
|
||||
|
||||
for( int c=0; c<apCourses.GetSize(); c++ ) // foreach course
|
||||
{
|
||||
Course* pCourse = apCourses[c];
|
||||
arrayWheelItemDatas.Add( WheelItemData(TYPE_COURSE, NULL, "", pCourse, pCourse->GetColor()) );
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ASSERT(0); // invalid PlayMode
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ RageTexture* RageTextureManager::LoadTexture( CString sTexturePath, bool bForceR
|
||||
m_mapPathToTexture.SetAt( sTexturePath, pTexture );
|
||||
}
|
||||
|
||||
LOG->WriteLine( "Display: %u MB video memory left", DISPLAY->GetDevice()->GetAvailableTextureMem() );
|
||||
LOG->WriteLine( "Display: %u KB video memory left", DISPLAY->GetDevice()->GetAvailableTextureMem() );
|
||||
|
||||
return pTexture;
|
||||
}
|
||||
|
||||
@@ -38,8 +38,6 @@ ScoreDisplayNormal::ScoreDisplayNormal()
|
||||
void ScoreDisplayNormal::Init( PlayerNumber pn )
|
||||
{
|
||||
m_PlayerNumber = pn;
|
||||
|
||||
SetScore( GAMESTATE->m_fScore[pn] );
|
||||
}
|
||||
|
||||
void ScoreDisplayNormal::SetScore( float fNewScore )
|
||||
|
||||
@@ -55,6 +55,12 @@ void Screen::Input( const DeviceInput& DeviceI, const InputEventType type, const
|
||||
if( !GAMESTATE->IsPlayerEnabled(MenuI.player) )
|
||||
return;
|
||||
|
||||
if( DeviceI.device == DEVICE_KEYBOARD && DeviceI.button == DIK_ESCAPE ) // don't make user hold back button if they're pressing escape
|
||||
{
|
||||
this->MenuBack( MenuI.player );
|
||||
return;
|
||||
}
|
||||
|
||||
switch( MenuI.button )
|
||||
{
|
||||
case MENU_BUTTON_UP: this->MenuUp( MenuI.player, type ); return;
|
||||
|
||||
@@ -98,10 +98,8 @@ ScreenGameplay::ScreenGameplay()
|
||||
GAMESTATE->m_pCurNotes[p]->GetNoteData( ¬edata );
|
||||
GAMESTATE->m_iPossibleDancePoints[p] = notedata.GetPossibleDancePoints();
|
||||
break;
|
||||
case PLAY_MODE_ENDLESS:
|
||||
GAMESTATE->m_iPossibleDancePoints[p] = -1;
|
||||
break;
|
||||
case PLAY_MODE_ONI:
|
||||
case PLAY_MODE_ENDLESS:
|
||||
{
|
||||
GAMESTATE->m_iPossibleDancePoints[p] = 0;
|
||||
|
||||
@@ -229,10 +227,10 @@ ScreenGameplay::ScreenGameplay()
|
||||
switch( GAMESTATE->m_PlayMode )
|
||||
{
|
||||
case PLAY_MODE_ARCADE:
|
||||
case PLAY_MODE_ENDLESS:
|
||||
m_pScoreDisplay[p] = new ScoreDisplayNormal;
|
||||
break;
|
||||
case PLAY_MODE_ONI:
|
||||
case PLAY_MODE_ENDLESS:
|
||||
m_pScoreDisplay[p] = new ScoreDisplayOni;
|
||||
break;
|
||||
default:
|
||||
@@ -390,6 +388,10 @@ bool ScreenGameplay::IsLastSong()
|
||||
case PLAY_MODE_ENDLESS:
|
||||
{
|
||||
Course* pCourse = GAMESTATE->m_pCurCourse;
|
||||
|
||||
if( pCourse->m_bRepeat )
|
||||
return false;
|
||||
|
||||
CArray<Song*,Song*> apSongs;
|
||||
CArray<Notes*,Notes*> apNotes[NUM_PLAYERS];
|
||||
pCourse->GetSongAndNotesForCurrentStyle( apSongs, apNotes );
|
||||
@@ -419,9 +421,15 @@ void ScreenGameplay::LoadNextSong( bool bFirstLoad )
|
||||
CArray<Notes*,Notes*> apNotes[NUM_PLAYERS];
|
||||
pCourse->GetSongAndNotesForCurrentStyle( apSongs, apNotes );
|
||||
|
||||
GAMESTATE->m_pCurSong = apSongs[GAMESTATE->m_iCurrentStageIndex];
|
||||
int iPlaySongIndex = -1;
|
||||
if( pCourse->m_bRandomize )
|
||||
iPlaySongIndex = rand() % apSongs.GetSize();
|
||||
else
|
||||
iPlaySongIndex = GAMESTATE->m_iCurrentStageIndex;
|
||||
|
||||
GAMESTATE->m_pCurSong = apSongs[iPlaySongIndex];
|
||||
for( int p=0; p<NUM_PLAYERS; p++ )
|
||||
GAMESTATE->m_pCurNotes[p] = apNotes[p][GAMESTATE->m_iCurrentStageIndex];
|
||||
GAMESTATE->m_pCurNotes[p] = apNotes[p][iPlaySongIndex];
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -1020,8 +1028,13 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
|
||||
case SM_GoToScreenAfterBack:
|
||||
switch( GAMESTATE->m_PlayMode )
|
||||
{
|
||||
case PLAY_MODE_ARCADE: SCREENMAN->SetNewScreen( new ScreenSelectMusic ); break;
|
||||
case PLAY_MODE_ONI: SCREENMAN->SetNewScreen( new ScreenSelectCourse ); break;
|
||||
case PLAY_MODE_ARCADE:
|
||||
SCREENMAN->SetNewScreen( new ScreenSelectMusic );
|
||||
break;
|
||||
case PLAY_MODE_ONI:
|
||||
case PLAY_MODE_ENDLESS:
|
||||
SCREENMAN->SetNewScreen( new ScreenSelectCourse );
|
||||
break;
|
||||
default: ASSERT(0);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -253,7 +253,7 @@ void ScreenSelectDifficulty::HandleScreenMessage( const ScreenMessage SM )
|
||||
break;
|
||||
case 4:
|
||||
GAMESTATE->m_PlayMode = PLAY_MODE_ENDLESS;
|
||||
SCREENMAN->SetNewScreen( new ScreenSelectGroup );
|
||||
SCREENMAN->SetNewScreen( new ScreenSelectCourse );
|
||||
break;
|
||||
default:
|
||||
ASSERT(0); // bad selection
|
||||
@@ -379,6 +379,7 @@ void ScreenSelectDifficulty::MenuStart( PlayerNumber pn )
|
||||
case 1: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_DIFFICULTY_COMMENT_MEDIUM) ); break;
|
||||
case 2: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_DIFFICULTY_COMMENT_HARD) ); break;
|
||||
case 3: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_DIFFICULTY_COMMENT_ONI) ); break;
|
||||
case 4: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_DIFFICULTY_COMMENT_ENDLESS) ); break;
|
||||
}
|
||||
|
||||
if( iSelection >= 3 ) // chose something on page 2
|
||||
|
||||
@@ -43,9 +43,15 @@ ScreenStage::ScreenStage()
|
||||
|
||||
if( GAMESTATE->m_PlayMode == PLAY_MODE_ONI )
|
||||
{
|
||||
m_textStage.SetText( "Challenge Mode" );
|
||||
m_textStage.SetText( "Nonstop Challenge" );
|
||||
m_textStage.SetDiffuseColor( D3DXCOLOR(0.8f,0.8f,1,1) ); // light blue
|
||||
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_CHALLENGE) );
|
||||
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ONI) );
|
||||
}
|
||||
else if( GAMESTATE->m_PlayMode == PLAY_MODE_ENDLESS )
|
||||
{
|
||||
m_textStage.SetText( "Endless Challenge" );
|
||||
m_textStage.SetDiffuseColor( D3DXCOLOR(0.8f,0.8f,1,1) ); // light blue
|
||||
SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ENDLESS) );
|
||||
}
|
||||
else if( GAMESTATE->IsExtraStage() )
|
||||
{
|
||||
|
||||
@@ -396,14 +396,12 @@ void SongManager::InitCoursesFromDisk()
|
||||
Course course;
|
||||
course.LoadFromCRSFile( "Courses\\" + saCourseFiles[i], m_pSongs );
|
||||
if( course.m_iStages > 0 )
|
||||
m_aCourses.Add( course );
|
||||
m_aOniCourses.Add( course );
|
||||
}
|
||||
|
||||
/*
|
||||
Chris: Default courses were a bad idea. Get rid of them.
|
||||
|
||||
//
|
||||
// Create default courses
|
||||
// Create endless courses
|
||||
//
|
||||
CStringArray saGroupNames;
|
||||
this->GetGroupNames( saGroupNames );
|
||||
@@ -416,13 +414,12 @@ void SongManager::InitCoursesFromDisk()
|
||||
for( DifficultyClass dc=CLASS_EASY; dc<=CLASS_HARD; dc=DifficultyClass(dc+1) ) // foreach DifficultyClass
|
||||
{
|
||||
Course course;
|
||||
course.CreateFromGroupAndDifficultyClass( sGroupName, dc, apGroupSongs );
|
||||
course.CreateEndlessCourseFromGroupAndDifficultyClass( sGroupName, dc, apGroupSongs );
|
||||
|
||||
if( course.m_iStages > 0 )
|
||||
m_aCourses.Add( course );
|
||||
m_aEndlessCourses.Add( course );
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void SongManager::ReloadCourses()
|
||||
|
||||
@@ -43,8 +43,11 @@ public:
|
||||
void GetSongsInGroup( const CString sGroupName, CArray<Song*,Song*> &AddTo );
|
||||
|
||||
|
||||
// for Courses
|
||||
CArray<Course, Course> m_aCourses;
|
||||
// for Oni
|
||||
CArray<Course, Course> m_aOniCourses;
|
||||
|
||||
// for Endless
|
||||
CArray<Course, Course> m_aEndlessCourses;
|
||||
|
||||
void InitCoursesFromDisk();
|
||||
void ReloadCourses();
|
||||
|
||||
Reference in New Issue
Block a user