From 0455ffaa360472f8cad7fcd42e9b7e45b52f3cd6 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Mon, 4 Jul 2011 18:15:21 -0400 Subject: [PATCH] Add two routine mirroring functions. I think the Alter Menu is getting a bit big. Maybe I should borrow from the help menus...they scroll nicely. --- Docs/Changelog_sm5.txt | 5 +++ Themes/_fallback/Languages/en.ini | 2 ++ src/ScreenEdit.cpp | 60 +++++++++++++++++++++++++++++-- src/ScreenEdit.h | 2 ++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index a09899a588..f7fc0cb694 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -13,6 +13,11 @@ StepMania 5.0 ????????? | 20110??? * [ScreenEdit] Add a function to switch the notes the routine players have to hit. In simple terms, Player 1's notes are now Player 2's and vice~versa. Check it out in the Alter Menu. [Wolfman2000] +* [ScreenEdit] Add two routine mirroring functions. Now you can build sections + of a chart for one player, and mirror the effect for the other player when + finished. For Pump players, it is not a straight mirror, but is more akin + to what is found via normal routine charts. In other words, you'll be happy. + Check it out in the Alter Menu. [Wolfman2000] 2011/07/03 ---------- diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index 7a46bb0da3..3029e65fda 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -932,6 +932,8 @@ MenuTimer=Menu Timer Meter=Meter Min BPM=Min Specified BPM Mines=Mines +Mirror Player 1 to 2=Mirror P1's notes to P2 (routine only) +Mirror Player 2 to 1=Mirror P2's notes to P1 (routine only) MoveRandomToEnd=Random At End More Options=More Options MovieColorDepth=Movie Color diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index e5d049f605..ecf52032b2 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -568,6 +568,10 @@ static MenuDef g_AlterMenu( MenuRowDef(ScreenEdit::convert_to_fake, "Convert selection to fake", true, EditMode_Full, true, true, 0, NULL ), MenuRowDef(ScreenEdit::routine_invert_notes, "Invert notes' player", true, + EditMode_Full, true, true, 0, NULL ), + MenuRowDef(ScreenEdit::routine_mirror_1_to_2, "Mirror Player 1 to 2", true, + EditMode_Full, true, true, 0, NULL ), + MenuRowDef(ScreenEdit::routine_mirror_2_to_1, "Mirror Player 2 to 1", true, EditMode_Full, true, true, 0, NULL ) ); @@ -1759,7 +1763,10 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB ) } else { - g_AlterMenu.rows[routine_invert_notes].bEnabled = (m_InputPlayerNumber != PLAYER_INVALID); + bool isRoutine = (m_InputPlayerNumber != PLAYER_INVALID); + g_AlterMenu.rows[routine_invert_notes].bEnabled = isRoutine; + g_AlterMenu.rows[routine_mirror_1_to_2].bEnabled = isRoutine; + g_AlterMenu.rows[routine_mirror_2_to_1].bEnabled = isRoutine; EditMiniMenu(&g_AlterMenu, SM_BackFromAlterMenu); } break; @@ -4082,7 +4089,56 @@ void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector &iAn } break; } - + case routine_mirror_1_to_2: + case routine_mirror_2_to_1: + { + PlayerNumber oPN = (c == routine_mirror_1_to_2 ? + PLAYER_1 : PLAYER_2); + PlayerNumber nPN = (c == routine_mirror_1_to_2 ? + PLAYER_2 : PLAYER_1); + int nTrack = -1; + NoteData &nd = this->m_NoteDataEdit; + NoteField &nf = this->m_NoteFieldEdit; + int tracks = nd.GetNumTracks(); + FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE(nd, r, + nf.m_iBeginMarker, + nf.m_iEndMarker) + { + for (int t = 0; t < tracks; t++) + { + const TapNote &tn = nd.GetTapNote(t, r); + if (tn.type != TapNote::empty && tn.pn == oPN) + { + TapNote nTap = tn; + nTap.pn = nPN; + StepsType curType = GAMESTATE->m_pCurSteps[PLAYER_1]->m_StepsType; + if (curType == StepsType_dance_routine) + { + nTrack = tracks - t - 1; + } + else if (curType == StepsType_pump_routine) + { + switch (t) + { + case 0: nTrack = 8; break; + case 1: nTrack = 9; break; + case 2: nTrack = 7; break; + case 3: nTrack = 5; break; + case 4: nTrack = 6; break; + case 5: nTrack = 3; break; + case 6: nTrack = 4; break; + case 7: nTrack = 2; break; + case 8: nTrack = 0; break; + case 9: nTrack = 1; break; + default: FAIL_M(ssprintf("Invalid column %d for pump-routine", t)); break; + } + } + m_NoteDataEdit.SetTapNote(nTrack, r, nTap); + } + } + } + break; + } } } diff --git a/src/ScreenEdit.h b/src/ScreenEdit.h index 7b5b7b2aeb..38f0a4bbad 100644 --- a/src/ScreenEdit.h +++ b/src/ScreenEdit.h @@ -409,6 +409,8 @@ public: convert_to_warp, /**< Convert the range into a WarpSegment. */ convert_to_fake, /**< Convert the range into a FakeSegment. */ routine_invert_notes, /**< Switch which player hits the note. */ + routine_mirror_1_to_2, /**< Mirror Player 1's notes for Player 2. */ + routine_mirror_2_to_1, /**< Mirror Player 2's notes for Player 1. */ NUM_ALTER_MENU_CHOICES };