* optimized card loading. There was some redundant code that wasn't necessary.

* getCardByName seemed to have a initialization error if you tried to use it before the entire game loaded.  The cache would
throw an exception if you tried to use find and it was empty.  I put a guard around it to avoid this issue.

* refactored Zeth's "toggledifficuly" feature to be stored in meta data.  http://code.google.com/p/wagic/source/detail?r=3106
 -- This is slightly modified as it forces a 1 for 1 swap of cards that are specified.
    from the example given this is how it seemed to be used anyways.
 -- since all the information is stored in the meta data, there's no need to alter the deck's
    definition.
This commit is contained in:
techdragon.nguyen@gmail.com
2011-02-14 08:14:35 +00:00
parent 1b5002726c
commit d9efb408e5
6 changed files with 57 additions and 56 deletions

View File

@@ -24,6 +24,7 @@ private:
string mAvatarFilename; string mAvatarFilename;
string mColorIndex; string mColorIndex;
map<int,int> mAlternateCardMap;
// statistical information // statistical information
int mGamesPlayed, mVictories, mPercentVictories, mDifficulty; int mGamesPlayed, mVictories, mPercentVictories, mDifficulty;
@@ -44,6 +45,7 @@ public:
string getColorIndex(); string getColorIndex();
int getAvatarId(int deckId); int getAvatarId(int deckId);
string getStatsSummary(); string getStatsSummary();
map<int,int>& getAlternateMappings();
int getDeckId(); int getDeckId();
int getGamesPlayed(); int getGamesPlayed();

View File

@@ -120,6 +120,7 @@ public:
MTGCard * _(int id); MTGCard * _(int id);
MTGCard * getCardById(int id); MTGCard * getCardById(int id);
MTGCard * getCardByName(string name); MTGCard * getCardByName(string name);
MTGCard * getCard(string inputText);
int load(const char * config_file, const char * setName = NULL, int autoload = 1); int load(const char * config_file, const char * setName = NULL, int autoload = 1);
int countByType(const char * _type); int countByType(const char * _type);
int countByColor(int color); int countByColor(int color);
@@ -154,13 +155,14 @@ protected:
public: public:
MTGAllCards * database; MTGAllCards * database;
map<int, int> cards; map<int, int> cards;
map<int, int> alternates;
string meta_desc; string meta_desc;
string meta_name; string meta_name;
int meta_id; int meta_id;
int totalCards(); int totalCards();
int totalPrice(); int totalPrice();
MTGDeck(MTGAllCards * _allcards); MTGDeck(MTGAllCards * _allcards);
MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_only = 0,int difficultySetting = 0); MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_only = 0);
int addRandomCards(int howmany, int * setIds = NULL, int nbSets = 0, int rarity = -1, const char * subtype = NULL, int addRandomCards(int howmany, int * setIds = NULL, int nbSets = 0, int rarity = -1, const char * subtype = NULL,
int * colors = NULL, int nbcolors = 0); int * colors = NULL, int nbcolors = 0);
int add(int cardid); int add(int cardid);

View File

@@ -1180,17 +1180,8 @@ AIPlayer * AIPlayerFactory::createAIPlayer(MTGAllCards * collection, Player * op
sprintf(deckFileSmall, "ai_baka_deck%i", deckid); sprintf(deckFileSmall, "ai_baka_deck%i", deckid);
} }
DeckStats * stats = DeckStats::GetInstance(); DeckStats * stats = DeckStats::GetInstance();
int deckSetting = NULL;
int diff = stats->percentVictories(); MTGDeck * tempDeck = NEW MTGDeck(deckFile, collection, 0);
if (diff >= 65)
{
deckSetting = HARD;
}
else if (diff < 65)
{
deckSetting = EASY;
}
MTGDeck * tempDeck = NEW MTGDeck(deckFile, collection,0,deckSetting);
AIPlayerBaka * baka = NEW AIPlayerBaka(tempDeck, deckFile, deckFileSmall, avatarFile); AIPlayerBaka * baka = NEW AIPlayerBaka(tempDeck, deckFile, deckFileSmall, avatarFile);
baka->deckId = deckid; baka->deckId = deckid;
SAFE_DELETE(tempDeck); SAFE_DELETE(tempDeck);

View File

