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:
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
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user