93c63cef3d
stats generation. No data needs to be written to the deck master files themselves. Now the mana colors will only show if you have battled with a particular deck at least once. This is not retroactive, so you will need to battle the ai again. This can not be edited manually either to prevent tampering with the statistical data. Player deck mana color display is also covered this way. Decks will still be saved in the new layout if a disk write is necessary. So any changes via the deck editor will result in a deck file rewrite is was always the case.:)
198 lines
4.9 KiB
C++
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;
|
|
}
|