fix "can't hit taps on same line as mines"
move life deltas to prefs separate life delta for stepping on a mine
This commit is contained in:
@@ -12,6 +12,7 @@
|
|||||||
#include "CombinedLifeMeterTug.h"
|
#include "CombinedLifeMeterTug.h"
|
||||||
#include "ThemeManager.h"
|
#include "ThemeManager.h"
|
||||||
#include "GameState.h"
|
#include "GameState.h"
|
||||||
|
#include "PrefsManager.h"
|
||||||
|
|
||||||
|
|
||||||
const float METER_WIDTH = 550;
|
const float METER_WIDTH = 550;
|
||||||
@@ -55,16 +56,16 @@ void CombinedLifeMeterTug::Update( float fDelta )
|
|||||||
|
|
||||||
void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, TapNoteScore score )
|
void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, TapNoteScore score )
|
||||||
{
|
{
|
||||||
float fPercentToMove;
|
float fPercentToMove = 0;
|
||||||
switch( score )
|
switch( score )
|
||||||
{
|
{
|
||||||
case TNS_MARVELOUS: fPercentToMove = +0.010f; break;
|
case TNS_MARVELOUS: fPercentToMove = PREFSMAN->m_fLifeDeltaMarvelousPercentChange; break;
|
||||||
case TNS_PERFECT: fPercentToMove = +0.010f; break;
|
case TNS_PERFECT: fPercentToMove = PREFSMAN->m_fLifeDeltaPerfectPercentChange; break;
|
||||||
case TNS_GREAT: fPercentToMove = +0.005f; break;
|
case TNS_GREAT: fPercentToMove = PREFSMAN->m_fLifeDeltaGreatPercentChange; break;
|
||||||
case TNS_GOOD: fPercentToMove = +0.000f; break;
|
case TNS_GOOD: fPercentToMove = PREFSMAN->m_fLifeDeltaGoodPercentChange; break;
|
||||||
case TNS_BOO: fPercentToMove = -0.010f; break;
|
case TNS_BOO: fPercentToMove = PREFSMAN->m_fLifeDeltaBooPercentChange; break;
|
||||||
case TNS_MISS: fPercentToMove = -0.020f; break;
|
case TNS_MISS: fPercentToMove = PREFSMAN->m_fLifeDeltaMissPercentChange; break;
|
||||||
default: ASSERT(0); fPercentToMove = +0.000f; break;
|
default: ASSERT(0); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( pn )
|
switch( pn )
|
||||||
@@ -79,5 +80,39 @@ void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, TapNoteScore score )
|
|||||||
|
|
||||||
void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, HoldNoteScore score, TapNoteScore tscore )
|
void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, HoldNoteScore score, TapNoteScore tscore )
|
||||||
{
|
{
|
||||||
|
/* The initial tap note score (which we happen to have in have in
|
||||||
|
* tscore) has already been reported to the above function. If the
|
||||||
|
* hold end result was an NG, count it as a miss; if the end result
|
||||||
|
* was an OK, count a perfect. (Remember, this is just life meter
|
||||||
|
* computation, not scoring.) */
|
||||||
|
float fPercentToMove = 0;
|
||||||
|
switch( score )
|
||||||
|
{
|
||||||
|
case HNS_OK: fPercentToMove = PREFSMAN->m_fLifeDeltaOKPercentChange; break;
|
||||||
|
case HNS_NG: fPercentToMove = PREFSMAN->m_fLifeDeltaNGPercentChange; break;
|
||||||
|
default: ASSERT(0); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( pn )
|
||||||
|
{
|
||||||
|
case PLAYER_1: GAMESTATE->m_fTugLifePercentP1 += fPercentToMove; break;
|
||||||
|
case PLAYER_2: GAMESTATE->m_fTugLifePercentP1 -= fPercentToMove; break;
|
||||||
|
default: ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
CLAMP( GAMESTATE->m_fTugLifePercentP1, 0, 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void CombinedLifeMeterTug::ChangeLifeMine( PlayerNumber pn )
|
||||||
|
{
|
||||||
|
float fPercentToMove = PREFSMAN->m_fLifeDeltaMinePercentChange;
|
||||||
|
switch( pn )
|
||||||
|
{
|
||||||
|
case PLAYER_1: GAMESTATE->m_fTugLifePercentP1 += fPercentToMove; break;
|
||||||
|
case PLAYER_2: GAMESTATE->m_fTugLifePercentP1 -= fPercentToMove; break;
|
||||||
|
default: ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
CLAMP( GAMESTATE->m_fTugLifePercentP1, 0, 1 );
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "LifeMeter.h"
|
#include "CombinedLifeMeter.h"
|
||||||
#include "Sprite.h"
|
#include "Sprite.h"
|
||||||
#include "MeterDisplay.h"
|
#include "MeterDisplay.h"
|
||||||
#include "CharacterHead.h"
|
#include "CharacterHead.h"
|
||||||
@@ -25,6 +25,7 @@ public:
|
|||||||
|
|
||||||
virtual void ChangeLife( PlayerNumber pn, TapNoteScore score );
|
virtual void ChangeLife( PlayerNumber pn, TapNoteScore score );
|
||||||
virtual void ChangeLife( PlayerNumber pn, HoldNoteScore score, TapNoteScore tscore );
|
virtual void ChangeLife( PlayerNumber pn, HoldNoteScore score, TapNoteScore tscore );
|
||||||
|
virtual void ChangeLifeMine( PlayerNumber pn );
|
||||||
virtual void OnDancePointsChange( PlayerNumber pn ) {};
|
virtual void OnDancePointsChange( PlayerNumber pn ) {};
|
||||||
virtual bool IsInDanger( PlayerNumber pn ) { return false; };
|
virtual bool IsInDanger( PlayerNumber pn ) { return false; };
|
||||||
virtual bool IsHot( PlayerNumber pn ) { return false; };
|
virtual bool IsHot( PlayerNumber pn ) { return false; };
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ public:
|
|||||||
/* Change life after receiving a hold note grade. tscore is the score
|
/* Change life after receiving a hold note grade. tscore is the score
|
||||||
* received for the initial tap note. */
|
* received for the initial tap note. */
|
||||||
virtual void ChangeLife( HoldNoteScore score, TapNoteScore tscore ) = 0;
|
virtual void ChangeLife( HoldNoteScore score, TapNoteScore tscore ) = 0;
|
||||||
|
virtual void ChangeLifeMine() = 0;
|
||||||
virtual void OnDancePointsChange() = 0; // look in GAMESTATE and update the display
|
virtual void OnDancePointsChange() = 0; // look in GAMESTATE and update the display
|
||||||
virtual bool IsInDanger() const = 0;
|
virtual bool IsInDanger() const = 0;
|
||||||
virtual bool IsHot() const = 0;
|
virtual bool IsHot() const = 0;
|
||||||
@@ -42,26 +43,5 @@ protected:
|
|||||||
PlayerNumber m_PlayerNumber;
|
PlayerNumber m_PlayerNumber;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CombinedLifeMeter : public ActorFrame
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CombinedLifeMeter() {};
|
|
||||||
virtual ~CombinedLifeMeter() {};
|
|
||||||
|
|
||||||
virtual void OnSongEnded() {};
|
|
||||||
/* Change life after receiving a tap note grade. This *is* called for
|
|
||||||
* the head of hold notes. */
|
|
||||||
virtual void ChangeLife( PlayerNumber pn, TapNoteScore score ) = 0;
|
|
||||||
/* Change life after receiving a hold note grade. tscore is the score
|
|
||||||
* received for the initial tap note. */
|
|
||||||
virtual void ChangeLife( PlayerNumber pn, HoldNoteScore score, TapNoteScore tscore ) = 0;
|
|
||||||
virtual void OnDancePointsChange( PlayerNumber pn ) = 0; // look in GAMESTATE and update the display
|
|
||||||
virtual bool IsInDanger( PlayerNumber pn ) = 0;
|
|
||||||
virtual bool IsHot( PlayerNumber pn ) = 0;
|
|
||||||
virtual bool IsFailing( PlayerNumber pn ) = 0;
|
|
||||||
virtual void OnTaunt() {};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -292,12 +292,12 @@ void LifeMeterBar::ChangeLife( TapNoteScore score )
|
|||||||
case SongOptions::DRAIN_NORMAL:
|
case SongOptions::DRAIN_NORMAL:
|
||||||
switch( score )
|
switch( score )
|
||||||
{
|
{
|
||||||
case TNS_MARVELOUS: fDeltaLife = +0.008f; break;
|
case TNS_MARVELOUS: fDeltaLife = PREFSMAN->m_fLifeDeltaMarvelousPercentChange; break;
|
||||||
case TNS_PERFECT: fDeltaLife = +0.008f; break;
|
case TNS_PERFECT: fDeltaLife = PREFSMAN->m_fLifeDeltaPerfectPercentChange; break;
|
||||||
case TNS_GREAT: fDeltaLife = +0.004f; break;
|
case TNS_GREAT: fDeltaLife = PREFSMAN->m_fLifeDeltaGreatPercentChange; break;
|
||||||
case TNS_GOOD: fDeltaLife = +0.000f; break;
|
case TNS_GOOD: fDeltaLife = PREFSMAN->m_fLifeDeltaGoodPercentChange; break;
|
||||||
case TNS_BOO: fDeltaLife = -0.040f; break;
|
case TNS_BOO: fDeltaLife = PREFSMAN->m_fLifeDeltaBooPercentChange; break;
|
||||||
case TNS_MISS: fDeltaLife = -0.080f; break;
|
case TNS_MISS: fDeltaLife = PREFSMAN->m_fLifeDeltaMissPercentChange; break;
|
||||||
default:
|
default:
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
@@ -311,8 +311,8 @@ void LifeMeterBar::ChangeLife( TapNoteScore score )
|
|||||||
case TNS_PERFECT: fDeltaLife = +0.000f; break;
|
case TNS_PERFECT: fDeltaLife = +0.000f; break;
|
||||||
case TNS_GREAT: fDeltaLife = +0.000f; break;
|
case TNS_GREAT: fDeltaLife = +0.000f; break;
|
||||||
case TNS_GOOD: fDeltaLife = +0.000f; break;
|
case TNS_GOOD: fDeltaLife = +0.000f; break;
|
||||||
case TNS_BOO: fDeltaLife = -0.040f; break;
|
case TNS_BOO: fDeltaLife = PREFSMAN->m_fLifeDeltaBooPercentChange; break;
|
||||||
case TNS_MISS: fDeltaLife = -0.080f; break;
|
case TNS_MISS: fDeltaLife = PREFSMAN->m_fLifeDeltaMissPercentChange; break;
|
||||||
default:
|
default:
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
@@ -334,20 +334,67 @@ void LifeMeterBar::ChangeLife( TapNoteScore score )
|
|||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle progressiveness and ComboToRegainLife here
|
ChangeLife( fDeltaLife );
|
||||||
|
}
|
||||||
|
|
||||||
|
void LifeMeterBar::ChangeLife( HoldNoteScore score, TapNoteScore tscore )
|
||||||
|
{
|
||||||
|
/* The initial tap note score (which we happen to have in have in
|
||||||
|
* tscore) has already been reported to the above function. If the
|
||||||
|
* hold end result was an NG, count it as a miss; if the end result
|
||||||
|
* was an OK, count a perfect. (Remember, this is just life meter
|
||||||
|
* computation, not scoring.) */
|
||||||
|
float fDeltaLife=0.f;
|
||||||
|
switch( GAMESTATE->m_SongOptions.m_DrainType )
|
||||||
|
{
|
||||||
|
case SongOptions::DRAIN_NORMAL:
|
||||||
switch( score )
|
switch( score )
|
||||||
{
|
{
|
||||||
case TNS_MARVELOUS:
|
case HNS_OK: fDeltaLife = PREFSMAN->m_fLifeDeltaOKPercentChange; break;
|
||||||
case TNS_PERFECT:
|
case HNS_NG: fDeltaLife = PREFSMAN->m_fLifeDeltaNGPercentChange; break;
|
||||||
case TNS_GREAT:
|
default:
|
||||||
case TNS_GOOD:
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
if( IsHot() && score == HNS_NG )
|
||||||
|
fDeltaLife = -0.10f; // make it take a while to get back to "doing great"
|
||||||
|
break;
|
||||||
|
case SongOptions::DRAIN_NO_RECOVER:
|
||||||
|
switch( score )
|
||||||
|
{
|
||||||
|
case HNS_OK: fDeltaLife = +0.000f; break;
|
||||||
|
case HNS_NG: fDeltaLife = PREFSMAN->m_fLifeDeltaNGPercentChange; break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SongOptions::DRAIN_SUDDEN_DEATH:
|
||||||
|
switch( score )
|
||||||
|
{
|
||||||
|
case HNS_OK: fDeltaLife = +0; break;
|
||||||
|
case HNS_NG: fDeltaLife = -1.0; break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ChangeLife( fDeltaLife );
|
||||||
|
}
|
||||||
|
|
||||||
|
void LifeMeterBar::ChangeLife( float fDeltaLife )
|
||||||
|
{
|
||||||
|
// handle progressiveness and ComboToRegainLife here
|
||||||
|
if( fDeltaLife >= 0 )
|
||||||
|
{
|
||||||
m_iMissCombo = 0;
|
m_iMissCombo = 0;
|
||||||
m_iComboToRegainLife = max( m_iComboToRegainLife-1, 0 );
|
m_iComboToRegainLife = max( m_iComboToRegainLife-1, 0 );
|
||||||
if ( m_iComboToRegainLife > 0 )
|
if ( m_iComboToRegainLife > 0 )
|
||||||
fDeltaLife = 0.0f;
|
fDeltaLife = 0.0f;
|
||||||
break;
|
}
|
||||||
case TNS_BOO:
|
else
|
||||||
case TNS_MISS:
|
{
|
||||||
fDeltaLife *= 1 + (float)m_iProgressiveLifebar/8 * m_iMissCombo;
|
fDeltaLife *= 1 + (float)m_iProgressiveLifebar/8 * m_iMissCombo;
|
||||||
// do this after; only successive boo/miss will
|
// do this after; only successive boo/miss will
|
||||||
// increase the amount of life lost.
|
// increase the amount of life lost.
|
||||||
@@ -394,17 +441,27 @@ void LifeMeterBar::ChangeLife( TapNoteScore score )
|
|||||||
m_fLifeVelocity += fDeltaLife;
|
m_fLifeVelocity += fDeltaLife;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LifeMeterBar::ChangeLife( HoldNoteScore score, TapNoteScore tscore )
|
void LifeMeterBar::ChangeLifeMine()
|
||||||
{
|
{
|
||||||
/* The initial tap note score (which we happen to have in have in
|
float fDeltaLife=0.f;
|
||||||
* tscore) has already been reported to the above function. If the
|
switch( GAMESTATE->m_SongOptions.m_DrainType )
|
||||||
* hold end result was an NG, count it as a miss; if the end result
|
{
|
||||||
* was an OK, count a perfect. (Remember, this is just life meter
|
case SongOptions::DRAIN_NORMAL:
|
||||||
* computation, not scoring.) */
|
fDeltaLife = PREFSMAN->m_fLifeDeltaMinePercentChange;
|
||||||
if(score == HNS_NG)
|
if( IsHot() )
|
||||||
ChangeLife(TNS_MISS);
|
fDeltaLife = -0.10f; // make it take a while to get back to "doing great"
|
||||||
else if(score == HNS_OK)
|
break;
|
||||||
ChangeLife(TNS_PERFECT);
|
case SongOptions::DRAIN_NO_RECOVER:
|
||||||
|
fDeltaLife = PREFSMAN->m_fLifeDeltaMinePercentChange;
|
||||||
|
break;
|
||||||
|
case SongOptions::DRAIN_SUDDEN_DEATH:
|
||||||
|
fDeltaLife = -1.0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ChangeLife( fDeltaLife );
|
||||||
}
|
}
|
||||||
|
|
||||||
void LifeMeterBar::AfterLifeChanged()
|
void LifeMeterBar::AfterLifeChanged()
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ public:
|
|||||||
|
|
||||||
virtual void ChangeLife( TapNoteScore score );
|
virtual void ChangeLife( TapNoteScore score );
|
||||||
virtual void ChangeLife( HoldNoteScore score, TapNoteScore tscore );
|
virtual void ChangeLife( HoldNoteScore score, TapNoteScore tscore );
|
||||||
|
virtual void ChangeLife( float fDeltaLifePercent );
|
||||||
|
virtual void ChangeLifeMine();
|
||||||
virtual void AfterLifeChanged();
|
virtual void AfterLifeChanged();
|
||||||
virtual void OnDancePointsChange() {}; // this life meter doesn't care
|
virtual void OnDancePointsChange() {}; // this life meter doesn't care
|
||||||
virtual bool IsInDanger() const;
|
virtual bool IsInDanger() const;
|
||||||
|
|||||||
@@ -135,6 +135,15 @@ void LifeMeterBattery::ChangeLife( HoldNoteScore score, TapNoteScore tscore )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LifeMeterBattery::ChangeLife( float fDeltaLifePercent )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void LifeMeterBattery::ChangeLifeMine()
|
||||||
|
{
|
||||||
|
ChangeLife( TNS_MISS ); // same as a miss
|
||||||
|
}
|
||||||
|
|
||||||
void LifeMeterBattery::OnDancePointsChange()
|
void LifeMeterBattery::OnDancePointsChange()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ public:
|
|||||||
virtual void OnSongEnded();
|
virtual void OnSongEnded();
|
||||||
virtual void ChangeLife( TapNoteScore score );
|
virtual void ChangeLife( TapNoteScore score );
|
||||||
virtual void ChangeLife( HoldNoteScore score, TapNoteScore tscore );
|
virtual void ChangeLife( HoldNoteScore score, TapNoteScore tscore );
|
||||||
|
virtual void ChangeLife( float fDeltaLifePercent );
|
||||||
|
virtual void ChangeLifeMine();
|
||||||
virtual void OnDancePointsChange(); // look in GAMESTATE and update the display
|
virtual void OnDancePointsChange(); // look in GAMESTATE and update the display
|
||||||
virtual bool IsInDanger() const;
|
virtual bool IsInDanger() const;
|
||||||
virtual bool IsHot() const;
|
virtual bool IsHot() const;
|
||||||
|
|||||||
@@ -104,8 +104,10 @@ TapNoteScore NoteDataWithScoring::MinTapNoteScore(unsigned row) const
|
|||||||
TapNoteScore score = TNS_MARVELOUS;
|
TapNoteScore score = TNS_MARVELOUS;
|
||||||
for( int t=0; t<GetNumTracks(); t++ )
|
for( int t=0; t<GetNumTracks(); t++ )
|
||||||
{
|
{
|
||||||
/* If there's no tap note on this row, skip it, or else the score will always be TNS_NONE. */
|
/* Don't coun, or else the score
|
||||||
if(GetTapNote(t, row) == TAP_EMPTY)
|
* will always be TNS_NONE. */
|
||||||
|
TapNote tn = GetTapNote(t, row);
|
||||||
|
if( tn == TAP_EMPTY || tn == TAP_MINE )
|
||||||
continue;
|
continue;
|
||||||
score = min( score, GetTapNoteScore(t, row) );
|
score = min( score, GetTapNoteScore(t, row) );
|
||||||
}
|
}
|
||||||
@@ -127,8 +129,10 @@ int NoteDataWithScoring::LastTapNoteScoreTrack(unsigned row) const
|
|||||||
int best_track = -1;
|
int best_track = -1;
|
||||||
for( int t=0; t<GetNumTracks(); t++ )
|
for( int t=0; t<GetNumTracks(); t++ )
|
||||||
{
|
{
|
||||||
/* If there's no tap note on this track, skip it (the score will always be TNS_NONE) */
|
/* Skip empty tracks and mines */
|
||||||
if(GetTapNote(t, row) == TAP_EMPTY) continue;
|
TapNote tn = GetTapNote(t, row);
|
||||||
|
if( tn == TAP_EMPTY || tn == TAP_MINE )
|
||||||
|
continue;
|
||||||
|
|
||||||
TapNoteScore tns = GetTapNoteScore(t, row);
|
TapNoteScore tns = GetTapNoteScore(t, row);
|
||||||
|
|
||||||
|
|||||||
+17
-19
@@ -28,6 +28,7 @@
|
|||||||
#include "Combo.h"
|
#include "Combo.h"
|
||||||
#include "ScoreDisplay.h"
|
#include "ScoreDisplay.h"
|
||||||
#include "LifeMeter.h"
|
#include "LifeMeter.h"
|
||||||
|
#include "CombinedLifeMeter.h"
|
||||||
#include "PlayerAI.h"
|
#include "PlayerAI.h"
|
||||||
#include "NoteFieldPositioning.h"
|
#include "NoteFieldPositioning.h"
|
||||||
#include "NoteDataUtil.h"
|
#include "NoteDataUtil.h"
|
||||||
@@ -557,14 +558,18 @@ void PlayerMinus::Step( int col, RageTimer tm )
|
|||||||
|
|
||||||
|
|
||||||
if( tn == TAP_MINE )
|
if( tn == TAP_MINE )
|
||||||
|
|
||||||
{
|
{
|
||||||
// stepped too close to mine?
|
// stepped too close to mine?
|
||||||
if( fScaledSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowMineSeconds )
|
if( fScaledSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowMineSeconds )
|
||||||
{
|
{
|
||||||
m_soundMineExplosion.Play();
|
m_soundMineExplosion.Play();
|
||||||
score = TNS_MISS;
|
score = TNS_MISS;
|
||||||
m_pNoteField->TapMine( col, TNS_MISS );
|
m_pNoteField->TapMine( col, score );
|
||||||
|
|
||||||
|
if( m_pLifeMeter )
|
||||||
|
m_pLifeMeter->ChangeLifeMine();
|
||||||
|
if( m_pCombinedLifeMeter )
|
||||||
|
m_pCombinedLifeMeter->ChangeLifeMine(m_PlayerNumber);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -632,7 +637,11 @@ void PlayerMinus::Step( int col, RageTimer tm )
|
|||||||
{
|
{
|
||||||
m_soundMineExplosion.Play();
|
m_soundMineExplosion.Play();
|
||||||
score = TNS_MISS;
|
score = TNS_MISS;
|
||||||
m_pNoteField->TapMine( col, TNS_MISS );
|
m_pNoteField->TapMine( col, score );
|
||||||
|
if( m_pLifeMeter )
|
||||||
|
m_pLifeMeter->ChangeLifeMine();
|
||||||
|
if( m_pCombinedLifeMeter )
|
||||||
|
m_pCombinedLifeMeter->ChangeLifeMine(m_PlayerNumber);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PC_AUTOPLAY:
|
case PC_AUTOPLAY:
|
||||||
@@ -681,8 +690,12 @@ void PlayerMinus::Step( int col, RageTimer tm )
|
|||||||
score >= TNS_GREAT )
|
score >= TNS_GREAT )
|
||||||
HandleAutosync(fNoteOffset);
|
HandleAutosync(fNoteOffset);
|
||||||
|
|
||||||
|
|
||||||
|
if( IsThereATapOrHoldHeadAtRow(iIndexOverlappingNote) ) // don't judge rows that are only mines
|
||||||
|
{
|
||||||
if( IsRowCompletelyJudged(iIndexOverlappingNote) )
|
if( IsRowCompletelyJudged(iIndexOverlappingNote) )
|
||||||
OnRowCompletelyJudged( iIndexOverlappingNote );
|
OnRowCompletelyJudged( iIndexOverlappingNote );
|
||||||
|
}
|
||||||
|
|
||||||
if( score == TNS_MISS || score == TNS_BOO )
|
if( score == TNS_MISS || score == TNS_BOO )
|
||||||
{
|
{
|
||||||
@@ -813,23 +826,15 @@ void PlayerMinus::UpdateTapNotesMissedOlderThan( float fMissIfOlderThanSeconds )
|
|||||||
//LOG->Trace( "iStartCheckingAt: %d iMissIfOlderThanThisIndex: %d", iStartCheckingAt, iMissIfOlderThanThisIndex );
|
//LOG->Trace( "iStartCheckingAt: %d iMissIfOlderThanThisIndex: %d", iStartCheckingAt, iMissIfOlderThanThisIndex );
|
||||||
|
|
||||||
int iNumMissesFound = 0;
|
int iNumMissesFound = 0;
|
||||||
int iNumMinesMissed = 0;
|
|
||||||
for( int r=iStartCheckingAt; r<iMissIfOlderThanThisIndex; r++ )
|
for( int r=iStartCheckingAt; r<iMissIfOlderThanThisIndex; r++ )
|
||||||
{
|
{
|
||||||
bool MissedNoteOnThisRow = false;
|
bool MissedNoteOnThisRow = false;
|
||||||
bool MissedMineOnThisRow = false;
|
|
||||||
for( int t=0; t<GetNumTracks(); t++ )
|
for( int t=0; t<GetNumTracks(); t++ )
|
||||||
{
|
{
|
||||||
if( GetTapNote(t, r) == TAP_EMPTY) continue; /* no note here */
|
if( GetTapNote(t, r) == TAP_EMPTY) continue; /* no note here */
|
||||||
if( GetTapNoteScore(t, r) != TNS_NONE ) continue; /* note here is already hit */
|
if( GetTapNoteScore(t, r) != TNS_NONE ) continue; /* note here is already hit */
|
||||||
|
|
||||||
if( GetTapNote(t, r) == TAP_MINE )
|
if( GetTapNote(t, r) != TAP_MINE )
|
||||||
{
|
|
||||||
// A mine. Reward for not stepping on it.
|
|
||||||
MissedMineOnThisRow = true;
|
|
||||||
SetTapNoteScore(t, r, GAMESTATE->ShowMarvelous()? TNS_MARVELOUS:TNS_PERFECT);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// A normal note. Penalize for not stepping on it.
|
// A normal note. Penalize for not stepping on it.
|
||||||
MissedNoteOnThisRow = true;
|
MissedNoteOnThisRow = true;
|
||||||
@@ -844,17 +849,10 @@ void PlayerMinus::UpdateTapNotesMissedOlderThan( float fMissIfOlderThanSeconds )
|
|||||||
iNumMissesFound++;
|
iNumMissesFound++;
|
||||||
HandleTapRowScore( r );
|
HandleTapRowScore( r );
|
||||||
}
|
}
|
||||||
else if( MissedMineOnThisRow )
|
|
||||||
{
|
|
||||||
iNumMinesMissed++;
|
|
||||||
HandleTapRowScore( r );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( iNumMissesFound > 0 )
|
if( iNumMissesFound > 0 )
|
||||||
m_Judgment.SetJudgment( TNS_MISS );
|
m_Judgment.SetJudgment( TNS_MISS );
|
||||||
else if( iNumMinesMissed > 0 )
|
|
||||||
m_Judgment.SetJudgment( GAMESTATE->ShowMarvelous()? TNS_MARVELOUS:TNS_PERFECT );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ PrefsManager::PrefsManager()
|
|||||||
m_bEventMode = false;
|
m_bEventMode = false;
|
||||||
m_bAutoPlay = false;
|
m_bAutoPlay = false;
|
||||||
m_fJudgeWindowScale = 1.0f;
|
m_fJudgeWindowScale = 1.0f;
|
||||||
|
m_fLifeDifficultyScale = 1.0f;
|
||||||
m_fJudgeWindowMarvelousSeconds = 0.0225f;
|
m_fJudgeWindowMarvelousSeconds = 0.0225f;
|
||||||
m_fJudgeWindowPerfectSeconds = 0.045f;
|
m_fJudgeWindowPerfectSeconds = 0.045f;
|
||||||
m_fJudgeWindowGreatSeconds = 0.090f;
|
m_fJudgeWindowGreatSeconds = 0.090f;
|
||||||
@@ -65,7 +66,15 @@ PrefsManager::PrefsManager()
|
|||||||
m_fJudgeWindowBooSeconds = 0.180f;
|
m_fJudgeWindowBooSeconds = 0.180f;
|
||||||
m_fJudgeWindowOKSeconds = 0.250f; // allow enough time to take foot off and put back on
|
m_fJudgeWindowOKSeconds = 0.250f; // allow enough time to take foot off and put back on
|
||||||
m_fJudgeWindowMineSeconds = 0.135f;
|
m_fJudgeWindowMineSeconds = 0.135f;
|
||||||
m_fLifeDifficultyScale = 1.0f;
|
m_fLifeDeltaMarvelousPercentChange = +0.008f;
|
||||||
|
m_fLifeDeltaPerfectPercentChange = +0.008f;
|
||||||
|
m_fLifeDeltaGreatPercentChange = +0.004f;
|
||||||
|
m_fLifeDeltaGoodPercentChange = +0.000f;
|
||||||
|
m_fLifeDeltaBooPercentChange = -0.040f;
|
||||||
|
m_fLifeDeltaMissPercentChange = -0.080f;
|
||||||
|
m_fLifeDeltaOKPercentChange = +0.008f;
|
||||||
|
m_fLifeDeltaNGPercentChange = -0.080f;
|
||||||
|
m_fLifeDeltaMinePercentChange = -0.160f;
|
||||||
m_iRegenComboAfterFail = 10; // cumulative
|
m_iRegenComboAfterFail = 10; // cumulative
|
||||||
m_iRegenComboAfterMiss = 5; // cumulative
|
m_iRegenComboAfterMiss = 5; // cumulative
|
||||||
m_iMaxRegenComboAfterFail = 10;
|
m_iMaxRegenComboAfterFail = 10;
|
||||||
@@ -224,6 +233,7 @@ void PrefsManager::ReadGlobalPrefsFromDisk()
|
|||||||
ini.GetValue( "Options", "EventMode", m_bEventMode );
|
ini.GetValue( "Options", "EventMode", m_bEventMode );
|
||||||
ini.GetValue( "Options", "AutoPlay", m_bAutoPlay );
|
ini.GetValue( "Options", "AutoPlay", m_bAutoPlay );
|
||||||
ini.GetValue( "Options", "JudgeWindowScale", m_fJudgeWindowScale );
|
ini.GetValue( "Options", "JudgeWindowScale", m_fJudgeWindowScale );
|
||||||
|
ini.GetValue( "Options", "LifeDifficultyScale", m_fLifeDifficultyScale );
|
||||||
ini.GetValue( "Options", "JudgeWindowMarvelousSeconds", m_fJudgeWindowMarvelousSeconds );
|
ini.GetValue( "Options", "JudgeWindowMarvelousSeconds", m_fJudgeWindowMarvelousSeconds );
|
||||||
ini.GetValue( "Options", "JudgeWindowPerfectSeconds", m_fJudgeWindowPerfectSeconds );
|
ini.GetValue( "Options", "JudgeWindowPerfectSeconds", m_fJudgeWindowPerfectSeconds );
|
||||||
ini.GetValue( "Options", "JudgeWindowGreatSeconds", m_fJudgeWindowGreatSeconds );
|
ini.GetValue( "Options", "JudgeWindowGreatSeconds", m_fJudgeWindowGreatSeconds );
|
||||||
@@ -231,7 +241,15 @@ void PrefsManager::ReadGlobalPrefsFromDisk()
|
|||||||
ini.GetValue( "Options", "JudgeWindowBooSeconds", m_fJudgeWindowBooSeconds );
|
ini.GetValue( "Options", "JudgeWindowBooSeconds", m_fJudgeWindowBooSeconds );
|
||||||
ini.GetValue( "Options", "JudgeWindowOKSeconds", m_fJudgeWindowOKSeconds );
|
ini.GetValue( "Options", "JudgeWindowOKSeconds", m_fJudgeWindowOKSeconds );
|
||||||
ini.GetValue( "Options", "JudgeWindowMineSeconds", m_fJudgeWindowMineSeconds );
|
ini.GetValue( "Options", "JudgeWindowMineSeconds", m_fJudgeWindowMineSeconds );
|
||||||
ini.GetValue( "Options", "LifeDifficultyScale", m_fLifeDifficultyScale );
|
ini.GetValue( "Options", "LifeDeltaMarvelousPercentChange", m_fLifeDeltaMarvelousPercentChange );
|
||||||
|
ini.GetValue( "Options", "LifeDeltaPerfectPercentChange", m_fLifeDeltaPerfectPercentChange );
|
||||||
|
ini.GetValue( "Options", "LifeDeltaGreatPercentChange", m_fLifeDeltaGreatPercentChange );
|
||||||
|
ini.GetValue( "Options", "LifeDeltaGoodPercentChange", m_fLifeDeltaGoodPercentChange );
|
||||||
|
ini.GetValue( "Options", "LifeDeltaBooPercentChange", m_fLifeDeltaBooPercentChange );
|
||||||
|
ini.GetValue( "Options", "LifeDeltaMissPercentChange", m_fLifeDeltaMissPercentChange );
|
||||||
|
ini.GetValue( "Options", "LifeDeltaOKPercentChange", m_fLifeDeltaOKPercentChange );
|
||||||
|
ini.GetValue( "Options", "LifeDeltaNGPercentChange", m_fLifeDeltaNGPercentChange );
|
||||||
|
ini.GetValue( "Options", "LifeDeltaMinePercentChange", m_fLifeDeltaMinePercentChange );
|
||||||
ini.GetValue( "Options", "RegenComboAfterFail", m_iRegenComboAfterFail );
|
ini.GetValue( "Options", "RegenComboAfterFail", m_iRegenComboAfterFail );
|
||||||
ini.GetValue( "Options", "RegenComboAfterMiss", m_iRegenComboAfterMiss );
|
ini.GetValue( "Options", "RegenComboAfterMiss", m_iRegenComboAfterMiss );
|
||||||
ini.GetValue( "Options", "MaxRegenComboAfterFail", m_iMaxRegenComboAfterFail );
|
ini.GetValue( "Options", "MaxRegenComboAfterFail", m_iMaxRegenComboAfterFail );
|
||||||
@@ -364,6 +382,7 @@ void PrefsManager::SaveGlobalPrefsToDisk() const
|
|||||||
ini.SetValue( "Options", "EventMode", m_bEventMode );
|
ini.SetValue( "Options", "EventMode", m_bEventMode );
|
||||||
ini.SetValue( "Options", "AutoPlay", m_bAutoPlay );
|
ini.SetValue( "Options", "AutoPlay", m_bAutoPlay );
|
||||||
ini.SetValue( "Options", "JudgeWindowScale", m_fJudgeWindowScale );
|
ini.SetValue( "Options", "JudgeWindowScale", m_fJudgeWindowScale );
|
||||||
|
ini.SetValue( "Options", "LifeDifficultyScale", m_fLifeDifficultyScale );
|
||||||
ini.SetValue( "Options", "JudgeWindowMarvelousSeconds", m_fJudgeWindowMarvelousSeconds );
|
ini.SetValue( "Options", "JudgeWindowMarvelousSeconds", m_fJudgeWindowMarvelousSeconds );
|
||||||
ini.SetValue( "Options", "JudgeWindowPerfectSeconds", m_fJudgeWindowPerfectSeconds );
|
ini.SetValue( "Options", "JudgeWindowPerfectSeconds", m_fJudgeWindowPerfectSeconds );
|
||||||
ini.SetValue( "Options", "JudgeWindowGreatSeconds", m_fJudgeWindowGreatSeconds );
|
ini.SetValue( "Options", "JudgeWindowGreatSeconds", m_fJudgeWindowGreatSeconds );
|
||||||
@@ -371,7 +390,15 @@ void PrefsManager::SaveGlobalPrefsToDisk() const
|
|||||||
ini.SetValue( "Options", "JudgeWindowBooSeconds", m_fJudgeWindowBooSeconds );
|
ini.SetValue( "Options", "JudgeWindowBooSeconds", m_fJudgeWindowBooSeconds );
|
||||||
ini.SetValue( "Options", "JudgeWindowOKSeconds", m_fJudgeWindowOKSeconds );
|
ini.SetValue( "Options", "JudgeWindowOKSeconds", m_fJudgeWindowOKSeconds );
|
||||||
ini.SetValue( "Options", "JudgeWindowMineSeconds", m_fJudgeWindowMineSeconds );
|
ini.SetValue( "Options", "JudgeWindowMineSeconds", m_fJudgeWindowMineSeconds );
|
||||||
ini.SetValue( "Options", "LifeDifficultyScale", m_fLifeDifficultyScale );
|
ini.SetValue( "Options", "LifeDeltaMarvelousPercentChange", m_fLifeDeltaMarvelousPercentChange );
|
||||||
|
ini.SetValue( "Options", "LifeDeltaPerfectPercentChange", m_fLifeDeltaPerfectPercentChange );
|
||||||
|
ini.SetValue( "Options", "LifeDeltaGreatPercentChange", m_fLifeDeltaGreatPercentChange );
|
||||||
|
ini.SetValue( "Options", "LifeDeltaGoodPercentChange", m_fLifeDeltaGoodPercentChange );
|
||||||
|
ini.SetValue( "Options", "LifeDeltaBooPercentChange", m_fLifeDeltaBooPercentChange );
|
||||||
|
ini.SetValue( "Options", "LifeDeltaMissPercentChange", m_fLifeDeltaMissPercentChange );
|
||||||
|
ini.SetValue( "Options", "LifeDeltaOKPercentChange", m_fLifeDeltaOKPercentChange );
|
||||||
|
ini.SetValue( "Options", "LifeDeltaNGPercentChange", m_fLifeDeltaNGPercentChange );
|
||||||
|
ini.SetValue( "Options", "LifeDeltaMinePercentChange", m_fLifeDeltaMinePercentChange );
|
||||||
ini.SetValue( "Options", "RegenComboAfterFail", m_iRegenComboAfterFail );
|
ini.SetValue( "Options", "RegenComboAfterFail", m_iRegenComboAfterFail );
|
||||||
ini.SetValue( "Options", "RegenComboAfterMiss", m_iRegenComboAfterMiss );
|
ini.SetValue( "Options", "RegenComboAfterMiss", m_iRegenComboAfterMiss );
|
||||||
ini.SetValue( "Options", "MaxRegenComboAfterFail", m_iMaxRegenComboAfterFail );
|
ini.SetValue( "Options", "MaxRegenComboAfterFail", m_iMaxRegenComboAfterFail );
|
||||||
|
|||||||
@@ -57,6 +57,15 @@ public:
|
|||||||
float m_fJudgeWindowBooSeconds;
|
float m_fJudgeWindowBooSeconds;
|
||||||
float m_fJudgeWindowOKSeconds;
|
float m_fJudgeWindowOKSeconds;
|
||||||
float m_fJudgeWindowMineSeconds;
|
float m_fJudgeWindowMineSeconds;
|
||||||
|
float m_fLifeDeltaMarvelousPercentChange;
|
||||||
|
float m_fLifeDeltaPerfectPercentChange;
|
||||||
|
float m_fLifeDeltaGreatPercentChange;
|
||||||
|
float m_fLifeDeltaGoodPercentChange;
|
||||||
|
float m_fLifeDeltaBooPercentChange;
|
||||||
|
float m_fLifeDeltaMissPercentChange;
|
||||||
|
float m_fLifeDeltaOKPercentChange;
|
||||||
|
float m_fLifeDeltaNGPercentChange;
|
||||||
|
float m_fLifeDeltaMinePercentChange;
|
||||||
int m_iRegenComboAfterFail;
|
int m_iRegenComboAfterFail;
|
||||||
int m_iRegenComboAfterMiss;
|
int m_iRegenComboAfterMiss;
|
||||||
int m_iMaxRegenComboAfterFail;
|
int m_iMaxRegenComboAfterFail;
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ Grade StageStats::GetGrade( PlayerNumber pn )
|
|||||||
|
|
||||||
float Possible = 0, Actual = 0;
|
float Possible = 0, Actual = 0;
|
||||||
int i;
|
int i;
|
||||||
for( i = TNS_MISS; i < NUM_TAP_NOTE_SCORES; ++i )
|
for( i = 0; i < NUM_TAP_NOTE_SCORES; ++i )
|
||||||
{
|
{
|
||||||
Actual += iTapNoteScores[pn][i] * TapScoreValues[i];
|
Actual += iTapNoteScores[pn][i] * TapScoreValues[i];
|
||||||
Possible += iTapNoteScores[pn][i] * TapScoreValues[TNS_MARVELOUS];
|
Possible += iTapNoteScores[pn][i] * TapScoreValues[TNS_MARVELOUS];
|
||||||
|
|||||||
Reference in New Issue
Block a user