From cf579908cb8ddbf90ae88930c8f7eb37e6dd851d Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Fri, 7 Nov 2003 05:17:41 +0000 Subject: [PATCH] add echo, planted, stomp transforms --- stepmania/Themes/default/metrics.ini | 12 ++- stepmania/src/NoteData.cpp | 24 +++-- stepmania/src/NoteData.h | 6 +- stepmania/src/NoteDataUtil.cpp | 145 +++++++++++++++++++++++++++ stepmania/src/NoteDataUtil.h | 5 +- stepmania/src/PlayerOptions.cpp | 6 ++ stepmania/src/PlayerOptions.h | 3 + stepmania/src/ScreenEdit.cpp | 6 +- stepmania/src/ScreenEdit.h | 2 +- stepmania/src/ScreenOptions.cpp | 23 ++--- 10 files changed, 203 insertions(+), 29 deletions(-) diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index 365d43a9b6..210b2d97ef 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -1741,8 +1741,8 @@ ExplanationTogetherX=70 ExplanationTogetherY=412 ExplanationTogetherOnCommand=wrapwidthpixels,1000;horizalign,left;cropright,1;linear,0.5;cropright,0 ExplanationZoom=0.5 -ExplanationP1OnCommand=wrapwidthpixels,600;horizalign,left;cropright,1;linear,0.5;cropright,0 -ExplanationP2OnCommand=wrapwidthpixels,600;horizalign,right;cropright,1;linear,0.5;cropright,0 +ExplanationP1OnCommand=wrapwidthpixels,500;horizalign,left;cropright,1;linear,0.5;cropright,0 +ExplanationP2OnCommand=wrapwidthpixels,500;horizalign,right;cropright,1;linear,0.5;cropright,0 ColorSelected=1,1,1,1 // normal ColorNotSelected=0.5,0.5,0.5,1 // grayed NumShownItems=10 @@ -2940,7 +2940,7 @@ TurnName,5=SHUFFLE Turn,6=mod,supershuffle TurnName,6=S.SHUFFLE -Transform=7 +Transform=10 TransformDefault=mod,no transform Transform,1= TransformName,1=OFF @@ -2956,6 +2956,12 @@ Transform,6=mod,skippy TransformName,6=SKIPPY Transform,7=mod,mines TransformName,7=MINES +Transform,8=mod,echo +TransformName,8=ECHO +Transform,9=mod,planted +TransformName,9=PLANTED +Transform,10=mod,stomp +TransformName,10=STOMP Scroll=4 ScrollDefault=mod,no reverse,no split,no alternate diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index 58579e7da4..9a42ff24aa 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -174,15 +174,6 @@ void NoteData::RemoveHoldNote( int iHoldIndex ) m_HoldNotes.erase(m_HoldNotes.begin()+iHoldIndex, m_HoldNotes.begin()+iHoldIndex+1); } -bool NoteData::IsThereATapAtRow( int iRow ) const -{ - for( int t=0; t= hn.fStartBeat && fBeat <= hn.fEndBeat ) + iNumTracksHeld++; + } + return iNumTracksHeld; +} \ No newline at end of file diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index 88053dcc8d..9670a88b82 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -98,6 +98,11 @@ public: return t; return -1; } + inline bool IsThereATapAtRow( int index ) const + { + return GetFirstTrackWithTap( index ) != -1; + } + int GetNumTracksHeldAtRow( int row ); // used in edit/record void AddHoldNote( HoldNote newNote ); // add note hold note merging overlapping HoldNotes and destroying TapNotes underneath @@ -106,7 +111,6 @@ public: const HoldNote &GetHoldNote( int index ) const { return m_HoldNotes[index]; } // statistics - bool IsThereATapAtRow( int iRow ) const; /* Return the highest beat/row that might contain notes. (Use GetLastBeat if you need * accuracy.) */ diff --git a/stepmania/src/NoteDataUtil.cpp b/stepmania/src/NoteDataUtil.cpp index 97695c9ef5..c563e63388 100644 --- a/stepmania/src/NoteDataUtil.cpp +++ b/stepmania/src/NoteDataUtil.cpp @@ -689,6 +689,148 @@ void NoteDataUtil::Mines( NoteData &in, float fStartBeat, float fEndBeat ) } } +void NoteDataUtil::Echo( NoteData &in, float fStartBeat, float fEndBeat ) +{ + // add 8th note tap "echos" after all taps + int iEchoTrack = -1; + + fStartBeat = froundf( fStartBeat, 0.5 ); + + const int first_row = BeatToNoteRow( fStartBeat ); + const int last_row = min( BeatToNoteRow(fEndBeat), in.GetLastRow() ); + const int rows_per_interval = BeatToNoteRow( 0.5 ); + + // window is one beat wide and slides 1/2 a beat at a time + for( int r=first_row; r= iRowWindowBegin+1 && iHoldHeadRow <= iRowWindowEnd-1 ) + { + bTapInMiddle = true; + break; + } + } + if( bTapInMiddle ) + continue; + + if( iEchoTrack==-1 ) + continue; + + int iNumTracksHeld = in.GetNumTracksHeldAtRow(iRowEcho); + if( iNumTracksHeld >= 2 ) + continue; + + in.SetTapNote( iEchoTrack, iRowEcho, TAP_ADDITION ); + } +} + +void NoteDataUtil::Planted( NoteData &in, float fStartBeat, float fEndBeat ) +{ + // Convert all taps to freezes. + const int first_row = BeatToNoteRow( fStartBeat ); + const int last_row = min( BeatToNoteRow(fEndBeat), in.GetLastRow() ); + for( int r=first_row; r<=last_row; r++ ) + { + for( int t=0; t= 1 ) + continue; + + // TODO: Make this accurate for StepsTypes other than 4 panel cross. + int iOppositeTrack = in.GetNumTracks()-1-t; + in.SetTapNote( iOppositeTrack, r, TAP_ADDITION ); + } + } + } +} void NoteDataUtil::SnapToNearestNoteType( NoteData &in, NoteType nt1, NoteType nt2, float fBeginBeat, float fEndBeat ) { @@ -984,6 +1126,9 @@ void NoteDataUtil::TransformNoteData( NoteData &nd, const PlayerOptions &po, Ste case PlayerOptions::TRANSFORM_QUICK: NoteDataUtil::Quick(nd, fStartBeat, fEndBeat); break; case PlayerOptions::TRANSFORM_SKIPPY: NoteDataUtil::Skippy(nd, fStartBeat, fEndBeat); break; case PlayerOptions::TRANSFORM_MINES: NoteDataUtil::Mines(nd, fStartBeat, fEndBeat); break; + case PlayerOptions::TRANSFORM_ECHO: NoteDataUtil::Echo(nd, fStartBeat, fEndBeat); break; + case PlayerOptions::TRANSFORM_PLANTED: NoteDataUtil::Planted(nd, fStartBeat, fEndBeat); break; + case PlayerOptions::TRANSFORM_STOMP: NoteDataUtil::Stomp(nd, fStartBeat, fEndBeat); break; default: ASSERT(0); } } diff --git a/stepmania/src/NoteDataUtil.h b/stepmania/src/NoteDataUtil.h index 0f1878d00c..9f7a7539d7 100644 --- a/stepmania/src/NoteDataUtil.h +++ b/stepmania/src/NoteDataUtil.h @@ -47,8 +47,11 @@ namespace NoteDataUtil void Big( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 ); void Quick( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 ); void Skippy( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 ); - void Mines( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 ); void InsertIntelligentTaps( NoteData &in, float fBeatInterval, float fInsertBeatOffset, bool bSkippy, float fStartBeat = 0, float fEndBeat = 99999 ); + void Mines( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 ); + void Echo( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 ); + void Planted( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 ); + void Stomp( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 ); void SuperShuffleTaps( NoteData &in ); // change all TAP_ADDITIONs to TAP_TAPs diff --git a/stepmania/src/PlayerOptions.cpp b/stepmania/src/PlayerOptions.cpp index 9c99499806..a92e021b9c 100644 --- a/stepmania/src/PlayerOptions.cpp +++ b/stepmania/src/PlayerOptions.cpp @@ -154,6 +154,9 @@ CString PlayerOptions::GetString() const case TRANSFORM_QUICK: sReturn += "Quick, "; break; case TRANSFORM_SKIPPY: sReturn += "Skippy, "; break; case TRANSFORM_MINES: sReturn += "Mines, "; break; + case TRANSFORM_ECHO: sReturn += "Echo, "; break; + case TRANSFORM_PLANTED: sReturn += "Planted, "; break; + case TRANSFORM_STOMP: sReturn += "Stomp, "; break; default: ASSERT(0); // invalid } @@ -280,6 +283,9 @@ void PlayerOptions::FromString( CString sOptions ) else if( sBit == "quick" ) m_Transform = TRANSFORM_QUICK; else if( sBit == "skippy" ) m_Transform = TRANSFORM_SKIPPY; else if( sBit == "mines" ) m_Transform = TRANSFORM_MINES; + else if( sBit == "echo" ) m_Transform = TRANSFORM_ECHO; + else if( sBit == "planted" ) m_Transform = TRANSFORM_PLANTED; + else if( sBit == "stomp" ) m_Transform = TRANSFORM_STOMP; else if( sBit == "reverse" ) SET_FLOAT( fScrolls[SCROLL_REVERSE] ) else if( sBit == "split" ) SET_FLOAT( fScrolls[SCROLL_SPLIT] ) else if( sBit == "alternate" ) SET_FLOAT( fScrolls[SCROLL_ALTERNATE] ) diff --git a/stepmania/src/PlayerOptions.h b/stepmania/src/PlayerOptions.h index 5b633ba844..d830cf619b 100644 --- a/stepmania/src/PlayerOptions.h +++ b/stepmania/src/PlayerOptions.h @@ -65,6 +65,9 @@ struct PlayerOptions TRANSFORM_QUICK, TRANSFORM_SKIPPY, TRANSFORM_MINES, + TRANSFORM_ECHO, + TRANSFORM_PLANTED, + TRANSFORM_STOMP, NUM_TRANSFORMS }; enum Scroll { diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index 3c359b0f7f..94b290be1e 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -156,7 +156,7 @@ Menu g_AreaMenu MenuRow( "Clear", true ), MenuRow( "Quantize", true, 0, "4TH","8TH","12TH","16TH","24TH","32ND","48TH","64TH" ), MenuRow( "Turn", true, 0, "Left","Right","Mirror","Shuffle","Super Shuffle" ), - MenuRow( "Transform", true, 0, "Little","Wide","Big","Quick","Skippy" ), + MenuRow( "Transform", true, 0, "Little","Wide","Big","Quick","Skippy","Mines","Echo","Planted","Stomp" ), MenuRow( "Alter", true, 0, "Backwards","Swap Sides","Copy Left To Right","Copy Right To Left","Clear Left","Clear Right","Collapse To One","Shift Left","Shift Right" ), MenuRow( "Tempo", true, 0, "Compress 2x","Compress 3->2","Compress 4->3","Expand 3->4","Expand 2->3","Expand 2x" ), MenuRow( "Play selection", true ), @@ -1538,6 +1538,10 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ) case big: NoteDataUtil::Big( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; case quick: NoteDataUtil::Quick( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; case skippy: NoteDataUtil::Skippy( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; + case mines: NoteDataUtil::Mines( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; + case echo: NoteDataUtil::Echo( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; + case planted: NoteDataUtil::Planted( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; + case stomp: NoteDataUtil::Stomp( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break; default: ASSERT(0); } diff --git a/stepmania/src/ScreenEdit.h b/stepmania/src/ScreenEdit.h index ec7a1702b9..fb56304e0c 100644 --- a/stepmania/src/ScreenEdit.h +++ b/stepmania/src/ScreenEdit.h @@ -137,7 +137,7 @@ public: }; void HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers ); enum TurnType { left, right, mirror, shuffle, super_shuffle, NUM_TURN_TYPES }; - enum TransformType { little, wide, big, quick, skippy, NUM_TRANSFORM_TYPES }; + enum TransformType { little, wide, big, quick, skippy, mines, echo, planted, stomp, NUM_TRANSFORM_TYPES }; enum AlterType { backwards, swap_sides, copy_left_to_right, copy_right_to_left, clear_left, clear_right, collapse_to_one, shift_left, shift_right, NUM_ALTER_TYPES }; // MD 11/02/03 - added additional tempo adjusts which make "sense" enum TempoType { compress_2x, compress_3_2, compress_4_3, expand_4_3, expand_3_2, expand_2x, NUM_TEMPO_TYPES }; diff --git a/stepmania/src/ScreenOptions.cpp b/stepmania/src/ScreenOptions.cpp index 7f2af9b298..13ecf31d0e 100644 --- a/stepmania/src/ScreenOptions.cpp +++ b/stepmania/src/ScreenOptions.cpp @@ -210,24 +210,21 @@ void ScreenOptions::Init( InputMode im, OptionRow OptionRows[], int iNumOptionLi } // add explanation here so it appears on top + for( p=0; pGetPathToF("ScreenOptions explanation") ); + m_textExplanation[p].SetZoom( EXPLANATION_ZOOM ); + m_textExplanation[p].SetShadowLength( 0 ); + m_framePage.AddChild( &m_textExplanation[p] ); + } switch( m_InputMode ) { case INPUTMODE_INDIVIDUAL: for( p=0; pGetPathToF("ScreenOptions explanation") ); m_textExplanation[p].SetXY( EXPLANATION_X(p), EXPLANATION_Y(p) ); - m_textExplanation[p].SetZoom( EXPLANATION_ZOOM ); - m_textExplanation[p].SetShadowLength( 0 ); - m_framePage.AddChild( &m_textExplanation[p] ); - } break; case INPUTMODE_TOGETHER: - m_textExplanation[0].LoadFromFont( THEME->GetPathToF("ScreenOptions explanation") ); m_textExplanation[0].SetXY( EXPLANATION_TOGETHER_X, EXPLANATION_TOGETHER_Y ); - m_textExplanation[0].SetZoom( EXPLANATION_ZOOM ); - m_textExplanation[0].SetShadowLength( 0 ); - m_framePage.AddChild( &m_textExplanation[0] ); break; default: ASSERT(0); @@ -891,7 +888,7 @@ void ScreenOptions::ChangeValue( PlayerNumber pn, int iDelta ) m_iSelectedOption[p][iCurRow] = iNewSel; UpdateText( (PlayerNumber)p, iCurRow ); } - OnChange( pn ); + OnChange( (PlayerNumber)p ); } m_SoundChangeCol.Play(); } @@ -908,7 +905,7 @@ void ScreenOptions::MenuUp( PlayerNumber pn ) m_iCurrentRow[p] = m_iNumOptionRows; // on exit else m_iCurrentRow[p]--; - OnChange( pn ); + OnChange( (PlayerNumber)p ); } m_SoundPrevRow.Play(); } @@ -925,7 +922,7 @@ void ScreenOptions::MenuDown( PlayerNumber pn ) m_iCurrentRow[p] = 0; // on first row else m_iCurrentRow[p]++; - OnChange( pn ); + OnChange( (PlayerNumber)p ); } m_SoundNextRow.Play(); }