diff --git a/projects/mtg/bin/daily_build/template.exe b/projects/mtg/bin/daily_build/template.exe index c28474869..fa1a38342 100644 Binary files a/projects/mtg/bin/daily_build/template.exe and b/projects/mtg/bin/daily_build/template.exe differ diff --git a/projects/mtg/include/MTGDeck.h b/projects/mtg/include/MTGDeck.h index 7d8cfd228..fc059858c 100644 --- a/projects/mtg/include/MTGDeck.h +++ b/projects/mtg/include/MTGDeck.h @@ -11,14 +11,10 @@ #include using std::string; - - class GameApp; class MTGCard; class CardPrimitive; -#define SET_METADATA "setinfo.txt" - class MTGSetInfo{ public: MTGSetInfo(string _id); @@ -36,6 +32,7 @@ public: string getBlock(); int boosterCost(); int boosterSize(); + void processConfLine(string line); enum { //For memoized counts @@ -91,7 +88,11 @@ private: void init(); void initCounters(); public: - + enum { + READ_ANYTHING = 0, + READ_CARD = 1, + READ_METADATA = 2, + }; vector ids; map collection; mapprimitives; @@ -119,8 +120,6 @@ private: class MTGDeck{ protected: string filename; - - int total_cards; public: diff --git a/projects/mtg/include/OptionItem.h b/projects/mtg/include/OptionItem.h index d849d33fe..38927449c 100644 --- a/projects/mtg/include/OptionItem.h +++ b/projects/mtg/include/OptionItem.h @@ -177,6 +177,19 @@ protected: float mLastInput; }; +struct WCardSort{ +public: + virtual bool operator()(const MTGCard*l, const MTGCard*r) = 0; +}; + +struct WCSortCollector: public WCardSort{ + bool operator()(const MTGCard*l, const MTGCard*r); +}; + +struct WCSortAlpha: public WCardSort{ + bool operator()(const MTGCard*l, const MTGCard*r); +}; + class WGuiImage: public WGuiItem{ public: WGuiImage(WDataSource * wds, float _w = 0, float _h = 0, int _margin = 0); diff --git a/projects/mtg/src/GameStateAwards.cpp b/projects/mtg/src/GameStateAwards.cpp index 3aca81b47..5a9e946c8 100644 --- a/projects/mtg/src/GameStateAwards.cpp +++ b/projects/mtg/src/GameStateAwards.cpp @@ -210,11 +210,14 @@ bool GameStateAwards::enterSet(int setid){ WGuiList * spoiler = NEW WGuiList("Spoiler",setSrc); spoiler->setX(210); spoiler->setWidth(SCREEN_WIDTH - 220); - MTGAllCards * c = GameApp::collection; - for(it = c->collection.begin();it!=c->collection.end();it++){ - if(it->second && it->second->setId == setid && it->second->getId() >= 0) //Add only non-tokens from this set. - spoiler->Add(NEW WGuiItem(it->second->data->name)); + while(true){ + MTGCard * c = setSrc->getCard(); + if(c) + spoiler->Add(NEW WGuiItem(c->data->name)); + if(!setSrc->next()) + break; } + setSrc->setPos(0); spoiler->Entering(0); WGuiCardImage * wi = NEW WGuiCardImage(setSrc); wi->setX(105); diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index d4f9abbdb..f5346987a 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -335,21 +335,34 @@ bool MTGAllCards::addPrimitive(CardPrimitive * primitive, MTGCard * card){ } int MTGAllCards::readConfLine(std::ifstream &file, int set_id){ - + MTGSetInfo * si = setlist.getInfo(set_id); string s; int result = 1; if(!std::getline(file,s)) return 0; if (!s.size()) return -1; if (s[s.size()-1] == '\r') s.erase(s.size()-1); //Handle DOS files switch(conf_read_mode) { - case 0: + case MTGAllCards::READ_ANYTHING: if (s[0] == '['){ - conf_read_mode = 1; + if(s[1] == 'm'){ //M for metadata. + conf_read_mode = MTGAllCards::READ_METADATA; + } + else{ + conf_read_mode = MTGAllCards::READ_CARD; + } } - break; - case 1: + break; + case MTGAllCards::READ_METADATA: if (s[0] == '[' && s[1] == '/'){ - conf_read_mode = 0; + conf_read_mode = MTGAllCards::READ_ANYTHING; + break; + } + if(si) + si->processConfLine(s); + break; + case MTGAllCards::READ_CARD: + if (s[0] == '[' && s[1] == '/'){ + conf_read_mode = MTGAllCards::READ_ANYTHING; if (tempPrimitive) addPrimitive (tempPrimitive,tempCard); if (tempCard){ addCardToCollection(tempCard, set_id); @@ -816,3 +829,23 @@ string MTGSetInfo::getBlock(){ return setlist.blocks[block]; } + + +void MTGSetInfo::processConfLine(string line){ + unsigned int i = line.find_first_of("="); + if (i == string::npos) + return; + + string key = line.substr(0,i); + std::transform(key.begin(),key.end(),key.begin(),::tolower); + string value = line.substr(i+1); + + if(key.compare("name") == 0) + name = value; + else if(key.compare("author") == 0) + author = value; + else if(key.compare("block") == 0) + block = setlist.findBlock(value.c_str()); + else if(key.compare("year") == 0) + year = atoi(value.c_str()); + } \ No newline at end of file diff --git a/projects/mtg/src/OptionItem.cpp b/projects/mtg/src/OptionItem.cpp index 5f4837698..3c9832f44 100644 --- a/projects/mtg/src/OptionItem.cpp +++ b/projects/mtg/src/OptionItem.cpp @@ -3,6 +3,7 @@ #include #include "../include/PlayerData.h" #include "../include/Translate.h" +#include "../include/Subtypes.h" #include #include #include @@ -1393,6 +1394,68 @@ JQuad * WSrcImage::getImage(){ WSrcImage::WSrcImage(string s){ filename = s; } + +bool WCSortAlpha::operator()(const MTGCard*l, const MTGCard*r){ + if(!l || !r || !l->data || !r->data) + return false; + string ln = l->data->getLCName(); + string rn = r->data->getLCName(); + return (ln < rn); +} +bool WCSortCollector::operator()(const MTGCard*l, const MTGCard*r){ + if(!l || !r || !l->data || !r->data) + return false; + + int lc, rc; + lc = l->data->countColors(); rc = r->data->countColors(); + if(lc == 0) lc = 999; + if(rc == 0) rc = 999; + + int isW = (int)l->data->hasColor(Constants::MTG_COLOR_WHITE) - (int) r->data->hasColor(Constants::MTG_COLOR_WHITE); + int isU = (int)l->data->hasColor(Constants::MTG_COLOR_BLUE) - (int) r->data->hasColor(Constants::MTG_COLOR_BLUE); + int isB = (int)l->data->hasColor(Constants::MTG_COLOR_BLACK) - (int) r->data->hasColor(Constants::MTG_COLOR_BLACK); + int isR = (int)l->data->hasColor(Constants::MTG_COLOR_RED) - (int) r->data->hasColor(Constants::MTG_COLOR_RED); + int isG = (int)l->data->hasColor(Constants::MTG_COLOR_GREEN) - (int) r->data->hasColor(Constants::MTG_COLOR_GREEN); + int isArt = (int)l->data->hasType(Subtypes::TYPE_ARTIFACT) - (int) r->data->hasType(Subtypes::TYPE_ARTIFACT); + int isLand = (int)l->data->hasType(Subtypes::TYPE_LAND) - (int) r->data->hasType(Subtypes::TYPE_LAND); + + //Nested if hell. TODO: Farm these out to their own objects as a user-defined filter/sort system. + if(!isLand){ + int isBasic = (int)l->data->hasType("Basic") - (int) r->data->hasType("Basic"); + if(!isBasic){ + if(!isArt){ + if(lc == rc){ + if(!isG){ + if(!isR){ + if(!isB){ + if(!isU){ + if(!isW){ + string ln = l->data->getLCName(); + string rn = r->data->getLCName(); + if(ln.substr(0,4) == "the ") + ln = ln.substr(4); + if(rn.substr(0,4) == "the ") + rn = rn.substr(4); + return (ln < rn); + } + return (isW < 0); + } + return (isU < 0); + } + return (isB < 0); + } + return (isR < 0); + } + return (isG < 0); + } + return (lc < rc); + } + return (isArt < 0); + } + else return(isBasic < 0); + } + return (isLand < 0); +} //WSrcMTGSet WSrcMTGSet::WSrcMTGSet(int setid, float delay){ MTGAllCards * ac = GameApp::collection; @@ -1405,6 +1468,8 @@ WSrcMTGSet::WSrcMTGSet(int setid, float delay){ cards.push_back(it->second); } + std::sort(cards.begin(),cards.end(),WCSortCollector()); + currentCard = -1; if(cards.size()) currentCard = 0;