@@ -96,6 +96,7 @@ void DeckMetaData::LoadDeck()
mDescription = trim(deck.meta_desc); mDescription = trim(deck.meta_desc);
mDeckId = atoi((mFilename.substr(mFilename.find("deck") + 4, mFilename.find(".txt"))).c_str()); mDeckId = atoi((mFilename.substr(mFilename.find("deck") + 4, mFilename.find(".txt"))).c_str());
mDeckLoaded = true; mDeckLoaded = true;
mAlternateCardMap = deck.alternates;
} }
@@ -181,6 +182,11 @@ string DeckMetaData::getStatsSummary()
return statsSummary.str(); return statsSummary.str();
} }
map<int,int>& DeckMetaData::getAlternateMappings()
{
return mAlternateCardMap;
}
void DeckMetaData::setColorIndex(const string& colorIndex) void DeckMetaData::setColorIndex(const string& colorIndex)
{ {
mColorIndex = colorIndex; mColorIndex = colorIndex;

View File

@@ -676,16 +676,18 @@ MTGCard * MTGAllCards::getCardByName(string name)
if (!name.size()) return NULL; if (!name.size()) return NULL;
if (name[0] == '#') return NULL; if (name[0] == '#') return NULL;
map<string, MTGCard * >::iterator cached = mtgCardByNameCache.find(name); map<string, MTGCard * >::iterator cached = mtgCardByNameCache.end();
if ( mtgCardByNameCache.size() > 0 )
cached = mtgCardByNameCache.find(name);
if (cached!= mtgCardByNameCache.end()) if (cached!= mtgCardByNameCache.end())
{ {
return cached->second; return cached->second;
} }
int cardnb = atoi(name.c_str()); int cardId = atoi(name.c_str());
if (cardnb) if (cardId)
{ {
MTGCard * result = getCardById(cardnb); MTGCard * result = getCardById(cardId);
mtgCardByNameCache[name] = result; mtgCardByNameCache[name] = result;
return result; return result;
} }
@@ -742,7 +744,7 @@ int MTGDeck::totalPrice()
return total; return total;
} }
MTGDeck::MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_only,int difficultyRating) MTGDeck::MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_only)
{ {
total_cards = 0; total_cards = 0;
database = _allcards; database = _allcards;
@@ -775,58 +777,44 @@ MTGDeck::MTGDeck(const char * config_file, MTGAllCards * _allcards, int meta_onl
meta_desc.append(s.substr(found + 5)); meta_desc.append(s.substr(found + 5));
continue; continue;
} }
found = s.find("toggledifficulty:");
if (found != string::npos)
{
string cards = s.substr(found + 17);
size_t separator = cards.find("|");
string cardeasy = cards.substr(0,separator);
string cardhard = cards.substr(separator + 1);
MTGCard *sourceCard = MTGCollection()->getCardByName( cardeasy );
MTGCard *alternateCard = MTGCollection()->getCardByName( cardhard );
if ( alternateCard && sourceCard )
alternates.insert( make_pair( sourceCard->getMTGId(), alternateCard->getMTGId()));
else
DebugTrace("Failed to map card Alternates: [" << cardeasy << "] and [" << cardhard << "]");
continue;
}
continue; continue;
} }
if (meta_only) break; if (meta_only) break;
int nb = 1; int numberOfCopies = 1;
size_t found = s.find(" *"); size_t found = s.find(" *");
if (found != string::npos) if (found != string::npos)
{ {
nb = atoi(s.substr(found + 2).c_str()); numberOfCopies = atoi(s.substr(found + 2).c_str());
s = s.substr(0, found); s = s.substr(0, found);
} }
size_t diff = s.find("toggledifficulty:"); MTGCard *card = database->getCardByName( s );
if(diff != string::npos) if ( card )
{ {
string cards = s.substr(diff + 17); for (int i = 0; i < numberOfCopies; i++)
size_t separator = cards.find("|");
string cardeasy = cards.substr(0,separator);
string cardhard = cards.substr(separator + 1);
if(difficultyRating == HARD)
{ {
s = cardhard; add(card);
} }
else
{
s = cardeasy;
}
}
int cardnb = atoi(s.c_str());
if (cardnb)
{
add(cardnb);
} }
else else
{ {
size_t found = s.find(" *"); DebugTrace("could not find Card matching name: " << s);
if (found != string::npos)
{
nb = atoi(s.substr(found + 2).c_str());
s = s.substr(0, found);
}
MTGCard * card = database->getCardByName(s);
if (card)
{
for (int i = 0; i < nb; i++)
{
add(card);
}
}
else
{
DebugTrace("could not find Card matching name: " << s);
}
} }
} }
file.close(); file.close();

View File

@@ -1,5 +1,7 @@
#include "PrecompiledHeader.h" #include "PrecompiledHeader.h"
#include "DeckManager.h"
#include "DeckMetaData.h"
#include "MTGGameZones.h" #include "MTGGameZones.h"
#include "Player.h" #include "Player.h"
#include "GameOptions.h" #include "GameOptions.h"
@@ -43,10 +45,20 @@ MTGPlayerCards::MTGPlayerCards(MTGDeck * deck)
void MTGPlayerCards::initDeck(MTGDeck * deck) void MTGPlayerCards::initDeck(MTGDeck * deck)
{ {
resetLibrary(); resetLibrary();
bool isAI = deck->getFilename().find("baka") != string::npos;
DeckMetaData *deckMeta = DeckManager::GetInstance()->getDeckMetaDataById( deck->meta_id, isAI);
map<int,int> alternatesMap = deckMeta->getAlternateMappings();
bool useAlternates = deckMeta->getVictoryPercentage() >= 65;
map<int, int>::iterator it; map<int, int>::iterator it;
for (it = deck->cards.begin(); it != deck->cards.end(); it++) for (it = deck->cards.begin(); it != deck->cards.end(); it++)
{ {
MTGCard * card = deck->getCardById(it->first); int cardId = it->first;
if (useAlternates && isAI)
{
if ( alternatesMap.find( cardId ) != alternatesMap.end() )
cardId = alternatesMap[ cardId ];
}
MTGCard * card = deck->getCardById(cardId);
if (card) if (card)
{ {
for (int i = 0; i < it->second; i++) for (int i = 0; i < it->second; i++)