diff --git a/stepmania/NoteSkins/common/common/Fallback Tap Fake 4x1.png b/stepmania/NoteSkins/common/common/Fallback Tap Fake 4x1.png new file mode 100644 index 0000000000..a00663dbff Binary files /dev/null and b/stepmania/NoteSkins/common/common/Fallback Tap Fake 4x1.png differ diff --git a/stepmania/NoteSkins/common/common/metrics.ini b/stepmania/NoteSkins/common/common/metrics.ini index 37a53ef7f7..4ebe4c5dbc 100644 --- a/stepmania/NoteSkins/common/common/metrics.ini +++ b/stepmania/NoteSkins/common/common/metrics.ini @@ -3,6 +3,7 @@ DrawHoldHeadForTapsOnSameRow=1 TapNoteAnimationLengthInBeats=1 TapMineAnimationLengthInBeats=1 TapLiftAnimationLengthInBeats=1 +TapFakeAnimationLengthInBeats=1 HoldHeadAnimationLengthInBeats=1 HoldTopCapAnimationLengthInBeats=1 HoldBottomCapAnimationLengthInBeats=1 @@ -11,6 +12,7 @@ HoldTailAnimationLengthInBeats=4 TapNoteAnimationIsVivid=1 TapMineAnimationIsVivid=0 TapLiftAnimationIsVivid=0 +TapFakeAnimationIsVivid=0 HoldHeadAnimationIsVivid=0 HoldTopCapAnimationIsVivid=0 HoldBodyAnimationIsVivid=0 @@ -28,6 +30,10 @@ TapLiftAdditionTextureCoordOffsetX=0 TapLiftAdditionTextureCoordOffsetY=0 TapLiftNoteColorTextureCoordSpacingX=0 TapLiftNoteColorTextureCoordSpacingY=0 +TapFakeAdditionTextureCoordOffsetX=0 +TapFakeAdditionTextureCoordOffsetY=0 +TapFakeNoteColorTextureCoordSpacingX=0 +TapFakeNoteColorTextureCoordSpacingY=0 HoldHeadAdditionTextureCoordOffsetX=0 HoldHeadAdditionTextureCoordOffsetY=0 HoldHeadNoteColorTextureCoordSpacingX=0 diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index b95e4fdfe1..f1693b32dc 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -386,6 +386,7 @@ bool NoteData::IsHoldNoteAtRow( int iTrack, int iRow, int *pHeadRow ) const case TapNote::mine: case TapNote::attack: case TapNote::lift: + case TapNote::fake: return false; case TapNote::empty: @@ -465,7 +466,7 @@ int NoteData::GetNumTapNotes( int iStartIndex, int iEndIndex ) const FOREACH_NONEMPTY_ROW_IN_TRACK_RANGE( *this, t, r, iStartIndex, iEndIndex ) { const TapNote &tn = GetTapNote(t, r); - if( tn.type != TapNote::empty && tn.type != TapNote::mine ) + if( tn.type != TapNote::empty && tn.type != TapNote::mine && tn.type != TapNote::fake ) iNumNotes++; } } @@ -523,6 +524,7 @@ bool NoteData::RowNeedsAtLeastSimultaneousPresses( int iMinSimultaneousPresses, { case TapNote::mine: case TapNote::empty: + case TapNote::fake: continue; // skip these types - they don't count } ++iNumNotesThisIndex; @@ -573,7 +575,7 @@ int NoteData::GetNumRowsWithSimultaneousTaps( int iMinTaps, int iStartIndex, int for( int t=0; t= iMinTaps ) diff --git a/stepmania/src/NoteDataUtil.cpp b/stepmania/src/NoteDataUtil.cpp index 19e59600f5..501327f13f 100644 --- a/stepmania/src/NoteDataUtil.cpp +++ b/stepmania/src/NoteDataUtil.cpp @@ -150,6 +150,7 @@ static void LoadFromSMNoteDataStringWithPlayer( NoteData& out, const RString &sS // case 'A': tn = TAP_ORIGINAL_ATTACK; break; case 'K': tn = TAP_ORIGINAL_AUTO_KEYSOUND; break; case 'L': tn = TAP_ORIGINAL_LIFT; break; + case 'F': tn = TAP_ORIGINAL_FAKE; break; default: /* Invalid data. We don't want to assert, since there might * simply be invalid data in an .SM, and we don't want to die @@ -379,6 +380,7 @@ void NoteDataUtil::GetSMNoteDataString( const NoteData &in, RString &sRet ) case TapNote::attack: c = 'A'; break; case TapNote::autoKeysound: c = 'K'; break; case TapNote::lift: c = 'L'; break; + case TapNote::fake: c = 'F'; break; default: FAIL_M( ssprintf("tn %i", tn.type) ); // invalid enum value } @@ -1135,6 +1137,7 @@ static void SuperShuffleTaps( NoteData &inout, int iStartIndex, int iEndIndex ) case TapNote::mine: case TapNote::attack: case TapNote::lift: + case TapNote::fake: break; // shuffle this DEFAULT_FAIL( tn1.type ); } @@ -1298,7 +1301,7 @@ void NoteDataUtil::Wide( NoteData &inout, int iStartIndex, int iEndIndex ) iTrackToAdd--; CLAMP( iTrackToAdd, 0, inout.GetNumTracks()-1 ); - if( inout.GetTapNote(iTrackToAdd, i).type != TapNote::empty ) + if( inout.GetTapNote(iTrackToAdd, i).type != TapNote::empty && inout.GetTapNote(iTrackToAdd, i).type != TapNote::fake ) { iTrackToAdd = (iTrackToAdd+1) % inout.GetNumTracks(); } diff --git a/stepmania/src/NoteDataWithScoring.cpp b/stepmania/src/NoteDataWithScoring.cpp index 8085d61c21..8059c80b3a 100644 --- a/stepmania/src/NoteDataWithScoring.cpp +++ b/stepmania/src/NoteDataWithScoring.cpp @@ -91,6 +91,8 @@ int GetSuccessfulHands( const NoteData &in, int iStartIndex = 0, int iEndIndex = continue; if( tn.type == TapNote::mine ) // mines don't count continue; + if (tn.type == TapNote::fake ) // fake arrows don't count + continue; if( tn.result.tns <= TNS_W5 ) Missed = true; } @@ -133,7 +135,7 @@ int LastTapNoteScoreTrack( const NoteData &in, unsigned iRow, PlayerNumber pn ) { /* Skip empty tracks and mines */ const TapNote &tn = in.GetTapNote( t, iRow ); - if( tn.type == TapNote::empty || tn.type == TapNote::mine ) + if( tn.type == TapNote::empty || tn.type == TapNote::mine || tn.type == TapNote::fake ) continue; if( tn.pn != PLAYER_INVALID && tn.pn != pn && pn != PLAYER_INVALID ) continue; @@ -171,9 +173,9 @@ TapNoteScore NoteDataWithScoring::MinTapNoteScore( const NoteData &in, unsigned TapNoteScore score = TNS_W1; for( int t=0; tm_bDrawHoldHeadForTapsOnSameRow ) { pActor = GetHoldActor( m_HoldHead, NotePart_HoldHead, fBeat, false, false ); diff --git a/stepmania/src/NoteDisplay.h b/stepmania/src/NoteDisplay.h index eadfc08339..04f3d1b69c 100644 --- a/stepmania/src/NoteDisplay.h +++ b/stepmania/src/NoteDisplay.h @@ -21,6 +21,7 @@ enum NotePart NotePart_HoldTopCap, NotePart_HoldBody, NotePart_HoldBottomCap, + NotePart_Fake, NUM_NotePart }; @@ -106,6 +107,7 @@ private: NoteColorActor m_TapNote; NoteColorActor m_TapMine; NoteColorActor m_TapLift; + NoteColorActor m_TapFake; NoteColorActor m_HoldHead[NUM_HoldType][NUM_ActiveType]; NoteColorSprite m_HoldTopCap[NUM_HoldType][NUM_ActiveType]; NoteColorSprite m_HoldBody[NUM_HoldType][NUM_ActiveType]; diff --git a/stepmania/src/NoteTypes.cpp b/stepmania/src/NoteTypes.cpp index 5253ce8025..180b34303a 100644 --- a/stepmania/src/NoteTypes.cpp +++ b/stepmania/src/NoteTypes.cpp @@ -13,6 +13,7 @@ TapNote TAP_ORIGINAL_ROLL_HEAD ( TapNote::hold_head, TapNote::hold_head_roll, T TapNote TAP_ORIGINAL_MINE ( TapNote::mine, TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); TapNote TAP_ORIGINAL_ATTACK ( TapNote::attack, TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); TapNote TAP_ORIGINAL_AUTO_KEYSOUND ( TapNote::autoKeysound,TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); +TapNote TAP_ORIGINAL_FAKE ( TapNote::fake, TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); TapNote TAP_ADDITION_TAP ( TapNote::tap, TapNote::SubType_Invalid, TapNote::addition, "", 0, -1 ); TapNote TAP_ADDITION_MINE ( TapNote::mine, TapNote::SubType_Invalid, TapNote::addition, "", 0, -1 ); diff --git a/stepmania/src/NoteTypes.h b/stepmania/src/NoteTypes.h index 42b62d8711..7d1e77bf44 100644 --- a/stepmania/src/NoteTypes.h +++ b/stepmania/src/NoteTypes.h @@ -76,6 +76,7 @@ struct TapNote lift, // up attack, autoKeysound, + fake, // not scored for or against }; enum SubType { @@ -170,6 +171,7 @@ extern TapNote TAP_ORIGINAL_MINE; // 'M' extern TapNote TAP_ORIGINAL_LIFT; // 'L' extern TapNote TAP_ORIGINAL_ATTACK; // 'A' extern TapNote TAP_ORIGINAL_AUTO_KEYSOUND; // 'K' +extern TapNote TAP_ORIGINAL_FAKE; // 'F' extern TapNote TAP_ADDITION_TAP; extern TapNote TAP_ADDITION_MINE; diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index 93e7b08d34..8452be497c 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -396,6 +396,7 @@ static bool NeedsTapJudging( const TapNote &tn ) return tn.result.tns == TNS_None; case TapNote::hold_tail: case TapNote::attack: + case TapNote::fake: return false; } } @@ -415,6 +416,7 @@ static bool NeedsHoldJudging( const TapNote &tn ) case TapNote::mine: case TapNote::lift: case TapNote::attack: + case TapNote::fake: return false; } } @@ -2403,7 +2405,7 @@ void Player::FlashGhostRow( int iRow, PlayerNumber pn ) { const TapNote &tn = m_NoteData.GetTapNote( iTrack, iRow ); - if( tn.type == TapNote::empty || tn.type == TapNote::mine ) + if( tn.type == TapNote::empty || tn.type == TapNote::mine || tn.type == TapNote::fake ) continue; if( tn.pn != PLAYER_INVALID && tn.pn != pn ) continue; @@ -2477,7 +2479,7 @@ void Player::CrossedRows( int iLastRowCrossed, const RageTimer &now ) // check to see if there's a note at the crossed row if( m_pPlayerState->m_PlayerController != PC_HUMAN ) { - if( tn.type != TapNote::empty && tn.result.tns == TNS_None ) + if( tn.type != TapNote::empty && tn.type != TapNote::fake && tn.result.tns == TNS_None ) { Step( iTrack, iRow, now, false, false ); if( m_pPlayerState->m_PlayerController == PC_AUTOPLAY ) @@ -2637,7 +2639,7 @@ void Player::HandleTapRowScore( unsigned row ) { const TapNote &tn = m_NoteData.GetTapNote( track, row ); // Mines cannot be handled here. - if( tn.type == TapNote::empty || tn.type == TapNote::mine ) + if( tn.type == TapNote::empty || tn.type == TapNote::fake || tn.type == TapNote::mine ) continue; if( tn.pn != PLAYER_INVALID && tn.pn != pn ) continue;