From f99d643f079fe682eb8ba0b5930e964169567c2c Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Tue, 10 Mar 2009 15:52:22 +0000 Subject: [PATCH] New arrow type: the Fake arrow. Doesn't score for or against you. Perfect for simfiles that want to use mission mode type files or use measure skipping and not have it count against you. See ZXZ Bloody Heart in StepMix 4 for a file that could use this arrow type. --- .../common/common/Fallback Tap Fake 4x1.png | Bin 0 -> 7256 bytes stepmania/NoteSkins/common/common/metrics.ini | 6 ++++++ stepmania/src/NoteData.cpp | 6 ++++-- stepmania/src/NoteDataUtil.cpp | 5 ++++- stepmania/src/NoteDataWithScoring.cpp | 8 +++++--- stepmania/src/NoteDisplay.cpp | 7 +++++++ stepmania/src/NoteDisplay.h | 2 ++ stepmania/src/NoteTypes.cpp | 1 + stepmania/src/NoteTypes.h | 2 ++ stepmania/src/Player.cpp | 8 +++++--- 10 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 stepmania/NoteSkins/common/common/Fallback Tap Fake 4x1.png 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 0000000000000000000000000000000000000000..a00663dbffe1c202431eac98fb7829b613085587 GIT binary patch literal 7256 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 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;