working on finishing checkpoint holds:
track checkpoints missed and hit allow it to inlfuence the life meter
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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",
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user