fix bug in SwapSides that caused it to behave like Mirror
Add Alters: copy_left_to_right, copy_right_to_left, clear_left, clear_right, collapse_to_one, shift_left, shift_right Fix "SuperShuffle broken only in editor"
This commit is contained in:
@@ -21,6 +21,8 @@ BUG FIX: Super-shuffle fixed (now doesn't add extra notes)
|
|||||||
NEW FEATURE: Added WIDE transform (changes notes on beats to jumps)
|
NEW FEATURE: Added WIDE transform (changes notes on beats to jumps)
|
||||||
NEW FEATURE: Added BIG transform (strategically inserts 8ths)
|
NEW FEATURE: Added BIG transform (strategically inserts 8ths)
|
||||||
NEW FEATURE: Added QUICK transform (strategically inserts 16ths)
|
NEW FEATURE: Added QUICK transform (strategically inserts 16ths)
|
||||||
|
NEW FEATURE: Added SKIPPY transform
|
||||||
|
BUG FIX: Fixed song seeking in editor at non 1x music rates
|
||||||
|
|
||||||
----------------------- Version 3.01 ---------------------------
|
----------------------- Version 3.01 ---------------------------
|
||||||
CHANGE: Simplified NoteSkin tap graphic format. Old NoteSkins will need to
|
CHANGE: Simplified NoteSkin tap graphic format. Old NoteSkins will need to
|
||||||
|
|||||||
+124
-6
@@ -13,10 +13,8 @@
|
|||||||
#include "NoteData.h"
|
#include "NoteData.h"
|
||||||
#include "RageUtil.h"
|
#include "RageUtil.h"
|
||||||
#include "GameConstantsAndTypes.h"
|
#include "GameConstantsAndTypes.h"
|
||||||
#include "PrefsManager.h"
|
|
||||||
#include "ArrowEffects.h"
|
#include "ArrowEffects.h"
|
||||||
#include "PrefsManager.h"
|
#include "GameState.h"
|
||||||
#include "GameConstantsAndTypes.h"
|
|
||||||
#include "RageException.h"
|
#include "RageException.h"
|
||||||
#include "GameState.h"
|
#include "GameState.h"
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
@@ -881,7 +879,7 @@ void NoteDataUtil::Turn( NoteData &in, TurnType tt )
|
|||||||
iTakeFromTrack[t] = in.GetNumTracks()-t-1;
|
iTakeFromTrack[t] = in.GetNumTracks()-t-1;
|
||||||
break;
|
break;
|
||||||
case shuffle:
|
case shuffle:
|
||||||
case super_shuffle: // use this code to shuffle the HoldNotes
|
case super_shuffle: // use shuffle code to mix up HoldNotes without creating impossible patterns
|
||||||
{
|
{
|
||||||
vector<int> aiTracksLeftToMap;
|
vector<int> aiTracksLeftToMap;
|
||||||
for( t=0; t<in.GetNumTracks(); t++ )
|
for( t=0; t<in.GetNumTracks(); t++ )
|
||||||
@@ -915,7 +913,7 @@ void NoteDataUtil::Turn( NoteData &in, TurnType tt )
|
|||||||
in.CopyAll( &tempNoteData ); // copy note data from newData back into this
|
in.CopyAll( &tempNoteData ); // copy note data from newData back into this
|
||||||
in.Convert2sAnd3sToHoldNotes();
|
in.Convert2sAnd3sToHoldNotes();
|
||||||
|
|
||||||
if( tt == PlayerOptions::TURN_SUPER_SHUFFLE )
|
if( tt == super_shuffle )
|
||||||
SuperShuffleTaps( in );
|
SuperShuffleTaps( in );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -982,8 +980,9 @@ void NoteDataUtil::SwapSides( NoteData &in )
|
|||||||
for( int t=0; t<in.GetNumTracks()/2; t++ )
|
for( int t=0; t<in.GetNumTracks()/2; t++ )
|
||||||
{
|
{
|
||||||
int iTrackEarlier = t;
|
int iTrackEarlier = t;
|
||||||
int iTrackLater = in.GetNumTracks()-1-t;
|
int iTrackLater = t + in.GetNumTracks()/2 + in.GetNumTracks()%2;
|
||||||
|
|
||||||
|
// swap
|
||||||
TapNote tnEarlier = in.GetTapNote(iTrackEarlier, r);
|
TapNote tnEarlier = in.GetTapNote(iTrackEarlier, r);
|
||||||
TapNote tnLater = in.GetTapNote(iTrackLater, r);
|
TapNote tnLater = in.GetTapNote(iTrackLater, r);
|
||||||
in.SetTapNote(iTrackEarlier, r, tnLater);
|
in.SetTapNote(iTrackEarlier, r, tnLater);
|
||||||
@@ -1178,3 +1177,122 @@ void NoteDataUtil::SnapToNearestNoteType( NoteData &in, NoteType nt1, NoteType n
|
|||||||
|
|
||||||
//Convert2sAnd3sToHoldNotes();
|
//Convert2sAnd3sToHoldNotes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void NoteDataUtil::CopyLeftToRight( NoteData &in )
|
||||||
|
{
|
||||||
|
in.ConvertHoldNotesTo4s();
|
||||||
|
int max_row = in.GetLastRow();
|
||||||
|
for( int r=0; r<=max_row; r++ )
|
||||||
|
{
|
||||||
|
for( int t=0; t<in.GetNumTracks()/2; t++ )
|
||||||
|
{
|
||||||
|
int iTrackEarlier = t;
|
||||||
|
int iTrackLater = in.GetNumTracks()-1-t;
|
||||||
|
|
||||||
|
// swap
|
||||||
|
TapNote tnEarlier = in.GetTapNote(iTrackEarlier, r);
|
||||||
|
TapNote tnLater = in.GetTapNote(iTrackLater, r);
|
||||||
|
// in.SetTapNote(iTrackEarlier, r, tnLater);
|
||||||
|
in.SetTapNote(iTrackLater, r, tnEarlier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
in.Convert4sToHoldNotes();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NoteDataUtil::CopyRightToLeft( NoteData &in )
|
||||||
|
{
|
||||||
|
in.ConvertHoldNotesTo4s();
|
||||||
|
int max_row = in.GetLastRow();
|
||||||
|
for( int r=0; r<=max_row; r++ )
|
||||||
|
{
|
||||||
|
for( int t=0; t<in.GetNumTracks()/2; t++ )
|
||||||
|
{
|
||||||
|
int iTrackEarlier = t;
|
||||||
|
int iTrackLater = in.GetNumTracks()-1-t;
|
||||||
|
|
||||||
|
// swap
|
||||||
|
TapNote tnEarlier = in.GetTapNote(iTrackEarlier, r);
|
||||||
|
TapNote tnLater = in.GetTapNote(iTrackLater, r);
|
||||||
|
in.SetTapNote(iTrackEarlier, r, tnLater);
|
||||||
|
// in.SetTapNote(iTrackLater, r, tnEarlier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
in.Convert4sToHoldNotes();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NoteDataUtil::ClearLeft( NoteData &in )
|
||||||
|
{
|
||||||
|
in.ConvertHoldNotesTo4s();
|
||||||
|
int max_row = in.GetLastRow();
|
||||||
|
for( int r=0; r<=max_row; r++ )
|
||||||
|
for( int t=0; t<in.GetNumTracks()/2; t++ )
|
||||||
|
in.SetTapNote(t, r, TAP_EMPTY);
|
||||||
|
in.Convert4sToHoldNotes();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NoteDataUtil::ClearRight( NoteData &in )
|
||||||
|
{
|
||||||
|
in.ConvertHoldNotesTo4s();
|
||||||
|
int max_row = in.GetLastRow();
|
||||||
|
for( int r=0; r<=max_row; r++ )
|
||||||
|
for( int t=(in.GetNumTracks()+1)/2; t<in.GetNumTracks(); t++ )
|
||||||
|
in.SetTapNote(t, r, TAP_EMPTY);
|
||||||
|
in.Convert4sToHoldNotes();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NoteDataUtil::CollapseToOne( NoteData &in )
|
||||||
|
{
|
||||||
|
in.ConvertHoldNotesTo2sAnd3s();
|
||||||
|
int max_row = in.GetLastRow();
|
||||||
|
for( int r=0; r<=max_row; r++ )
|
||||||
|
for( int t=0; t<in.GetNumTracks(); t++ )
|
||||||
|
if( in.GetTapNote(t,r) != TAP_EMPTY )
|
||||||
|
{
|
||||||
|
in.SetTapNote(0, r, in.GetTapNote(t,r));
|
||||||
|
in.SetTapNote(t, r, TAP_EMPTY);
|
||||||
|
}
|
||||||
|
in.Convert2sAnd3sToHoldNotes();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NoteDataUtil::ShiftLeft( NoteData &in )
|
||||||
|
{
|
||||||
|
in.ConvertHoldNotesTo4s();
|
||||||
|
int max_row = in.GetLastRow();
|
||||||
|
for( int r=0; r<=max_row; r++ )
|
||||||
|
{
|
||||||
|
for( int t=0; t<in.GetNumTracks()-1; t++ ) // in.GetNumTracks()-1 times
|
||||||
|
{
|
||||||
|
int iTrackEarlier = t;
|
||||||
|
int iTrackLater = (t+1) % in.GetNumTracks();
|
||||||
|
|
||||||
|
// swap
|
||||||
|
TapNote tnEarlier = in.GetTapNote(iTrackEarlier, r);
|
||||||
|
TapNote tnLater = in.GetTapNote(iTrackLater, r);
|
||||||
|
in.SetTapNote(iTrackEarlier, r, tnLater);
|
||||||
|
in.SetTapNote(iTrackLater, r, tnEarlier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
in.Convert4sToHoldNotes();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NoteDataUtil::ShiftRight( NoteData &in )
|
||||||
|
{
|
||||||
|
in.ConvertHoldNotesTo4s();
|
||||||
|
int max_row = in.GetLastRow();
|
||||||
|
for( int r=0; r<=max_row; r++ )
|
||||||
|
{
|
||||||
|
for( int t=in.GetNumTracks()-1; t>0; t-- ) // in.GetNumTracks()-1 times
|
||||||
|
{
|
||||||
|
int iTrackEarlier = t;
|
||||||
|
int iTrackLater = (t+1) % in.GetNumTracks();
|
||||||
|
|
||||||
|
// swap
|
||||||
|
TapNote tnEarlier = in.GetTapNote(iTrackEarlier, r);
|
||||||
|
TapNote tnLater = in.GetTapNote(iTrackLater, r);
|
||||||
|
in.SetTapNote(iTrackEarlier, r, tnLater);
|
||||||
|
in.SetTapNote(iTrackLater, r, tnEarlier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
in.Convert4sToHoldNotes();
|
||||||
|
}
|
||||||
|
|||||||
@@ -165,10 +165,19 @@ namespace NoteDataUtil
|
|||||||
void Skippy( NoteData &in );
|
void Skippy( NoteData &in );
|
||||||
void InsertIntelligentTaps( NoteData &in, float fBeatInterval, float fInsertBeatOffset, bool bNewTapSameAsBeginning );
|
void InsertIntelligentTaps( NoteData &in, float fBeatInterval, float fInsertBeatOffset, bool bNewTapSameAsBeginning );
|
||||||
void SuperShuffleTaps( NoteData &in );
|
void SuperShuffleTaps( NoteData &in );
|
||||||
|
|
||||||
void Backwards( NoteData &in );
|
void Backwards( NoteData &in );
|
||||||
void SwapSides( NoteData &in );
|
void SwapSides( NoteData &in );
|
||||||
|
void CopyLeftToRight( NoteData &in );
|
||||||
|
void CopyRightToLeft( NoteData &in );
|
||||||
|
void ClearLeft( NoteData &in );
|
||||||
|
void ClearRight( NoteData &in );
|
||||||
|
void CollapseToOne( NoteData &in );
|
||||||
|
void ShiftLeft( NoteData &in );
|
||||||
|
void ShiftRight( NoteData &in );
|
||||||
|
|
||||||
void SnapToNearestNoteType( NoteData &in, NoteType nt1, NoteType nt2, float fBeginBeat, float fEndBeat );
|
void SnapToNearestNoteType( NoteData &in, NoteType nt1, NoteType nt2, float fBeginBeat, float fEndBeat );
|
||||||
|
|
||||||
inline void SnapToNearestNoteType( NoteData &in, NoteType nt, float fBeginBeat, float fEndBeat ) { SnapToNearestNoteType( in, nt, (NoteType)-1, fBeginBeat, fEndBeat ); }
|
inline void SnapToNearestNoteType( NoteData &in, NoteType nt, float fBeginBeat, float fEndBeat ) { SnapToNearestNoteType( in, nt, (NoteType)-1, fBeginBeat, fEndBeat ); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -148,8 +148,9 @@ MiniMenuDefinition g_AreaMenu =
|
|||||||
{ "Paste at begin marker", true, 1, 0, {""} },
|
{ "Paste at begin marker", true, 1, 0, {""} },
|
||||||
{ "Clear", true, 1, 0, {""} },
|
{ "Clear", true, 1, 0, {""} },
|
||||||
{ "Quantize", true, NUM_NOTE_TYPES, 0, {"4TH","8TH","12TH","16TH","24TH","32ND"} },
|
{ "Quantize", true, NUM_NOTE_TYPES, 0, {"4TH","8TH","12TH","16TH","24TH","32ND"} },
|
||||||
{ "Turn", true, ScreenEdit::NUM_TURN_TYPES, 0, {"Left","Right","Mirror","Shuffle","Super Shuffle","Backwards","Swap Sides"} },
|
{ "Turn", true, ScreenEdit::NUM_TURN_TYPES, 0, {"Left","Right","Mirror","Shuffle","Super Shuffle"} },
|
||||||
{ "Transform", true, ScreenEdit::NUM_TRANSFORM_TYPES, 0, {"Little","Wide","Big","Quick","Skippy"} },
|
{ "Transform", true, ScreenEdit::NUM_TRANSFORM_TYPES, 0, {"Little","Wide","Big","Quick","Skippy"} },
|
||||||
|
{ "Alter", true, ScreenEdit::NUM_ALTER_TYPES, 0, {"Backwards","Swap Sides","Copy Left To Right","Copy Right To Left","Clear Left","Clear Right","Collapse To One","Shift Left","Shift Right"} },
|
||||||
{ "Play selection", true, 1, 0, {""} },
|
{ "Play selection", true, 1, 0, {""} },
|
||||||
{ "Record in selection", true, 1, 0, {""} },
|
{ "Record in selection", true, 1, 0, {""} },
|
||||||
{ "Insert blank beat and shift down", true, 1, 0, {""} },
|
{ "Insert blank beat and shift down", true, 1, 0, {""} },
|
||||||
@@ -766,7 +767,9 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ
|
|||||||
g_AreaMenu.lines[paste_at_begin_marker].bEnabled = this->m_Clipboard.GetLastBeat() != 0 && m_NoteFieldEdit.m_fBeginMarker!=-1;
|
g_AreaMenu.lines[paste_at_begin_marker].bEnabled = this->m_Clipboard.GetLastBeat() != 0 && m_NoteFieldEdit.m_fBeginMarker!=-1;
|
||||||
g_AreaMenu.lines[clear].bEnabled = bAreaSelected;
|
g_AreaMenu.lines[clear].bEnabled = bAreaSelected;
|
||||||
g_AreaMenu.lines[quantize].bEnabled = bAreaSelected;
|
g_AreaMenu.lines[quantize].bEnabled = bAreaSelected;
|
||||||
|
g_AreaMenu.lines[turn].bEnabled = bAreaSelected;
|
||||||
g_AreaMenu.lines[transform].bEnabled = bAreaSelected;
|
g_AreaMenu.lines[transform].bEnabled = bAreaSelected;
|
||||||
|
g_AreaMenu.lines[alter].bEnabled = bAreaSelected;
|
||||||
g_AreaMenu.lines[play].bEnabled = bAreaSelected;
|
g_AreaMenu.lines[play].bEnabled = bAreaSelected;
|
||||||
g_AreaMenu.lines[record].bEnabled = bAreaSelected;
|
g_AreaMenu.lines[record].bEnabled = bAreaSelected;
|
||||||
SCREENMAN->MiniMenu( &g_AreaMenu, SM_BackFromAreaMenu );
|
SCREENMAN->MiniMenu( &g_AreaMenu, SM_BackFromAreaMenu );
|
||||||
@@ -1296,8 +1299,6 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers )
|
|||||||
case mirror: NoteDataUtil::Turn( m_Clipboard, NoteDataUtil::mirror ); break;
|
case mirror: NoteDataUtil::Turn( m_Clipboard, NoteDataUtil::mirror ); break;
|
||||||
case shuffle: NoteDataUtil::Turn( m_Clipboard, NoteDataUtil::shuffle ); break;
|
case shuffle: NoteDataUtil::Turn( m_Clipboard, NoteDataUtil::shuffle ); break;
|
||||||
case super_shuffle: NoteDataUtil::Turn( m_Clipboard, NoteDataUtil::super_shuffle ); break;
|
case super_shuffle: NoteDataUtil::Turn( m_Clipboard, NoteDataUtil::super_shuffle ); break;
|
||||||
case backwards: NoteDataUtil::Backwards( m_Clipboard ); break;
|
|
||||||
case swap_sides: NoteDataUtil::SwapSides( m_Clipboard ); break;
|
|
||||||
default: ASSERT(0);
|
default: ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1322,6 +1323,28 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers )
|
|||||||
HandleAreaMenuChoice( paste_at_begin_marker, NULL );
|
HandleAreaMenuChoice( paste_at_begin_marker, NULL );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case alter:
|
||||||
|
{
|
||||||
|
HandleAreaMenuChoice( cut, NULL );
|
||||||
|
|
||||||
|
AlterType at = (AlterType)iAnswers[c];
|
||||||
|
switch( at )
|
||||||
|
{
|
||||||
|
case backwards: NoteDataUtil::Backwards( m_Clipboard ); break;
|
||||||
|
case swap_sides: NoteDataUtil::SwapSides( m_Clipboard ); break;
|
||||||
|
case copy_left_to_right: NoteDataUtil::CopyLeftToRight( m_Clipboard ); break;
|
||||||
|
case copy_right_to_left: NoteDataUtil::CopyRightToLeft( m_Clipboard ); break;
|
||||||
|
case clear_left: NoteDataUtil::ClearLeft( m_Clipboard ); break;
|
||||||
|
case clear_right: NoteDataUtil::ClearRight( m_Clipboard ); break;
|
||||||
|
case collapse_to_one: NoteDataUtil::CollapseToOne( m_Clipboard ); break;
|
||||||
|
case shift_left: NoteDataUtil::ShiftLeft( m_Clipboard ); break;
|
||||||
|
case shift_right: NoteDataUtil::ShiftRight( m_Clipboard ); break;
|
||||||
|
default: ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
HandleAreaMenuChoice( paste_at_begin_marker, NULL );
|
||||||
|
}
|
||||||
|
break;
|
||||||
case play:
|
case play:
|
||||||
{
|
{
|
||||||
ASSERT( m_NoteFieldEdit.m_fBeginMarker!=-1 && m_NoteFieldEdit.m_fEndMarker!=-1 );
|
ASSERT( m_NoteFieldEdit.m_fBeginMarker!=-1 && m_NoteFieldEdit.m_fEndMarker!=-1 );
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ public:
|
|||||||
quantize,
|
quantize,
|
||||||
turn,
|
turn,
|
||||||
transform,
|
transform,
|
||||||
|
alter,
|
||||||
play,
|
play,
|
||||||
record,
|
record,
|
||||||
insert_and_shift,
|
insert_and_shift,
|
||||||
@@ -134,8 +135,9 @@ public:
|
|||||||
NUM_AREA_MENU_CHOICES
|
NUM_AREA_MENU_CHOICES
|
||||||
};
|
};
|
||||||
void HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers );
|
void HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers );
|
||||||
enum TurnType { left, right, mirror, shuffle, super_shuffle, backwards, swap_sides, NUM_TURN_TYPES };
|
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, 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 };
|
||||||
|
|
||||||
enum EditNotesStatisticsChoice {
|
enum EditNotesStatisticsChoice {
|
||||||
difficulty,
|
difficulty,
|
||||||
|
|||||||
Reference in New Issue
Block a user