vector<DeckMetaData *> GameState::BuildDeckList(const string& path, const string& smallDeckPrefix, Player * statsPlayer, int maxDecks) { vector<DeckMetaData*> retList; int found = 1; int nbDecks = 1; DeckManager *deckManager = DeckManager::GetInstance(); bool isAI = path.find("baka") != string::npos; while (found && (!maxDecks || nbDecks <= maxDecks)) { found = 0; std::ostringstream filename; filename << path << "/deck" << nbDecks << ".txt"; DeckMetaData * meta = deckManager->getDeckMetaDataByFilename(filename.str(), isAI); if (meta) { found = 1; //Check if the deck is unlocked based on sets etc... bool unlocked = true; vector<int> unlockRequirements = meta->getUnlockRequirements(); for (size_t i = 0; i < unlockRequirements.size(); ++i) { if (! options[unlockRequirements[i]].number) { unlocked = false; break; } } if (unlocked) { if (statsPlayer) { std::ostringstream aiStatsDeckName; aiStatsDeckName << smallDeckPrefix << "_deck" << nbDecks; meta->mStatsFilename = aiStatsDeckName.str(); meta->mIsAI = true; if (meta->mPlayerDeck != statsPlayer->GetCurrentDeckStatsFile()) { meta->mPlayerDeck = statsPlayer->GetCurrentDeckStatsFile(); meta->Invalidate(); } } else { std::ostringstream playerStatsDeckName; playerStatsDeckName << "stats/player_deck" << nbDecks << ".txt"; meta->mStatsFilename = options.profileFile(playerStatsDeckName.str()); meta->mIsAI = false; } retList.push_back(meta); } 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; } std::sort(retList.begin(), retList.end(), sortByName); return retList; }