From 94743864e620cfd13aabd27c8f442e83b4f333b1 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Thu, 24 Feb 2005 11:36:19 +0000 Subject: [PATCH] add OptionRowHandler types for EditMenu --- stepmania/src/GameState.cpp | 4 + stepmania/src/GameState.h | 7 + stepmania/src/OptionRowHandler.cpp | 236 +++++++++++++++++++++++++++-- 3 files changed, 235 insertions(+), 12 deletions(-) diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 3c8e6397bd..3bab894c11 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -207,6 +207,10 @@ void GameState::Reset() m_bStatsCommitted = false; LIGHTSMAN->SetLightsMode( LIGHTSMODE_ATTRACT ); + + m_stEdit = STEPS_TYPE_INVALID; + m_pStepsEditSource = NULL; + m_stEditSource = STEPS_TYPE_INVALID; ApplyCmdline(); } diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 5a9943589d..09475239fa 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -280,6 +280,13 @@ public: CoinMode GetCoinMode(); Premium GetPremium(); + // + // Edit stuff + // + StepsType m_stEdit; + Steps *m_pStepsEditSource; + StepsType m_stEditSource; + // Lua void PushSelf( lua_State *L ); }; diff --git a/stepmania/src/OptionRowHandler.cpp b/stepmania/src/OptionRowHandler.cpp index 554d488c80..c1daad4cfa 100644 --- a/stepmania/src/OptionRowHandler.cpp +++ b/stepmania/src/OptionRowHandler.cpp @@ -22,6 +22,7 @@ #define ENTRY_MODE(s,i) THEME->GetMetric ("ScreenOptionsMaster",ssprintf("%s,%i",(s).c_str(),(i+1))) #define ENTRY_DEFAULT(s) THEME->GetMetric ("ScreenOptionsMaster",(s) + "Default") +#define STEPS_TYPES_TO_HIDE THEME->GetMetric ("OptionRowHandler","StepsTypesToHide") static void SelectExactlyOne( int iSelection, vector &vbSelectedOut ) { @@ -82,10 +83,12 @@ public: void FillList( OptionRowDefinition &defOut, CString param ); void FillNoteSkins( OptionRowDefinition &defOut ); void FillSteps( OptionRowDefinition &defOut ); + void FillEditsAndNull( OptionRowDefinition &defOut ); void FillCharacters( OptionRowDefinition &defOut ); void FillStyles( OptionRowDefinition &defOut ); void FillGroups( OptionRowDefinition &defOut ); void FillDifficulties( OptionRowDefinition &defOut ); + void FillSongsInCurrentSongGroup( OptionRowDefinition &defOut ); }; class OptionRowHandlerLua : public OptionRowHandler @@ -124,6 +127,153 @@ public: void FillConfig( OptionRowDefinition &defOut, CString param ); }; +class OptionRowHandlerStepsType : public OptionRowHandler +{ +public: + StepsType *m_pstToFill; + vector m_vStepsTypesToShow; + + OptionRowHandlerStepsType::OptionRowHandlerStepsType() { Init(); } + void Init() + { + OptionRowHandler::Init(); + m_pstToFill = NULL; + m_vStepsTypesToShow.clear(); + } + virtual void ImportOption( const OptionRowDefinition &row, PlayerNumber pn, vector &vbSelectedOut ) const + { + if( GAMESTATE->m_pCurSteps[0] ) + { + StepsType st = GAMESTATE->m_pCurSteps[0]->m_StepsType; + vector::const_iterator iter = find( m_vStepsTypesToShow.begin(), m_vStepsTypesToShow.end(), st ); + if( iter != m_vStepsTypesToShow.end() ) + { + unsigned i = iter - m_vStepsTypesToShow.begin(); + vbSelectedOut[i] = true; + return; + } + } + vbSelectedOut[0] = true; + } + virtual int ExportOption( const OptionRowDefinition &def, PlayerNumber pn, const vector &vbSelected ) const + { + int index = GetOneSelection( vbSelected ); + *m_pstToFill = m_vStepsTypesToShow[index]; + return 0; + } + + void FillStepsType( OptionRowDefinition &defOut, CString sParam ) + { + Init(); + defOut.Init(); + + if( sParam == "EditStepsType" ) + m_pstToFill = &GAMESTATE->m_stEdit; + else if( sParam == "EditSourceStepsType" ) + m_pstToFill = &GAMESTATE->m_stEditSource; + else + RageException::Throw( "invalid StepsType param \"%s\"", sParam.c_str() ); + + m_sName = sParam; + defOut.name = sParam; + defOut.bOneChoiceForAllPlayers = true; + defOut.layoutType = LAYOUT_SHOW_ONE_IN_ROW; + defOut.m_bExportOnChange = true; + + // calculate which StepsTypes to show + GAMEMAN->GetStepsTypesForGame( GAMESTATE->m_pCurGame, m_vStepsTypesToShow ); + + // subtract hidden StepsTypes + vector vsStepsTypesToHide; + split( STEPS_TYPES_TO_HIDE, ",", vsStepsTypesToHide, true ); + for( unsigned i=0; i::iterator iter = find( m_vStepsTypesToShow.begin(), m_vStepsTypesToShow.end(), st ); + if( iter != m_vStepsTypesToShow.end() ) + m_vStepsTypesToShow.erase( iter ); + } + } + + FOREACH_CONST( StepsType, m_vStepsTypesToShow, st ) + { + CString s = GAMEMAN->StepsTypeToString( *st ); + defOut.choices.push_back( s ); + } + + if( *m_pstToFill == STEPS_TYPE_INVALID ) + *m_pstToFill = m_vStepsTypesToShow[0]; + } +}; + + +class OptionRowHandlerSteps : public OptionRowHandler +{ +public: + Steps **m_ppStepsToFill; + vector m_vSteps; + + OptionRowHandlerSteps::OptionRowHandlerSteps() { Init(); } + void Init() + { + OptionRowHandler::Init(); + m_ppStepsToFill = NULL; + m_vSteps.clear(); + } + virtual void ImportOption( const OptionRowDefinition &row, PlayerNumber pn, vector &vbSelectedOut ) const + { + vector::const_iterator iter = find( m_vSteps.begin(), m_vSteps.end(), *m_ppStepsToFill ); + if( iter != m_vSteps.end() ) + { + unsigned i = iter - m_vSteps.begin(); + vbSelectedOut[i] = true; + return; + } + vbSelectedOut[0] = true; + } + virtual int ExportOption( const OptionRowDefinition &def, PlayerNumber pn, const vector &vbSelected ) const + { + int index = GetOneSelection( vbSelected ); + *m_ppStepsToFill = m_vSteps[index]; + return 0; + } + + void FillSteps( OptionRowDefinition &defOut, CString sParam ) + { + Init(); + defOut.Init(); + + if( sParam == "EditSourceSteps" ) + m_ppStepsToFill = &GAMESTATE->m_pStepsEditSource; + else + RageException::Throw( "invalid StepsType param \"%s\"", sParam.c_str() ); + + m_sName = sParam; + defOut.name = sParam; + defOut.bOneChoiceForAllPlayers = true; + defOut.layoutType = LAYOUT_SHOW_ONE_IN_ROW; + defOut.m_bExportOnChange = true; + + GAMESTATE->m_pCurSong->GetSteps( m_vSteps, GAMESTATE->m_stEditSource ); + StepsUtil::SortNotesArrayByDifficulty( m_vSteps ); + for( unsigned i=0; iGetDifficulty() == DIFFICULTY_EDIT ) + s = pSteps->GetDescription(); + else + s = DifficultyToThemedString( pSteps->GetDifficulty() ); + s += ssprintf( " (%d)", pSteps->GetMeter() ); + + defOut.choices.push_back( s ); + } + } +}; + void OptionRowHandlerList::ImportOption( const OptionRowDefinition &def, PlayerNumber pn, vector &vbSelectedOut ) const { @@ -323,17 +473,20 @@ int OptionRowHandlerConfig::ExportOption( const OptionRowDefinition &def, Player /* Add the list named "ListName" to the given row/handler. */ void OptionRowHandlerList::FillList( OptionRowDefinition &defOut, CString sListName ) { - if( m_sName == "noteskins" ) { FillNoteSkins( defOut ); return; } - else if( m_sName == "steps" ) { FillSteps( defOut ); return; } - else if( m_sName == "characters" ) { FillCharacters( defOut ); return; } - else if( m_sName == "styles" ) { FillStyles( defOut ); return; } - else if( m_sName == "groups" ) { FillGroups( defOut ); return; } - else if( m_sName == "difficulties" ) { FillDifficulties( defOut ); return; } + m_sName = sListName; + + if( m_sName.CompareNoCase("NoteSkins")==0 ) { FillNoteSkins( defOut ); return; } + else if( m_sName.CompareNoCase("Steps")==0 ) { FillSteps( defOut ); return; } + else if( m_sName.CompareNoCase("EditsAndNull")==0 ) { FillEditsAndNull( defOut ); return; } + else if( m_sName.CompareNoCase("Characters")==0 ) { FillCharacters( defOut ); return; } + else if( m_sName.CompareNoCase("Styles")==0 ) { FillStyles( defOut ); return; } + else if( m_sName.CompareNoCase("Groups")==0 ) { FillGroups( defOut ); return; } + else if( m_sName.CompareNoCase("Difficulties")==0 ) { FillDifficulties( defOut ); return; } + else if( m_sName.CompareNoCase("SongsInCurrentSongGroup")==0 ) { FillSongsInCurrentSongGroup( defOut ); return; } Init(); defOut.Init(); - m_sName = sListName; m_bUseModNameForIcon = true; defOut.name = sListName; @@ -372,7 +525,7 @@ void OptionRowHandlerList::FillList( OptionRowDefinition &defOut, CString sListN defOut.m_vEnabledForPlayers.insert( pn ); } } - else if( sName == "exportonchange" ) m_bExportOnChange = true; + else if( sName == "exportonchange" ) defOut.m_bExportOnChange = true; else RageException::Throw( "Unkown row flag \"%s\"", sName.c_str() ); } @@ -498,7 +651,7 @@ void OptionRowHandlerLua::FillLua( OptionRowDefinition &defOut, CString sLuaFunc lua_gettable( LUA->L, -2 ); if( !lua_isnil( LUA->L, -1 ) ) { - m_bExportOnChange = !!MyLua_checkboolean( LUA->L, -1 ); + defOut.m_bExportOnChange = !!MyLua_checkboolean( LUA->L, -1 ); } lua_pop( LUA->L, 1 ); /* pop ExportOnChange value */ @@ -613,6 +766,38 @@ void OptionRowHandlerList::FillSteps( OptionRowDefinition &defOut ) } } +void OptionRowHandlerList::FillEditsAndNull( OptionRowDefinition &defOut ) +{ + Init(); + defOut.Init(); + + defOut.name = "EditsAndNull"; + defOut.bOneChoiceForAllPlayers = true; + defOut.layoutType = LAYOUT_SHOW_ONE_IN_ROW; + defOut.m_bExportOnChange = true; + + vector vSteps; + GAMESTATE->m_pCurSong->GetSteps( vSteps, GAMESTATE->m_stEdit, DIFFICULTY_EDIT ); + StepsUtil::SortNotesArrayByDifficulty( vSteps ); + FOREACH_CONST( Steps*, vSteps, p ) + { + CString s = (*p)->GetDescription(); + s += ssprintf( " (%d)", (*p)->GetMeter() ); + + defOut.choices.push_back( s ); + GameCommand mc; + mc.m_pSteps = *p; + ListEntries.push_back( mc ); + } + + // Add NULL entry for a new edit + { + defOut.choices.push_back( ENTRY_NAME("NewEdit") ); + GameCommand mc; + ListEntries.push_back( mc ); + } +} + /* Add the given configuration value to the given row/handler. */ void OptionRowHandlerConfig::FillConfig( OptionRowDefinition &defOut, CString param ) @@ -752,6 +937,31 @@ void OptionRowHandlerList::FillDifficulties( OptionRowDefinition &defOut ) } } +void OptionRowHandlerList::FillSongsInCurrentSongGroup( OptionRowDefinition &defOut ) +{ + Init(); + defOut.Init(); + + vector vpSongs; + SONGMAN->GetSongs( vpSongs, GAMESTATE->m_sPreferredSongGroup ); + + if( GAMESTATE->m_pCurSong == NULL ) + GAMESTATE->m_pCurSong = vpSongs[0]; + + defOut.name = "SongsInCurrentSongGroup"; + defOut.bOneChoiceForAllPlayers = true; + defOut.layoutType = LAYOUT_SHOW_ONE_IN_ROW; + defOut.m_bExportOnChange = true; + + FOREACH_CONST( Song*, vpSongs, p ) + { + defOut.choices.push_back( (*p)->GetFullTranslitTitle() ); + GameCommand mc; + mc.m_pSong = *p; + ListEntries.push_back( mc ); + } +} + OptionRowHandler* OptionRowHandlerUtil::Make( const Command &command, OptionRowDefinition &defOut ) { @@ -761,9 +971,11 @@ OptionRowHandler* OptionRowHandlerUtil::Make( const Command &command, OptionRowD const CString &name = command.GetName(); - if( name == "list" ) { OptionRowHandlerList *p = new OptionRowHandlerList; p->FillList( defOut, sArg(1) ); pHand = p; } - else if( name == "lua" ) { OptionRowHandlerLua *p = new OptionRowHandlerLua; p->FillLua( defOut, sArg(1) ); pHand = p; } - else if( name == "conf" ) { OptionRowHandlerConfig *p = new OptionRowHandlerConfig; p->FillConfig( defOut, sArg(1) ); pHand = p; } + if( name == "list" ) { OptionRowHandlerList *p = new OptionRowHandlerList; p->FillList( defOut, sArg(1) ); pHand = p; } + else if( name == "lua" ) { OptionRowHandlerLua *p = new OptionRowHandlerLua; p->FillLua( defOut, sArg(1) ); pHand = p; } + else if( name == "conf" ) { OptionRowHandlerConfig *p = new OptionRowHandlerConfig; p->FillConfig( defOut, sArg(1) ); pHand = p; } + else if( name == "stepstype" ) { OptionRowHandlerStepsType *p = new OptionRowHandlerStepsType; p->FillStepsType( defOut, sArg(1) ); pHand = p; } + else if( name == "steps" ) { OptionRowHandlerSteps *p = new OptionRowHandlerSteps; p->FillSteps( defOut, sArg(1) ); pHand = p; } EndHandleArgs;