simplify mine scoring
add separate dance point weights for mines
This commit is contained in:
@@ -33,6 +33,7 @@ HoldTailIsAboveWavyParts=1
|
|||||||
|
|
||||||
[GhostArrowDim]
|
[GhostArrowDim]
|
||||||
NoneCommand=
|
NoneCommand=
|
||||||
|
HitMineCommand=blend,add;diffuse,1,1,1,1;zoom,1;rotationz,0;linear,0.3;rotationz,90;linear,0.3;rotationz,180;diffusealpha,0
|
||||||
MissCommand=
|
MissCommand=
|
||||||
BooCommand=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
BooCommand=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
||||||
GoodCommand=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
GoodCommand=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
||||||
@@ -42,19 +43,10 @@ MarvelousCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;d
|
|||||||
|
|
||||||
[GhostArrowBright]
|
[GhostArrowBright]
|
||||||
NoneCommand=
|
NoneCommand=
|
||||||
|
HitMineCommand=blend,add;diffuse,1,1,1,1;zoom,1;rotationz,0;linear,0.3;rotationz,90;linear,0.3;rotationz,180;diffusealpha,0
|
||||||
MissCommand=
|
MissCommand=
|
||||||
BooCommand=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
BooCommand=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
||||||
GoodCommand=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
GoodCommand=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
||||||
GreatCommand=diffuse,0.0,1.0,0.4,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
GreatCommand=diffuse,0.0,1.0,0.4,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
||||||
PerfectCommand=diffuse,1.0,1.0,0.3,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
PerfectCommand=diffuse,1.0,1.0,0.3,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
||||||
MarvelousCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
MarvelousCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
|
||||||
|
|
||||||
[GhostArrowMine]
|
|
||||||
NoneCommand=
|
|
||||||
MissCommand=blend,add;diffuse,1,1,1,1;zoom,1;rotationz,0;linear,0.3;rotationz,90;linear,0.3;rotationz,180;diffusealpha,0
|
|
||||||
BooCommand=
|
|
||||||
GoodCommand=
|
|
||||||
GreatCommand=
|
|
||||||
PerfectCommand=
|
|
||||||
MarvelousCommand=
|
|
||||||
|
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, HoldNoteScore score, Tap
|
|||||||
|
|
||||||
void CombinedLifeMeterTug::ChangeLifeMine( PlayerNumber pn )
|
void CombinedLifeMeterTug::ChangeLifeMine( PlayerNumber pn )
|
||||||
{
|
{
|
||||||
float fPercentToMove = PREFSMAN->m_fLifeDeltaMinePercentChange;
|
float fPercentToMove = PREFSMAN->m_fLifeDeltaHitMinePercentChange;
|
||||||
switch( pn )
|
switch( pn )
|
||||||
{
|
{
|
||||||
case PLAYER_1: GAMESTATE->m_fTugLifePercentP1 += fPercentToMove; break;
|
case PLAYER_1: GAMESTATE->m_fTugLifePercentP1 += fPercentToMove; break;
|
||||||
|
|||||||
@@ -154,14 +154,15 @@ CString TapNoteScoreToString( TapNoteScore tns )
|
|||||||
{
|
{
|
||||||
switch( tns )
|
switch( tns )
|
||||||
{
|
{
|
||||||
case TNS_NONE: return "none";
|
case TNS_NONE: return "None";
|
||||||
case TNS_MISS: return "miss";
|
case TNS_HIT_MINE: return "HitMine";
|
||||||
case TNS_BOO: return "boo";
|
case TNS_MISS: return "Miss";
|
||||||
case TNS_GOOD: return "good";
|
case TNS_BOO: return "Boo";
|
||||||
case TNS_GREAT: return "great";
|
case TNS_GOOD: return "Good";
|
||||||
case TNS_PERFECT: return "perfect";
|
case TNS_GREAT: return "Great";
|
||||||
case TNS_MARVELOUS: return "marvelous";
|
case TNS_PERFECT: return "Perfect";
|
||||||
default: ASSERT(0); return ""; // invalid Difficulty
|
case TNS_MARVELOUS: return "Marvelous";
|
||||||
|
default: ASSERT(0); return ""; // invalid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -157,6 +157,7 @@ SongSortOrder StringToSongSortOrder( CString str );
|
|||||||
|
|
||||||
enum TapNoteScore {
|
enum TapNoteScore {
|
||||||
TNS_NONE,
|
TNS_NONE,
|
||||||
|
TNS_HIT_MINE,
|
||||||
TNS_MISS,
|
TNS_MISS,
|
||||||
TNS_BOO,
|
TNS_BOO,
|
||||||
TNS_GOOD,
|
TNS_GOOD,
|
||||||
|
|||||||
@@ -44,17 +44,14 @@ void GhostArrowRow::Load( PlayerNumber pn, CString NoteSkin, float fYReverseOffs
|
|||||||
|
|
||||||
m_GhostDim[c].SetName( "GhostArrowDim" );
|
m_GhostDim[c].SetName( "GhostArrowDim" );
|
||||||
m_GhostBright[c].SetName( "GhostArrowBright" );
|
m_GhostBright[c].SetName( "GhostArrowBright" );
|
||||||
m_GhostMine[c].SetName( "GhostArrowMine" );
|
|
||||||
m_HoldGhost[c].SetName( "HoldGhostArrow" );
|
m_HoldGhost[c].SetName( "HoldGhostArrow" );
|
||||||
|
|
||||||
m_GhostDim[c].Init( pn );
|
m_GhostDim[c].Init( pn );
|
||||||
m_GhostBright[c].Init( pn );
|
m_GhostBright[c].Init( pn );
|
||||||
m_GhostMine[c].Init( pn );
|
|
||||||
//m_HoldGhost[c].Init( pn );
|
//m_HoldGhost[c].Init( pn );
|
||||||
|
|
||||||
m_GhostDim[c].Load( NoteSkin, Button, "tap explosion dim", false);
|
m_GhostDim[c].Load( NoteSkin, Button, "tap explosion dim", false);
|
||||||
m_GhostBright[c].Load( NoteSkin, Button, "tap explosion bright", false );
|
m_GhostBright[c].Load( NoteSkin, Button, "tap explosion bright", false );
|
||||||
m_GhostMine[c].Load( NoteSkin, Button, "tap explosion mine", true );
|
|
||||||
m_HoldGhost[c].Load( NoteSkin, Button, "hold explosion" );
|
m_HoldGhost[c].Load( NoteSkin, Button, "hold explosion" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -66,7 +63,6 @@ void GhostArrowRow::Update( float fDeltaTime )
|
|||||||
{
|
{
|
||||||
m_GhostDim[c].Update( fDeltaTime );
|
m_GhostDim[c].Update( fDeltaTime );
|
||||||
m_GhostBright[c].Update( fDeltaTime );
|
m_GhostBright[c].Update( fDeltaTime );
|
||||||
m_GhostMine[c].Update( fDeltaTime );
|
|
||||||
m_HoldGhost[c].Update( fDeltaTime );
|
m_HoldGhost[c].Update( fDeltaTime );
|
||||||
|
|
||||||
const float fX = ArrowGetXPos( m_PlayerNumber, c, 0 );
|
const float fX = ArrowGetXPos( m_PlayerNumber, c, 0 );
|
||||||
@@ -75,17 +71,14 @@ void GhostArrowRow::Update( float fDeltaTime )
|
|||||||
|
|
||||||
m_GhostDim[c].SetX( fX );
|
m_GhostDim[c].SetX( fX );
|
||||||
m_GhostBright[c].SetX( fX );
|
m_GhostBright[c].SetX( fX );
|
||||||
m_GhostMine[c].SetX( fX );
|
|
||||||
m_HoldGhost[c].SetX( fX );
|
m_HoldGhost[c].SetX( fX );
|
||||||
|
|
||||||
m_GhostDim[c].SetY( fY );
|
m_GhostDim[c].SetY( fY );
|
||||||
m_GhostBright[c].SetY( fY );
|
m_GhostBright[c].SetY( fY );
|
||||||
m_GhostMine[c].SetY( fY );
|
|
||||||
m_HoldGhost[c].SetY( fY );
|
m_HoldGhost[c].SetY( fY );
|
||||||
|
|
||||||
m_GhostDim[c].SetZ( fZ );
|
m_GhostDim[c].SetZ( fZ );
|
||||||
m_GhostBright[c].SetZ( fZ );
|
m_GhostBright[c].SetZ( fZ );
|
||||||
m_GhostMine[c].SetZ( fZ );
|
|
||||||
m_HoldGhost[c].SetZ( fZ );
|
m_HoldGhost[c].SetZ( fZ );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -98,7 +91,6 @@ void GhostArrowRow::DrawPrimitives()
|
|||||||
|
|
||||||
m_GhostDim[c].Draw();
|
m_GhostDim[c].Draw();
|
||||||
m_GhostBright[c].Draw();
|
m_GhostBright[c].Draw();
|
||||||
m_GhostMine[c].Draw();
|
|
||||||
m_HoldGhost[c].Draw();
|
m_HoldGhost[c].Draw();
|
||||||
|
|
||||||
g_NoteFieldMode[m_PlayerNumber].EndDrawTrack(c);
|
g_NoteFieldMode[m_PlayerNumber].EndDrawTrack(c);
|
||||||
@@ -121,19 +113,12 @@ void GhostArrowRow::SetHoldIsActive( int iCol )
|
|||||||
m_HoldGhost[iCol].SetHoldIsActive( true );
|
m_HoldGhost[iCol].SetHoldIsActive( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
void GhostArrowRow::DidTapMine( int iCol, TapNoteScore score )
|
|
||||||
{
|
|
||||||
m_GhostMine[iCol].Step( score );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GhostArrowRow::CopyTweening( const GhostArrowRow &from )
|
void GhostArrowRow::CopyTweening( const GhostArrowRow &from )
|
||||||
{
|
{
|
||||||
for( int c=0; c<m_iNumCols; c++ )
|
for( int c=0; c<m_iNumCols; c++ )
|
||||||
{
|
{
|
||||||
m_GhostDim[c].CopyTweening( from.m_GhostDim[c] );
|
m_GhostDim[c].CopyTweening( from.m_GhostDim[c] );
|
||||||
m_GhostBright[c].CopyTweening( from.m_GhostBright[c] );
|
m_GhostBright[c].CopyTweening( from.m_GhostBright[c] );
|
||||||
m_GhostMine[c].CopyTweening( from.m_GhostMine[c] );
|
|
||||||
m_HoldGhost[c].CopyTweening( from.m_HoldGhost[c] );
|
m_HoldGhost[c].CopyTweening( from.m_HoldGhost[c] );
|
||||||
}
|
}
|
||||||
ActorFrame::CopyTweening( from );
|
ActorFrame::CopyTweening( from );
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ public:
|
|||||||
void Load( PlayerNumber pn, CString NoteSkin, float fYReverseOffset );
|
void Load( PlayerNumber pn, CString NoteSkin, float fYReverseOffset );
|
||||||
|
|
||||||
void DidTapNote( int iCol, TapNoteScore score, bool bBright );
|
void DidTapNote( int iCol, TapNoteScore score, bool bBright );
|
||||||
void DidTapMine( int iCol, TapNoteScore score );
|
|
||||||
void SetHoldIsActive( int iCol );
|
void SetHoldIsActive( int iCol );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -40,7 +39,6 @@ protected:
|
|||||||
|
|
||||||
GhostArrow m_GhostDim[MAX_NOTE_TRACKS];
|
GhostArrow m_GhostDim[MAX_NOTE_TRACKS];
|
||||||
GhostArrow m_GhostBright[MAX_NOTE_TRACKS];
|
GhostArrow m_GhostBright[MAX_NOTE_TRACKS];
|
||||||
GhostArrow m_GhostMine[MAX_NOTE_TRACKS];
|
|
||||||
HoldGhostArrow m_HoldGhost[MAX_NOTE_TRACKS];
|
HoldGhostArrow m_HoldGhost[MAX_NOTE_TRACKS];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -448,12 +448,12 @@ void LifeMeterBar::ChangeLifeMine()
|
|||||||
switch( GAMESTATE->m_SongOptions.m_DrainType )
|
switch( GAMESTATE->m_SongOptions.m_DrainType )
|
||||||
{
|
{
|
||||||
case SongOptions::DRAIN_NORMAL:
|
case SongOptions::DRAIN_NORMAL:
|
||||||
fDeltaLife = PREFSMAN->m_fLifeDeltaMinePercentChange;
|
fDeltaLife = PREFSMAN->m_fLifeDeltaHitMinePercentChange;
|
||||||
if( IsHot() )
|
if( IsHot() )
|
||||||
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;
|
break;
|
||||||
case SongOptions::DRAIN_NO_RECOVER:
|
case SongOptions::DRAIN_NO_RECOVER:
|
||||||
fDeltaLife = PREFSMAN->m_fLifeDeltaMinePercentChange;
|
fDeltaLife = PREFSMAN->m_fLifeDeltaHitMinePercentChange;
|
||||||
break;
|
break;
|
||||||
case SongOptions::DRAIN_SUDDEN_DEATH:
|
case SongOptions::DRAIN_SUDDEN_DEATH:
|
||||||
fDeltaLife = -1.0;
|
fDeltaLife = -1.0;
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ int NoteDataWithScoring::GetSuccessfulMines( float fStartBeat, float fEndBeat )
|
|||||||
{
|
{
|
||||||
for( int t=0; t<GetNumTracks(); t++ )
|
for( int t=0; t<GetNumTracks(); t++ )
|
||||||
{
|
{
|
||||||
if( this->GetTapNote(t, i) == TAP_MINE && GetTapNoteScore(t, i) != TNS_MISS )
|
if( this->GetTapNote(t, i) == TAP_MINE && GetTapNoteScore(t, i) != TNS_HIT_MINE )
|
||||||
iNumSuccessfulMinesNotes++;
|
iNumSuccessfulMinesNotes++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -656,4 +656,3 @@ void NoteField::Step( int iCol ) { SearchForSongBeat()->m_ReceptorArrowRow.Step(
|
|||||||
void NoteField::SetPressed( int iCol ) { SearchForSongBeat()->m_ReceptorArrowRow.SetPressed( iCol ); }
|
void NoteField::SetPressed( int iCol ) { SearchForSongBeat()->m_ReceptorArrowRow.SetPressed( iCol ); }
|
||||||
void NoteField::DidTapNote( int iCol, TapNoteScore score, bool bBright ) { SearchForSongBeat()->m_GhostArrowRow.DidTapNote( iCol, score, bBright ); }
|
void NoteField::DidTapNote( int iCol, TapNoteScore score, bool bBright ) { SearchForSongBeat()->m_GhostArrowRow.DidTapNote( iCol, score, bBright ); }
|
||||||
void NoteField::DidHoldNote( int iCol ) { /*SearchForSongBeat()->m_GhostArrowRow.DidHoldNote( iCol );*/ }
|
void NoteField::DidHoldNote( int iCol ) { /*SearchForSongBeat()->m_GhostArrowRow.DidHoldNote( iCol );*/ }
|
||||||
void NoteField::DidTapMine( int iCol, TapNoteScore score ) { SearchForSongBeat()->m_GhostArrowRow.DidTapMine( iCol, score ); }
|
|
||||||
|
|||||||
@@ -52,7 +52,6 @@ public:
|
|||||||
void SetPressed( int iCol );
|
void SetPressed( int iCol );
|
||||||
void DidTapNote( int iCol, TapNoteScore score, bool bBright );
|
void DidTapNote( int iCol, TapNoteScore score, bool bBright );
|
||||||
void DidHoldNote( int iCol );
|
void DidHoldNote( int iCol );
|
||||||
void DidTapMine( int iCol, TapNoteScore score );
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
+22
-25
@@ -605,7 +605,7 @@ void PlayerMinus::Step( int col, RageTimer tm )
|
|||||||
TapNote tn = GetTapNote(col,iIndexOverlappingNote);
|
TapNote tn = GetTapNote(col,iIndexOverlappingNote);
|
||||||
|
|
||||||
// calculate TapNoteScore
|
// calculate TapNoteScore
|
||||||
TapNoteScore score;
|
TapNoteScore score = TNS_NONE;
|
||||||
|
|
||||||
switch( GAMESTATE->m_PlayerController[m_PlayerNumber] )
|
switch( GAMESTATE->m_PlayerController[m_PlayerNumber] )
|
||||||
{
|
{
|
||||||
@@ -644,18 +644,14 @@ void PlayerMinus::Step( int col, RageTimer tm )
|
|||||||
if( fScaledSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowMineSeconds )
|
if( fScaledSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowMineSeconds )
|
||||||
{
|
{
|
||||||
m_soundMine.Play();
|
m_soundMine.Play();
|
||||||
score = TNS_MISS;
|
score = TNS_HIT_MINE;
|
||||||
m_pNoteField->DidTapMine( col, score );
|
|
||||||
|
|
||||||
if( m_pLifeMeter )
|
if( m_pLifeMeter )
|
||||||
m_pLifeMeter->ChangeLifeMine();
|
m_pLifeMeter->ChangeLifeMine();
|
||||||
if( m_pCombinedLifeMeter )
|
if( m_pCombinedLifeMeter )
|
||||||
m_pCombinedLifeMeter->ChangeLifeMine(m_PlayerNumber);
|
m_pCombinedLifeMeter->ChangeLifeMine(m_PlayerNumber);
|
||||||
m_pNoteField->SetTapNote(col, iIndexOverlappingNote, TAP_EMPTY); // remove from NoteField
|
m_pNoteField->SetTapNote(col, iIndexOverlappingNote, TAP_EMPTY); // remove from NoteField
|
||||||
}
|
m_pNoteField->DidTapNote( col, score, false );
|
||||||
else
|
|
||||||
{
|
|
||||||
score = TNS_NONE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -744,14 +740,14 @@ void PlayerMinus::Step( int col, RageTimer tm )
|
|||||||
// Unless the computer made a very good step, they were fooled by the mine
|
// Unless the computer made a very good step, they were fooled by the mine
|
||||||
if( tn == TAP_MINE && score <= TNS_GOOD )
|
if( tn == TAP_MINE && score <= TNS_GOOD )
|
||||||
{
|
{
|
||||||
|
score = TNS_HIT_MINE;
|
||||||
m_soundMine.Play();
|
m_soundMine.Play();
|
||||||
score = TNS_MISS;
|
|
||||||
m_pNoteField->DidTapMine( col, score );
|
|
||||||
if( m_pLifeMeter )
|
if( m_pLifeMeter )
|
||||||
m_pLifeMeter->ChangeLifeMine();
|
m_pLifeMeter->ChangeLifeMine();
|
||||||
if( m_pCombinedLifeMeter )
|
if( m_pCombinedLifeMeter )
|
||||||
m_pCombinedLifeMeter->ChangeLifeMine(m_PlayerNumber);
|
m_pCombinedLifeMeter->ChangeLifeMine(m_PlayerNumber);
|
||||||
m_pNoteField->SetTapNote(col, iIndexOverlappingNote, TAP_EMPTY); // remove from NoteField
|
m_pNoteField->SetTapNote(col, iIndexOverlappingNote, TAP_EMPTY); // remove from NoteField
|
||||||
|
m_pNoteField->DidTapNote( col, score, false );
|
||||||
}
|
}
|
||||||
if( IsTapAttack(tn) && score > TNS_GOOD )
|
if( IsTapAttack(tn) && score > TNS_GOOD )
|
||||||
{
|
{
|
||||||
@@ -842,6 +838,10 @@ void PlayerMinus::Step( int col, RageTimer tm )
|
|||||||
score >= TNS_GREAT )
|
score >= TNS_GREAT )
|
||||||
HandleAutosync(fNoteOffset);
|
HandleAutosync(fNoteOffset);
|
||||||
|
|
||||||
|
if( m_pPrimaryScoreKeeper )
|
||||||
|
m_pPrimaryScoreKeeper->HandleTapScore( score );
|
||||||
|
if( m_pSecondaryScoreKeeper )
|
||||||
|
m_pSecondaryScoreKeeper->HandleTapScore( score );
|
||||||
|
|
||||||
if( IsThereATapOrHoldHeadAtRow(iIndexOverlappingNote) ) // don't judge rows that are only mines
|
if( IsThereATapOrHoldHeadAtRow(iIndexOverlappingNote) ) // don't judge rows that are only mines
|
||||||
{
|
{
|
||||||
@@ -906,9 +906,16 @@ void PlayerMinus::OnRowCompletelyJudged( int iIndexThatWasSteppedOn )
|
|||||||
* slightly more harsh scoring than DDR */
|
* slightly more harsh scoring than DDR */
|
||||||
/* I'm not sure this is right, either. Can you really jump a boo and a perfect
|
/* I'm not sure this is right, either. Can you really jump a boo and a perfect
|
||||||
* and get scored for a perfect? (That's so loose, you can gallop jumps.) -glenn */
|
* and get scored for a perfect? (That's so loose, you can gallop jumps.) -glenn */
|
||||||
|
/* Instead of grading individual columns, DDR sets a "was pressed recently"
|
||||||
|
* countdown every time you step on a column. When you step on the first note of
|
||||||
|
* the jump, it sets the first "was pressed recently" timer. Then, when you do
|
||||||
|
* the 2nd step of the jump, it sets another column's timer then AND's the jump
|
||||||
|
* columns with the "was pressed recently" columns to see whether or not you hit
|
||||||
|
* all the columns of the jump. -Chris */
|
||||||
// TapNoteScore score = MinTapNoteScore(iIndexThatWasSteppedOn);
|
// TapNoteScore score = MinTapNoteScore(iIndexThatWasSteppedOn);
|
||||||
TapNoteScore score = LastTapNoteScore(iIndexThatWasSteppedOn);
|
TapNoteScore score = LastTapNoteScore(iIndexThatWasSteppedOn);
|
||||||
ASSERT(score != TNS_NONE);
|
ASSERT(score != TNS_NONE);
|
||||||
|
ASSERT(score != TNS_HIT_MINE);
|
||||||
|
|
||||||
/* If the whole row was hit with perfects or greats, remove the row
|
/* If the whole row was hit with perfects or greats, remove the row
|
||||||
* from the NoteField, so it disappears. */
|
* from the NoteField, so it disappears. */
|
||||||
@@ -1027,7 +1034,7 @@ void PlayerMinus::CrossedRow( int iNoteRow )
|
|||||||
// Hold the panel while crossing a mine will cause the mine to explode
|
// Hold the panel while crossing a mine will cause the mine to explode
|
||||||
for( int t=0; t<GetNumTracks(); t++ )
|
for( int t=0; t<GetNumTracks(); t++ )
|
||||||
{
|
{
|
||||||
if( GetTapNote(t, iNoteRow) == TAP_MINE )
|
if( GetTapNote(t,iNoteRow) == TAP_MINE )
|
||||||
{
|
{
|
||||||
const StyleInput StyleI( m_PlayerNumber, t );
|
const StyleInput StyleI( m_PlayerNumber, t );
|
||||||
const GameInput GameI = GAMESTATE->GetCurrentStyleDef()->StyleInputToGameInput( StyleI );
|
const GameInput GameI = GAMESTATE->GetCurrentStyleDef()->StyleInputToGameInput( StyleI );
|
||||||
@@ -1065,18 +1072,7 @@ void PlayerMinus::RandomiseNotes( int iNoteRow )
|
|||||||
void PlayerMinus::HandleTapRowScore( unsigned row )
|
void PlayerMinus::HandleTapRowScore( unsigned row )
|
||||||
{
|
{
|
||||||
TapNoteScore scoreOfLastTap = LastTapNoteScore(row);
|
TapNoteScore scoreOfLastTap = LastTapNoteScore(row);
|
||||||
|
int iNumTapsInRow = this->GetNumTracksWithTapOrHoldHead(row);
|
||||||
int iNumTapsInRow = 0;
|
|
||||||
int iNumAdditions = 0;
|
|
||||||
for( int t=0; t<GetNumTracks(); t++ ) // for each column
|
|
||||||
{
|
|
||||||
TapNote tn = GetTapNote(t, row);
|
|
||||||
if( tn != TAP_EMPTY )
|
|
||||||
iNumTapsInRow++;
|
|
||||||
if( tn == TAP_ADDITION )
|
|
||||||
iNumAdditions++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT(iNumTapsInRow > 0);
|
ASSERT(iNumTapsInRow > 0);
|
||||||
|
|
||||||
bool NoCheating = true;
|
bool NoCheating = true;
|
||||||
@@ -1111,16 +1107,17 @@ void PlayerMinus::HandleTapRowScore( unsigned row )
|
|||||||
|
|
||||||
iCurCombo = 0;
|
iCurCombo = 0;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The score keeper updates the hit combo. Remember the old combo for handling announcers. */
|
/* The score keeper updates the hit combo. Remember the old combo for handling announcers. */
|
||||||
const int iOldCombo = g_CurStageStats.iCurCombo[m_PlayerNumber];
|
const int iOldCombo = g_CurStageStats.iCurCombo[m_PlayerNumber];
|
||||||
|
|
||||||
if(m_pPrimaryScoreKeeper)
|
if(m_pPrimaryScoreKeeper)
|
||||||
m_pPrimaryScoreKeeper->HandleTapRowScore(scoreOfLastTap, iNumTapsInRow, iNumAdditions );
|
m_pPrimaryScoreKeeper->HandleTapRowScore(scoreOfLastTap, iNumTapsInRow );
|
||||||
|
|
||||||
if(m_pSecondaryScoreKeeper)
|
if(m_pSecondaryScoreKeeper)
|
||||||
m_pSecondaryScoreKeeper->HandleTapRowScore(scoreOfLastTap, iNumTapsInRow, iNumAdditions );
|
m_pSecondaryScoreKeeper->HandleTapRowScore(scoreOfLastTap, iNumTapsInRow );
|
||||||
|
|
||||||
m_Combo.SetCombo( g_CurStageStats.iCurCombo[m_PlayerNumber] );
|
m_Combo.SetCombo( g_CurStageStats.iCurCombo[m_PlayerNumber] );
|
||||||
|
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ PrefsManager::PrefsManager()
|
|||||||
m_fLifeDeltaMissPercentChange = -0.080f;
|
m_fLifeDeltaMissPercentChange = -0.080f;
|
||||||
m_fLifeDeltaOKPercentChange = +0.008f;
|
m_fLifeDeltaOKPercentChange = +0.008f;
|
||||||
m_fLifeDeltaNGPercentChange = -0.080f;
|
m_fLifeDeltaNGPercentChange = -0.080f;
|
||||||
m_fLifeDeltaMinePercentChange = -0.160f;
|
m_fLifeDeltaHitMinePercentChange = -0.160f;
|
||||||
m_iRegenComboAfterFail = 10; // cumulative
|
m_iRegenComboAfterFail = 10; // cumulative
|
||||||
m_iRegenComboAfterMiss = 5; // cumulative
|
m_iRegenComboAfterMiss = 5; // cumulative
|
||||||
m_iMaxRegenComboAfterFail = 10;
|
m_iMaxRegenComboAfterFail = 10;
|
||||||
@@ -93,6 +93,7 @@ PrefsManager::PrefsManager()
|
|||||||
m_iPercentScoreMissWeight = 0;
|
m_iPercentScoreMissWeight = 0;
|
||||||
m_iPercentScoreOKWeight = 3;
|
m_iPercentScoreOKWeight = 3;
|
||||||
m_iPercentScoreNGWeight = 0;
|
m_iPercentScoreNGWeight = 0;
|
||||||
|
m_iPercentScoreHitMineWeight = -2;
|
||||||
m_iGradeMarvelousWeight = 2;
|
m_iGradeMarvelousWeight = 2;
|
||||||
m_iGradePerfectWeight = 2;
|
m_iGradePerfectWeight = 2;
|
||||||
m_iGradeGreatWeight = 1;
|
m_iGradeGreatWeight = 1;
|
||||||
@@ -101,6 +102,7 @@ PrefsManager::PrefsManager()
|
|||||||
m_iGradeMissWeight = -8;
|
m_iGradeMissWeight = -8;
|
||||||
m_iGradeOKWeight = 6;
|
m_iGradeOKWeight = 6;
|
||||||
m_iGradeNGWeight = 0;
|
m_iGradeNGWeight = 0;
|
||||||
|
m_iPercentScoreHitMineWeight = -8;
|
||||||
m_fGradePercentAA = 0.93f;
|
m_fGradePercentAA = 0.93f;
|
||||||
m_fGradePercentA = 0.80f;
|
m_fGradePercentA = 0.80f;
|
||||||
m_fGradePercentB = 0.65f;
|
m_fGradePercentB = 0.65f;
|
||||||
@@ -303,7 +305,7 @@ void PrefsManager::ReadGlobalPrefsFromDisk()
|
|||||||
ini.GetValue( "Options", "LifeDeltaMissPercentChange", m_fLifeDeltaMissPercentChange );
|
ini.GetValue( "Options", "LifeDeltaMissPercentChange", m_fLifeDeltaMissPercentChange );
|
||||||
ini.GetValue( "Options", "LifeDeltaOKPercentChange", m_fLifeDeltaOKPercentChange );
|
ini.GetValue( "Options", "LifeDeltaOKPercentChange", m_fLifeDeltaOKPercentChange );
|
||||||
ini.GetValue( "Options", "LifeDeltaNGPercentChange", m_fLifeDeltaNGPercentChange );
|
ini.GetValue( "Options", "LifeDeltaNGPercentChange", m_fLifeDeltaNGPercentChange );
|
||||||
ini.GetValue( "Options", "LifeDeltaMinePercentChange", m_fLifeDeltaMinePercentChange );
|
ini.GetValue( "Options", "LifeDeltaHitMinePercentChange", m_fLifeDeltaHitMinePercentChange );
|
||||||
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 );
|
||||||
@@ -318,6 +320,7 @@ void PrefsManager::ReadGlobalPrefsFromDisk()
|
|||||||
ini.GetValue( "Options", "PercentScoreMissWeight", m_iPercentScoreMissWeight );
|
ini.GetValue( "Options", "PercentScoreMissWeight", m_iPercentScoreMissWeight );
|
||||||
ini.GetValue( "Options", "PercentScoreOKWeight", m_iPercentScoreOKWeight );
|
ini.GetValue( "Options", "PercentScoreOKWeight", m_iPercentScoreOKWeight );
|
||||||
ini.GetValue( "Options", "PercentScoreNGWeight", m_iPercentScoreNGWeight );
|
ini.GetValue( "Options", "PercentScoreNGWeight", m_iPercentScoreNGWeight );
|
||||||
|
ini.GetValue( "Options", "PercentScoreHitMineWeight", m_iPercentScoreHitMineWeight );
|
||||||
ini.GetValue( "Options", "GradeMarvelousWeight", m_iGradeMarvelousWeight );
|
ini.GetValue( "Options", "GradeMarvelousWeight", m_iGradeMarvelousWeight );
|
||||||
ini.GetValue( "Options", "GradePerfectWeight", m_iGradePerfectWeight );
|
ini.GetValue( "Options", "GradePerfectWeight", m_iGradePerfectWeight );
|
||||||
ini.GetValue( "Options", "GradeGreatWeight", m_iGradeGreatWeight );
|
ini.GetValue( "Options", "GradeGreatWeight", m_iGradeGreatWeight );
|
||||||
@@ -326,6 +329,7 @@ void PrefsManager::ReadGlobalPrefsFromDisk()
|
|||||||
ini.GetValue( "Options", "GradeMissWeight", m_iGradeMissWeight );
|
ini.GetValue( "Options", "GradeMissWeight", m_iGradeMissWeight );
|
||||||
ini.GetValue( "Options", "GradeOKWeight", m_iGradeOKWeight );
|
ini.GetValue( "Options", "GradeOKWeight", m_iGradeOKWeight );
|
||||||
ini.GetValue( "Options", "GradeNGWeight", m_iGradeNGWeight );
|
ini.GetValue( "Options", "GradeNGWeight", m_iGradeNGWeight );
|
||||||
|
ini.GetValue( "Options", "GradeHitMineWeight", m_iPercentScoreHitMineWeight );
|
||||||
ini.GetValue( "Options", "GradePercentAA", m_fGradePercentAA );
|
ini.GetValue( "Options", "GradePercentAA", m_fGradePercentAA );
|
||||||
ini.GetValue( "Options", "GradePercentA", m_fGradePercentA );
|
ini.GetValue( "Options", "GradePercentA", m_fGradePercentA );
|
||||||
ini.GetValue( "Options", "GradePercentB", m_fGradePercentB );
|
ini.GetValue( "Options", "GradePercentB", m_fGradePercentB );
|
||||||
@@ -484,7 +488,7 @@ void PrefsManager::SaveGlobalPrefsToDisk() const
|
|||||||
ini.SetValue( "Options", "LifeDeltaMissPercentChange", m_fLifeDeltaMissPercentChange );
|
ini.SetValue( "Options", "LifeDeltaMissPercentChange", m_fLifeDeltaMissPercentChange );
|
||||||
ini.SetValue( "Options", "LifeDeltaOKPercentChange", m_fLifeDeltaOKPercentChange );
|
ini.SetValue( "Options", "LifeDeltaOKPercentChange", m_fLifeDeltaOKPercentChange );
|
||||||
ini.SetValue( "Options", "LifeDeltaNGPercentChange", m_fLifeDeltaNGPercentChange );
|
ini.SetValue( "Options", "LifeDeltaNGPercentChange", m_fLifeDeltaNGPercentChange );
|
||||||
ini.SetValue( "Options", "LifeDeltaMinePercentChange", m_fLifeDeltaMinePercentChange );
|
ini.SetValue( "Options", "LifeDeltaHitMinePercentChange", m_fLifeDeltaHitMinePercentChange );
|
||||||
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 );
|
||||||
@@ -499,6 +503,7 @@ void PrefsManager::SaveGlobalPrefsToDisk() const
|
|||||||
ini.SetValue( "Options", "PercentScoreMissWeight", m_iPercentScoreMissWeight );
|
ini.SetValue( "Options", "PercentScoreMissWeight", m_iPercentScoreMissWeight );
|
||||||
ini.SetValue( "Options", "PercentScoreOKWeight", m_iPercentScoreOKWeight );
|
ini.SetValue( "Options", "PercentScoreOKWeight", m_iPercentScoreOKWeight );
|
||||||
ini.SetValue( "Options", "PercentScoreNGWeight", m_iPercentScoreNGWeight );
|
ini.SetValue( "Options", "PercentScoreNGWeight", m_iPercentScoreNGWeight );
|
||||||
|
ini.SetValue( "Options", "PercentScoreHitMineWeight", m_iPercentScoreHitMineWeight );
|
||||||
ini.SetValue( "Options", "GradeMarvelousWeight", m_iGradeMarvelousWeight );
|
ini.SetValue( "Options", "GradeMarvelousWeight", m_iGradeMarvelousWeight );
|
||||||
ini.SetValue( "Options", "GradePerfectWeight", m_iGradePerfectWeight );
|
ini.SetValue( "Options", "GradePerfectWeight", m_iGradePerfectWeight );
|
||||||
ini.SetValue( "Options", "GradeGreatWeight", m_iGradeGreatWeight );
|
ini.SetValue( "Options", "GradeGreatWeight", m_iGradeGreatWeight );
|
||||||
@@ -507,6 +512,7 @@ void PrefsManager::SaveGlobalPrefsToDisk() const
|
|||||||
ini.SetValue( "Options", "GradeMissWeight", m_iGradeMissWeight );
|
ini.SetValue( "Options", "GradeMissWeight", m_iGradeMissWeight );
|
||||||
ini.SetValue( "Options", "GradeOKWeight", m_iGradeOKWeight );
|
ini.SetValue( "Options", "GradeOKWeight", m_iGradeOKWeight );
|
||||||
ini.SetValue( "Options", "GradeNGWeight", m_iGradeNGWeight );
|
ini.SetValue( "Options", "GradeNGWeight", m_iGradeNGWeight );
|
||||||
|
ini.SetValue( "Options", "GradeHitMineWeight", m_iPercentScoreHitMineWeight );
|
||||||
ini.SetValue( "Options", "GradePercentAA", m_fGradePercentAA );
|
ini.SetValue( "Options", "GradePercentAA", m_fGradePercentAA );
|
||||||
ini.SetValue( "Options", "GradePercentA", m_fGradePercentA );
|
ini.SetValue( "Options", "GradePercentA", m_fGradePercentA );
|
||||||
ini.SetValue( "Options", "GradePercentB", m_fGradePercentB );
|
ini.SetValue( "Options", "GradePercentB", m_fGradePercentB );
|
||||||
|
|||||||
@@ -71,9 +71,9 @@ public:
|
|||||||
float m_fLifeDeltaGoodPercentChange;
|
float m_fLifeDeltaGoodPercentChange;
|
||||||
float m_fLifeDeltaBooPercentChange;
|
float m_fLifeDeltaBooPercentChange;
|
||||||
float m_fLifeDeltaMissPercentChange;
|
float m_fLifeDeltaMissPercentChange;
|
||||||
|
float m_fLifeDeltaHitMinePercentChange;
|
||||||
float m_fLifeDeltaOKPercentChange;
|
float m_fLifeDeltaOKPercentChange;
|
||||||
float m_fLifeDeltaNGPercentChange;
|
float m_fLifeDeltaNGPercentChange;
|
||||||
float m_fLifeDeltaMinePercentChange;
|
|
||||||
int m_iRegenComboAfterFail;
|
int m_iRegenComboAfterFail;
|
||||||
int m_iRegenComboAfterMiss;
|
int m_iRegenComboAfterMiss;
|
||||||
int m_iMaxRegenComboAfterFail;
|
int m_iMaxRegenComboAfterFail;
|
||||||
@@ -85,6 +85,7 @@ public:
|
|||||||
int m_iPercentScoreGoodWeight;
|
int m_iPercentScoreGoodWeight;
|
||||||
int m_iPercentScoreBooWeight;
|
int m_iPercentScoreBooWeight;
|
||||||
int m_iPercentScoreMissWeight;
|
int m_iPercentScoreMissWeight;
|
||||||
|
int m_iPercentScoreHitMineWeight;
|
||||||
int m_iPercentScoreOKWeight;
|
int m_iPercentScoreOKWeight;
|
||||||
int m_iPercentScoreNGWeight;
|
int m_iPercentScoreNGWeight;
|
||||||
int m_iGradeMarvelousWeight;
|
int m_iGradeMarvelousWeight;
|
||||||
@@ -93,6 +94,7 @@ public:
|
|||||||
int m_iGradeGoodWeight;
|
int m_iGradeGoodWeight;
|
||||||
int m_iGradeBooWeight;
|
int m_iGradeBooWeight;
|
||||||
int m_iGradeMissWeight;
|
int m_iGradeMissWeight;
|
||||||
|
int m_iGradeHitMineWeight;
|
||||||
int m_iGradeOKWeight;
|
int m_iGradeOKWeight;
|
||||||
int m_iGradeNGWeight;
|
int m_iGradeNGWeight;
|
||||||
float m_fGradePercentAA;
|
float m_fGradePercentAA;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ static CachedThemeMetric GREAT_COMMAND ("ProTimingDisplay","GreatCommand");
|
|||||||
static CachedThemeMetric GOOD_COMMAND ("ProTimingDisplay","GoodCommand");
|
static CachedThemeMetric GOOD_COMMAND ("ProTimingDisplay","GoodCommand");
|
||||||
static CachedThemeMetric BOO_COMMAND ("ProTimingDisplay","BooCommand");
|
static CachedThemeMetric BOO_COMMAND ("ProTimingDisplay","BooCommand");
|
||||||
static CachedThemeMetric MISS_COMMAND ("ProTimingDisplay","MissCommand");
|
static CachedThemeMetric MISS_COMMAND ("ProTimingDisplay","MissCommand");
|
||||||
|
static CachedThemeMetric HIT_MINE_COMMAND ("ProTimingDisplay","HitMineCommand");
|
||||||
|
|
||||||
|
|
||||||
ProTimingDisplay::ProTimingDisplay()
|
ProTimingDisplay::ProTimingDisplay()
|
||||||
@@ -22,6 +23,7 @@ ProTimingDisplay::ProTimingDisplay()
|
|||||||
GOOD_COMMAND.Refresh();
|
GOOD_COMMAND.Refresh();
|
||||||
BOO_COMMAND.Refresh();
|
BOO_COMMAND.Refresh();
|
||||||
MISS_COMMAND.Refresh();
|
MISS_COMMAND.Refresh();
|
||||||
|
HIT_MINE_COMMAND.Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProTimingDisplay::Reset()
|
void ProTimingDisplay::Reset()
|
||||||
@@ -43,7 +45,13 @@ void ProTimingDisplay::SetJudgment( int ms, TapNoteScore score )
|
|||||||
const CachedThemeMetric *Commands[NUM_TAP_NOTE_SCORES] =
|
const CachedThemeMetric *Commands[NUM_TAP_NOTE_SCORES] =
|
||||||
{
|
{
|
||||||
NULL, /* no TNS_NONE */
|
NULL, /* no TNS_NONE */
|
||||||
&MISS_COMMAND, &BOO_COMMAND, &GOOD_COMMAND, &GREAT_COMMAND, &PERFECT_COMMAND, &MARVELOUS_COMMAND
|
&HIT_MINE_COMMAND,
|
||||||
|
&MISS_COMMAND,
|
||||||
|
&BOO_COMMAND,
|
||||||
|
&GOOD_COMMAND,
|
||||||
|
&GREAT_COMMAND,
|
||||||
|
&PERFECT_COMMAND,
|
||||||
|
&MARVELOUS_COMMAND
|
||||||
};
|
};
|
||||||
ASSERT( score != TNS_NONE );
|
ASSERT( score != TNS_NONE );
|
||||||
ASSERT( score < NUM_TAP_NOTE_SCORES );
|
ASSERT( score < NUM_TAP_NOTE_SCORES );
|
||||||
|
|||||||
@@ -964,10 +964,9 @@ CString Capitalize( const CString &s )
|
|||||||
{
|
{
|
||||||
if( s.GetLength()==0 )
|
if( s.GetLength()==0 )
|
||||||
return "";
|
return "";
|
||||||
CString s1 = s.Left(1);
|
CString s2 = s;
|
||||||
s1.MakeUpper();
|
s2[0] = toupper( s2[0] );
|
||||||
CString s2 = s.Right( s.GetLength()-1 );
|
return s2;
|
||||||
return s1+s2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char char_traits_char_nocase::uptab[256] =
|
char char_traits_char_nocase::uptab[256] =
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ public:
|
|||||||
/* Note that pNoteData will include any transformations due to modifiers. */
|
/* Note that pNoteData will include any transformations due to modifiers. */
|
||||||
virtual void OnNextSong( int iSongInCourseIndex, const Steps* pNotes, const NoteData* pNoteData ) = 0; // before a song plays (called multiple times if course)
|
virtual void OnNextSong( int iSongInCourseIndex, const Steps* pNotes, const NoteData* pNoteData ) = 0; // before a song plays (called multiple times if course)
|
||||||
|
|
||||||
virtual void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow, int iNumAdditions ) = 0;
|
virtual void HandleTapScore( TapNoteScore score ) = 0;
|
||||||
|
virtual void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow ) = 0;
|
||||||
virtual void HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore ) = 0;
|
virtual void HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore ) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -221,6 +221,36 @@ void ScoreKeeperMAX2::AddScore( TapNoteScore score )
|
|||||||
|
|
||||||
Let p = score multiplier (Marvelous = 10, Perfect = 9, Great = 5, other = 0)
|
Let p = score multiplier (Marvelous = 10, Perfect = 9, Great = 5, other = 0)
|
||||||
|
|
||||||
|
N = total number of steps and freeze steps
|
||||||
|
S = The sum of all integers from 1 to N (the total number of steps/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
|
||||||
|
|
||||||
|
*IMPORTANT* : Double steps (U+L, D+R, etc.) count as two steps instead of one *for your combo count only*,
|
||||||
|
so if you get a double L+R on the 112th step of a song, you score is calculated for only one step, not two,
|
||||||
|
as the combo counter might otherwise imply.
|
||||||
|
|
||||||
|
Now, through simple algebraic manipulation:
|
||||||
|
S = 1+...+N = (1+N)*N/2 (1 through N added together)
|
||||||
|
|
||||||
|
Okay, time for an 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.
|
||||||
*/
|
*/
|
||||||
int p = 0; // score multiplier
|
int p = 0; // score multiplier
|
||||||
|
|
||||||
@@ -286,19 +316,22 @@ void ScoreKeeperMAX2::AddScore( TapNoteScore score )
|
|||||||
printf( "score: %i\n", iScore );
|
printf( "score: %i\n", iScore );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScoreKeeperMAX2::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow, int iNumAdditions )
|
void ScoreKeeperMAX2::HandleTapScore( TapNoteScore score )
|
||||||
|
{
|
||||||
|
if( score == TNS_HIT_MINE )
|
||||||
|
{
|
||||||
|
g_CurStageStats.iActualDancePoints[m_PlayerNumber] += TapNoteScoreToDancePoints( TNS_HIT_MINE );
|
||||||
|
g_CurStageStats.iTapNoteScores[m_PlayerNumber][TNS_HIT_MINE] += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoreKeeperMAX2::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow )
|
||||||
{
|
{
|
||||||
ASSERT( iNumTapsInRow >= 1 );
|
ASSERT( iNumTapsInRow >= 1 );
|
||||||
int iNumTapsToScore = iNumTapsInRow; //-iNumAdditions;
|
|
||||||
|
|
||||||
// Update dance points. Additions don't count.
|
// Update dance points.
|
||||||
// (yes they do)
|
g_CurStageStats.iActualDancePoints[m_PlayerNumber] += TapNoteScoreToDancePoints( scoreOfLastTap );
|
||||||
if( iNumTapsToScore > 0 )
|
// update judged row totals
|
||||||
{
|
|
||||||
g_CurStageStats.iActualDancePoints[m_PlayerNumber] += TapNoteScoreToDancePoints( scoreOfLastTap );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do count additions in judge totals.
|
|
||||||
g_CurStageStats.iTapNoteScores[m_PlayerNumber][scoreOfLastTap] += 1;
|
g_CurStageStats.iTapNoteScores[m_PlayerNumber][scoreOfLastTap] += 1;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -332,46 +365,8 @@ void ScoreKeeperMAX2::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTa
|
|||||||
if( scoreOfLastTap >= MinScoreToContinueCombo )
|
if( scoreOfLastTap >= MinScoreToContinueCombo )
|
||||||
g_CurStageStats.iCurCombo[m_PlayerNumber] += ComboCountIfHit;
|
g_CurStageStats.iCurCombo[m_PlayerNumber] += ComboCountIfHit;
|
||||||
|
|
||||||
/*
|
|
||||||
http://www.aaroninjapan.com/ddr2.html
|
|
||||||
|
|
||||||
A single step's points are calculated as follows:
|
|
||||||
|
|
||||||
p = score multiplier (Perfect = 10, Great = 5, other = 0)
|
|
||||||
N = total number of steps and freeze steps
|
|
||||||
S = The sum of all integers from 1 to N (the total number of steps/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
|
|
||||||
|
|
||||||
*IMPORTANT* : Double steps (U+L, D+R, etc.) count as two steps instead of one *for your combo count only*,
|
|
||||||
so if you get a double L+R on the 112th step of a song, you score is calculated for only one step, not two,
|
|
||||||
as the combo counter might otherwise imply.
|
|
||||||
|
|
||||||
Now, through simple algebraic manipulation:
|
|
||||||
S = 1+...+N = (1+N)*N/2 (1 through N added together)
|
|
||||||
|
|
||||||
Okay, time for an 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.
|
|
||||||
*/
|
|
||||||
AddScore( scoreOfLastTap ); // only score once per row
|
AddScore( scoreOfLastTap ); // only score once per row
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// handle combo logic
|
// handle combo logic
|
||||||
//
|
//
|
||||||
@@ -452,6 +447,7 @@ int ScoreKeeperMAX2::TapNoteScoreToDancePoints( TapNoteScore tns )
|
|||||||
int TapScoreValues[NUM_TAP_NOTE_SCORES] =
|
int TapScoreValues[NUM_TAP_NOTE_SCORES] =
|
||||||
{
|
{
|
||||||
0,
|
0,
|
||||||
|
PREFSMAN->m_iPercentScoreHitMineWeight,
|
||||||
PREFSMAN->m_iPercentScoreMissWeight,
|
PREFSMAN->m_iPercentScoreMissWeight,
|
||||||
PREFSMAN->m_iPercentScoreBooWeight,
|
PREFSMAN->m_iPercentScoreBooWeight,
|
||||||
PREFSMAN->m_iPercentScoreGoodWeight,
|
PREFSMAN->m_iPercentScoreGoodWeight,
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ public:
|
|||||||
// before a song plays (called multiple times if course)
|
// before a song plays (called multiple times if course)
|
||||||
void OnNextSong( int iSongInCourseIndex, const Steps* pNotes, const NoteData* pNoteData );
|
void OnNextSong( int iSongInCourseIndex, const Steps* pNotes, const NoteData* pNoteData );
|
||||||
|
|
||||||
void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow, int iNumAdditions );
|
void HandleTapScore( TapNoteScore score );
|
||||||
|
void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow );
|
||||||
void HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore );
|
void HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -33,12 +33,18 @@ void ScoreKeeperRave::OnNextSong( int iSongInCourseIndex, const Steps* pNotes, c
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScoreKeeperRave::HandleTapScore( TapNoteScore score )
|
||||||
|
{
|
||||||
|
// FIXME
|
||||||
|
}
|
||||||
|
|
||||||
#define CROSSED( val ) (fOld < val && fNew >= val)
|
#define CROSSED( val ) (fOld < val && fNew >= val)
|
||||||
#define CROSSED_ATTACK_LEVEL( level ) CROSSED(1.f/NUM_ATTACK_LEVELS*(level+1))
|
#define CROSSED_ATTACK_LEVEL( level ) CROSSED(1.f/NUM_ATTACK_LEVELS*(level+1))
|
||||||
void ScoreKeeperRave::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow, int iNumAdditions )
|
void ScoreKeeperRave::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow )
|
||||||
{
|
{
|
||||||
AttackLevel oldAL = (AttackLevel)(int)GAMESTATE->m_fSuperMeter[m_PlayerNumber];
|
AttackLevel oldAL = (AttackLevel)(int)GAMESTATE->m_fSuperMeter[m_PlayerNumber];
|
||||||
|
|
||||||
|
// TODO: Move these to prefs
|
||||||
float fPercentToMove;
|
float fPercentToMove;
|
||||||
switch( scoreOfLastTap )
|
switch( scoreOfLastTap )
|
||||||
{
|
{
|
||||||
@@ -66,7 +72,7 @@ void ScoreKeeperRave::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTa
|
|||||||
|
|
||||||
void ScoreKeeperRave::HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore )
|
void ScoreKeeperRave::HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore )
|
||||||
{
|
{
|
||||||
|
// FIXME
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScoreKeeperRave::Update( float fDelta )
|
void ScoreKeeperRave::Update( float fDelta )
|
||||||
|
|||||||
@@ -21,10 +21,11 @@ class ScoreKeeperRave : public ScoreKeeper
|
|||||||
public:
|
public:
|
||||||
// Overrides
|
// Overrides
|
||||||
ScoreKeeperRave(PlayerNumber pn);
|
ScoreKeeperRave(PlayerNumber pn);
|
||||||
virtual void Update( float fDelta );
|
void Update( float fDelta );
|
||||||
virtual void OnNextSong( int iSongInCourseIndex, const Steps* pNotes, const NoteData* pNoteData ); // before a song plays (called multiple times if course)
|
void OnNextSong( int iSongInCourseIndex, const Steps* pNotes, const NoteData* pNoteData ); // before a song plays (called multiple times if course)
|
||||||
virtual void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow, int iNumAdditions );
|
void HandleTapScore( TapNoteScore score );
|
||||||
virtual void HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore );
|
void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow );
|
||||||
|
void HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void LaunchAttack( AttackLevel al );
|
void LaunchAttack( AttackLevel al );
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ Grade StageStats::GetGrade( PlayerNumber pn ) const
|
|||||||
* is tricky since at that point the ScoreKeepers no longer exist.
|
* is tricky since at that point the ScoreKeepers no longer exist.
|
||||||
*
|
*
|
||||||
* See http://www.aaroninjapan.com/ddr2.html ("Regular play scoring") */
|
* See http://www.aaroninjapan.com/ddr2.html ("Regular play scoring") */
|
||||||
const float TapScoreValues[NUM_TAP_NOTE_SCORES] =
|
float TapScoreValues[NUM_TAP_NOTE_SCORES] =
|
||||||
{
|
{
|
||||||
0,
|
0,
|
||||||
PREFSMAN->m_iGradeMissWeight,
|
PREFSMAN->m_iGradeMissWeight,
|
||||||
@@ -156,7 +156,7 @@ Grade StageStats::GetGrade( PlayerNumber pn ) const
|
|||||||
PREFSMAN->m_iGradePerfectWeight,
|
PREFSMAN->m_iGradePerfectWeight,
|
||||||
PREFSMAN->m_iGradeMarvelousWeight,
|
PREFSMAN->m_iGradeMarvelousWeight,
|
||||||
};
|
};
|
||||||
const float HoldScoreValues[NUM_HOLD_NOTE_SCORES] =
|
float HoldScoreValues[NUM_HOLD_NOTE_SCORES] =
|
||||||
{
|
{
|
||||||
0,
|
0,
|
||||||
PREFSMAN->m_iGradeNGWeight,
|
PREFSMAN->m_iGradeNGWeight,
|
||||||
|
|||||||
Reference in New Issue
Block a user