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.

This commit is contained in:
Jason Felds
2009-03-10 15:52:22 +00:00
parent 757a9639c9
commit f99d643f07
10 changed files with 36 additions and 9 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

@@ -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
+4 -2
View File
@@ -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<GetNumTracks(); t++ )
{
const TapNote &tn = GetTapNote(t, r);
if( tn.type != TapNote::mine && tn.type != TapNote::empty ) // mines don't count
if( tn.type != TapNote::mine && tn.type != TapNote::empty && tn.type != TapNote::fake ) // mines don't count
iNumNotesThisIndex++;
}
if( iNumNotesThisIndex >= iMinTaps )
+4 -1
View File
@@ -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();
}
+5 -3
View File
@@ -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; t<in.GetNumTracks(); t++ )
{
/* Ignore mines, or the score will always be TNS_None. */
/* Ignore mines (and fake arrows), or the score will always be TNS_None. */
const TapNote &tn = in.GetTapNote( t, row );
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;
+7
View File
@@ -20,6 +20,7 @@ static const char *NotePartNames[] = {
"TapNote",
"TapMine",
"TapLift",
"TapFake",
"HoldHead",
"HoldTopCap",
"HoldBody",
@@ -237,6 +238,7 @@ void NoteDisplay::Load( int iColNum, const PlayerState* pPlayerState, float fYRe
m_TapNote.Load( sButton, "Tap Note" );
m_TapMine.Load( sButton, "Tap Mine" );
m_TapLift.Load( sButton, "Tap Lift" );
m_TapFake.Load( sButton, "Tap Fake" );
FOREACH_HoldType( ht )
{
@@ -701,6 +703,11 @@ void NoteDisplay::DrawTap( const TapNote& tn, int iCol, float fBeat, bool bOnSam
pActor = GetTapActor( m_TapMine, NotePart_Mine, fBeat );
part = NotePart_Mine;
}
else if( tn.type == TapNote::fake )
{
pActor = GetTapActor( m_TapFake, NotePart_Fake, fBeat );
part = NotePart_Fake;
}
else if( bOnSameRowAsHoldStart && cache->m_bDrawHoldHeadForTapsOnSameRow )
{
pActor = GetHoldActor( m_HoldHead, NotePart_HoldHead, fBeat, false, false );
+2
View File
@@ -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];
+1
View File
@@ -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 );
+2
View File
@@ -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;
+5 -3
View File
@@ -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;