diff --git a/projects/mtg/include/DeckManager.h b/projects/mtg/include/DeckManager.h index 7ca56d9df..213066679 100644 --- a/projects/mtg/include/DeckManager.h +++ b/projects/mtg/include/DeckManager.h @@ -28,6 +28,7 @@ public: vector * getAIDeckOrderList(); void AddMetaData( const std::string& filename, bool isAI); + void DeleteMetaData( const std::string& filename, bool isAI); DeckMetaData* getDeckMetaDataById(int deckId, bool isAI); DeckMetaData* getDeckMetaDataByFilename(const std::string& filename, bool isAI); StatsWrapper* getExtendedStatsForDeckId(int deckId, MTGAllCards* collection, bool isAI); diff --git a/projects/mtg/src/DeckManager.cpp b/projects/mtg/src/DeckManager.cpp index 685310e91..92e74f79e 100644 --- a/projects/mtg/src/DeckManager.cpp +++ b/projects/mtg/src/DeckManager.cpp @@ -119,6 +119,52 @@ void DeckManager::AddMetaData( const string& filename, bool isAI ) } } +void DeckManager::DeleteMetaData( const string& filename, bool isAI ) +{ + map::iterator it; + vector::iterator metaDataIter; + + if (isAI) + { + it = aiDeckStatsMap.find(filename); + if (it != aiDeckStatsMap.end()) + { + SAFE_DELETE(it->second); + aiDeckStatsMap.erase(it); + } + + for( metaDataIter = mInstance->aiDeckOrderList.begin(); metaDataIter != mInstance->aiDeckOrderList.end(); ++metaDataIter) + { + if ((*metaDataIter)->getFilename() == filename) + { + SAFE_DELETE( *metaDataIter ); + aiDeckOrderList.erase(metaDataIter); + break; + } + } + } + else + { + it = playerDeckStatsMap.find(filename); + if (it != playerDeckStatsMap.end()) + { + SAFE_DELETE(it->second); + playerDeckStatsMap.erase(it); + } + + for( metaDataIter = mInstance->playerDeckOrderList.begin(); metaDataIter != mInstance->playerDeckOrderList.end(); ++metaDataIter) + { + if ((*metaDataIter)->getFilename() == filename) + { + SAFE_DELETE( *metaDataIter ); + playerDeckOrderList.erase(metaDataIter); + break; + } + } + } +} + + StatsWrapper * DeckManager::getExtendedStatsForDeckId( int deckId, MTGAllCards *collection, bool isAI ) { DeckMetaData *selectedDeck = getDeckMetaDataById( deckId, isAI ); diff --git a/projects/mtg/src/GameState.cpp b/projects/mtg/src/GameState.cpp index b90c53e55..227a7af42 100644 --- a/projects/mtg/src/GameState.cpp +++ b/projects/mtg/src/GameState.cpp @@ -51,6 +51,7 @@ vector GameState::BuildDeckList(const string& path, const string if (meta) { + found = 1; //Check if the deck is unlocked based on sets etc... bool unlocked = true; vector unlockRequirements = meta->getUnlockRequirements(); @@ -65,7 +66,6 @@ vector GameState::BuildDeckList(const string& path, const string if (unlocked) { - found = 1; if (statsPlayer) { std::ostringstream aiStatsDeckName; @@ -85,10 +85,17 @@ vector GameState::BuildDeckList(const string& path, const string meta->mStatsFilename = options.profileFile(playerStatsDeckName.str()); meta->mIsAI = false; } - retList.push_back(meta); - nbDecks++; } + else + { + //updateMetaDataList in DeckManager.cpp performs some weird magic, swapping data between its cache and the "retList" from this function + //Bottom line, we need to guarantee retList contains exactly the same items as (or updated versions of) the items in DeckManager Cache + //In other words, any meta data that didn't make it to retList in this function must be erased from the DeckManager cache + deckManager->DeleteMetaData(filename.str(), isAI); + } + + nbDecks++; } meta = NULL; } diff --git a/projects/mtg/src/TargetChooser.cpp b/projects/mtg/src/TargetChooser.cpp index 51f17f835..ad8c2df59 100644 --- a/projects/mtg/src/TargetChooser.cpp +++ b/projects/mtg/src/TargetChooser.cpp @@ -826,6 +826,13 @@ bool TargetChooser::validTargetsExist(int maxTargets) int TargetChooser::countValidTargets() { int result = 0; + + //Some TargetChooser objects are created at a point where no observer is available + // see ManaCost::parseManaCost which sets observer to NULL in some cases (namely: when the cards database is loaded at game start) + // This is a workaround for this situation + if (!observer && source) + observer = source->getObserver(); + for (int i = 0; i < 2; ++i) { assert(observer);