示例#1
0
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;

}