diff --git a/projects/mtg/bin/Res/sets/TSP/booster.txt b/projects/mtg/bin/Res/sets/TSP/booster.txt new file mode 100644 index 000000000..7f7db9a1e --- /dev/null +++ b/projects/mtg/bin/Res/sets/TSP/booster.txt @@ -0,0 +1,21 @@ + + + rarity:mythic; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + rarity:rare; + + + rarity:uncommon; + + + rarity:special; + + + rarity:common; + + \ No newline at end of file diff --git a/projects/mtg/include/MTGDeck.h b/projects/mtg/include/MTGDeck.h index 3446794a3..9068fab3d 100644 --- a/projects/mtg/include/MTGDeck.h +++ b/projects/mtg/include/MTGDeck.h @@ -14,10 +14,11 @@ using std::string; class GameApp; class MTGCard; class CardPrimitive; - +class MTGPack; class MTGSetInfo{ public: MTGSetInfo(string _id); + ~MTGSetInfo(); string id; //Short name: 10E, RAV, etc. Automatic from folder. string author; //Author of set, for crediting mod makers, etc. string name; //Long name: Tenth Edition @@ -30,8 +31,6 @@ public: int totalCards(); string getName(); string getBlock(); - int boosterCost(); - int boosterSize(); void processConfLine(string line); enum { @@ -46,10 +45,10 @@ public: MAX_COUNT = 6 }; + MTGPack * mPack; //Does it use a specialized booster pack? bool bZipped; //Is this set's images present as a zip file? bool bThemeZipped; //[...] in the theme? - int counts[MTGSetInfo::MAX_COUNT]; - int booster[MAX_RARITY]; + int counts[MTGSetInfo::MAX_COUNT]; }; class MTGSets{ diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index eb265166a..91d6993b9 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -107,6 +107,7 @@ class Constants NB_BASIC_ABILITIES = 48, + RARITY_S = 'S', //Special Rarity RARITY_M = 'M', //Mythics RARITY_R = 'R', //Rares RARITY_U = 'U', //Uncommons @@ -122,6 +123,7 @@ class Constants //Price for singles PRICE_1M = 3000, PRICE_1R = 500, + PRICE_1S = 200, PRICE_1U = 100, PRICE_1C = 20, PRICE_1L = 5, @@ -132,10 +134,6 @@ class Constants CHANCE_CUSTOM_PACK = 15, CHANCE_PURE_OVERRIDE = 50, CHANCE_MIXED_OVERRIDE = 25, - PRICE_XR = 355, - PRICE_XU = 88, - PRICE_XC = 8, - PRICE_XL = 1, MAIN_FONT = 0, MENU_FONT = 1, diff --git a/projects/mtg/include/MTGPack.h b/projects/mtg/include/MTGPack.h index bdbc975ca..7d3055eb1 100644 --- a/projects/mtg/include/MTGPack.h +++ b/projects/mtg/include/MTGPack.h @@ -1,6 +1,8 @@ #ifndef _MTGPACCK_H_ #define _MTGPACK_H_ +class ShopBooster; + class MTGPackEntry{ public: virtual int addCard(WSrcCards * pool,MTGDeck * to) = 0; @@ -9,6 +11,8 @@ public: class MTGPackEntryRandom: public MTGPackEntry{ public: + MTGPackEntryRandom() {filter = ""; copies=1;}; + MTGPackEntryRandom(string f, int c=1) {filter = f; copies = c;}; int addCard(WSrcCards * pool,MTGDeck * to); string filter; }; @@ -36,13 +40,16 @@ public: class MTGPack{ public: friend class MTGPacks; + friend class ShopBooster; + friend class MTGSetInfo; bool meetsRequirements(); //Check if pool contains locked cards. bool isUnlocked(); bool isValid() {return bValid;}; void load(string filename); int assemblePack(MTGDeck * to); - MTGPack(string s) {bValid = false; load(s); unlockStatus=0;}; + MTGPack() {bValid = false; unlockStatus = 0; price=Constants::PRICE_BOOSTER;}; + MTGPack(string s) {bValid = false; load(s); unlockStatus = 0;}; ~MTGPack(); string getName(); string getSort() {return sort;}; @@ -72,8 +79,9 @@ public: int size() {return (int)packs.size();}; void refreshUnlocked(); - + static MTGPack * getDefault(); private: + static MTGPack defaultBooster; vector packs; }; #endif \ No newline at end of file diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index 987f29537..719542055 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -304,8 +304,12 @@ void CardGui::alternateRender(MTGCard * card, const Pos& pos){ case Constants::RARITY_L: sprintf(buf,_("%s Land").c_str(),setlist[card->setId].c_str()); break; + case Constants::RARITY_T: + sprintf(buf,_("%s Token").c_str(),setlist[card->setId].c_str()); + break; default: - sprintf(buf,"%s",setlist[card->setId].c_str()); + case Constants::RARITY_S: + sprintf(buf,_("%s Special").c_str(),setlist[card->setId].c_str()); break; } diff --git a/projects/mtg/src/GameStateShop.cpp b/projects/mtg/src/GameStateShop.cpp index 64fa94e7b..2fba96f05 100644 --- a/projects/mtg/src/GameStateShop.cpp +++ b/projects/mtg/src/GameStateShop.cpp @@ -736,9 +736,8 @@ void ShopBooster::randomCustom(MTGPacks * packlist){ pack = packlist->randomPack(); if(pack && !pack->isUnlocked()) pack = NULL; - if(!pack){ + if(!pack) randomStandard(); - } } void ShopBooster::randomStandard(){ int mSet = -1; @@ -763,6 +762,7 @@ void ShopBooster::randomStandard(){ altSet = setlist.randomSet(-1,80-mSetCount); } if(altSet == mainSet) altSet = NULL; //Prevent "10E & 10E Booster" + if(!altSet) pack = mainSet->mPack; } int ShopBooster::maxInventory(){ @@ -771,39 +771,15 @@ int ShopBooster::maxInventory(){ return 5; } void ShopBooster::addToDeck(MTGDeck * d, WSrcCards * srcCards){ - - if(pack){ + if(!pack){ //A combination booster. + MTGPack * mP = MTGPacks::getDefault(); + if(!altSet && mainSet->mPack) mP = mainSet->mPack; + char buf[512]; + if(!altSet) sprintf(buf,"set:%s;",mainSet->id.c_str()); + else sprintf(buf,"set:%s;|set:%s;",mainSet->id.c_str(),altSet->id.c_str()); + mP->pool = buf; + mP->assemblePack(d); //Use the primary packfile. assemblePack deletes pool. + } + else pack->assemblePack(d); - } - else{ - WSrcCards * pool = NEW WSrcCards(0); - WCFilterSet *main, *alt; - int num = setlist.getSetNum(mainSet); - main = NEW WCFilterSet(num); - if(altSet){ - num = setlist.getSetNum(altSet); - alt = NEW WCFilterSet(num); - pool->addFilter(NEW WCFilterOR(main,alt)); - } else - pool->addFilter(main); - pool->loadMatches(srcCards,true); - pool->Shuffle(); - - //Add cards to booster. Pool is shuffled, so just step through. - int carryover = 1; - if(!(rand() % 8)){ - pool->addFilter(NEW WCFilterRarity(Constants::RARITY_M)); - carryover = pool->addToDeck(d,carryover); - } - pool->clearFilters(); - pool->addFilter(NEW WCFilterRarity(Constants::RARITY_R)); - carryover = pool->addToDeck(d,carryover); - pool->clearFilters(); - pool->addFilter(NEW WCFilterRarity(Constants::RARITY_U)); - carryover = pool->addToDeck(d,carryover+3); - pool->clearFilters(); - pool->addFilter(NEW WCFilterRarity(Constants::RARITY_C)); - carryover = pool->addToDeck(d,carryover+11); - SAFE_DELETE(pool); - } } diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp index bf3ae34ae..912370e3f 100644 --- a/projects/mtg/src/MTGDeck.cpp +++ b/projects/mtg/src/MTGDeck.cpp @@ -5,6 +5,8 @@ #include "../include/Translate.h" #include "../include/DeckMetaData.h" #include "../include/PriceList.h" +#include "../include/WDataSrc.h" +#include "../include/MTGPack.h" #include #include #include @@ -842,6 +844,10 @@ int MTGSets::size(){ } //MTGSetInfo +MTGSetInfo::~MTGSetInfo(){ + if(mPack != MTGPacks::getDefault()) + SAFE_DELETE(mPack); +} MTGSetInfo::MTGSetInfo(string _id) { string whitespaces (" \t\f\v\n\r"); id = _id; @@ -851,12 +857,14 @@ MTGSetInfo::MTGSetInfo(string _id) { for(int i=0;iisValid()){ + SAFE_DELETE(mPack); + } + bZipped = false; + bThemeZipped = false; } void MTGSetInfo::count(MTGCard*c){ @@ -889,32 +897,6 @@ int MTGSetInfo::totalCards(){ return counts[MTGSetInfo::TOTAL_CARDS]; } -int MTGSetInfo::boosterSize(){ - int size = 0; - - for(int i = 0; iShuffle(); for(size_t i=0;iadd(p,to,carryover); @@ -140,7 +142,9 @@ void MTGPack::load(string filename){ holder = pPack->Attribute("pool"); if(holder) pool = holder; else pool = ""; holder = pPack->Attribute("type"); - if(holder) type = holder; else type = "Booster"; + if(holder){ + type = holder; + }else type = "Booster"; holder = pPack->Attribute("name"); if(holder) name = holder; else name = "Special"; holder = pPack->Attribute("requires"); @@ -160,6 +164,8 @@ void MTGPack::load(string filename){ holder = pSlot->Attribute("copies"); if(holder) s->copies = atoi(holder); else s->copies = 1; + holder = pSlot->Attribute("pool"); + if(holder) s->pool = holder; for(pEntry = pSlot->FirstChildElement();pEntry!=NULL;pEntry=pEntry->NextSiblingElement()){ tag = pEntry->Value(); @@ -221,7 +227,8 @@ void MTGPacks::loadAll(){ while ((mDit = readdir(mDip))){ char myFilename[4096]; sprintf(myFilename, RESPATH"/packs/%s", mDit->d_name); - if(myFilename[0] == '.') continue; + if(mDit->d_name[0] == '.') continue; + if(!strcmp(mDit->d_name,"default_booster.txt")) continue; MTGPack * p = NEW MTGPack(myFilename); if(!p->isValid()){ SAFE_DELETE(p); @@ -267,6 +274,32 @@ bool MTGPack::isUnlocked(){ return (unlockStatus > 0); } +MTGPack * MTGPacks::getDefault(){ + if(!defaultBooster.isValid()){ + defaultBooster.load(RESPATH"/packs/default_booster.txt"); + defaultBooster.unlockStatus = 1; + } + if(!defaultBooster.isValid()){ + MTGPackSlot * ps = NEW MTGPackSlot(); ps->copies = 1; + ps->addEntry(NEW MTGPackEntryRandom("rarity:mythic;")); + for(int i=0;i<7;i++) + ps->addEntry(NEW MTGPackEntryRandom("rarity:rare;")); + defaultBooster.slots.push_back(ps); + ps = NEW MTGPackSlot(); ps->copies = 3; + ps->addEntry(NEW MTGPackEntryRandom("rarity:uncommon;")); + defaultBooster.slots.push_back(ps); + ps = NEW MTGPackSlot(); ps->copies = 1; + ps->addEntry(NEW MTGPackEntryRandom("rarity:land;")); + defaultBooster.slots.push_back(ps); + ps = NEW MTGPackSlot(); ps->copies = 10; + ps->addEntry(NEW MTGPackEntryRandom("rarity:common;")); + defaultBooster.slots.push_back(ps); + defaultBooster.bValid = true; + defaultBooster.unlockStatus = 1; + } + return &defaultBooster; +} + void MTGPacks::refreshUnlocked(){ for(size_t t=0;tunlockStatus < 0) diff --git a/projects/mtg/src/PriceList.cpp b/projects/mtg/src/PriceList.cpp index 2dbd7e5e0..ed968fd31 100644 --- a/projects/mtg/src/PriceList.cpp +++ b/projects/mtg/src/PriceList.cpp @@ -47,6 +47,9 @@ int PriceList::getPrice(int cardId){ case Constants::RARITY_M: return Constants::PRICE_1M; break; + case Constants::RARITY_S: + return Constants::PRICE_1S; + break; case Constants::RARITY_R: return Constants::PRICE_1R; break; diff --git a/projects/mtg/src/WDataSrc.cpp b/projects/mtg/src/WDataSrc.cpp index 82405fbb5..d76e8471d 100644 --- a/projects/mtg/src/WDataSrc.cpp +++ b/projects/mtg/src/WDataSrc.cpp @@ -511,6 +511,7 @@ int WCSortRarity::rareToInt(char r){ case Constants::RARITY_U: return 3; case Constants::RARITY_R: return 4; case Constants::RARITY_M: return 5; + case Constants::RARITY_S: return 6; } } bool WCSortRarity::operator()(const MTGCard*l, const MTGCard*r){ diff --git a/projects/mtg/src/WFilter.cpp b/projects/mtg/src/WFilter.cpp index ecaa87c80..a76fd0ca1 100644 --- a/projects/mtg/src/WFilter.cpp +++ b/projects/mtg/src/WFilter.cpp @@ -298,13 +298,15 @@ float WCFilterRarity::filterFee(){ bool WCFilterRarity::isMatch(MTGCard * c){ if(!c || !c->data) return false; + if(rarity == 'A') return true; //A for "Any" or "All" return (c->getRarity() == rarity); } string WCFilterRarity::getCode(){ char buf[64]; - const char* rarities[7] = {"any","token","land","common","uncommon","rare","mythic"}; + const char* rarities[8] = {"any","token","land","common","uncommon","rare","mythic","special"}; int x = 0; switch(rarity){ + case 'S': x=7; break; case 'M': x=6; break; case 'R': x=5; break; case 'U': x=4; break; @@ -319,6 +321,7 @@ WCFilterRarity::WCFilterRarity(string arg){ rarity = -1; char c = toupper(arg[0]); switch(c){ + case 'S': case 'M': case 'R': case 'U': @@ -326,8 +329,9 @@ WCFilterRarity::WCFilterRarity(string arg){ case 'L': case 'T': rarity = c; - break; + return; } + rarity = 'A'; } //WCFilterAbility bool WCFilterAbility::isMatch(MTGCard * c){ diff --git a/projects/mtg/src/WGui.cpp b/projects/mtg/src/WGui.cpp index 1c284d036..0adf9238e 100644 --- a/projects/mtg/src/WGui.cpp +++ b/projects/mtg/src/WGui.cpp @@ -1621,6 +1621,7 @@ void WGuiFilterItem::updateValue(){ mParent->addArg("Rare","r:r;"); mParent->addArg("Uncommon","r:u;"); mParent->addArg("Common","r:c;"); + mParent->addArg("Special Rarity","{r:m;|r:t;|r:r;|r:u;|r:c;}"); }else if(filterType == FILTER_CMC){ for(int i=0;i<20;i++){ sprintf(buf_code,"cmc:%i;",i);