Files
wagic/projects/mtg/src/DeckMetaData.cpp
T
techdragon.nguyen@gmail.com f4d1154cd6 reverted latest change
2011-02-14 09:35:43 +00:00

198 lines
4.9 KiB
C++

#include "PrecompiledHeader.h"
#include "DeckMetaData.h"
#include "DeckStats.h"
#include "MTGDeck.h"
#include "utils.h"
//Possible improvements:
//Merge this with DeckStats
//Have this class handle all the Meta Data rather than relying on MTGDeck. Then MTGDeck would have a MetaData object...
DeckMetaData::DeckMetaData(const string& filename)
: mFilename(filename), mGamesPlayed(0), mVictories(0), mPercentVictories(0), mDifficulty(0),
mDeckLoaded(false), mStatsLoaded(false)
{
// TODO, figure out how we can defer this to later - currently,
// there's a catch 22, as we sort the deck list alphabetically, so we need to open the deck file
// to get its name. This means that for the opponent list, we crack open 106 files just to read the deck name
//, which is the bulk of the remaining 4 second delay we see the first time we try to pick an opponent on the first match
LoadDeck();
}
void DeckMetaData::LoadStats()
{
if (!mStatsLoaded)
{
DeckStats * stats = DeckStats::GetInstance();
if (mIsAI)
{
stats->load(mPlayerDeck);
DeckStat * opponentDeckStats = stats->getDeckStat(mStatsFilename);
if (opponentDeckStats)
{
mPercentVictories = stats->percentVictories(mStatsFilename);
mVictories = opponentDeckStats->victories;
mGamesPlayed = opponentDeckStats->nbgames;
mColorIndex = opponentDeckStats->manaColorIndex;
ostringstream oss;
int deckFilenameOffset = mStatsFilename.find("deck") + 4;
int oppDeckId = atoi(mStatsFilename.substr(deckFilenameOffset, mStatsFilename.find_last_of(".")).c_str());
int avatarId = getAvatarId(oppDeckId);
oss << "avatar" << avatarId << ".jpg";
mAvatarFilename = oss.str();
if (mPercentVictories < 34)
{
mDifficulty = HARD;
}
else if (mPercentVictories < 55)
{
mDifficulty = NORMAL;
}
else
{
mDifficulty = EASY;
}
}
else
{
ostringstream oss;
oss << "avatar" << getAvatarId(mDeckId) << ".jpg";
mAvatarFilename = oss.str();
}
}
else
{
if (FileExists(mStatsFilename))
{
stats->load(mStatsFilename);
mGamesPlayed = stats->nbGames();
mPercentVictories = stats->percentVictories();
mVictories = static_cast<int>(mGamesPlayed * (mPercentVictories / 100.0f));
}
}
mStatsLoaded = true;
}
}
// since we only have 100 stock avatar images, we need to recycle the images for deck numbers > 99
int DeckMetaData::getAvatarId(int deckId)
{
int avatarId = deckId % 100;
if (deckId >= 100 && avatarId == 0)
return 100;
return avatarId;
}
void DeckMetaData::LoadDeck()
{
if (!mDeckLoaded)
{
MTGDeck deck(mFilename.c_str(), NULL, 1);
mName = trim(deck.meta_name);
mDescription = trim(deck.meta_desc);
mDeckId = atoi((mFilename.substr(mFilename.find("deck") + 4, mFilename.find(".txt"))).c_str());
mDeckLoaded = true;
}
}
//Accessors
string DeckMetaData::getFilename()
{
return mFilename;
}
string DeckMetaData::getName()
{
return mName;
}
int DeckMetaData::getDeckId()
{
return mDeckId;
}
string DeckMetaData::getAvatarFilename()
{
return mAvatarFilename;
}
string DeckMetaData::getColorIndex()
{
return mColorIndex;
}
int DeckMetaData::getGamesPlayed()
{
return mGamesPlayed;
}
int DeckMetaData::getVictories()
{
return mVictories;
}
int DeckMetaData::getVictoryPercentage()
{
return mPercentVictories;
}
int DeckMetaData::getDifficulty()
{
return mDifficulty;
}
string DeckMetaData::getDifficultyString()
{
string difficultyString = "Normal";
switch (mDifficulty)
{
case HARD:
difficultyString = "Hard";
break;
case EASY:
difficultyString = "Easy";
break;
}
return difficultyString;
}
string DeckMetaData::getDescription()
{
return mDescription;
}
string DeckMetaData::getStatsSummary()
{
LoadStats();
ostringstream statsSummary;
statsSummary << "Difficulty: " << getDifficultyString() << endl
<< "Victory %: " << getVictoryPercentage() << endl
<< "Games Played: " << getGamesPlayed() << endl;
return statsSummary.str();
}
void DeckMetaData::setColorIndex(const string& colorIndex)
{
mColorIndex = colorIndex;
}
void DeckMetaData::setDeckName(const string& newDeckTitle)
{
mName = newDeckTitle;
}
void DeckMetaData::Invalidate()
{
mStatsLoaded = false;
}