From e3167a82d89ac544774e254df4577ab619e63272 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sat, 30 Jul 2005 19:34:23 +0000 Subject: [PATCH] working on new course edit screens --- stepmania/src/Course.cpp | 14 +- stepmania/src/Course.h | 1 + stepmania/src/GameState.cpp | 3 + stepmania/src/Makefile.am | 1 + stepmania/src/ScreenEdit.cpp | 20 +- stepmania/src/ScreenEdit.h | 1 - stepmania/src/ScreenEditCourseMods.cpp | 41 +++ stepmania/src/ScreenEditCourseMods.h | 42 +++ stepmania/src/ScreenOptions.cpp | 42 ++- stepmania/src/ScreenOptions.h | 9 +- .../src/ScreenOptionsEditCourseEntry.cpp | 310 ++++++++++-------- stepmania/src/ScreenOptionsEditCourseEntry.h | 10 +- stepmania/src/StepMania-net2003.vcproj | 6 + stepmania/src/StepMania.dsp | 12 +- stepmania/src/StepMania.vcproj | 6 + 15 files changed, 342 insertions(+), 176 deletions(-) create mode 100644 stepmania/src/ScreenEditCourseMods.cpp create mode 100644 stepmania/src/ScreenEditCourseMods.h diff --git a/stepmania/src/Course.cpp b/stepmania/src/Course.cpp index c03f5ff534..9ae36a9092 100644 --- a/stepmania/src/Course.cpp +++ b/stepmania/src/Course.cpp @@ -73,10 +73,7 @@ CString CourseEntry::GetTextDescription() const vsEntryDescription.push_back( "Sort: %d" + SongSortToThemedString(songSort) ); if( songSort != SongSort_Randomize && iChooseIndex != 0 ) vsEntryDescription.push_back( "Choose " + FormatNumberAndSuffix(iChooseIndex) + " match" ); - int iNumModChanges = 0; - if( !sModifiers.empty() ) - iNumModChanges++; - iNumModChanges += attacks.size(); + int iNumModChanges = GetNumModChanges(); if( iNumModChanges != 0 ) vsEntryDescription.push_back( ssprintf("%d mod changes", iNumModChanges) ); if( fGainSeconds != 0 ) @@ -86,6 +83,15 @@ CString CourseEntry::GetTextDescription() const return s; } +int CourseEntry::GetNumModChanges() const +{ + int iNumModChanges = 0; + if( !sModifiers.empty() ) + iNumModChanges++; + iNumModChanges += attacks.size(); + return iNumModChanges; +} + Course::Course() { diff --git a/stepmania/src/Course.h b/stepmania/src/Course.h index 3e54281275..ed89e3081b 100644 --- a/stepmania/src/Course.h +++ b/stepmania/src/Course.h @@ -96,6 +96,7 @@ public: } CString GetTextDescription() const; + int GetNumModChanges() const; }; class Course diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index af1fae8c21..906ecac2a0 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -2039,6 +2039,8 @@ public: } static int GetCurrentGame( T* p, lua_State *L ) { const_cast(p->GetCurrentGame())->PushSelf( L ); return 1; } static int GetLastSelectedProfileID( T* p, lua_State *L ) { lua_pushstring(L, p->m_sLastSelectedProfileID ); return 1; } + static int GetEditCourseEntryIndex( T* p, lua_State *L ) { lua_pushnumber(L, p->m_iEditCourseEntryIndex ); return 1; } + static void Register(lua_State *L) { ADD_METHOD( IsPlayerEnabled ) @@ -2092,6 +2094,7 @@ public: ADD_METHOD( IsWinner ) ADD_METHOD( GetCurrentGame ) ADD_METHOD( GetLastSelectedProfileID ) + ADD_METHOD( GetEditCourseEntryIndex ) Luna::Register( L ); diff --git a/stepmania/src/Makefile.am b/stepmania/src/Makefile.am index 36ed8e14e8..b59bfc5a7d 100644 --- a/stepmania/src/Makefile.am +++ b/stepmania/src/Makefile.am @@ -28,6 +28,7 @@ ScreenCenterImage.cpp ScreenCenterImage.h ScreenCredits.cpp ScreenCredits.h \ ScreenDebugOverlay.cpp ScreenDebugOverlay.h \ ScreenDemonstration.cpp ScreenDemonstration.h ScreenDimensions.h \ ScreenEdit.cpp ScreenEdit.h \ +ScreenEditCourseMods.cpp ScreenEditCourseMods.h \ ScreenEditMenu.cpp ScreenEditMenu.h ScreenEnding.cpp ScreenEnding.h \ ScreenEvaluation.cpp ScreenEvaluation.h ScreenExit.cpp ScreenExit.h ScreenNetEvaluation.cpp ScreenNetEvaluation.h \ ScreenNetSelectMusic.cpp ScreenNetSelectMusic.h ScreenNetSelectBase.cpp ScreenNetSelectBase.h ScreenNetRoom.cpp ScreenNetRoom.h \ diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index 5a352a4763..0f8bfcca3b 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -586,7 +586,6 @@ void ScreenEdit::Init() m_pSong = GAMESTATE->m_pCurSong; m_pSteps = GAMESTATE->m_pCurSteps[PLAYER_1]; - m_pAttacksFromCourse = NULL; m_bReturnToRecordMenuAfterPlay = false; m_fBeatToReturnTo = 0; @@ -1571,7 +1570,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ if( bUsesThisSong ) { g_CourseMode.rows[0].choices.push_back( crs->GetDisplayFullTitle() ); - if( crs == m_pAttacksFromCourse ) + if( crs == GAMESTATE->m_pCurCourse ) g_CourseMode.rows[0].iDefaultChoice = g_CourseMode.rows[0].choices.size()-1; } } @@ -2154,12 +2153,13 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) else if( SM == SM_BackFromCourseModeMenu ) { const int num = ScreenMiniMenu::s_viLastAnswers[0]; - m_pAttacksFromCourse = NULL; + GAMESTATE->m_pCurCourse.Set( NULL ); if( num != 0 ) { const CString name = g_CourseMode.rows[0].choices[num]; - m_pAttacksFromCourse = SONGMAN->FindCourse( name ); - ASSERT( m_pAttacksFromCourse ); + Course *pCourse = SONGMAN->FindCourse( name ); + GAMESTATE->m_pCurCourse.Set( pCourse ); + ASSERT( GAMESTATE->m_pCurCourse ); } } else if( SM == SM_BackFromOptions ) @@ -3036,17 +3036,17 @@ void ScreenEdit::SetupCourseAttacks() GAMESTATE->RemoveActiveAttacksForPlayer( PLAYER_1 ); - if( m_pAttacksFromCourse ) + if( GAMESTATE->m_pCurCourse ) { - m_pAttacksFromCourse->LoadFromCRSFile( m_pAttacksFromCourse->m_sPath ); + GAMESTATE->m_pCurCourse->LoadFromCRSFile( GAMESTATE->m_pCurCourse->m_sPath ); AttackArray Attacks; - for( unsigned e = 0; e < m_pAttacksFromCourse->m_vEntries.size(); ++e ) + for( unsigned e = 0; e < GAMESTATE->m_pCurCourse->m_vEntries.size(); ++e ) { - if( m_pAttacksFromCourse->m_vEntries[e].pSong != m_pSong ) + if( GAMESTATE->m_pCurCourse->m_vEntries[e].pSong != m_pSong ) continue; - Attacks = m_pAttacksFromCourse->m_vEntries[e].attacks; + Attacks = GAMESTATE->m_pCurCourse->m_vEntries[e].attacks; break; } diff --git a/stepmania/src/ScreenEdit.h b/stepmania/src/ScreenEdit.h index 7e127f2eaf..e2378a52f6 100644 --- a/stepmania/src/ScreenEdit.h +++ b/stepmania/src/ScreenEdit.h @@ -240,7 +240,6 @@ protected: Player m_Player; Background m_Background; Foreground m_Foreground; - Course *m_pAttacksFromCourse; bool m_bReturnToRecordMenuAfterPlay; // for MODE_RECORD and MODE_PLAY diff --git a/stepmania/src/ScreenEditCourseMods.cpp b/stepmania/src/ScreenEditCourseMods.cpp new file mode 100644 index 0000000000..d62359572b --- /dev/null +++ b/stepmania/src/ScreenEditCourseMods.cpp @@ -0,0 +1,41 @@ +#include "global.h" +#include "ScreenEditCourseMods.h" +#include "RageLog.h" + +REGISTER_SCREEN_CLASS( ScreenEditCourseMods ); +ScreenEditCourseMods::ScreenEditCourseMods( CString sName ) : ScreenEdit( sName ) +{ + LOG->Trace( "ScreenEditCourseMods::ScreenEditCourseMods()" ); +} + +void ScreenEditCourseMods::Init() +{ + ScreenEdit::Init(); + + +} + +/* + * (c) 2002-2005 Chris Danford + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ diff --git a/stepmania/src/ScreenEditCourseMods.h b/stepmania/src/ScreenEditCourseMods.h new file mode 100644 index 0000000000..412c08946e --- /dev/null +++ b/stepmania/src/ScreenEditCourseMods.h @@ -0,0 +1,42 @@ +#ifndef ScreenEditCourseMods_H +#define ScreenEditCourseMods_H + +#include "ScreenEdit.h" + +class ScreenEditCourseMods : public ScreenEdit +{ +public: + ScreenEditCourseMods( CString sName ); + + void Init(); + +protected: + +}; + +#endif + +/* + * (c) 2003-2004 Chris Danford + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ diff --git a/stepmania/src/ScreenOptions.cpp b/stepmania/src/ScreenOptions.cpp index ead6e46b1c..a4455c82bb 100644 --- a/stepmania/src/ScreenOptions.cpp +++ b/stepmania/src/ScreenOptions.cpp @@ -894,7 +894,7 @@ void ScreenOptions::ProcessMenuStart( PlayerNumber pn, const InputEventType type if( row.GetFirstItemGoesDown() ) { // move to the first choice in the row - ChangeValueInRow( pn, -row.GetChoiceInRowWithFocus(pn), type != IET_FIRST_PRESS ); + ChangeValueInRowRelative( m_iCurrentRow[pn], pn, -row.GetChoiceInRowWithFocus(pn), type != IET_FIRST_PRESS ); } } else // data.selectType != SELECT_MULTIPLE @@ -918,9 +918,9 @@ void ScreenOptions::ProcessMenuStart( PlayerNumber pn, const InputEventType type row.SetOneSelection( pn, iChoiceInRow ); } if( row.GetFirstItemGoesDown() ) - ChangeValueInRow( pn, -row.GetChoiceInRowWithFocus(pn), type != IET_FIRST_PRESS ); // move to the first choice + ChangeValueInRowRelative( m_iCurrentRow[pn], pn, -row.GetChoiceInRowWithFocus(pn), type != IET_FIRST_PRESS ); // move to the first choice else - ChangeValueInRow( pn, 0, type != IET_FIRST_PRESS ); + ChangeValueInRowRelative( m_iCurrentRow[pn], pn, 0, type != IET_FIRST_PRESS ); break; case NAV_THREE_KEY_MENU: /* Don't accept START to go to the next screen if we're still transitioning in. */ @@ -951,13 +951,28 @@ void ScreenOptions::StoreFocus( PlayerNumber pn ) } /* Left/right */ -void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat ) +void ScreenOptions::ChangeValueInRowAbsolute( int iRow, PlayerNumber pn, int iChoiceIndex, bool bRepeat ) { - const int iCurRow = m_iCurrentRow[pn]; - if( iCurRow == -1 ) // no row selected + if( iRow == -1 ) // no row selected return; // don't allow a move - OptionRow &row = *m_pRows[iCurRow]; + OptionRow &row = *m_pRows[iRow]; + + const int iNumChoices = row.GetRowDef().m_vsChoices.size(); + ASSERT( iNumChoices >= 0 && iChoiceIndex < iNumChoices ); + + int iCurrentChoiceWithFocus = row.GetChoiceInRowWithFocus(pn); + int iDelta = iChoiceIndex - iCurrentChoiceWithFocus; + + ChangeValueInRowRelative( iRow, pn, iDelta, bRepeat ); +} + +void ScreenOptions::ChangeValueInRowRelative( int iRow, PlayerNumber pn, int iDelta, bool bRepeat ) +{ + if( iRow == -1 ) // no row selected + return; // don't allow a move + + OptionRow &row = *m_pRows[iRow]; const int iNumChoices = row.GetRowDef().m_vsChoices.size(); @@ -968,14 +983,14 @@ void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat ) * * XXX: Only allow repeats if the opposite key isn't pressed; otherwise, holding both * directions will repeat in place continuously, which is weird. */ - MoveRowRelative( pn, iDelta, Repeat ); + MoveRowRelative( pn, iDelta, bRepeat ); return; } if( iNumChoices <= 1 ) // nowhere to move return; - if( Repeat && !ALLOW_REPEATING_CHANGE_VALUE_INPUT ) + if( bRepeat && !ALLOW_REPEATING_CHANGE_VALUE_INPUT ) return; bool bOneChanged = false; @@ -983,7 +998,6 @@ void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat ) int iCurrentChoiceWithFocus = row.GetChoiceInRowWithFocus(pn); int iNewChoiceWithFocus = iCurrentChoiceWithFocus + iDelta; - ASSERT( iNumChoices > 0 ); wrap( iNewChoiceWithFocus, iNumChoices ); if( iCurrentChoiceWithFocus != iNewChoiceWithFocus ) @@ -1049,9 +1063,9 @@ void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat ) } } - UpdateText( iCurRow ); + UpdateText( iRow ); - this->AfterChangeValueInRow( pn ); + this->AfterChangeValueInRow( iRow, pn ); if( m_OptionsNavigation != NAV_THREE_KEY_MENU ) m_SoundChangeCol.Play(); @@ -1061,11 +1075,11 @@ void ScreenOptions::ChangeValueInRow( PlayerNumber pn, int iDelta, bool Repeat ) vector vpns; FOREACH_HumanPlayer( p ) vpns.push_back( p ); - ExportOptions( iCurRow, vpns ); + ExportOptions( iRow, vpns ); } } -void ScreenOptions::AfterChangeValueInRow( PlayerNumber pn ) +void ScreenOptions::AfterChangeValueInRow( int iRow, PlayerNumber pn ) { AfterChangeValueOrRow( pn ); } diff --git a/stepmania/src/ScreenOptions.h b/stepmania/src/ScreenOptions.h index 508432ddee..0faf6e5af5 100644 --- a/stepmania/src/ScreenOptions.h +++ b/stepmania/src/ScreenOptions.h @@ -66,15 +66,16 @@ protected: virtual void BeginFadingOut() { this->PostScreenMessage( SM_BeginFadingOut, 0 ); } - void ChangeValueInRow( PlayerNumber pn, int iDelta, bool bRepeat ); - virtual void AfterChangeValueInRow( PlayerNumber pn ); // override this to detect when the value in a row has changed + void ChangeValueInRowRelative( int iRow, PlayerNumber pn, int iDelta, bool bRepeat ); + void ChangeValueInRowAbsolute( int iRow, PlayerNumber pn, int iChoiceIndex, bool bRepeat ); + virtual void AfterChangeValueInRow( int iRow, PlayerNumber pn ); // override this to detect when the value in a row has changed void MoveRowRelative( PlayerNumber pn, int iDir, bool bRepeat ); void MoveRowAbsolute( PlayerNumber pn, int iRow, bool bRepeat ); virtual void AfterChangeRow( PlayerNumber pn ); // override this to detect when the row has changed virtual void AfterChangeValueOrRow( PlayerNumber pn ); - void MenuLeft( PlayerNumber pn, const InputEventType type ) { ChangeValueInRow(pn,-1,type != IET_FIRST_PRESS); } - void MenuRight( PlayerNumber pn, const InputEventType type ) { ChangeValueInRow(pn,+1,type != IET_FIRST_PRESS); } + void MenuLeft( PlayerNumber pn, const InputEventType type ) { ChangeValueInRowRelative(m_iCurrentRow[pn],pn,-1,type != IET_FIRST_PRESS); } + void MenuRight( PlayerNumber pn, const InputEventType type ) { ChangeValueInRowRelative(m_iCurrentRow[pn],pn,+1,type != IET_FIRST_PRESS); } void MenuUp( PlayerNumber pn, const InputEventType type ); void MenuDown( PlayerNumber pn, const InputEventType type ); void MenuSelect( PlayerNumber pn, const InputEventType type ); diff --git a/stepmania/src/ScreenOptionsEditCourseEntry.cpp b/stepmania/src/ScreenOptionsEditCourseEntry.cpp index c5ec139264..c76d4ca282 100644 --- a/stepmania/src/ScreenOptionsEditCourseEntry.cpp +++ b/stepmania/src/ScreenOptionsEditCourseEntry.cpp @@ -7,7 +7,7 @@ #include "CommonMetrics.h" #include "GameManager.h" #include "song.h" -#include "FontCharAliases.h" +#include "Steps.h" enum EditCourseEntryRow { @@ -24,6 +24,26 @@ enum EditCourseEntryRow }; #define FOREACH_EditCourseEntryRow( i ) FOREACH_ENUM( EditCourseEntryRow, NUM_EditCourseEntryRow, i ) +static void FillSongsAndChoices( const CString &sSongGroup, vector &vpSongsOut, vector &vsChoicesOut ) +{ + vpSongsOut.clear(); + vsChoicesOut.clear(); + + if( sSongGroup.empty() ) + SONGMAN->GetSongs( vpSongsOut ); + else + SONGMAN->GetSongs( vpSongsOut, sSongGroup ); + vpSongsOut.insert( vpSongsOut.begin(), NULL ); + + FOREACH_CONST( Song*, vpSongsOut, s ) + { + if( *s == NULL ) + vsChoicesOut.push_back( "(any)" ); + else + vsChoicesOut.push_back( (*s)->GetTranslitFullTitle() ); + } +} + REGISTER_SCREEN_CLASS( ScreenOptionsEditCourseEntry ); ScreenOptionsEditCourseEntry::ScreenOptionsEditCourseEntry( CString sName ) : ScreenOptions( sName ) @@ -38,7 +58,8 @@ void ScreenOptionsEditCourseEntry::Init() // save a backup that we'll use if we revert. Course *pCourse = GAMESTATE->m_pCurCourse; - m_Original = pCourse->m_vEntries[ GAMESTATE->m_iEditCourseEntryIndex ]; + const CourseEntry &ce = pCourse->m_vEntries[ GAMESTATE->m_iEditCourseEntryIndex ]; + m_Original = ce; vector vDefs; @@ -59,9 +80,7 @@ void ScreenOptionsEditCourseEntry::Init() def.m_sName = "Song"; def.m_vsChoices.clear(); - CString sStart = "&Start;"; - FontCharAliases::ReplaceMarkers( sStart ); - def.m_vsChoices.push_back( sStart ); + FillSongsAndChoices( ce.sSongGroup, m_vpDisplayedSongs, def.m_vsChoices ); vDefs.push_back( def ); vHands.push_back( NULL ); @@ -105,7 +124,8 @@ void ScreenOptionsEditCourseEntry::Init() def.m_sName = "Set Mods"; def.m_vsChoices.clear(); - def.m_vsChoices.push_back( "Set Mods" ); + CString s = ssprintf( "%d mod changes", ce.GetNumModChanges() ); + def.m_vsChoices.push_back( s ); vDefs.push_back( def ); vHands.push_back( NULL ); @@ -115,12 +135,12 @@ void ScreenOptionsEditCourseEntry::Init() void ScreenOptionsEditCourseEntry::BeginScreen() { ScreenOptions::BeginScreen(); - - ImportAllOptions(); } void ScreenOptionsEditCourseEntry::HandleScreenMessage( const ScreenMessage SM ) { + Course *pCourse = GAMESTATE->m_pCurCourse; + if( SM == SM_GoToNextScreen ) { switch( m_iCurrentRow[GAMESTATE->m_MasterPlayerNumber] ) @@ -133,7 +153,20 @@ void ScreenOptionsEditCourseEntry::HandleScreenMessage( const ScreenMessage SM ) case ROW_CHOOSE_INDEX: break; case ROW_SET_MODS: - SCREENMAN->SetNewScreen( "ScreenEditCourseMods" ); + { + Trail *pTrail = pCourse->GetTrail( STEPS_TYPE_DANCE_SINGLE ); + TrailEntry *pTrailEntry = &pTrail->m_vEntries[GAMESTATE->m_iEditCourseEntryIndex]; + Song *pSong = pTrailEntry->pSong; + Steps *pSteps = pTrailEntry->pSteps; + + // Set up for ScreenEdit + const Style *pStyle = GAMEMAN->GetEditorStyleForStepsType(pSteps->m_StepsType); + GAMESTATE->m_pCurStyle.Set( pStyle ); + GAMESTATE->m_pCurSong.Set( pSong ); + GAMESTATE->m_pCurSteps[PLAYER_1].Set( pSteps ); + + SCREENMAN->SetNewScreen( "ScreenEditCourseMods" ); + } break; case ROW_DONE: SCREENMAN->SetNewScreen( "ScreenOptionsEditCourse" ); @@ -144,7 +177,6 @@ void ScreenOptionsEditCourseEntry::HandleScreenMessage( const ScreenMessage SM ) else if( SM == SM_GoToPrevScreen ) { // revert - Course *pCourse = GAMESTATE->m_pCurCourse; pCourse->m_vEntries[ GAMESTATE->m_iEditCourseEntryIndex ] = m_Original; SCREENMAN->SetNewScreen( "ScreenOptionsEditCourse" ); @@ -154,16 +186,132 @@ void ScreenOptionsEditCourseEntry::HandleScreenMessage( const ScreenMessage SM ) ScreenOptions::HandleScreenMessage( SM ); } -void ScreenOptionsEditCourseEntry::AfterChangeValueInRow( PlayerNumber pn ) +void ScreenOptionsEditCourseEntry::AfterChangeValueInRow( int iRow, PlayerNumber pn ) { - ScreenOptions::AfterChangeValueInRow( pn ); - Course *pCourse = GAMESTATE->m_pCurCourse; - CourseEntry &ce = pCourse->m_vEntries[ GAMESTATE->m_iEditCourseEntryIndex ]; + ScreenOptions::AfterChangeValueInRow( iRow, pn ); - switch( m_iCurrentRow[pn] ) + Course *pCourse = GAMESTATE->m_pCurCourse; + int iEntryIndex = GAMESTATE->m_iEditCourseEntryIndex; + ASSERT( iEntryIndex >= 0 && iEntryIndex < pCourse->m_vEntries.size() ); + CourseEntry &ce = pCourse->m_vEntries[ iEntryIndex ]; + + switch( iRow ) + { + case ROW_SONG_GROUP: + // refresh songs + { + vector vpns; + vpns.push_back( PLAYER_1 ); + ExportOptions( ROW_SONG_GROUP, vpns ); + + OptionRow &row = *m_pRows[ROW_SONG]; + OptionRowDefinition def = row.GetRowDef(); + FillSongsAndChoices( ce.sSongGroup, m_vpDisplayedSongs, def.m_vsChoices ); + + row.Reload( def ); + + vector::const_iterator iter = find( m_vpDisplayedSongs.begin(), m_vpDisplayedSongs.end(), ce.pSong ); + if( iter == m_vpDisplayedSongs.end() ) + { + this->ChangeValueInRowAbsolute( ROW_SONG, PLAYER_1, 0, false ); + } + else + { + int iSongIndex = iter - m_vpDisplayedSongs.begin(); + this->ChangeValueInRowAbsolute( ROW_SONG, PLAYER_1, iSongIndex, false ); + } + } + break; + } +} + +void ScreenOptionsEditCourseEntry::ImportOptions( int iRow, const vector &vpns ) +{ + Course *pCourse = GAMESTATE->m_pCurCourse; + int iEntryIndex = GAMESTATE->m_iEditCourseEntryIndex; + ASSERT( iEntryIndex >= 0 && iEntryIndex < pCourse->m_vEntries.size() ); + CourseEntry &ce = pCourse->m_vEntries[ iEntryIndex ]; + + OptionRow &row = *m_pRows[iRow]; + + switch( iRow ) + { + case ROW_SONG_GROUP: + FOREACH_CONST( CString, row.GetRowDef().m_vsChoices, s ) + { + if( *s == ce.sSongGroup ) + { + int iChoice = s - row.GetRowDef().m_vsChoices.begin(); + row.SetOneSharedSelection( iChoice ); + AfterChangeValueInRow( iRow, GAMESTATE->m_MasterPlayerNumber ); + break; + } + } + break; + case ROW_SONG: + { + vector::const_iterator iter = find( m_vpDisplayedSongs.begin(), m_vpDisplayedSongs.end(), ce.pSong ); + int iChoice = 0; + if( iter != m_vpDisplayedSongs.end() ) + iChoice = iter - m_vpDisplayedSongs.begin(); + OptionRow &row = *m_pRows[ROW_SONG]; + row.SetOneSharedSelection( iChoice ); + } + break; + case ROW_BASE_DIFFICULTY: + { + vector::const_iterator iter = find( DIFFICULTIES_TO_SHOW.GetValue().begin(), DIFFICULTIES_TO_SHOW.GetValue().end(), ce.baseDifficulty ); + int iChoice = 0; + if( iter != DIFFICULTIES_TO_SHOW.GetValue().end() ) + iChoice = iter - DIFFICULTIES_TO_SHOW.GetValue().begin() + 1; + OptionRow &row = *m_pRows[ROW_BASE_DIFFICULTY]; + row.SetOneSharedSelection( iChoice ); + } + break; + case ROW_LOW_METER: + { + int iChoice = 0; + if( ce.iLowMeter != -1 ) + iChoice = ce.iLowMeter; + OptionRow &row = *m_pRows[ROW_LOW_METER]; + row.SetOneSharedSelection( iChoice ); + } + break; + case ROW_HIGH_METER: + { + int iChoice = 0; + if( ce.iHighMeter != -1 ) + iChoice = ce.iHighMeter; + OptionRow &row = *m_pRows[ROW_HIGH_METER]; + row.SetOneSharedSelection( iChoice ); + } + break; + case ROW_SORT: + { + int iChoice = ce.songSort; + OptionRow &row = *m_pRows[ROW_SORT]; + row.SetOneSharedSelection( iChoice ); + } + break; + case ROW_CHOOSE_INDEX: + { + int iChoice = ce.iChooseIndex; + OptionRow &row = *m_pRows[ROW_CHOOSE_INDEX]; + row.SetOneSharedSelection( iChoice ); + } + } +} + +void ScreenOptionsEditCourseEntry::ExportOptions( int iRow, const vector &vpns ) +{ + Course *pCourse = GAMESTATE->m_pCurCourse; + int iEntryIndex = GAMESTATE->m_iEditCourseEntryIndex; + ASSERT( iEntryIndex >= 0 && iEntryIndex < pCourse->m_vEntries.size() ); + CourseEntry &ce = pCourse->m_vEntries[ iEntryIndex ]; + + switch( iRow ) { case ROW_SONG_GROUP: - // export song group { OptionRow &row = *m_pRows[ROW_SONG_GROUP]; int iChoice = row.GetChoiceInRowWithFocus( GAMESTATE->m_MasterPlayerNumber ); @@ -172,53 +320,25 @@ void ScreenOptionsEditCourseEntry::AfterChangeValueInRow( PlayerNumber pn ) else ce.sSongGroup = row.GetRowDef().m_vsChoices[ iChoice ]; } - // refresh songs - { - OptionRow &row = *m_pRows[ROW_SONG]; - OptionRowDefinition def = row.GetRowDef(); - def.m_vsChoices.clear(); - def.m_vsChoices.push_back( "(any)" ); - vector vpSongs; - if( ce.sSongGroup.empty() ) - SONGMAN->GetSongs( vpSongs ); - else - SONGMAN->GetSongs( vpSongs, ce.sSongGroup ); - FOREACH_CONST( Song*, vpSongs, s ) - def.m_vsChoices.push_back( (*s)->GetTranslitFullTitle() ); - vector::const_iterator iter = find( vpSongs.begin(), vpSongs.end(), ce.pSong ); - if( iter != vpSongs.end() ) - { - int iSongIndex = iter - vpSongs.begin(); - row.SetOneSharedSelection( iSongIndex+1 ); - } - else - { - row.SetOneSharedSelection( 0 ); - } - row.Reload( def ); - } - // fall through + break; case ROW_SONG: - // export song { OptionRow &row = *m_pRows[ROW_SONG]; int iChoice = row.GetChoiceInRowWithFocus( GAMESTATE->m_MasterPlayerNumber ); if( iChoice == 0 ) ce.pSong = NULL; else - ce.pSong = SONGMAN->GetAllSongs()[iChoice-1]; + ce.pSong = m_vpDisplayedSongs[iChoice-1]; } - // fall through + break; case ROW_BASE_DIFFICULTY: - // export difficulty { OptionRow &row = *m_pRows[ROW_BASE_DIFFICULTY]; int iChoice = row.GetChoiceInRowWithFocus( GAMESTATE->m_MasterPlayerNumber ); ce.baseDifficulty = DIFFICULTIES_TO_SHOW.GetValue()[iChoice]; } - // fall through + break; case ROW_LOW_METER: - // export low meter { OptionRow &row = *m_pRows[ROW_LOW_METER]; int iChoice = row.GetChoiceInRowWithFocus( GAMESTATE->m_MasterPlayerNumber ); @@ -227,9 +347,8 @@ void ScreenOptionsEditCourseEntry::AfterChangeValueInRow( PlayerNumber pn ) else ce.iLowMeter = iChoice; } - // fall through + break; case ROW_HIGH_METER: - // export high meter { OptionRow &row = *m_pRows[ROW_HIGH_METER]; int iChoice = row.GetChoiceInRowWithFocus( GAMESTATE->m_MasterPlayerNumber ); @@ -238,108 +357,24 @@ void ScreenOptionsEditCourseEntry::AfterChangeValueInRow( PlayerNumber pn ) else ce.iHighMeter = iChoice; } - // fall through + break; case ROW_SORT: - // export sort { OptionRow &row = *m_pRows[ROW_SORT]; int iChoice = row.GetChoiceInRowWithFocus( GAMESTATE->m_MasterPlayerNumber ); ce.songSort = (SongSort)iChoice; } - // fall through + break; case ROW_CHOOSE_INDEX: - // export choose index { OptionRow &row = *m_pRows[ROW_CHOOSE_INDEX]; int iChoice = row.GetChoiceInRowWithFocus( GAMESTATE->m_MasterPlayerNumber ); ce.iChooseIndex = iChoice; } - // fall through - case ROW_SET_MODS: - // fall through - default: - ; // nothing left to do + break; } } -void ScreenOptionsEditCourseEntry::ImportAllOptions() -{ - // fill choices before importing - AfterChangeValueInRow( GAMESTATE->m_MasterPlayerNumber ); - - - Course *pCourse = GAMESTATE->m_pCurCourse; - CourseEntry &ce = pCourse->m_vEntries[ GAMESTATE->m_iEditCourseEntryIndex ]; - - // import song group - { - OptionRow &row = *m_pRows[ROW_SONG_GROUP]; - FOREACH_CONST( CString, row.GetRowDef().m_vsChoices, s ) - { - if( *s == ce.sSongGroup ) - { - int iChoice = s - row.GetRowDef().m_vsChoices.begin(); - row.SetOneSharedSelection( iChoice ); - AfterChangeValueInRow( GAMESTATE->m_MasterPlayerNumber ); - break; - } - } - } - // import song - { - vector vpSongs; - SONGMAN->GetSongs( vpSongs, ce.sSongGroup ); - vector::const_iterator iter = find( vpSongs.begin(), vpSongs.end(), ce.pSong ); - int iChoice = 0; - if( iter != vpSongs.end() ) - iChoice = iter - vpSongs.begin() + 1; - OptionRow &row = *m_pRows[ROW_SONG]; - row.SetOneSharedSelection( iChoice ); - } - // import base difficulty - { - vector::const_iterator iter = find( DIFFICULTIES_TO_SHOW.GetValue().begin(), DIFFICULTIES_TO_SHOW.GetValue().end(), ce.baseDifficulty ); - int iChoice = 0; - if( iter != DIFFICULTIES_TO_SHOW.GetValue().end() ) - iChoice = iter - DIFFICULTIES_TO_SHOW.GetValue().begin() + 1; - OptionRow &row = *m_pRows[ROW_BASE_DIFFICULTY]; - row.SetOneSharedSelection( iChoice ); - } - // import low meter - { - int iChoice = 0; - if( ce.iLowMeter != -1 ) - iChoice = ce.iLowMeter; - OptionRow &row = *m_pRows[ROW_LOW_METER]; - row.SetOneSharedSelection( iChoice ); - } - // import high meter - { - int iChoice = 0; - if( ce.iHighMeter != -1 ) - iChoice = ce.iHighMeter; - OptionRow &row = *m_pRows[ROW_HIGH_METER]; - row.SetOneSharedSelection( iChoice ); - } - // import sort - { - int iChoice = ce.songSort; - OptionRow &row = *m_pRows[ROW_SORT]; - row.SetOneSharedSelection( iChoice ); - } - // import choose index - { - int iChoice = ce.iChooseIndex; - OptionRow &row = *m_pRows[ROW_CHOOSE_INDEX]; - row.SetOneSharedSelection( iChoice ); - } -} - -void ScreenOptionsEditCourseEntry::ExportOptions( int iRow, const vector &vpns ) -{ - -} - void ScreenOptionsEditCourseEntry::ProcessMenuStart( PlayerNumber pn, const InputEventType type ) { switch( m_iCurrentRow[GAMESTATE->m_MasterPlayerNumber] ) @@ -359,6 +394,7 @@ void ScreenOptionsEditCourseEntry::ProcessMenuStart( PlayerNumber pn, const Inpu } } + /* * (c) 2002-2004 Chris Danford * All rights reserved. diff --git a/stepmania/src/ScreenOptionsEditCourseEntry.h b/stepmania/src/ScreenOptionsEditCourseEntry.h index 15fbc0f9b8..7476bfd0f3 100644 --- a/stepmania/src/ScreenOptionsEditCourseEntry.h +++ b/stepmania/src/ScreenOptionsEditCourseEntry.h @@ -3,6 +3,7 @@ #include "ScreenOptions.h" #include "Course.h" +class Song; class ScreenOptionsEditCourseEntry : public ScreenOptions { @@ -15,15 +16,16 @@ public: virtual void HandleScreenMessage( const ScreenMessage SM ); protected: - virtual void ImportOptions( int iRow, const vector &vpns ) {} + + virtual void ImportOptions( int iRow, const vector &vpns ); virtual void ExportOptions( int iRow, const vector &vpns ); - virtual void AfterChangeValueInRow( PlayerNumber pn ); + virtual void AfterChangeValueInRow( int iRow, PlayerNumber pn ); virtual void ProcessMenuStart( PlayerNumber pn, const InputEventType type ); - void ImportAllOptions(); + vector m_vpDisplayedSongs; // corresponds with the choices in the Song row - CourseEntry m_Original; + CourseEntry m_Original; // use this to revert when cancelling }; #endif diff --git a/stepmania/src/StepMania-net2003.vcproj b/stepmania/src/StepMania-net2003.vcproj index fff30d6baf..22a1cc0e7c 100644 --- a/stepmania/src/StepMania-net2003.vcproj +++ b/stepmania/src/StepMania-net2003.vcproj @@ -303,6 +303,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ + + + + diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index f7d773024b..5183160798 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -62,7 +62,7 @@ IntDir=.\../Debug6 TargetDir=\cvs\stepmania\Program TargetName=StepMania-debug SOURCE="$(InputPath)" -PreLink_Cmds=archutils\Win32\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=archutils\Win32\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=archutils\Win32\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi # End Special Build Tool @@ -99,7 +99,7 @@ IntDir=.\../Release6 TargetDir=\cvs\stepmania\Program TargetName=StepMania SOURCE="$(InputPath)" -PreLink_Cmds=archutils\Win32\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=archutils\Win32\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=archutils\Win32\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi # End Special Build Tool @@ -2542,6 +2542,14 @@ SOURCE=.\ScreenEdit.h # End Source File # Begin Source File +SOURCE=.\ScreenEditCourseMods.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScreenEditCourseMods.h +# End Source File +# Begin Source File + SOURCE=.\ScreenEditMenu.cpp !IF "$(CFG)" == "StepMania - Win32 Debug" diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj index c35516c3a8..d70cab2110 100644 --- a/stepmania/src/StepMania.vcproj +++ b/stepmania/src/StepMania.vcproj @@ -283,6 +283,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ + + + +