Save profile modifiers per gametype. Only reset saved modifiers when

loading profile modifiers, so we don't wipe out modifiers that aren't saved.
UsingProfileDefaultModifiers is gone; if an entry exists in the DefaultModifiers
list at all, UsingProfileDefaultModifiers is true.
This commit is contained in:
Glenn Maynard
2004-11-14 05:24:37 +00:00
parent 6e602f89c9
commit 4a246546a9
3 changed files with 58 additions and 13 deletions
+9 -5
View File
@@ -246,10 +246,15 @@ void GameState::PlayersFinalized()
Profile* pProfile = PROFILEMAN->GetProfile(pn);
if( pProfile->m_bUsingProfileDefaultModifiers )
CString sModifiers;
if( pProfile->GetDefaultModifiers( this->m_pCurGame, sModifiers ) )
{
GAMESTATE->m_PlayerOptions[pn].Init();
GAMESTATE->ApplyModifiers( pn, pProfile->m_sDefaultModifiers );
/* We don't save negative preferences (eg. "no reverse"). If the theme
* sets a default of "reverse", and the player turns it off, we should
* set it off. However, don't reset modifiers that aren't saved by the
* profile, so we don't ignore unsaved modifiers when a profile is in use. */
GAMESTATE->m_PlayerOptions[pn].ResetSavedPrefs();
GAMESTATE->ApplyModifiers( pn, sModifiers );
}
// Only set the sort order if it wasn't already set by a ModeChoice (or by an earlier profile)
if( m_SortOrder == SORT_INVALID && pProfile->m_SortOrder != SORT_INVALID )
@@ -386,8 +391,7 @@ void GameState::SaveCurrentSettingsToProfile( PlayerNumber pn )
Profile* pProfile = PROFILEMAN->GetProfile(pn);
pProfile->m_bUsingProfileDefaultModifiers = true;
pProfile->m_sDefaultModifiers = m_PlayerOptions[pn].GetSavedPrefsString();
pProfile->SetDefaultModifiers( this->m_pCurGame, m_PlayerOptions[pn].GetSavedPrefsString() );
if( IsSongSort(m_SortOrder) )
pProfile->m_SortOrder = m_SortOrder;
if( m_PreferredDifficulty[pn] != DIFFICULTY_INVALID )
+45 -6
View File
@@ -22,6 +22,7 @@
#include "Foreach.h"
#include "CatalogXml.h"
#include "Bookkeeper.h"
#include "Game.h"
//
// Old file versions for backward compatibility
@@ -72,8 +73,6 @@ void Profile::InitGeneralData()
}
m_bUsingProfileDefaultModifiers = false;
m_sDefaultModifiers = "";
m_SortOrder = SORT_INVALID;
m_LastDifficulty = DIFFICULTY_INVALID;
m_LastCourseDifficulty = DIFFICULTY_INVALID;
@@ -393,6 +392,33 @@ int Profile::GetSongNumTimesPlayed( const SongID& songID ) const
return iTotalNumTimesPlayed;
}
/*
* Get the profile default modifiers. Return true if set, in which case sModifiersOut
* will be set. Return false if no modifier string is set, in which case the theme
* defaults should be used. Note that the null string means "no modifiers are active",
* which is distinct from no modifier string being set at all.
*
* In practice, we get the default modifiers from the theme the first time a game
* is played, and from the profile every time thereafter.
*/
bool Profile::GetDefaultModifiers( const Game* pGameType, CString &sModifiersOut ) const
{
map<CString,CString>::const_iterator it;
it = m_sDefaultModifiers.find( pGameType->m_szName );
if( it == m_sDefaultModifiers.end() )
return false;
sModifiersOut = it->second;
return true;
}
void Profile::SetDefaultModifiers( const Game* pGameType, const CString &sModifiers )
{
if( sModifiers == "" )
m_sDefaultModifiers.erase( pGameType->m_szName );
else
m_sDefaultModifiers[pGameType->m_szName] = sModifiers;
}
//
// Steps high scores
//
@@ -733,8 +759,6 @@ XNode* Profile::SaveGeneralDataCreateNode() const
pGeneralDataNode->AppendChild( "IsMachine", IsMachine() );
pGeneralDataNode->AppendChild( "Guid", m_sGuid );
pGeneralDataNode->AppendChild( "UsingProfileDefaultModifiers", m_bUsingProfileDefaultModifiers );
pGeneralDataNode->AppendChild( "DefaultModifiers", m_sDefaultModifiers );
pGeneralDataNode->AppendChild( "SortOrder", SortOrderToString(m_SortOrder) );
pGeneralDataNode->AppendChild( "LastDifficulty", DifficultyToString(m_LastDifficulty) );
pGeneralDataNode->AppendChild( "LastCourseDifficulty", CourseDifficultyToString(m_LastCourseDifficulty) );
@@ -761,6 +785,12 @@ XNode* Profile::SaveGeneralDataCreateNode() const
// accidentally used where they're not intended. There's a lot of
// copying and pasting in this code.
{
XNode* pDefaultModifiers = pGeneralDataNode->AppendChild("DefaultModifiers");
for( map<CString,CString>::const_iterator it = m_sDefaultModifiers.begin(); it != m_sDefaultModifiers.end(); ++it )
pDefaultModifiers->AppendChild( it->first, it->second );
}
{
XNode* pUnlockedSongs = pGeneralDataNode->AppendChild("UnlockedSongs");
for( set<int>::const_iterator it = m_UnlockedSongs.begin(); it != m_UnlockedSongs.end(); ++it )
@@ -878,8 +908,6 @@ void Profile::LoadGeneralDataFromNode( const XNode* pNode )
const XNode* pTemp;
pNode->GetChildValue( "Guid", m_sGuid );
pNode->GetChildValue( "UsingProfileDefaultModifiers", m_bUsingProfileDefaultModifiers );
pNode->GetChildValue( "DefaultModifiers", m_sDefaultModifiers );
pNode->GetChildValue( "SortOrder", s ); m_SortOrder = StringToSortOrder( s );
pNode->GetChildValue( "LastDifficulty", s ); m_LastDifficulty = StringToDifficulty( s );
pNode->GetChildValue( "LastCourseDifficulty", s ); m_LastCourseDifficulty = StringToCourseDifficulty( s );
@@ -902,6 +930,17 @@ void Profile::LoadGeneralDataFromNode( const XNode* pNode )
pNode->GetChildValue( "TotalMines", m_iTotalMines );
pNode->GetChildValue( "TotalHands", m_iTotalHands );
{
const XNode* pDefaultModifiers = pNode->GetChild("DefaultModifiers");
if( pDefaultModifiers )
{
FOREACH_Node( pDefaultModifiers, game_type )
{
m_sDefaultModifiers[game_type->name] = game_type->value;
}
}
}
{
const XNode* pUnlockedSongs = pNode->GetChild("UnlockedSongs");
if( pUnlockedSongs )
+4 -2
View File
@@ -46,6 +46,7 @@ class Style;
class Song;
class Steps;
class Course;
class Game;
class Profile
{
@@ -72,6 +73,8 @@ public:
static CString GetProfileDisplayNameFromDir( CString sDir );
int GetSongNumTimesPlayed( const Song* pSong ) const;
int GetSongNumTimesPlayed( const SongID& songID ) const;
bool GetDefaultModifiers( const Game* pGameType, CString &sModifiersOut ) const;
void SetDefaultModifiers( const Game* pGameType, const CString &sModifiers );
void AddStepTotals( int iNumTapsAndHolds, int iNumJumps, int iNumHolds, int iNumMines, int iNumHands );
@@ -88,8 +91,7 @@ public:
// General data
//
CString m_sGuid;
bool m_bUsingProfileDefaultModifiers;
CString m_sDefaultModifiers;
map<CString,CString> m_sDefaultModifiers;
SortOrder m_SortOrder;
Difficulty m_LastDifficulty;
CourseDifficulty m_LastCourseDifficulty;