From 52100a727bbb8bf30b04e78ba702ff2c227bee85 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Wed, 12 Nov 2003 08:13:02 +0000 Subject: [PATCH] working on "attack notes" --- stepmania/src/EditCoursesMenu.cpp | 9 +++-- stepmania/src/NoteDataUtil.cpp | 27 ++++++++++---- stepmania/src/NoteTypes.h | 5 +++ stepmania/src/NotesWriterDWI.cpp | 11 +++++- stepmania/src/Player.cpp | 2 +- stepmania/src/ScreenEdit.cpp | 62 +++++++++++++++++++++++-------- stepmania/src/ScreenManager.cpp | 13 +++++-- stepmania/src/ScreenManager.h | 5 ++- stepmania/src/ScreenMessage.h | 1 - 9 files changed, 101 insertions(+), 34 deletions(-) diff --git a/stepmania/src/EditCoursesMenu.cpp b/stepmania/src/EditCoursesMenu.cpp index d035af38ae..c59231f920 100644 --- a/stepmania/src/EditCoursesMenu.cpp +++ b/stepmania/src/EditCoursesMenu.cpp @@ -44,6 +44,8 @@ const ScreenMessage SM_BackFromCourseOptionsMenu = (ScreenMessage)(SM_User+1); const ScreenMessage SM_BackFromCourseEntryOptionsMenu = (ScreenMessage)(SM_User+2); +const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+3); +const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+4); enum CourseEntryMenuRow { @@ -393,7 +395,7 @@ void EditCoursesMenu::Start() GAMESTATE->m_PlayerOptions[PLAYER_1] = PlayerOptions(); GAMESTATE->m_PlayerOptions[PLAYER_1].FromString( pEntry->modifiers ); - SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions" ); + SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromPlayerOptions ); break; case ROW_ENTRY_SONG_OPTIONS: m_soundStart.Play(); @@ -401,7 +403,7 @@ void EditCoursesMenu::Start() GAMESTATE->m_SongOptions = SongOptions(); GAMESTATE->m_SongOptions.FromString( pEntry->modifiers ); - SCREENMAN->AddNewScreenToTop( "ScreenSongOptions" ); + SCREENMAN->AddNewScreenToTop( "ScreenSongOptions", SM_BackFromSongOptions ); break; default: m_soundInvalid.Play(); @@ -448,7 +450,8 @@ void EditCoursesMenu::HandleScreenMessage( const ScreenMessage SM ) OnRowValueChanged( ROW_ENTRY_OPTIONS ); } break; - case SM_RegainingFocus: + case SM_BackFromPlayerOptions: + case SM_BackFromSongOptions: // coming back from PlayerOptions or SongOptions pEntry->modifiers = GAMESTATE->m_PlayerOptions[PLAYER_1].GetString() + "," + GAMESTATE->m_SongOptions.GetString(); OnRowValueChanged( ROW_ENTRY_PLAYER_OPTIONS ); diff --git a/stepmania/src/NoteDataUtil.cpp b/stepmania/src/NoteDataUtil.cpp index acfe8f091f..1277f82d41 100644 --- a/stepmania/src/NoteDataUtil.cpp +++ b/stepmania/src/NoteDataUtil.cpp @@ -158,15 +158,28 @@ void NoteDataUtil::GetSMNoteDataString( const NoteData &in_, CString &out ) for( int r=iMeasureStartRow; r<=iMeasureLastRow; r+=iRowSpacing ) { - for( int t=0; t= TAP_ATTACK_BEGIN && tn <= TAP_ATTACK_END ) + { + c = tn - TAP_ATTACK_BEGIN + 'a'; // TODO: overflow check? + } + else + { + ASSERT(0); + c = '0'; + } + break; } sRet.append(1, c); } @@ -682,7 +695,7 @@ void NoteDataUtil::AddMines( NoteData &in, float fStartBeat, float fEndBeat ) } } - // Place mines right after hold so players must lift their foot. + // Place mines right after hold so player must lift their foot. for( int i=0; i= TAP_ATTACK_BEGIN && cNoteCols[col] <= TAP_ATTACK_END ) + continue; + else + ASSERT(0); + } if( cNoteCols[col] == TAP_HOLD_HEAD ) holds += dirs[col]; diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index b38c7cb717..2d405d1857 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -633,7 +633,7 @@ void PlayerMinus::Step( int col, RageTimer tm ) return; // Unless the computer made a very good step, they were fooled by the mine - if( tn == TAP_MINE && score <= TNS_GREAT ) + if( tn == TAP_MINE && score <= TNS_GOOD ) { m_soundMine.Play(); score = TNS_MISS; diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index caf20b5c50..0686293984 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -89,6 +89,10 @@ const ScreenMessage SM_BackFromEditNotesStatistics = (ScreenMessage)(SM_User+3); const ScreenMessage SM_BackFromEditOptions = (ScreenMessage)(SM_User+4); const ScreenMessage SM_BackFromEditSongInfo = (ScreenMessage)(SM_User+5); const ScreenMessage SM_BackFromBGChange = (ScreenMessage)(SM_User+6); +const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+7); +const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+8); +const ScreenMessage SM_BackFromInsertAttack = (ScreenMessage)(SM_User+9); +const ScreenMessage SM_BackFromInsertAttackModifiers= (ScreenMessage)(SM_User+10); const CString HELP_TEXT = @@ -217,6 +221,19 @@ static const MenuRow g_BGChangeItems[] = }; static Menu g_BGChange( "Background Change", g_BGChangeItems ); +static const MenuRow g_InsertAttackItems[] = +{ + { "Duration", true, 2, { "0:10","0:20","0:30","0:40","0:50","1:00","1:10","1:20","1:30","1:40","1:50","2:00" } }, + { "Set modifiers", true, 0, { "PRESS START" } }, + { NULL, true, 0, { NULL } } +}; +static Menu g_InsertAttack( "Insert Attack", g_InsertAttackItems ); + +// HACK: need to remember the track we're inserting on so +// that we can lay the attack note after coming back from +// menus. +int g_iLastInsertAttackTrack = -1; + ScreenEdit::ScreenEdit( CString sName ) : Screen( sName ) { LOG->Trace( "ScreenEdit::ScreenEdit()" ); @@ -661,22 +678,23 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ if( !bRemovedAHoldNote ) { - // Hold Shift to lay mine - bool bLayMine = - INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_LSHIFT)) || - INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_RSHIFT)); - - // We didn't remove a HoldNote, so the user wants to add or delete a TapNote - if( m_NoteFieldEdit.GetTapNote(iCol, iSongIndex) == TAP_EMPTY ) + // Delete the tap note here if one already exists + if( m_NoteFieldEdit.GetTapNote(iCol, iSongIndex) != TAP_EMPTY ) { - if( bLayMine ) - m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_MINE ); - else - m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_TAP ); + m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_EMPTY ); } else { - m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_EMPTY ); + // Hold LShift to lay mine, hold RShift to lay an attack + if( INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_LSHIFT)) ) + m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_MINE ); + else if( INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_RSHIFT)) ) + { + g_iLastInsertAttackTrack = iCol; + SCREENMAN->MiniMenu( &g_InsertAttack, SM_BackFromInsertAttack ); + } + else + m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_TAP ); } } } @@ -1240,10 +1258,24 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) case SM_BackFromBGChange: HandleBGChangeChoice( (BGChangeChoice)ScreenMiniMenu::s_iLastLine, ScreenMiniMenu::s_iLastAnswers ); break; - case SM_RegainingFocus: + case SM_BackFromPlayerOptions: + case SM_BackFromSongOptions: // coming back from PlayerOptions or SongOptions m_soundMusic.SetPlaybackRate( GAMESTATE->m_SongOptions.m_fMusicRate ); break; + case SM_BackFromInsertAttack: + GAMESTATE->StoreSelectedOptions(); // save so that we don't lose the options chosen for edit and playback + SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertAttackModifiers ); + break; + case SM_BackFromInsertAttackModifiers: + { + PlayerOptions poChosen = GAMESTATE->m_PlayerOptions[PLAYER_1]; + CString sMods = poChosen.GetString(); + int row = BeatToNoteRow( GAMESTATE->m_fSongBeat ); + m_NoteFieldEdit.SetTapNote( g_iLastInsertAttackTrack, row, TAP_TAP ); + GAMESTATE->RestoreSelectedOptions(); // restore the edit and playback options + } + break; } } @@ -1368,10 +1400,10 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, int* iAnswers ) } break; case player_options: - SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions" ); + SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromPlayerOptions ); break; case song_options: - SCREENMAN->AddNewScreenToTop( "ScreenSongOptions" ); + SCREENMAN->AddNewScreenToTop( "ScreenSongOptions", SM_BackFromSongOptions ); break; case edit_song_info: { diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index c5129c1da1..53d7951ada 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -321,6 +321,8 @@ ScreenManager::ScreenManager() m_SystemLayer = new ScreenSystemLayer; m_ScreenBuffered = NULL; + + m_MessageSendOnPop = SM_None; } @@ -583,10 +585,11 @@ retry: GAMESTATE->m_bIsOnSystemMenu = false; } -void ScreenManager::AddNewScreenToTop( CString sClassName ) +void ScreenManager::AddNewScreenToTop( CString sClassName, ScreenMessage messageSendOnPop ) { Screen* pNewScreen = MakeNewScreen(sClassName); m_ScreenStack.push_back( pNewScreen ); + m_MessageSendOnPop = messageSendOnPop; } #include "ScreenPrompt.h" @@ -617,9 +620,11 @@ void ScreenManager::PopTopScreen( ScreenMessage SM ) //pScreenToPop->HandleScreenMessage( SM_LosingInputFocus ); m_ScreenStack.erase(m_ScreenStack.end()-1, m_ScreenStack.end()); m_ScreensToDelete.push_back( pScreenToPop ); - - Screen* pNewTopScreen = m_ScreenStack[m_ScreenStack.size()-1]; - pNewTopScreen->HandleScreenMessage( SM ); + + // post to the new top + PostMessageToTopScreen( SM, 0 ); + PostMessageToTopScreen( m_MessageSendOnPop, 0 ); + m_MessageSendOnPop = SM_None; } void ScreenManager::PostMessageToTopScreen( ScreenMessage SM, float fDelay ) diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index b53fed0672..4f7ecbda5a 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -39,11 +39,11 @@ public: void LoadPreppedScreen(); void DeletePreppedScreen(); void SetNewScreen( CString sClassName ); - void AddNewScreenToTop( CString sClassName ); + void AddNewScreenToTop( CString sClassName, ScreenMessage messageSendOnPop ); void Prompt( ScreenMessage SM_SendWhenDone, CString sText, bool bYesNo = false, bool bDefaultAnswer = false, void(*OnYes)(void*) = NULL, void(*OnNo)(void*) = NULL, void* pCallbackData = NULL ); void TextEntry( ScreenMessage SM_SendWhenDone, CString sQuestion, CString sInitialAnswer, void(*OnOK)(CString sAnswer) = NULL, void(*OnCanel)() = NULL ); void MiniMenu( Menu* pDef, ScreenMessage SM_SendOnOK, ScreenMessage SM_SendOnCancel = SM_None ); - void PopTopScreen( ScreenMessage SM = SM_RegainingFocus ); + void PopTopScreen( ScreenMessage SM = SM_None ); void SystemMessage( CString sMessage ); void PostMessageToTopScreen( ScreenMessage SM, float fDelay ); @@ -57,6 +57,7 @@ public: private: vector m_ScreenStack; // bottommost to topmost + ScreenMessage m_MessageSendOnPop; vector m_ScreensToDelete; Screen *m_ScreenBuffered; ScreenSystemLayer *m_SystemLayer; diff --git a/stepmania/src/ScreenMessage.h b/stepmania/src/ScreenMessage.h index a89a02f6ff..1fc4863277 100644 --- a/stepmania/src/ScreenMessage.h +++ b/stepmania/src/ScreenMessage.h @@ -23,7 +23,6 @@ enum ScreenMessage { SM_BeginFadingOut, SM_GoToNextScreen, SM_GoToPrevScreen, - SM_RegainingFocus, SM_User = 100 };