working on finishing checkpoint holds:

track checkpoints missed and hit
allow it to inlfuence the life meter
This commit is contained in:
Glenn Maynard
2007-04-06 23:25:32 +00:00
parent 8864c5b382
commit 8c36383c76
10 changed files with 114 additions and 71 deletions
+4
View File
@@ -21,6 +21,8 @@ static void TugMeterPercentChangeInit( size_t /*ScoreEvent*/ i, RString &sNameOu
case SE_W5: defaultValueOut = -0.010f; break;
case SE_Miss: defaultValueOut = -0.020f; break;
case SE_HitMine: defaultValueOut = -0.040f; break;
case SE_CheckpointHit: defaultValueOut = +0.002f; break;
case SE_CheckpointMiss: defaultValueOut = -0.002f; break;
case SE_Held: defaultValueOut = +0.008f; break;
case SE_LetGo: defaultValueOut = -0.020f; break;
}
@@ -73,6 +75,8 @@ void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, TapNoteScore score )
case TNS_W5: fPercentToMove = g_fTugMeterPercentChange[SE_W5]; break;
case TNS_Miss: fPercentToMove = g_fTugMeterPercentChange[SE_Miss]; break;
case TNS_HitMine: fPercentToMove = g_fTugMeterPercentChange[SE_HitMine]; break;
case TNS_CheckpointHit: fPercentToMove = g_fTugMeterPercentChange[SE_CheckpointHit]; break;
case TNS_CheckpointMiss:fPercentToMove = g_fTugMeterPercentChange[SE_CheckpointMiss]; break;
default: ASSERT(0); break;
}
+6
View File
@@ -156,12 +156,14 @@ static const char *TapNoteScoreNames[] = {
"None",
"HitMine",
"AvoidMine",
"CheckpointMiss",
"Miss",
"W5",
"W4",
"W3",
"W2",
"W1",
"CheckpointHit",
};
XToString( TapNoteScore );
LuaXType( TapNoteScore );
@@ -171,6 +173,8 @@ TapNoteScore StringToTapNoteScore( const RString &s )
if ( s == "None" ) return TNS_None;
else if( s == "HitMine" ) return TNS_HitMine;
else if( s == "AvoidMine" ) return TNS_AvoidMine;
else if( s == "CheckpointHit" ) return TNS_CheckpointHit;
else if( s == "CheckpointMiss" )return TNS_CheckpointMiss;
else if( s == "Miss" ) return TNS_Miss;
else if( s == "W5" ) return TNS_W5;
else if( s == "W4" ) return TNS_W4;
@@ -227,6 +231,7 @@ static const char *TimingWindowNames[] = {
XToString( TimingWindow );
static const char *ScoreEventNames[] = {
"CheckpointHit",
"W1",
"W2",
"W3",
@@ -234,6 +239,7 @@ static const char *ScoreEventNames[] = {
"W5",
"Miss",
"HitMine",
"CheckpointMiss",
"Held",
"LetGo",
};
+4
View File
@@ -135,12 +135,14 @@ enum TapNoteScore {
TNS_None,
TNS_HitMine,
TNS_AvoidMine,
TNS_CheckpointMiss,
TNS_Miss,
TNS_W5,
TNS_W4,
TNS_W3,
TNS_W2,
TNS_W1,
TNS_CheckpointHit,
NUM_TapNoteScore,
TapNoteScore_Invalid,
};
@@ -181,6 +183,7 @@ const RString& TimingWindowToString( TimingWindow tw );
enum ScoreEvent
{
SE_CheckpointHit,
SE_W1,
SE_W2,
SE_W3,
@@ -188,6 +191,7 @@ enum ScoreEvent
SE_W5,
SE_Miss,
SE_HitMine,
SE_CheckpointMiss,
SE_Held,
SE_LetGo,
NUM_ScoreEvent
+4 -2
View File
@@ -135,9 +135,11 @@ void LifeMeterBar::ChangeLife( TapNoteScore score )
case TNS_Miss: fDeltaLife = m_fLifePercentChange.GetValue(SE_Miss); break;
case TNS_HitMine: fDeltaLife = m_fLifePercentChange.GetValue(SE_HitMine); break;
case TNS_None: fDeltaLife = m_fLifePercentChange.GetValue(SE_Miss); break;
case TNS_CheckpointHit: fDeltaLife = m_fLifePercentChange.GetValue(SE_CheckpointHit); break;
case TNS_CheckpointMiss:fDeltaLife = m_fLifePercentChange.GetValue(SE_CheckpointMiss); break;
}
if( IsHot() && score < TNS_W4 )
fDeltaLife = -0.10f; // make it take a while to get back to "hot"
if( IsHot() && fDeltaLife < 0 )
fDeltaLife = min( fDeltaLife, -0.10f ); // make it take a while to get back to "hot"
switch( GAMESTATE->m_SongOptions.GetSong().m_DrainType )
{
+19 -13
View File
@@ -20,22 +20,26 @@ static ThemeMetric<int> NUM_CHAMBERS ("LifeMeterTime","NumChambers");
static ThemeMetric<int> NUM_STRIPS ("LifeMeterTime","NumStrips");
static ThemeMetric<float> INITIAL_VALUE ("LifeMeterTime","InitialValue");
static const float g_fTimeMeterSecondsChangeInit[] =
{
+0.0f, // SE_CheckpointHit
+0.1f, // SE_W1
+0.0f, // SE_W2
-0.5f, // SE_W3
-1.0f, // SE_W4
-2.0f, // SE_W5
-4.0f, // SE_Miss
-2.0f, // SE_HitMine
-0.0f, // SE_CheckpointMiss
-0.0f, // SE_Held
-4.0f, // SE_LetGo
};
COMPILE_ASSERT( ARRAYSIZE(g_fTimeMeterSecondsChangeInit) == NUM_ScoreEvent );
static void TimeMeterSecondsChangeInit( size_t /*ScoreEvent*/ i, RString &sNameOut, float &defaultValueOut )
{
sNameOut = "TimeMeterSecondsChange" + ScoreEventToString( (ScoreEvent)i );
switch( i )
{
default: ASSERT(0);
case SE_W1: defaultValueOut = +0.1f; break;
case SE_W2: defaultValueOut = +0.0f; break;
case SE_W3: defaultValueOut = -0.5f; break;
case SE_W4: defaultValueOut = -1.0f; break;
case SE_W5: defaultValueOut = -2.0f; break;
case SE_Miss: defaultValueOut = -4.0f; break;
case SE_HitMine: defaultValueOut = -2.0f; break;
case SE_Held: defaultValueOut = -0.0f; break;
case SE_LetGo: defaultValueOut = -4.0f; break;
}
defaultValueOut = g_fTimeMeterSecondsChangeInit[i];
}
static Preference1D<float> g_fTimeMeterSecondsChange( TimeMeterSecondsChangeInit, NUM_ScoreEvent );
@@ -125,6 +129,8 @@ void LifeMeterTime::ChangeLife( TapNoteScore tns )
case TNS_W5: fMeterChange = g_fTimeMeterSecondsChange[SE_W5]; break;
case TNS_Miss: fMeterChange = g_fTimeMeterSecondsChange[SE_Miss]; break;
case TNS_HitMine: fMeterChange = g_fTimeMeterSecondsChange[SE_HitMine]; break;
case TNS_CheckpointHit: fMeterChange = g_fTimeMeterSecondsChange[SE_CheckpointHit]; break;
case TNS_CheckpointMiss:fMeterChange = g_fTimeMeterSecondsChange[SE_CheckpointMiss]; break;
}
float fOldLife = m_fLifeTotalLostSeconds;
+13 -16
View File
@@ -2261,7 +2261,8 @@ void Player::CrossedRows( int iFirstRowCrossed, int iLastRowCrossed, const RageT
{
//LOG->Trace( "%d...", r );
vector<int> viColsWithHold;
bool bAllHoldsHeldThisRow = true;
int iNumHoldsHeldThisRow = 0;
int iNumHoldsMissedThisRow = 0;
// start at r-1 so that we consider holds whose end rows are equal to the checkpoint row
NoteData::all_tracks_iterator iter = m_NoteData.GetTapNoteRangeAllTracks( r-1, r, NULL, true );
@@ -2289,7 +2290,10 @@ void Player::CrossedRows( int iFirstRowCrossed, int iLastRowCrossed, const RageT
continue;
viColsWithHold.push_back( iTrack );
bAllHoldsHeldThisRow &= tn.HoldResult.fLife > 0;
if( tn.HoldResult.fLife > 0 )
++iNumHoldsHeldThisRow;
else
++iNumHoldsMissedThisRow;
}
if( !viColsWithHold.empty() )
@@ -2298,21 +2302,14 @@ void Player::CrossedRows( int iFirstRowCrossed, int iLastRowCrossed, const RageT
const int iOldCombo = m_pPlayerStageStats ? m_pPlayerStageStats->m_iCurCombo : 0;
const int iOldMissCombo = m_pPlayerStageStats ? m_pPlayerStageStats->m_iCurMissCombo : 0;
if( m_pPlayerStageStats )
{
if( bAllHoldsHeldThisRow )
{
m_pPlayerStageStats->m_iCurCombo++;
m_pPlayerStageStats->m_iCurMissCombo = 0;
}
else
{
m_pPlayerStageStats->m_iCurCombo = 0;
m_pPlayerStageStats->m_iCurMissCombo++;
}
}
if( m_pPrimaryScoreKeeper )
m_pPrimaryScoreKeeper->HandleHoldCheckpointScore( m_NoteData, r, iNumHoldsHeldThisRow, iNumHoldsMissedThisRow );
if( m_pSecondaryScoreKeeper )
m_pSecondaryScoreKeeper->HandleHoldCheckpointScore( m_NoteData, r, iNumHoldsHeldThisRow, iNumHoldsMissedThisRow );
if( bAllHoldsHeldThisRow )
ChangeLife( iNumHoldsMissedThisRow == 0? TNS_CheckpointHit:TNS_CheckpointMiss );
if( iNumHoldsMissedThisRow == 0 )
{
FOREACH( int, viColsWithHold, i )
{
+1
View File
@@ -56,6 +56,7 @@ public:
virtual void HandleTapRowScore( const NoteData &nd, int iRow ) = 0;
virtual void HandleHoldScore( const TapNote &tn ) = 0;
virtual void HandleHoldActiveSeconds( float fMusicSecondsHeld ) = 0;
virtual void HandleHoldCheckpointScore( const NoteData &nd, int iRow, int iNumHoldsHeldThisRow, int iNumHoldsMissedThisRow ) { }
virtual void HandleTapScoreNone() = 0;
protected:
+44 -27
View File
@@ -33,6 +33,8 @@ void PercentScoreWeightInit( size_t /*ScoreEvent*/ i, RString &sNameOut, int &de
case SE_W5: defaultValueOut = 0; break;
case SE_Miss: defaultValueOut = 0; break;
case SE_HitMine: defaultValueOut = -2; break;
case SE_CheckpointHit: defaultValueOut = 0; break;
case SE_CheckpointMiss: defaultValueOut = 0; break;
case SE_Held: defaultValueOut = 3; break;
case SE_LetGo: defaultValueOut = 0; break;
}
@@ -51,6 +53,8 @@ void GradeWeightInit( size_t /*ScoreEvent*/ i, RString &sNameOut, int &defaultVa
case SE_W5: defaultValueOut = -4; break;
case SE_Miss: defaultValueOut = -8; break;
case SE_HitMine: defaultValueOut = -8; break;
case SE_CheckpointHit: defaultValueOut = 0; break;
case SE_CheckpointMiss: defaultValueOut = 0; break;
case SE_Held: defaultValueOut = 6; break;
case SE_LetGo: defaultValueOut = 0; break;
}
@@ -432,6 +436,41 @@ void ScoreKeeperNormal::HandleTapScore( const TapNote &tn )
AddTapScore( tns );
}
void ScoreKeeperNormal::HandleHoldCheckpointScore( const NoteData &nd, int iRow, int iNumHoldsHeldThisRow, int iNumHoldsMissedThisRow )
{
HandleTapNoteScoreInternal( iNumHoldsMissedThisRow == 0? TNS_CheckpointHit:TNS_CheckpointMiss, TNS_CheckpointHit, iNumHoldsHeldThisRow+iNumHoldsMissedThisRow );
}
void ScoreKeeperNormal::HandleTapNoteScoreInternal( TapNoteScore tns, TapNoteScore maximum, int iNumTapsInRow )
{
// Update dance points.
if( !m_pPlayerStageStats->m_bFailed )
m_pPlayerStageStats->m_iActualDancePoints += TapNoteScoreToDancePoints( tns );
// update judged row totals
m_pPlayerStageStats->m_iTapNoteScores[tns] += 1;
// increment the current total possible dance score
m_pPlayerStageStats->m_iCurPossibleDancePoints += TapNoteScoreToDancePoints( maximum );
//
// Regular combo
//
const int iComboCountIfHit = m_ComboIsPerRow? 1: iNumTapsInRow;
if( tns >= m_MinScoreToMaintainCombo )
{
m_pPlayerStageStats->m_iCurMissCombo = 0;
if( tns >= m_MinScoreToContinueCombo )
m_pPlayerStageStats->m_iCurCombo += iComboCountIfHit;
}
else
{
m_pPlayerStageStats->m_iCurCombo = 0;
if( tns == TNS_Miss || tns == TNS_CheckpointMiss )
m_pPlayerStageStats->m_iCurMissCombo += iComboCountIfHit;
}
}
void ScoreKeeperNormal::HandleTapRowScore( const NoteData &nd, int iRow )
{
TapNoteScore scoreOfLastTap;
@@ -442,33 +481,7 @@ void ScoreKeeperNormal::HandleTapRowScore( const NoteData &nd, int iRow )
if( iNumTapsInRow <= 0 )
return;
// Update dance points.
if( !m_pPlayerStageStats->m_bFailed )
m_pPlayerStageStats->m_iActualDancePoints += TapNoteScoreToDancePoints( scoreOfLastTap );
// update judged row totals
m_pPlayerStageStats->m_iTapNoteScores[scoreOfLastTap] += 1;
// increment the current total possible dance score
m_pPlayerStageStats->m_iCurPossibleDancePoints += TapNoteScoreToDancePoints( TNS_W1 );
//
// Regular combo
//
const int iComboCountIfHit = m_ComboIsPerRow? 1: iNumTapsInRow;
if( scoreOfLastTap >= m_MinScoreToMaintainCombo )
{
m_pPlayerStageStats->m_iCurMissCombo = 0;
if( scoreOfLastTap >= m_MinScoreToContinueCombo )
m_pPlayerStageStats->m_iCurCombo += iComboCountIfHit;
}
else
{
m_pPlayerStageStats->m_iCurCombo = 0;
if( scoreOfLastTap == TNS_Miss )
m_pPlayerStageStats->m_iCurMissCombo += iComboCountIfHit;
}
HandleTapNoteScoreInternal( scoreOfLastTap, TNS_W1, iNumTapsInRow );
if( m_pPlayerState->m_PlayerNumber != PLAYER_INVALID )
MESSAGEMAN->Broadcast( enum_add2(Message_CurrentComboChangedP1,m_pPlayerState->m_PlayerNumber) );
@@ -635,6 +648,8 @@ int ScoreKeeperNormal::TapNoteScoreToDancePoints( TapNoteScore tns, bool bBeginn
case TNS_W3: iWeight = g_iPercentScoreWeight[SE_W3]; break;
case TNS_W2: iWeight = g_iPercentScoreWeight[SE_W2]; break;
case TNS_W1: iWeight = g_iPercentScoreWeight[SE_W1]; break;
case TNS_CheckpointHit: iWeight = g_iPercentScoreWeight[SE_CheckpointHit]; break;
case TNS_CheckpointMiss:iWeight = g_iPercentScoreWeight[SE_CheckpointMiss]; break;
}
if( bBeginner && PREFSMAN->m_bMercifulBeginner )
iWeight = max( 0, iWeight );
@@ -676,6 +691,8 @@ int ScoreKeeperNormal::TapNoteScoreToGradePoints( TapNoteScore tns, bool bBeginn
case TNS_W3: iWeight = g_iGradeWeight[SE_W3]; break;
case TNS_W2: iWeight = g_iGradeWeight[SE_W2]; break;
case TNS_W1: iWeight = g_iGradeWeight[SE_W1]; break;
case TNS_CheckpointHit: iWeight = g_iGradeWeight[SE_CheckpointHit]; break;
case TNS_CheckpointMiss:iWeight = g_iGradeWeight[SE_CheckpointMiss]; break;
}
if( bBeginner && PREFSMAN->m_bMercifulBeginner )
iWeight = max( 0, iWeight );
+3
View File
@@ -59,6 +59,9 @@ public:
void HandleTapRowScore( const NoteData &nd, int iRow );
void HandleHoldScore( const TapNote &tn );
void HandleHoldActiveSeconds( float fMusicSecondsHeld ) {};
void HandleHoldCheckpointScore( const NoteData &nd, int iRow, int iNumHoldsHeldThisRow, int iNumHoldsMissedThisRow );
void HandleTapNoteScoreInternal( TapNoteScore tns, TapNoteScore maximum, int iNumTapsInRow );
// This must be calculated using only cached radar values so that we can
// do it quickly.
+16 -13
View File
@@ -13,23 +13,26 @@
ThemeMetric<float> ATTACK_DURATION_SECONDS ("ScoreKeeperRave","AttackDurationSeconds");
static const float g_fSuperMeterPercentChangeInit[] =
{
+0.02f, // SE_CheckpointHit
+0.05f, // SE_W1
+0.04f, // SE_W2
+0.02f, // SE_W3
+0.00f, // SE_W4
+0.00f, // SE_W5
+0.20f, // SE_Miss
+0.40f, // SE_HitMine
-0.02f, // SE_CheckpointMiss
+0.04f, // SE_Held
-0.20f, // SE_LetGo
};
COMPILE_ASSERT( ARRAYSIZE(g_fSuperMeterPercentChangeInit) == NUM_ScoreEvent );
static void SuperMeterPercentChangeInit( size_t /*ScoreEvent*/ i, RString &sNameOut, float &defaultValueOut )
{
sNameOut = "SuperMeterPercentChange" + ScoreEventToString( (ScoreEvent)i );
switch( i )
{
default: ASSERT(0);
case SE_W1: defaultValueOut = +0.05f; break;
case SE_W2: defaultValueOut = +0.04f; break;
case SE_W3: defaultValueOut = +0.02f; break;
case SE_W4: defaultValueOut = +0.00f; break;
case SE_W5: defaultValueOut = -0.00f; break;
case SE_Miss: defaultValueOut = -0.20f; break;
case SE_HitMine: defaultValueOut = -0.40f; break;
case SE_Held: defaultValueOut = +0.04f; break;
case SE_LetGo: defaultValueOut = -0.20f; break;
}
defaultValueOut = g_fSuperMeterPercentChangeInit[i];
}
static Preference1D<float> g_fSuperMeterPercentChange( SuperMeterPercentChangeInit, NUM_ScoreEvent );