diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index ba9085c0b6..220b66892b 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -4094,7 +4094,7 @@ Background Options,1=screen,ScreenBackgroundOptions;name,Background Options Bookkeeping=1;together;SelectNone BookkeepingDefault= Bookkeeping,1=screen,ScreenBookkeeping;name,Bookkeeping -Clear Bookkeeping Data=1;together;SelectOne +Clear Bookkeeping Data=1;together;SelectNone Clear Bookkeeping DataDefault= Clear Bookkeeping Data,1=ClearBookkeepingData;name,Clear Bookkeeping Data Center Image=1;together;SelectNone @@ -4106,10 +4106,13 @@ Coin Options,1=screen,ScreenCoinOptions;name,Coin Options Config Key/Joy Mappings=1;together;SelectNone Config Key/Joy MappingsDefault= Config Key/Joy Mappings,1=screen,ScreenMapControllers;name,Key Joy Mappings -Clear Machine Stats=1;together;SelectOne +Clear Machine Stats=1;together;SelectNone Clear Machine StatsDefault= -Clear Machine Stats,1=ClearMachineStats;name,ClearMachineStats;screen,Screen Options Menu -Fill Machine Stats=1;together;SelectOne +Clear Machine Stats,1=ClearMachineStats;screen,ScreenOptionsMenu;name,Clear Machine Stats +Clear Machine Edits=1;together;SelectNone +Clear Machine EditsDefault= +Clear Machine Edits,1=ClearMachineEdits;screen,ScreenOptionsMenu;name,Clear Machine Edits +Fill Machine Stats=1;together;SelectNone Fill Machine StatsDefault= Fill Machine Stats,1=screen,ScreenOptionsMenu;FillMachineStats;name,Fill Machine Stats Input Options=1;together;SelectNone @@ -4136,7 +4139,7 @@ Profile Options,1=screen,ScreenProfileOptions;name,Profile Options Reload Songs/Courses=1;together;SelectNone Reload Songs/CoursesDefault= Reload Songs/Courses,1=screen,ScreenReloadSongs;name,Reload Songs -Reset To Defaults=1;together;SelectOne +Reset To Defaults=1;together;SelectNone Reset To DefaultsDefault= Reset To Defaults,1=ResetToFactoryDefaults;screen,ScreenOptionsMenu;name,Reset To Defaults Test Input=1;together;SelectNone @@ -4151,6 +4154,12 @@ Transfer Stats From Machine,1=TransferStatsFromMachine;screen,ScreenOptionsMenu; Transfer Stats To Machine=1;together;SelectNone Transfer Stats To MachineDefault= Transfer Stats To Machine,1=TransferStatsToMachine;screen,ScreenOptionsMenu;name,Transfer Stats To Machine +Copy Edits To Machine=1;together;SelectNone +Copy Edits To MachineDefault= +Copy Edits To Machine,1=CopyEditsToMachine;screen,ScreenOptionsMenu;name,Copy Edits To Machine +Copy Edits From Machine=1;together;SelectNone +Copy Edits From MachineDefault= +Copy Edits From Machine,1=CopyEditsFromMachine;screen,ScreenOptionsMenu;name,Copy Edits From Machine Set Machine Time=1;together;SelectNone Set Machine TimeDefault= Set Machine Time,1=screen,ScreenSetTime;name,Set Machine Time diff --git a/stepmania/src/GameCommand.cpp b/stepmania/src/GameCommand.cpp index cc1793543e..0c9564d682 100644 --- a/stepmania/src/GameCommand.cpp +++ b/stepmania/src/GameCommand.cpp @@ -25,6 +25,7 @@ #include "ThemeManager.h" #include "PlayerState.h" #include "Course.h" +#include "RageFileManager.h" void GameCommand::Init() { @@ -56,9 +57,12 @@ void GameCommand::Init() m_bClearBookkeepingData = false; m_bClearMachineStats = false; + m_bClearMachineEdits = false; m_bFillMachineStats = false; m_bTransferStatsFromMachine = false; m_bTransferStatsToMachine = false; + m_bCopyEditsFromMachine = false; + m_bCopyEditsToMachine = false; m_bInsertCredit = false; m_bResetToFactoryDefaults = false; m_bStopMusic = false; @@ -357,6 +361,10 @@ void GameCommand::LoadOne( const Command& cmd ) { m_bClearMachineStats = true; } + else if( sName == "clearmachineedits" ) + { + m_bClearMachineEdits = true; + } else if( sName == "fillmachinestats" ) { m_bFillMachineStats = true; @@ -365,6 +373,14 @@ void GameCommand::LoadOne( const Command& cmd ) { m_bTransferStatsFromMachine = true; } + else if( sName == "copyeditstomachine" ) + { + m_bCopyEditsToMachine = true; + } + else if( sName == "copyeditsfrommachine" ) + { + m_bCopyEditsFromMachine = true; + } else if( sName == "transferstatstomachine" ) { m_bTransferStatsToMachine = true; @@ -789,6 +805,27 @@ void GameCommand::ApplySelf( const vector &vpns ) const PROFILEMAN->SaveMachineProfile(); SCREENMAN->SystemMessage( "Machine stats cleared." ); } + if( m_bClearMachineEdits ) + { + int iNumAttempted = 0; + int iNumSuccessful = 0; + + vector vsEditFiles; + GetDirListing( PROFILEMAN->GetProfileDir(PROFILE_SLOT_MACHINE)+EDIT_SUBDIR+"*.edit", vsEditFiles, false, true ); + FOREACH_CONST( CString, vsEditFiles, i ) + { + iNumAttempted++; + bool bSuccess = FILEMAN->Remove( *i ); + if( bSuccess ) + iNumSuccessful++; + } + + // reload the machine profile + PROFILEMAN->SaveMachineProfile(); + PROFILEMAN->LoadMachineProfile(); + + SCREENMAN->SystemMessage( ssprintf("%d edits cleared, %d errors.",iNumSuccessful,iNumAttempted-iNumSuccessful) ); + } if( m_bFillMachineStats ) { // Choose a percent for all scores. This is useful for testing unlocks @@ -908,6 +945,94 @@ void GameCommand::ApplySelf( const vector &vpns ) const MEMCARDMAN->FlushAndReset(); } + if( m_bCopyEditsFromMachine ) + { + bool bTriedToCopy = false; + FOREACH_PlayerNumber( pn ) + { + if( MEMCARDMAN->GetCardState(pn) != MEMORY_CARD_STATE_READY ) + continue; // skip + + MEMCARDMAN->MountCard(pn); + + bTriedToCopy = true; + + CString sFromDir = PROFILEMAN->GetProfileDir(PROFILE_SLOT_MACHINE) + EDIT_SUBDIR; + CString sToDir = MEM_CARD_MOUNT_POINT[pn] + PREFSMAN->m_sMemoryCardProfileSubdir + "/" + EDITS_SUBDIR; + + int iNumAttempted = 0; + int iNumSuccessful = 0; + int iNumOverwritten = 0; + + vector vsEditFiles; + GetDirListing( sFromDir+"*.edit", vsEditFiles, false, false ); + FOREACH_CONST( CString, vsEditFiles, i ) + { + iNumAttempted++; + if( DoesFileExist(sToDir+*i) ) + iNumOverwritten++; + bool bSuccess = FileCopy( sFromDir+*i, sToDir+*i ); + if( bSuccess ) + iNumSuccessful++; + } + + MEMCARDMAN->UnmountCard(pn); + + SCREENMAN->SystemMessage( ssprintf("Copied to P%d card:\n attempted %d copies (%d overwritten)\n %d files copied, %d errors.",pn+1,iNumAttempted,iNumOverwritten,iNumSuccessful,iNumAttempted-iNumSuccessful) ); + break; + } + + if( !bTriedToCopy ) + SCREENMAN->SystemMessage( "Edits not copied - No memory cards ready." ); + + MEMCARDMAN->FlushAndReset(); + } + if( m_bCopyEditsToMachine ) + { + bool bTriedToCopy = false; + FOREACH_PlayerNumber( pn ) + { + if( MEMCARDMAN->GetCardState(pn) != MEMORY_CARD_STATE_READY ) + continue; // skip + + MEMCARDMAN->MountCard(pn); + + bTriedToCopy = true; + + CString sFromDir = MEM_CARD_MOUNT_POINT[pn] + PREFSMAN->m_sMemoryCardProfileSubdir + "/" + EDITS_SUBDIR; + CString sToDir = PROFILEMAN->GetProfileDir(PROFILE_SLOT_MACHINE) + EDIT_SUBDIR; + + int iNumAttempted = 0; + int iNumSuccessful = 0; + int iNumOverwritten = 0; + + vector vsEditFiles; + GetDirListing( sFromDir+"*.edit", vsEditFiles, false, false ); + FOREACH_CONST( CString, vsEditFiles, i ) + { + iNumAttempted++; + if( DoesFileExist(sToDir+*i) ) + iNumOverwritten++; + bool bSuccess = FileCopy( sFromDir+*i, sToDir+*i ); + if( bSuccess ) + iNumSuccessful++; + } + + MEMCARDMAN->UnmountCard(pn); + + // reload the machine profile + PROFILEMAN->SaveMachineProfile(); + PROFILEMAN->LoadMachineProfile(); + + SCREENMAN->SystemMessage( ssprintf("Copied from P%d card:\n attempted %d copies (%d overwritten)\n %d files copied, %d errors.",pn+1,iNumAttempted,iNumOverwritten,iNumSuccessful,iNumAttempted-iNumSuccessful) ); + break; + } + + if( !bTriedToCopy ) + SCREENMAN->SystemMessage( "Edits not copied - No memory cards ready." ); + + MEMCARDMAN->FlushAndReset(); + } if( m_bInsertCredit ) { InsertCredit(); diff --git a/stepmania/src/GameCommand.h b/stepmania/src/GameCommand.h index baaee30a2f..41c2d3b82a 100644 --- a/stepmania/src/GameCommand.h +++ b/stepmania/src/GameCommand.h @@ -74,9 +74,12 @@ public: bool m_bClearBookkeepingData; bool m_bClearMachineStats; + bool m_bClearMachineEdits; bool m_bFillMachineStats; // for testing bool m_bTransferStatsFromMachine; bool m_bTransferStatsToMachine; + bool m_bCopyEditsFromMachine; + bool m_bCopyEditsToMachine; bool m_bInsertCredit; bool m_bResetToFactoryDefaults; bool m_bStopMusic; diff --git a/stepmania/src/ProfileManager.cpp b/stepmania/src/ProfileManager.cpp index 79ab491cd5..93a8f0f48b 100644 --- a/stepmania/src/ProfileManager.cpp +++ b/stepmania/src/ProfileManager.cpp @@ -369,6 +369,7 @@ void ProfileManager::LoadMachineProfile() // If the machine name has changed, make sure we use the new name m_MachineProfile.m_sDisplayName = PREFSMAN->m_sMachineName; + SONGMAN->FreeAllLoadedFromProfile( PROFILE_SLOT_MACHINE ); SONGMAN->LoadAllFromProfileDir( MACHINE_PROFILE_DIR, PROFILE_SLOT_MACHINE ); } diff --git a/stepmania/src/SongManager.cpp b/stepmania/src/SongManager.cpp index cc6f7c0b92..243cd2ee12 100644 --- a/stepmania/src/SongManager.cpp +++ b/stepmania/src/SongManager.cpp @@ -1175,12 +1175,12 @@ void SongManager::UpdateRankingCourses() } } -void SongManager::LoadAllFromProfileDir( const CString &sDir, ProfileSlot slot ) +void SongManager::LoadAllFromProfileDir( const CString &sProfileDir, ProfileSlot slot ) { // // Load all .edit files. // - CString sEditsDir = sDir+"Edits/"; + CString sEditsDir = sProfileDir + EDIT_SUBDIR; CStringArray asEditsFilesWithPath; GetDirListing( sEditsDir+"*.edit", asEditsFilesWithPath, false, true ); diff --git a/stepmania/src/SongManager.h b/stepmania/src/SongManager.h index e050df607f..783509552b 100644 --- a/stepmania/src/SongManager.h +++ b/stepmania/src/SongManager.h @@ -34,7 +34,7 @@ public: void RegenerateNonFixedCourses(); void SetPreferences(); - void LoadAllFromProfileDir( const CString &sDir, ProfileSlot slot ); + void LoadAllFromProfileDir( const CString &sProfileDir, ProfileSlot slot ); int GetNumStepsLoadedFromProfile(); void FreeAllLoadedFromProfile( ProfileSlot slot = PROFILE_SLOT_INVALID ); @@ -119,6 +119,7 @@ protected: vector m_pShuffledCourses; // used by GetRandomCourse }; +static const CString EDIT_SUBDIR = "Edits/"; extern SongManager* SONGMAN; // global and accessable from anywhere in our program