diff --git a/src/Bookkeeper.cpp b/src/Bookkeeper.cpp index 39c5846e85..ec383184ee 100644 --- a/src/Bookkeeper.cpp +++ b/src/Bookkeeper.cpp @@ -4,10 +4,12 @@ #include "RageLog.h" #include "IniFile.h" #include "GameConstantsAndTypes.h" +#include "GameState.h" #include "SongManager.h" #include "RageFile.h" #include "XmlFile.h" #include "XmlFileUtil.h" +#include "SpecialFiles.h" #include Bookkeeper* BOOKKEEPER = NULL; // global and accessible from anywhere in our program @@ -120,6 +122,17 @@ void Bookkeeper::ReadFromDisk() if( !XmlFileUtil::LoadFromFileShowErrors(xml, COINS_DAT) ) return; + int numCoins = 0; + ReadCoinsFile(numCoins); + + if ( numCoins < 0 ) + numCoins = 0; + else if ( numCoins / PREFSMAN->m_iCoinsPerCredit > MAX_NUM_CREDITS ) + numCoins = 0; + + LOG->Trace("Number of Coins to Load on boot: %i", numCoins); + GAMESTATE->m_iCoins.Set(numCoins); + LoadFromNode( &xml ); } @@ -145,6 +158,20 @@ void Bookkeeper::CoinInserted() ++m_mapCoinsForHour[d]; } +void Bookkeeper::WriteCoinsFile( int coins ) +{ + IniFile ini; + ini.SetValue( "Bookkeeping", "Coins", coins); + ini.WriteFile( SpecialFiles::COINS_INI ); +} + +void Bookkeeper::ReadCoinsFile( int &coins ) +{ + IniFile ini; + ini.ReadFile( SpecialFiles::COINS_INI ); + ini.GetValue( "Bookkeeping", "Coins", coins); +} + // Return the number of coins between [beginning,ending). int Bookkeeper::GetNumCoinsInRange( map::const_iterator begin, map::const_iterator end ) const { diff --git a/src/Bookkeeper.h b/src/Bookkeeper.h index 5b9cc5c0fa..ef13e82609 100644 --- a/src/Bookkeeper.h +++ b/src/Bookkeeper.h @@ -21,6 +21,9 @@ public: void GetCoinsLastWeeks( int coins[NUM_LAST_WEEKS] ) const; void GetCoinsByDayOfWeek( int coins[DAYS_IN_WEEK] ) const; void GetCoinsByHour( int coins[HOURS_IN_DAY] ) const; + void WriteCoinsFile( int coins ) ; + void ReadCoinsFile( int &coins ) ; + void LoadFromNode( const XNode *pNode ); XNode* CreateNode() const; diff --git a/src/GameCommand.cpp b/src/GameCommand.cpp index 83da0bb0a5..4d7d67a58c 100644 --- a/src/GameCommand.cpp +++ b/src/GameCommand.cpp @@ -5,6 +5,7 @@ #include "GameManager.h" #include "GameState.h" #include "AnnouncerManager.h" +#include "Bookkeeper.h" #include "PlayerOptions.h" #include "ProfileManager.h" #include "Profile.h" @@ -718,6 +719,9 @@ void GameCommand::ApplySelf( const vector &vpns ) const GAMESTATE->m_iCoins.Set( GAMESTATE->m_iCoins - iNumCreditsOwed * PREFSMAN->m_iCoinsPerCredit ); LOG->Trace( "Deducted %i coins, %i remaining", iNumCreditsOwed * PREFSMAN->m_iCoinsPerCredit, GAMESTATE->m_iCoins.Get() ); + + //Credit Used, make sure to update CoinsFile + BOOKKEEPER->WriteCoinsFile(GAMESTATE->m_iCoins.Get()); } // If only one side is joined and we picked a style that requires both diff --git a/src/GameState.cpp b/src/GameState.cpp index f5287b259e..1fe3ed4a74 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -514,6 +514,9 @@ namespace GAMESTATE->JoinPlayer( pn ); + // On Join, make sure to update Coins File + BOOKKEEPER->WriteCoinsFile(GAMESTATE->m_iCoins.Get()); + return true; } }; diff --git a/src/SpecialFiles.cpp b/src/SpecialFiles.cpp index 5f6d5c50e8..eeab64fbed 100644 --- a/src/SpecialFiles.cpp +++ b/src/SpecialFiles.cpp @@ -19,6 +19,8 @@ const RString SpecialFiles::TYPE_TXT_FILE = "Data/Type.txt"; const RString SpecialFiles::SONGS_DIR = "Songs/"; const RString SpecialFiles::COURSES_DIR = "Courses/"; const RString SpecialFiles::NOTESKINS_DIR = "NoteSkins/"; +const RString SpecialFiles::COINS_INI = "Save/Coin.ini"; + /* diff --git a/src/SpecialFiles.h b/src/SpecialFiles.h index dc6782d0d5..0fe040e9bd 100644 --- a/src/SpecialFiles.h +++ b/src/SpecialFiles.h @@ -39,6 +39,9 @@ namespace SpecialFiles extern const RString COURSES_DIR; /** @brief The default noteskins directory. */ extern const RString NOTESKINS_DIR; + + extern const RString COINS_INI; + } #endif diff --git a/src/StepMania.cpp b/src/StepMania.cpp index 808c808a7e..e163ce1253 100644 --- a/src/StepMania.cpp +++ b/src/StepMania.cpp @@ -1281,9 +1281,12 @@ void StepMania::InsertCoin( int iNum, bool bCountInBookkeeping ) { GAMESTATE->m_iCoins.Set( MAX_NUM_CREDITS * PREFSMAN->m_iCoinsPerCredit ); } - + LOG->Trace("%i coins inserted, %i needed to play", GAMESTATE->m_iCoins.Get(), PREFSMAN->m_iCoinsPerCredit.Get() ); + // On InsertCoin, make sure to update Coins file + BOOKKEEPER->WriteCoinsFile(GAMESTATE->m_iCoins.Get()); + // If inserting coins, play an appropriate sound; if deducting coins, don't play anything. if (iNum > 0) { @@ -1323,6 +1326,9 @@ void StepMania::ClearCredits() GAMESTATE->m_iCoins.Set( 0 ); SCREENMAN->PlayInvalidSound(); + // Update Coins file to make sure credits are cleared. + BOOKKEEPER->WriteCoinsFile(GAMESTATE->m_iCoins.Get()); + // TODO: remove this redundant message and things that depend on it Message msg( "CoinInserted" ); // below params are unused