Added Arbitrary Remap option to Alter Menu in Edit Mode.
This commit is contained in:
@@ -597,6 +597,7 @@ AllGroups=All Groups
|
|||||||
Alternate=Alternate
|
Alternate=Alternate
|
||||||
Always=Always
|
Always=Always
|
||||||
Animations=Animations
|
Animations=Animations
|
||||||
|
Arbitrary Remap Columns=Arbitrarily Remap
|
||||||
Arcade Style=Arcade Style
|
Arcade Style=Arcade Style
|
||||||
Ask=Ask
|
Ask=Ask
|
||||||
AttackMines=AttackMines
|
AttackMines=AttackMines
|
||||||
@@ -1402,6 +1403,7 @@ Enter a new preview start.=Enter when the music sample starts.
|
|||||||
Enter a new preview length.=Enter how long the music sample lasts.
|
Enter a new preview length.=Enter how long the music sample lasts.
|
||||||
Enter a new min BPM.=Enter the minimum displayed BPM.
|
Enter a new min BPM.=Enter the minimum displayed BPM.
|
||||||
Enter a new max BPM.=Enter the maximum displayed BPM.
|
Enter a new max BPM.=Enter the maximum displayed BPM.
|
||||||
|
Enter the new track mapping.=Enter the new track mapping.
|
||||||
More than %d notes per measure is not allowed. This change has been reverted.=More than %d notes per measure is not allowed. This change has been reverted.
|
More than %d notes per measure is not allowed. This change has been reverted.=More than %d notes per measure is not allowed. This change has been reverted.
|
||||||
No backgrounds available=No backgrounds available
|
No backgrounds available=No backgrounds available
|
||||||
EditHelpText=Up/Down:\n change beat\nLeft/Right:\n change snap\nNumber keys:\n add/remove\n tap note\nN and M keys:\n swap tap notes\nCtrl + N/M:\n swap cycled segment\nCtrl + ,/.:\n cycle segments\nCreate hold note:\n Hold a number\n while moving\n Up or Down\nCreate roll note:\n Hold Shift,\n then create a\n hold note.\nSpace bar: Set area\n marker\nT key: Switch Timing\nEnter: Area Menu\nA Key: Alter Menu\nEscape: Main Menu\nF4: Timing Menu\nF1: Show help\n
|
EditHelpText=Up/Down:\n change beat\nLeft/Right:\n change snap\nNumber keys:\n add/remove\n tap note\nN and M keys:\n swap tap notes\nCtrl + N/M:\n swap cycled segment\nCtrl + ,/.:\n cycle segments\nCreate hold note:\n Hold a number\n while moving\n Up or Down\nCreate roll note:\n Hold Shift,\n then create a\n hold note.\nSpace bar: Set area\n marker\nT key: Switch Timing\nEnter: Area Menu\nA Key: Alter Menu\nEscape: Main Menu\nF4: Timing Menu\nF1: Show help\n
|
||||||
|
|||||||
@@ -2274,6 +2274,14 @@ void NoteDataUtil::SwapUpDown(NoteData& inout, StepsType st)
|
|||||||
inout.RevalidateATIs(vector<int>(), false);
|
inout.RevalidateATIs(vector<int>(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NoteDataUtil::ArbitraryRemap(NoteData& inout, int* mapping)
|
||||||
|
{
|
||||||
|
NoteData tempND;
|
||||||
|
tempND.LoadTransformed(inout, inout.GetNumTracks(), mapping);
|
||||||
|
inout.CopyAll(tempND);
|
||||||
|
inout.RevalidateATIs(vector<int>(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct ValidRow
|
struct ValidRow
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ namespace NoteDataUtil
|
|||||||
void ShiftLeft( NoteData &inout );
|
void ShiftLeft( NoteData &inout );
|
||||||
void ShiftRight( NoteData &inout );
|
void ShiftRight( NoteData &inout );
|
||||||
void SwapUpDown( NoteData &inout, StepsType st );
|
void SwapUpDown( NoteData &inout, StepsType st );
|
||||||
|
void ArbitraryRemap( NoteData &inout, int* mapping );
|
||||||
|
|
||||||
void SnapToNearestNoteType( NoteData &inout, NoteType nt1, NoteType nt2, int iStartIndex, int iEndIndex );
|
void SnapToNearestNoteType( NoteData &inout, NoteType nt1, NoteType nt2, int iStartIndex, int iEndIndex );
|
||||||
|
|
||||||
|
|||||||
@@ -1751,6 +1751,16 @@ void MakeLower( wchar_t *p, size_t iLen )
|
|||||||
UnicodeUpperLower( p, iLen, g_LowerCase );
|
UnicodeUpperLower( p, iLen, g_LowerCase );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool operator>>(const RString& lhs, int& rhs)
|
||||||
|
{
|
||||||
|
return istringstream(lhs) >> rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator>>(const RString& lhs, float& rhs)
|
||||||
|
{
|
||||||
|
return istringstream(lhs) >> rhs;
|
||||||
|
}
|
||||||
|
|
||||||
int StringToInt( const RString &sString )
|
int StringToInt( const RString &sString )
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|||||||
@@ -418,6 +418,9 @@ RString IntToString( const int &iNum );
|
|||||||
float StringToFloat( const RString &sString );
|
float StringToFloat( const RString &sString );
|
||||||
RString FloatToString( const float &num );
|
RString FloatToString( const float &num );
|
||||||
bool StringToFloat( const RString &sString, float &fOut );
|
bool StringToFloat( const RString &sString, float &fOut );
|
||||||
|
// Better than IntToString because you can check for success.
|
||||||
|
bool operator>>(const RString& lhs, int& rhs);
|
||||||
|
bool operator>>(const RString& lhs, float& rhs);
|
||||||
|
|
||||||
RString WStringToRString( const wstring &sString );
|
RString WStringToRString( const wstring &sString );
|
||||||
RString WcharToUTF8( wchar_t c );
|
RString WcharToUTF8( wchar_t c );
|
||||||
|
|||||||
+74
-1
@@ -62,6 +62,7 @@ AutoScreenMessage( SM_UpdateTextInfo );
|
|||||||
AutoScreenMessage( SM_BackFromMainMenu );
|
AutoScreenMessage( SM_BackFromMainMenu );
|
||||||
AutoScreenMessage( SM_BackFromAreaMenu );
|
AutoScreenMessage( SM_BackFromAreaMenu );
|
||||||
AutoScreenMessage( SM_BackFromAlterMenu );
|
AutoScreenMessage( SM_BackFromAlterMenu );
|
||||||
|
AutoScreenMessage( SM_BackFromArbitraryRemap );
|
||||||
AutoScreenMessage( SM_BackFromStepsInformation );
|
AutoScreenMessage( SM_BackFromStepsInformation );
|
||||||
AutoScreenMessage( SM_BackFromStepsData );
|
AutoScreenMessage( SM_BackFromStepsData );
|
||||||
AutoScreenMessage( SM_BackFromOptions );
|
AutoScreenMessage( SM_BackFromOptions );
|
||||||
@@ -616,7 +617,7 @@ static MenuDef g_AlterMenu(
|
|||||||
MenuRowDef(ScreenEdit::alter, "Alter", true,
|
MenuRowDef(ScreenEdit::alter, "Alter", true,
|
||||||
EditMode_Practice, true, true, 0, "Autogen To Fill Width","Backwards","Swap Sides",
|
EditMode_Practice, true, true, 0, "Autogen To Fill Width","Backwards","Swap Sides",
|
||||||
"Copy Left To Right","Copy Right To Left","Clear Left","Clear Right",
|
"Copy Left To Right","Copy Right To Left","Clear Left","Clear Right",
|
||||||
"Collapse To One","Collapse Left","Shift Left","Shift Right", "Swap Up/Down" ),
|
"Collapse To One","Collapse Left","Shift Left","Shift Right", "Swap Up/Down", "Arbitrary Remap Columns" ),
|
||||||
MenuRowDef(ScreenEdit::tempo, "Tempo", true,
|
MenuRowDef(ScreenEdit::tempo, "Tempo", true,
|
||||||
EditMode_Full, true, true, 0, "Compress 2x","Compress 3->2",
|
EditMode_Full, true, true, 0, "Compress 2x","Compress 3->2",
|
||||||
"Compress 4->3","Expand 3->4","Expand 2->3","Expand 2x" ),
|
"Compress 4->3","Expand 3->4","Expand 2->3","Expand 2x" ),
|
||||||
@@ -3285,6 +3286,10 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
|
|||||||
{
|
{
|
||||||
HandleAlterMenuChoice( (AlterMenuChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers );
|
HandleAlterMenuChoice( (AlterMenuChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers );
|
||||||
}
|
}
|
||||||
|
else if( SM == SM_BackFromArbitraryRemap )
|
||||||
|
{
|
||||||
|
HandleArbitraryRemapping(ScreenTextEntry::s_sLastAnswer);
|
||||||
|
}
|
||||||
else if( SM == SM_BackFromStepsInformation )
|
else if( SM == SM_BackFromStepsInformation )
|
||||||
{
|
{
|
||||||
HandleStepsInformationChoice( (StepsInformationChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers );
|
HandleStepsInformationChoice( (StepsInformationChoice)ScreenMiniMenu::s_iLastRowCode, ScreenMiniMenu::s_viLastAnswers );
|
||||||
@@ -4532,6 +4537,66 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector<int> &iAns
|
|||||||
GAMESTATE->SetProcessedTimingData(NULL);
|
GAMESTATE->SetProcessedTimingData(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LocalizedString ENTER_ARBITRARY_MAPPING( "ScreenEdit", "Enter the new track mapping." );
|
||||||
|
static bool ConvertMappingInputToMapping(RString const& mapstr, int* mapping, RString& error)
|
||||||
|
{
|
||||||
|
vector<RString> mapping_input;
|
||||||
|
split(mapstr, ",", mapping_input);
|
||||||
|
int tracks_for_type= GAMEMAN->GetStepsTypeInfo(GAMESTATE->m_pCurSteps[0]->m_StepsType).iNumTracks;
|
||||||
|
if(mapping_input.size() > tracks_for_type)
|
||||||
|
{
|
||||||
|
error= "Too many tracks specified.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// mapping_input.size() < tracks_for_type is not checked because
|
||||||
|
// unspecified tracks are mapped directly. -Kyz
|
||||||
|
size_t track= 0;
|
||||||
|
// track will be used for filling in the unspecified part of the mapping.
|
||||||
|
for(; track < mapping_input.size(); ++track)
|
||||||
|
{
|
||||||
|
if(mapping_input[track].empty())
|
||||||
|
{
|
||||||
|
mapping[track]= track;
|
||||||
|
}
|
||||||
|
else if(!(mapping_input[track] >> mapping[track]))
|
||||||
|
{
|
||||||
|
error= "'" + mapping_input[track] + "' is not a track id.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(mapping[track] < 0 || mapping[track] >= tracks_for_type)
|
||||||
|
{
|
||||||
|
error= ssprintf("Entry %d, '%s', '%d' is out of range 0 to %d.", track, mapping_input[track].c_str(), mapping[track], tracks_for_type-1);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(; track < tracks_for_type; ++track)
|
||||||
|
{
|
||||||
|
mapping[track]= track;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ArbitraryRemapValidate(const RString& answer, RString& error_out)
|
||||||
|
{
|
||||||
|
int mapping[MAX_NOTE_TRACKS];
|
||||||
|
return ConvertMappingInputToMapping(answer, mapping, error_out);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenEdit::HandleArbitraryRemapping(RString const& mapstr)
|
||||||
|
{
|
||||||
|
const NoteData OldClipboard( m_Clipboard );
|
||||||
|
HandleAlterMenuChoice( cut, false );
|
||||||
|
int mapping[MAX_NOTE_TRACKS];
|
||||||
|
RString error;
|
||||||
|
// error is actually reported by the validate function, and unused here.
|
||||||
|
if(ConvertMappingInputToMapping(mapstr, mapping, error))
|
||||||
|
{
|
||||||
|
NoteDataUtil::ArbitraryRemap(m_Clipboard, mapping);
|
||||||
|
}
|
||||||
|
HandleAreaMenuChoice( paste_at_begin_marker, false );
|
||||||
|
m_Clipboard = OldClipboard;
|
||||||
|
}
|
||||||
|
|
||||||
void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector<int> &iAnswers, bool bAllowUndo)
|
void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector<int> &iAnswers, bool bAllowUndo)
|
||||||
{
|
{
|
||||||
ASSERT_M(m_NoteFieldEdit.m_iBeginMarker!=-1 && m_NoteFieldEdit.m_iEndMarker!=-1,
|
ASSERT_M(m_NoteFieldEdit.m_iBeginMarker!=-1 && m_NoteFieldEdit.m_iEndMarker!=-1,
|
||||||
@@ -4677,6 +4742,14 @@ void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector<int> &iAn
|
|||||||
case shift_left: NoteDataUtil::ShiftLeft( m_Clipboard ); break;
|
case shift_left: NoteDataUtil::ShiftLeft( m_Clipboard ); break;
|
||||||
case shift_right: NoteDataUtil::ShiftRight( m_Clipboard ); break;
|
case shift_right: NoteDataUtil::ShiftRight( m_Clipboard ); break;
|
||||||
case swap_up_down: NoteDataUtil::SwapUpDown(m_Clipboard, GAMESTATE->m_pCurSteps[0]->m_StepsType); break;
|
case swap_up_down: NoteDataUtil::SwapUpDown(m_Clipboard, GAMESTATE->m_pCurSteps[0]->m_StepsType); break;
|
||||||
|
case arbitrary_remap:
|
||||||
|
ScreenTextEntry::TextEntry(
|
||||||
|
SM_BackFromArbitraryRemap, ENTER_ARBITRARY_MAPPING,
|
||||||
|
"0, 1, 2, 3", MAX_NOTE_TRACKS * 4,
|
||||||
|
// 2 chars for digit, one for comma, one for space.
|
||||||
|
ArbitraryRemapValidate
|
||||||
|
);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleAreaMenuChoice( paste_at_begin_marker, false );
|
HandleAreaMenuChoice( paste_at_begin_marker, false );
|
||||||
|
|||||||
@@ -442,6 +442,7 @@ public:
|
|||||||
modify_keysounds_at_row, /**< Modify the keysounds at this row. */
|
modify_keysounds_at_row, /**< Modify the keysounds at this row. */
|
||||||
NUM_AREA_MENU_CHOICES
|
NUM_AREA_MENU_CHOICES
|
||||||
};
|
};
|
||||||
|
void HandleArbitraryRemapping(RString const& mapstr);
|
||||||
void HandleAlterMenuChoice(AlterMenuChoice c,
|
void HandleAlterMenuChoice(AlterMenuChoice c,
|
||||||
const vector<int> &iAnswers,
|
const vector<int> &iAnswers,
|
||||||
bool bAllowUndo = true);
|
bool bAllowUndo = true);
|
||||||
@@ -502,6 +503,7 @@ public:
|
|||||||
shift_left,
|
shift_left,
|
||||||
shift_right,
|
shift_right,
|
||||||
swap_up_down,
|
swap_up_down,
|
||||||
|
arbitrary_remap,
|
||||||
NUM_ALTER_TYPES
|
NUM_ALTER_TYPES
|
||||||
};
|
};
|
||||||
enum TempoType
|
enum TempoType
|
||||||
|
|||||||
Reference in New Issue
Block a user