diff --git a/projects/mtg/Makefile b/projects/mtg/Makefile
index bdb58c8ee..8484d1874 100644
--- a/projects/mtg/Makefile
+++ b/projects/mtg/Makefile
@@ -1,4 +1,4 @@
-OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/Logger.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGRules.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/SimplePad.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/Token.o objs/Translate.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o
+OBJS = objs/ActionElement.o objs/ActionLayer.o objs/ActionStack.o objs/AIMomirPlayer.o objs/AIPlayer.o objs/AIStats.o objs/CardGui.o objs/CardDescriptor.o objs/CardDisplay.o objs/CardEffect.o objs/CardPrimitive.o objs/CardSelector.o objs/Counters.o objs/Credits.o objs/Damage.o objs/DamagerDamaged.o objs/DeckDataWrapper.o objs/DeckMetaData.o objs/DeckStats.o objs/DuelLayers.o objs/Effects.o objs/ExtraCost.o objs/GameApp.o objs/GameLauncher.o objs/GameObserver.o objs/GameOptions.o objs/GameState.o objs/GameStateAwards.o objs/GameStateDeckViewer.o objs/GameStateDuel.o objs/GameStateMenu.o objs/GameStateOptions.o objs/GameStateShop.o objs/GameStateTransitions.o objs/GuiAvatars.o objs/GuiBackground.o objs/GuiCardsController.o objs/GuiCombat.o objs/GuiFrame.o objs/GuiHand.o objs/GuiLayers.o objs/GuiMana.o objs/GuiPhaseBar.o objs/GuiPlay.o objs/GuiStatic.o objs/Logger.o objs/ManaCost.o objs/ManaCostHybrid.o objs/MenuItem.o objs/MTGAbility.o objs/MTGCardInstance.o objs/MTGCard.o objs/MTGDeck.o objs/MTGDefinitions.o objs/MTGGamePhase.o objs/MTGGameZones.o objs/MTGPack.o objs/MTGRules.o objs/OptionItem.o objs/PhaseRing.o objs/Player.o objs/PlayerData.o objs/PlayGuiObjectController.o objs/PlayGuiObject.o objs/Pos.o objs/PriceList.o objs/ReplacementEffects.o objs/Rules.o objs/SimpleMenu.o objs/SimpleMenuItem.o objs/SimplePad.o objs/Subtypes.o objs/TargetChooser.o objs/TargetsList.o objs/TextScroller.o objs/Token.o objs/Translate.o objs/Trash.o objs/utils.o objs/WEvent.o objs/WResourceManager.o objs/WCachedResource.o objs/WDataSrc.o objs/WGui.o objs/WFilter.o objs/Tasks.o
DEPS = $(patsubst objs/%.o, deps/%.d, $(OBJS))
RESULT = $(shell psp-config --psp-prefix 2> Makefile.cache)
diff --git a/projects/mtg/bin/Res/packs/artifact_booster.txt b/projects/mtg/bin/Res/packs/artifact_booster.txt
new file mode 100644
index 000000000..8619f1e3e
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/artifact_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:common;
+
+
+ rarity:land;type:basic;
+
+
\ No newline at end of file
diff --git a/projects/mtg/bin/Res/packs/black_booster.txt b/projects/mtg/bin/Res/packs/black_booster.txt
new file mode 100644
index 000000000..266a2093b
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/black_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:common;
+
+
+ rarity:land;type:basic;
+
+
\ No newline at end of file
diff --git a/projects/mtg/bin/Res/packs/blue_booster.txt b/projects/mtg/bin/Res/packs/blue_booster.txt
new file mode 100644
index 000000000..4103cb03f
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/blue_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:common;
+
+
+ rarity:land;type:basic;
+
+
\ No newline at end of file
diff --git a/projects/mtg/bin/Res/packs/elf_pack.txt b/projects/mtg/bin/Res/packs/elf_pack.txt
new file mode 100644
index 000000000..c1c8c9e79
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/elf_pack.txt
@@ -0,0 +1,21 @@
+
+
+ rarity:mythic;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+
+
+ rarity:uncommon;
+
+
+ rarity:common;
+
+
+ rarity:land;type:basic;
+
+
\ No newline at end of file
diff --git a/projects/mtg/bin/Res/packs/goblin_pack.txt b/projects/mtg/bin/Res/packs/goblin_pack.txt
new file mode 100644
index 000000000..4df1bd5c5
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/goblin_pack.txt
@@ -0,0 +1,21 @@
+
+
+ rarity:mythic;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+
+
+ rarity:uncommon;
+
+
+ rarity:common;
+
+
+ rarity:land;type:basic;
+
+
\ No newline at end of file
diff --git a/projects/mtg/bin/Res/packs/green_booster.txt b/projects/mtg/bin/Res/packs/green_booster.txt
new file mode 100644
index 000000000..737d3ca95
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/green_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:common;
+
+
+ rarity:land;type:basic;
+
+
\ No newline at end of file
diff --git a/projects/mtg/bin/Res/packs/lotto_pack.txt b/projects/mtg/bin/Res/packs/lotto_pack.txt
new file mode 100644
index 000000000..57eba0dd9
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/lotto_pack.txt
@@ -0,0 +1,18 @@
+
+
+ rarity:rare;|rarity:mythic
+ rarity:rare;
+ rarity:uncommon;
+ rarity:uncommon;
+ rarity:uncommon;
+ rarity:uncommon;
+ rarity:common;
+ rarity:common;
+ rarity:common;
+ rarity:common;
+ rarity:common;
+ rarity:common;|rarity:land;
+ rarity:common;|rarity:land;
+ rarity:common;|rarity:land;
+
+
\ No newline at end of file
diff --git a/projects/mtg/bin/Res/packs/mage_pack.txt b/projects/mtg/bin/Res/packs/mage_pack.txt
new file mode 100644
index 000000000..7c08e743e
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/mage_pack.txt
@@ -0,0 +1,21 @@
+
+
+ rarity:mythic;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+
+
+ rarity:uncommon;
+
+
+ rarity:common;
+
+
+ rarity:land;type:basic;
+
+
\ No newline at end of file
diff --git a/projects/mtg/bin/Res/packs/red_booster.txt b/projects/mtg/bin/Res/packs/red_booster.txt
new file mode 100644
index 000000000..7fb171120
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/red_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:common;
+
+
+ rarity:land;type:basic;
+
+
\ No newline at end of file
diff --git a/projects/mtg/bin/Res/packs/soldier_pack.txt b/projects/mtg/bin/Res/packs/soldier_pack.txt
new file mode 100644
index 000000000..87838f0f4
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/soldier_pack.txt
@@ -0,0 +1,21 @@
+
+
+ rarity:mythic;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+ rarity:rare;
+
+
+ rarity:uncommon;
+
+
+ rarity:common;
+
+
+ rarity:land;type:basic;
+
+
\ No newline at end of file
diff --git a/projects/mtg/bin/Res/packs/white_booster.txt b/projects/mtg/bin/Res/packs/white_booster.txt
new file mode 100644
index 000000000..33fa69902
--- /dev/null
+++ b/projects/mtg/bin/Res/packs/white_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:common;
+
+
+ rarity:land;type:basic;
+
+
\ No newline at end of file
diff --git a/projects/mtg/include/GameStateShop.h b/projects/mtg/include/GameStateShop.h
index f1ce1c391..47cf34cb0 100644
--- a/projects/mtg/include/GameStateShop.h
+++ b/projects/mtg/include/GameStateShop.h
@@ -27,7 +27,22 @@
#define SHOP_ITEMS SHOP_SLOTS+1
#define LIST_FADEIN 15
-struct ShopBooster{
+class MTGPack;
+class MTGPacks;
+
+class ShopBooster{
+public:
+ ShopBooster();
+ string getName();
+ void randomize(MTGPacks * packlist);
+ int basePrice();
+ int maxInventory();
+ void addToDeck(MTGDeck * d, WSrcCards * srcCards);
+ string getSort();
+private:
+ void randomCustom(MTGPacks * packlist);
+ void randomStandard();
+ MTGPack * pack;
MTGSetInfo * mainSet;
MTGSetInfo * altSet;
};
@@ -58,6 +73,7 @@ class GameStateShop: public GameState, public JGuiListener
SimpleMenu * menu;
PriceList * pricelist;
PlayerData * playerdata;
+ MTGPacks * packlist;
bool mTouched;
bool needLoad;
int mPrices[SHOP_ITEMS];
@@ -75,7 +91,6 @@ class GameStateShop: public GameState, public JGuiListener
void load();
void save(bool force=false);
void updateCounts();
- void assembleBooster(int controlId);
void beginPurchase(int controlId);
void purchaseCard(int controlId);
void purchaseBooster(int controlId);
diff --git a/projects/mtg/include/MTGCard.h b/projects/mtg/include/MTGCard.h
index ab09e3644..0f26301a7 100644
--- a/projects/mtg/include/MTGCard.h
+++ b/projects/mtg/include/MTGCard.h
@@ -35,18 +35,14 @@ class MTGCard {
MTGCard(MTGCard * source);
void setMTGId(int id);
- int getMTGId();
- int getId();
-
-
- char getRarity();
void setRarity(char _rarity);
-
//void setImageName( char * value);
- char * getImageName ();
-
void setPrimitive(CardPrimitive * cp);
+ int getMTGId() const;
+ int getId() const;
+ char getRarity() const;
+ char * getImageName();
};
diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h
index 4d86fb14b..eb265166a 100644
--- a/projects/mtg/include/MTGDefinitions.h
+++ b/projects/mtg/include/MTGDefinitions.h
@@ -127,7 +127,11 @@ class Constants
PRICE_1L = 5,
//Price in booster
- PRICE_XM = 2500,
+ PRICE_BOOSTER = 700,
+ PRICE_MIXED_BOOSTER = 800,
+ CHANCE_CUSTOM_PACK = 15,
+ CHANCE_PURE_OVERRIDE = 50,
+ CHANCE_MIXED_OVERRIDE = 25,
PRICE_XR = 355,
PRICE_XU = 88,
PRICE_XC = 8,
diff --git a/projects/mtg/include/MTGPack.h b/projects/mtg/include/MTGPack.h
new file mode 100644
index 000000000..bdbc975ca
--- /dev/null
+++ b/projects/mtg/include/MTGPack.h
@@ -0,0 +1,79 @@
+#ifndef _MTGPACCK_H_
+#define _MTGPACK_H_
+
+class MTGPackEntry{
+public:
+ virtual int addCard(WSrcCards * pool,MTGDeck * to) = 0;
+ int copies;
+};
+
+class MTGPackEntryRandom: public MTGPackEntry{
+public:
+ int addCard(WSrcCards * pool,MTGDeck * to);
+ string filter;
+};
+class MTGPackEntrySpecific: public MTGPackEntry{
+public:
+ int addCard(WSrcCards * pool,MTGDeck * to);
+ MTGCard * card;
+};
+
+class MTGPackEntryNothing: public MTGPackEntry{
+public:
+ int addCard(WSrcCards * pool,MTGDeck * to) {return 0;};
+};
+
+class MTGPackSlot{
+public:
+ ~MTGPackSlot();
+ int add(WSrcCards * ocean, MTGDeck * to, int carryover);
+ void addEntry(MTGPackEntry*item);
+ int copies;
+ string pool;
+ vector entries;
+};
+
+class MTGPack{
+public:
+ friend class MTGPacks;
+ 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();
+ string getName();
+ string getSort() {return sort;};
+ int getPrice() {return price;};
+ static WSrcCards * getPool(string poolstr);
+protected:
+ void countCards();
+ string name; //Name of the pack.
+ string type; //"Booster", "Deck", "Whatever"
+ string pool; //The starting pool.
+ string sort; //The sorting method.
+ string check; //Unlock requirements.
+ string desc; //Big card description.
+ bool bValid;
+ int unlockStatus;
+
+ int price; //Base price.
+ int minCards, maxCards;
+ vector slots;
+};
+
+class MTGPacks{
+public:
+ ~MTGPacks();
+ MTGPack * randomPack(int key=0);
+ void loadAll();
+ int size() {return (int)packs.size();};
+ void refreshUnlocked();
+
+
+private:
+ vector packs;
+};
+#endif
\ No newline at end of file
diff --git a/projects/mtg/include/PriceList.h b/projects/mtg/include/PriceList.h
index f1908790a..e31f2f025 100644
--- a/projects/mtg/include/PriceList.h
+++ b/projects/mtg/include/PriceList.h
@@ -21,7 +21,8 @@ class PriceList{
int getSellPrice(int cardid);
int getPurchasePrice(int cardid);
int getPrice(int cardId);
- int setPrice(int cardId, int price);
+ int setPrice(int cardId,int price);
+ int getOtherPrice(int amt);
static float difficultyScalar(float price, int cardid=0);
static void updateKey() {randomKey = rand();};
};
diff --git a/projects/mtg/include/WDataSrc.h b/projects/mtg/include/WDataSrc.h
index ce61a9386..5bd7542b0 100644
--- a/projects/mtg/include/WDataSrc.h
+++ b/projects/mtg/include/WDataSrc.h
@@ -5,8 +5,10 @@ class WCardFilter;
struct WCardSort;
struct WDistort;
class PriceList;
+class MTGCard;
class MTGDeck;
class MTGAllCards;
+class JQuad;
class WSyncable{
public:
@@ -69,22 +71,29 @@ public:
virtual void Sort(int method);
virtual bool setOffset(int pos);
+ virtual bool isEmptySet(WCardFilter * f);
virtual void addFilter(WCardFilter * f);
virtual void clearFilters();
+ virtual WCardFilter* unhookFilters();
virtual bool matchesFilters(MTGCard * c);
virtual void validateFilters();
virtual void bakeFilters(); //Discards all invalidated cards.
virtual float filterFee();
- virtual int addToDeck(MTGDeck * i, int num=-1); //Returns num that didn't add
+ //Loads into us.
virtual int loadMatches(MTGAllCards* ac); //loadMatches adds the cards from something
virtual int loadMatches(MTGDeck * deck); //into this, if it matches our filter
virtual int loadMatches(WSrcCards* src, bool all=false); //If all==true, ignore filters on src.
+ //We load it
+ virtual int addRandomCards(MTGDeck * i, int howmany=1);
+ virtual int addToDeck(MTGDeck * i, int num=-1); //Returns num that didn't add
+
enum {
MAX_CYCLES = 4, //How many cycles to search, for addToDeck
SORT_COLLECTOR,
- SORT_ALPHA
+ SORT_ALPHA,
+ SORT_RARITY
};
protected:
vector cards;
@@ -122,5 +131,10 @@ struct WCSortAlpha{
bool operator()(const MTGCard*l, const MTGCard*r);
};
+struct WCSortRarity{
+ int rareToInt(char r);
+ bool operator()(const MTGCard*l, const MTGCard*r);
+};
+
#endif
\ No newline at end of file
diff --git a/projects/mtg/include/WFilter.h b/projects/mtg/include/WFilter.h
index 1960a6f97..3d9c4c4a7 100644
--- a/projects/mtg/include/WFilter.h
+++ b/projects/mtg/include/WFilter.h
@@ -8,11 +8,11 @@ public:
WCFilterFactory() {};
static WCFilterFactory * GetInstance();
static void Destroy();
- WCardFilter * Construct(string x);
+ WCardFilter * Construct(string src);
private:
size_t findNext(string src, size_t start, char open='(', char close=')');
WCardFilter * Leaf(string src);
- WCardFilter * Terminal(string type, string arg);
+ WCardFilter * Terminal(string src, string arg);
static WCFilterFactory * me;
};
diff --git a/projects/mtg/src/GameStateAwards.cpp b/projects/mtg/src/GameStateAwards.cpp
index 4e9f384a8..1bcb61314 100644
--- a/projects/mtg/src/GameStateAwards.cpp
+++ b/projects/mtg/src/GameStateAwards.cpp
@@ -114,6 +114,7 @@ void GameStateAwards::Start()
detailview = NULL;
setSrc = NULL;
showMenu = false;
+ resources.Unmiss("awardback.jpg"); //Last resort, same as shop.
mBgTex = resources.RetrieveTexture("awardback.jpg",TEXTURE_SUB_5551);
mBg = resources.RetrieveQuad("awardback.jpg");
}
diff --git a/projects/mtg/src/GameStateDeckViewer.cpp b/projects/mtg/src/GameStateDeckViewer.cpp
index 3c7a5b98c..57bc869e2 100644
--- a/projects/mtg/src/GameStateDeckViewer.cpp
+++ b/projects/mtg/src/GameStateDeckViewer.cpp
@@ -149,10 +149,10 @@ void GameStateDeckViewer::Start()
menu->Add(22,"Filter by...");
menu->Add(2,"Switch decks without saving");
if(options[Options::CHEATMODE].number)
- menu->Add(-1,"*Complete collection & reset*");
+ menu->Add(-1,"Complete Collection");
menu->Add(1,"Save & Rename");
+ menu->Add(3,"Back to Main Menu");
menu->Add(0,"Save & Back to Main Menu");
- menu->Add(3,"Back to main menu");
menu->Add(4,"Cancel");
@@ -646,7 +646,7 @@ void GameStateDeckViewer::renderOnScreenMenu(){
if (value > 9){nb_letters += 3;}else{nb_letters+=2;}
}
}
- int value = myDeck->getCount();
+ int value = myDeck->totalCopies();
sprintf(buffer, _("Your Deck: %i cards").c_str(), value);
font->DrawString(buffer, SCREEN_WIDTH-200+rightTransition, SCREEN_HEIGHT/2 + 25);
@@ -1090,7 +1090,7 @@ void GameStateDeckViewer::updateStats() {
stw.needUpdate = false;
- stw.cardCount = myDeck->getCount();
+ stw.cardCount = myDeck->totalCopies();
stw.countLands = myDeck->getCount(Constants::MTG_COLOR_LAND);
stw.totalPrice = myDeck->totalPrice();
@@ -1518,7 +1518,9 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
goa->giveAward();
}
options.save();
- mStage = STAGE_WELCOME; // Reset the deck viewer, so that the new collection gets loaded
+ SAFE_DELETE(myCollection);
+ myCollection = NEW DeckDataWrapper(playerdata->collection);
+ myCollection->Sort(WSrcCards::SORT_ALPHA);
break;
case 0:
myDeck->save();
diff --git a/projects/mtg/src/GameStateMenu.cpp b/projects/mtg/src/GameStateMenu.cpp
index bc6ed29b5..4759f45f1 100644
--- a/projects/mtg/src/GameStateMenu.cpp
+++ b/projects/mtg/src/GameStateMenu.cpp
@@ -10,6 +10,7 @@
#include "../include/PlayerData.h"
#include "../include/utils.h"
#include "../include/DeckDataWrapper.h"
+#include "../include/MTGPack.h"
static const char* GAME_VERSION = "WTH?! 0.11.0 - by wololo";
@@ -404,9 +405,7 @@ void GameStateMenu::Update(float dt)
//Reload list of unlocked sets, now that we know about the sets.
options.reloadProfile(false);
-
genNbCardsStr();
-
resetDirectory();
//All major things have been loaded, resize the cache to use it as efficiently as possible
resources.autoResize();
diff --git a/projects/mtg/src/GameStateShop.cpp b/projects/mtg/src/GameStateShop.cpp
index 8642db26c..1d6196a32 100644
--- a/projects/mtg/src/GameStateShop.cpp
+++ b/projects/mtg/src/GameStateShop.cpp
@@ -6,6 +6,7 @@
#include "../include/GameStateShop.h"
#include "../include/GameApp.h"
#include "../include/MTGDeck.h"
+#include "../include/MTGPack.h"
#include "../include/Translate.h"
#include "../include/GameOptions.h"
#include
@@ -35,6 +36,7 @@ GameStateShop::GameStateShop(GameApp* parent): GameState(parent) {
shopMenu = NULL;
bigDisplay = NULL;
myCollection = NULL;
+ packlist = NULL;
pricelist = NULL;
playerdata = NULL;
booster = NULL;
@@ -117,6 +119,8 @@ void GameStateShop::Start(){
JRenderer::GetInstance()->EnableVSync(true);
taskList = NULL;
+ packlist = NEW MTGPacks();
+ packlist->loadAll();
load();
}
@@ -124,13 +128,7 @@ string GameStateShop::descPurchase(int controlId, bool tiny){
char buffer[4096];
string name;
if(controlId < BOOSTER_SLOTS){
- if(mBooster[controlId].altSet == mBooster[controlId].mainSet)
- mBooster[controlId].altSet = NULL;
- if(mBooster[controlId].altSet)
- sprintf(buffer,_("%s & %s (15 Cards)").c_str(),mBooster[controlId].mainSet->id.c_str(),mBooster[controlId].altSet->id.c_str());
- else
- sprintf(buffer,_("%s Booster (15 Cards)").c_str(),mBooster[controlId].mainSet->id.c_str());
- name = buffer;
+ name = mBooster[controlId].getName();
}
else{
MTGCard * c = srcCards->getCard(controlId-BOOSTER_SLOTS);
@@ -159,43 +157,6 @@ string GameStateShop::descPurchase(int controlId, bool tiny){
sprintf(buffer,_("%s (%i) : %i credits").c_str(),name.c_str(),mCounts[controlId],mPrices[controlId]);
return buffer;
}
-void GameStateShop::assembleBooster(int controlId){
- int mSet = -1;
- MTGSetInfo * si = setlist.randomSet(-1);
- mBooster[controlId].mainSet = si;
- mBooster[controlId].altSet = NULL;
-
- int mSetCount = si->counts[MTGSetInfo::TOTAL_CARDS];
- if(mSetCount < 80){
- if(rand() % 100 < 50){ //50% Chance of picking a pure pack instead. Combo packs are more rare :)
- si = setlist.randomSet(-1,80);
- mSetCount = si->counts[MTGSetInfo::TOTAL_CARDS];
- mBooster[controlId].mainSet = si;
- }else
- mBooster[controlId].altSet = setlist.randomSet(si->block,mSetCount);
- }
- else {
- mBooster[controlId].altSet = NULL;
- if(rand() % 100 < 10) //10% chance of having a mixed booster anyways.
- mBooster[controlId].altSet = setlist.randomSet(si->block);
- }
-
- for(int attempts=0;attempts<10;attempts++){
- if(mBooster[controlId].altSet != mBooster[controlId].mainSet)
- break;
- mBooster[controlId].altSet = setlist.randomSet(-1,mSetCount);
- }
-
- int price = mBooster[controlId].mainSet->boosterCost();
- mInventory[controlId] = 2+rand()%4;
- if(mBooster[controlId].altSet != NULL){
- price += mBooster[controlId].altSet->boosterCost();
- price /= 2;
- price = price + .05 * price; //Mixed sets add a 5% premium.
- mInventory[controlId] = 1+rand()%2;
- }
- mPrices[controlId] = price;
-}
void GameStateShop::beginPurchase(int controlId){
JLBFont * mFont = resources.GetJLBFont(Constants::MENU_FONT);
mFont->SetScale(DEFAULT_MENU_FONT_SCALE);
@@ -239,45 +200,31 @@ void GameStateShop::purchaseBooster(int controlId){
return;
playerdata->credits -= mPrices[controlId];
mInventory[controlId]--;
- WSrcCards * pool = NEW WSrcCards(0);
- WCFilterSet *main, *alt;
-
- int num = setlist.getSetNum(mBooster[controlId].mainSet);
- main = NEW WCFilterSet(num);
- if(mBooster[controlId].altSet){
- num = setlist.getSetNum(mBooster[controlId].altSet);
- alt = NEW WCFilterSet(num);
- pool->addFilter(NEW WCFilterOR(main,alt));
- }else
- pool->addFilter(main);
- pool->loadMatches(srcCards,true);
- pool->Shuffle();
-
SAFE_DELETE(booster);
+ deleteDisplay();
booster = NEW MTGDeck(mParent->collection);
-
- //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(booster,carryover);
- }
- pool->clearFilters();
- pool->addFilter(NEW WCFilterRarity(Constants::RARITY_R));
- carryover = pool->addToDeck(booster,carryover);
- pool->clearFilters();
- pool->addFilter(NEW WCFilterRarity(Constants::RARITY_U));
- carryover = pool->addToDeck(booster,carryover+3);
- pool->clearFilters();
- pool->addFilter(NEW WCFilterRarity(Constants::RARITY_C));
- carryover = pool->addToDeck(booster,carryover+11);
+ boosterDisplay = NEW CardDisplay(12,NULL, SCREEN_WIDTH - 200, SCREEN_HEIGHT/2,this,NULL,5);
+ mBooster[controlId].addToDeck(booster,srcCards);
- myCollection->Add(booster);
- makeDisplay(booster);
+ string sort = mBooster[controlId].getSort();
+ DeckDataWrapper * ddw = NEW DeckDataWrapper(booster);
+ if(sort == "alpha")
+ ddw->Sort(WSrcCards::SORT_ALPHA);
+ else if(sort == "collector")
+ ddw->Sort(WSrcCards::SORT_COLLECTOR);
+ else
+ ddw->Sort(WSrcCards::SORT_RARITY);
+ for (int x=0;xSize();x++){
+ MTGCard * c = ddw->getCard(x);
+ MTGCardInstance * ci = NEW MTGCardInstance(c, NULL);
+ boosterDisplay->AddCard(ci);
+ subBooster.push_back(ci);
+ }
+ SAFE_DELETE(ddw);
+ myCollection->Add(booster);
mTouched = true;
save(true);
- SAFE_DELETE(pool);
menu->Close();
}
@@ -308,8 +255,11 @@ void GameStateShop::load(){
int nbboostersets = 0;
JQuad * mBackThumb = resources.GetQuad("back_thumb");
- for(int i=0;igetOtherPrice(mBooster[i].basePrice());
+ }
for(int i=BOOSTER_SLOTS;igetCard(i-BOOSTER_SLOTS)) == NULL){
@@ -365,6 +315,7 @@ void GameStateShop::End()
SAFE_DELETE(myCollection);
SAFE_DELETE(booster);
SAFE_DELETE(filterMenu);
+ SAFE_DELETE(packlist);
deleteDisplay();
//Release alternate thumbnails.
@@ -530,17 +481,7 @@ void GameStateShop::Update(float dt)
}
void GameStateShop::makeDisplay(MTGDeck * d){
- deleteDisplay();
- boosterDisplay = NEW CardDisplay(12,NULL, SCREEN_WIDTH - 200, SCREEN_HEIGHT/2,this,NULL,5);
- map::iterator it;
-
- for (it = d->cards.begin(); it!=d->cards.end(); it++){
- MTGCard * c = d->getCardById(it->first);
- MTGCardInstance * ci = NEW MTGCardInstance(c, NULL);
- boosterDisplay->AddCard(ci);
- subBooster.push_back(ci);
- }
}
void GameStateShop::deleteDisplay(){
vector::iterator i;
@@ -688,3 +629,124 @@ void GameStateShop::ButtonPressed(int controllerId, int controlId)
}
menu->Close();
}
+
+//ShopBooster
+ShopBooster::ShopBooster(){
+ pack = NULL;
+ mainSet = NULL;
+ altSet = NULL;
+}
+string ShopBooster::getSort() {
+ if(pack)
+ return pack->getSort();
+ return "";
+};
+string ShopBooster::getName(){
+ char buffer[512];
+ if(!pack){
+ if(altSet == mainSet)
+ altSet = NULL;
+ if(altSet)
+ sprintf(buffer,_("%s & %s (15 Cards)").c_str(),mainSet->id.c_str(),altSet->id.c_str());
+ else if(mainSet)
+ sprintf(buffer,_("%s Booster (15 Cards)").c_str(),mainSet->id.c_str());
+ }else{
+ return pack->getName();
+ }
+ return buffer;
+}
+
+void ShopBooster::randomize(MTGPacks * packlist){
+ mainSet = NULL; altSet = NULL; pack = NULL;
+ if(!setlist.size()) return;
+ if(packlist && setlist.size() > 10){ //FIXME make these an unlockable item.
+ int rnd = rand() % 100;
+ if(rnd <= Constants::CHANCE_CUSTOM_PACK){
+ randomCustom(packlist);
+ return;
+ }
+ }
+ randomStandard();
+}
+int ShopBooster::basePrice(){
+ if(pack)
+ return pack->getPrice();
+ else if(altSet)
+ return Constants::PRICE_MIXED_BOOSTER;
+ return Constants::PRICE_BOOSTER;
+}
+void ShopBooster::randomCustom(MTGPacks * packlist){
+ pack = packlist->randomPack();
+ if(pack && !pack->isUnlocked())
+ pack = NULL;
+ if(!pack){
+ randomStandard();
+ }
+}
+void ShopBooster::randomStandard(){
+ int mSet = -1;
+ MTGSetInfo * si = setlist.randomSet(-1);
+ mainSet = si;
+ altSet = NULL;
+
+ int mSetCount = si->counts[MTGSetInfo::TOTAL_CARDS];
+ if(mSetCount < 80){
+ if(rand() % 100 < Constants::CHANCE_PURE_OVERRIDE){ //Chance of picking a pure pack instead.
+ si = setlist.randomSet(-1,80);
+ mSetCount = si->counts[MTGSetInfo::TOTAL_CARDS];
+ mainSet = si;
+ }else
+ altSet = setlist.randomSet(si->block,80-mSetCount);
+ }
+ else if(rand() % 100 < Constants::CHANCE_MIXED_OVERRIDE) //Chance of having a mixed booster anyways.
+ altSet = setlist.randomSet(si->block);
+
+ for(int attempts=0;attempts<10;attempts++){ //Try to prevent altSet == mainSet.
+ if(altSet != mainSet) break;
+ altSet = setlist.randomSet(-1,80-mSetCount);
+ }
+ if(altSet == mainSet) altSet = NULL; //Prevent "10E & 10E Booster"
+
+}
+int ShopBooster::maxInventory(){
+ if(altSet || pack)
+ return 2;
+ return 5;
+}
+void ShopBooster::addToDeck(MTGDeck * d, WSrcCards * srcCards){
+
+ if(pack){
+ 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);
+ }
+}
\ No newline at end of file
diff --git a/projects/mtg/src/MTGCard.cpp b/projects/mtg/src/MTGCard.cpp
index 15b098a4a..31610442f 100644
--- a/projects/mtg/src/MTGCard.cpp
+++ b/projects/mtg/src/MTGCard.cpp
@@ -50,13 +50,13 @@ void MTGCard::setMTGId(int id){
}
}
-int MTGCard::getMTGId(){
+int MTGCard::getMTGId() const {
return mtgid;
}
-int MTGCard::getId(){
+int MTGCard::getId() const {
return mtgid;
}
-char MTGCard::getRarity(){
+char MTGCard::getRarity() const {
return rarity;
}
@@ -64,7 +64,7 @@ void MTGCard::setRarity(char _rarity){
rarity = _rarity;
}
-char * MTGCard::getImageName(){
+char * MTGCard::getImageName() {
return image_name;
}
diff --git a/projects/mtg/src/MTGDeck.cpp b/projects/mtg/src/MTGDeck.cpp
index 111570a9a..76a0b9f4f 100644
--- a/projects/mtg/src/MTGDeck.cpp
+++ b/projects/mtg/src/MTGDeck.cpp
@@ -676,7 +676,7 @@ int MTGDeck::remove(MTGCard * card){
int MTGDeck::save(){
std::ofstream file(filename.c_str());
- char writer[10];
+ char writer[512];
if (file){
#if defined (WIN32) || defined (LINUX)
OutputDebugString("saving");
diff --git a/projects/mtg/src/MTGPack.cpp b/projects/mtg/src/MTGPack.cpp
new file mode 100644
index 000000000..04c8168e5
--- /dev/null
+++ b/projects/mtg/src/MTGPack.cpp
@@ -0,0 +1,269 @@
+#include
+#include
+#include
+#include
+#include "../include/config.h"
+#include "../include/GameApp.h"
+#include "../include/Translate.h"
+#include "../include/WDataSrc.h"
+#include "../include/WFilter.h"
+#include "../include/DeckDataWrapper.h"
+#include "../include/MTGPack.h"
+#include "../../../JGE/src/TinyXML/tinyxml.h"
+
+int MTGPackEntryRandom::addCard(WSrcCards *pool, MTGDeck *to){
+ int fails = 0;
+ if(!pool) return 1;
+ WCFilterFactory * ff = WCFilterFactory::GetInstance();
+ WCardFilter * oldf = pool->unhookFilters();
+ pool->addFilter(ff->Construct(filter));
+ fails = pool->addRandomCards(to,copies);
+ pool->clearFilters();
+ pool->addFilter(oldf);
+ return fails;
+}
+int MTGPackEntrySpecific::addCard(WSrcCards *pool, MTGDeck *to){
+ int fails = 0;
+ //Ignores pool entirely.
+ MTGAllCards * ac = GameApp::collection;
+
+ if(!card) return copies;
+ for(int i=0;iadd(card);
+ return 0;
+}
+
+int MTGPackSlot::add(WSrcCards * ocean, MTGDeck *to, int carryover){
+ if(!entries.size()) return copies;
+ int fails = 0;
+ int amt = copies + carryover;
+ WSrcCards * myPool = MTGPack::getPool(pool);
+ if(!myPool) myPool = ocean;
+ for(int i=0;iaddCard(myPool,to))
+ pos++;
+ if(pos == entries.size()) fails++;
+#else //Fall straight through to next slot
+ fails = entries[pos]->addCard(myPool,to);
+#endif
+ }
+ return fails;
+}
+
+WSrcCards * MTGPack::getPool(string poolstr){
+ WSrcCards * mySrc = NULL;
+ size_t s = poolstr.find("all");
+ WCFilterFactory * ff = WCFilterFactory::GetInstance();
+
+ if(s == string::npos){ //Default to just unlocked cards
+ mySrc = NEW WSrcUnlockedCards();
+ s = poolstr.find("unlocked");
+ string sub = poolstr;
+ if(s != string::npos) sub = poolstr.substr(s+8);
+ if(sub.size()){
+ mySrc->addFilter(ff->Construct(sub));
+ mySrc->bakeFilters();
+ }
+ }
+ else{ //Use everything.
+ mySrc = NEW WSrcCards();
+ string sub = poolstr.substr(s+3);
+ if(sub.size()){
+ mySrc->addFilter(ff->Construct(sub));
+ mySrc->loadMatches(GameApp::collection);
+ mySrc->bakeFilters();
+ }else
+ mySrc->loadMatches(GameApp::collection);
+ }
+ mySrc->Shuffle();
+ return mySrc;
+}
+
+void MTGPackSlot::addEntry(MTGPackEntry*item){
+ if(item)
+ entries.push_back(item);
+}
+int MTGPack::assemblePack(MTGDeck *to){
+ int carryover = 0;
+ WSrcCards * p = getPool(pool);
+ if(!p)
+ return -1;
+
+ for(size_t i=0;iadd(p,to,carryover);
+ }
+ SAFE_DELETE(p);
+ return carryover;
+}
+void MTGPack::countCards(){
+ minCards = 0;
+ maxCards = 0;
+ for(size_t i=0;ientries.size();y++){
+ int test = ps->entries[y]->copies * ps->copies;
+ if(test > top) top = test;
+ if(test < bot) bot = test;
+ }
+ maxCards += top;
+ minCards += bot;
+ }
+}
+void MTGPack::load(string filename){
+ //TODO Placeholder until XML format available.
+ TiXmlDocument packfile(filename.c_str());
+ if(!packfile.LoadFile())
+ return;
+ TiXmlHandle hDoc(&packfile);
+ TiXmlElement * pPack;
+ pPack = hDoc.FirstChildElement().Element();
+ if(!pPack ) return;
+ //root should be "pack"
+ string tag = pPack->Value();
+ std::transform(tag.begin(),tag.end(),tag.begin(),::tolower);
+ if(tag != "pack")
+ return;
+ //After validating, handle actual loading.
+ TiXmlElement * pSlot;
+ const char * holder = NULL;
+ holder = pPack->Attribute("price");
+ if(holder) price = atoi(holder); else price = Constants::PRICE_BOOSTER;
+ holder = pPack->Attribute("pool");
+ if(holder) pool = holder; else pool = "";
+ holder = pPack->Attribute("type");
+ if(holder) type = holder; else type = "Booster";
+ holder = pPack->Attribute("name");
+ if(holder) name = holder; else name = "Special";
+ holder = pPack->Attribute("requires");
+ if(holder) check = holder;
+ holder = pPack->Attribute("sort");
+ if(holder) sort = holder; else sort = "";
+ std::transform(sort.begin(),sort.end(),sort.begin(),::tolower);
+
+ for (pSlot=pPack->FirstChildElement();pSlot!=NULL;pSlot=pSlot->NextSiblingElement()){
+ TiXmlElement * pEntry;
+ //Load slot.
+ tag = pSlot->Value();
+ std::transform(tag.begin(),tag.end(),tag.begin(),::tolower);
+ if(tag != "slot") continue;
+ MTGPackSlot * s = NEW MTGPackSlot();
+ slots.push_back(s);
+ holder = pSlot->Attribute("copies");
+ if(holder) s->copies = atoi(holder);
+ else s->copies = 1;
+
+ for(pEntry = pSlot->FirstChildElement();pEntry!=NULL;pEntry=pEntry->NextSiblingElement()){
+ tag = pEntry->Value();
+ std::transform(tag.begin(),tag.end(),tag.begin(),::tolower);
+ if(tag == "card"){ //Load specific card
+ MTGPackEntrySpecific * es = NEW MTGPackEntrySpecific();
+ holder = pEntry->Attribute("copies");
+ if(holder) es->copies = atoi(holder);
+ else es->copies = 1;
+ es->card = GameApp::collection->getCardByName(pEntry->Value());
+ s->addEntry(es);
+ }else if(tag == "random_card"){ //Load random card
+ MTGPackEntryRandom * er = NEW MTGPackEntryRandom();
+ holder = pEntry->Attribute("copies");
+ if(holder) er->copies = atoi(holder);
+ else er->copies = 1;
+ const char * text = pEntry->GetText();
+ if(text) er->filter = text;
+ s->addEntry(er);
+ }else if(tag == "nothing"){
+ MTGPackEntryNothing * nt = NEW MTGPackEntryNothing();
+ s->addEntry(nt);
+ }
+ }
+ }
+ bValid = true;
+ countCards();
+ return;
+}
+MTGPackSlot::~MTGPackSlot(){
+ for(size_t t=0;td_name);
+ if(myFilename[0] == '.') continue;
+ MTGPack * p = NEW MTGPack(myFilename);
+ if(!p->isValid()){
+ SAFE_DELETE(p);
+ continue;
+ }
+ packs.push_back(p);
+ }
+ closedir(mDip);
+}
+string MTGPack::getName(){
+ string n = _(name);
+ string t = _(type);
+ char buf[1024];
+ if(minCards != maxCards)
+ sprintf(buf,"%s %s (%i-%i cards)",n.c_str(),t.c_str(),minCards,maxCards);
+ else
+ sprintf(buf,"%s %s (%i cards)",n.c_str(),t.c_str(),maxCards);
+ return buf;
+}
+
+bool MTGPack::meetsRequirements(){
+ bool unlocked = true;
+ WCFilterFactory * ff = WCFilterFactory::GetInstance();
+ WSrcCards * myC = getPool(pool);
+ if(!myC || myC->Size() < maxCards) unlocked = false; //Top pool lacks cards.
+ SAFE_DELETE(myC);
+ if(!check.size() || !unlocked) return unlocked;
+ myC = NEW WSrcUnlockedCards(); //Requirements are independent of pool;
+ WCardFilter * cf = ff->Construct(check);
+ unlocked = !myC->isEmptySet(cf); //Quick check for empty set status.
+ SAFE_DELETE(cf); //delete requirement filter
+ SAFE_DELETE(myC); //delete pool.
+ return unlocked;
+}
+
+bool MTGPack::isUnlocked(){
+ if(unlockStatus == 0){
+ if(meetsRequirements())
+ unlockStatus = 1;
+ else
+ unlockStatus = -1;
+ }
+ return (unlockStatus > 0);
+}
+
+void MTGPacks::refreshUnlocked(){
+ for(size_t t=0;tunlockStatus < 0)
+ packs[t]->unlockStatus = 0;
+ }
+}
\ No newline at end of file
diff --git a/projects/mtg/src/PriceList.cpp b/projects/mtg/src/PriceList.cpp
index 42d33e0f8..2dbd7e5e0 100644
--- a/projects/mtg/src/PriceList.cpp
+++ b/projects/mtg/src/PriceList.cpp
@@ -95,3 +95,8 @@ int PriceList::getPurchasePrice(int cardid){
if(p < 2) p = 2; //Prevents "Sell for 0 credits"
return (int)p;
}
+int PriceList::getOtherPrice(int amt){
+ float p = difficultyScalar(amt,0);
+ if(p < 2) p = 2;
+ return (int)p;
+}
diff --git a/projects/mtg/src/WDataSrc.cpp b/projects/mtg/src/WDataSrc.cpp
index 64472f8a4..9501be755 100644
--- a/projects/mtg/src/WDataSrc.cpp
+++ b/projects/mtg/src/WDataSrc.cpp
@@ -160,6 +160,22 @@ int WSrcCards::loadMatches(WSrcCards* src, bool all){
validateFilters();
return count;
}
+int WSrcCards::addRandomCards(MTGDeck * i, int howmany){
+ if(!cards.size() || (filtersRoot && !validated.size()))
+ return howmany;
+ for(int x=0;xadd(cards[validated[pos]]);
+ }
+ else{
+ size_t pos = rand() % cards.size();
+ i->add(cards[pos]);
+ }
+ }
+ return 0;
+}
+
int WSrcCards::addToDeck(MTGDeck * i, int num){
int oldpos = getOffset();
int added = 0;
@@ -256,6 +272,7 @@ void WSrcCards::Shuffle(){
}
void WSrcCards::validateFilters(){
validated.clear();
+ if(filtersRoot == NULL) return; //No filter, no validation
for(size_t t=0;t 0);
+ for(size_t t=0;tisMatch(cards[validated[t]]))
+ return false;
+ }else if(f->isMatch(cards[t]))
+ return false;
+ }
+ return true;
+}
void WSrcCards::addFilter(WCardFilter * f) {
if(filtersRoot == NULL)
@@ -288,13 +318,21 @@ void WSrcCards::clearFilters() {
SAFE_DELETE(filtersRoot);
validated.clear();
}
-
+WCardFilter* WSrcCards::unhookFilters(){
+ WCardFilter* temp = filtersRoot;
+ filtersRoot = NULL;
+ clearFilters();
+ return temp;
+}
void WSrcCards::Sort(int method){
switch(method){
- case SORT_COLLECTOR:
+ case WSrcCards::SORT_COLLECTOR:
std::sort(cards.begin(),cards.end(),WCSortCollector());
break;
- case SORT_ALPHA:
+ case WSrcCards::SORT_RARITY:
+ std::sort(cards.begin(),cards.end(),WCSortRarity());
+ break;
+ case WSrcCards::SORT_ALPHA:
default:
std::sort(cards.begin(),cards.end(),WCSortAlpha());
break;
@@ -386,6 +424,8 @@ void WSrcDeck::Rebuild(MTGDeck * d){
}
int WSrcDeck::count(MTGCard * c){
+ if(!c)
+ return totalCopies();
if(copies.find(c->getMTGId()) == copies.end())
return 0;
return copies[c->getMTGId()];
@@ -425,12 +465,28 @@ int WSrcDeck::totalCopies(){
return totalCards;
}
//Sorting methods:
-
+int WCSortRarity::rareToInt(char r){
+ switch(r){
+ default: case Constants::RARITY_T: return 0;
+ case Constants::RARITY_L: return 1;
+ case Constants::RARITY_C: return 2;
+ case Constants::RARITY_U: return 3;
+ case Constants::RARITY_R: return 4;
+ case Constants::RARITY_M: return 5;
+ }
+}
+bool WCSortRarity::operator()(const MTGCard*l, const MTGCard*r){
+ if(!l || !r || !l->data || !r->data)
+ return false;
+ return (rareToInt(l->getRarity()) < rareToInt(r->getRarity()));
+}
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();
+ if(ln == rn)
+ return l->getMTGId() < r->getMTGId();
return (ln < rn);
}
bool WCSortCollector::operator()(const MTGCard*l, const MTGCard*r){
diff --git a/projects/mtg/src/WFilter.cpp b/projects/mtg/src/WFilter.cpp
index 902cec90d..ecaa87c80 100644
--- a/projects/mtg/src/WFilter.cpp
+++ b/projects/mtg/src/WFilter.cpp
@@ -29,15 +29,11 @@ size_t WCFilterFactory::findNext(string src, size_t start,char open, char close)
}
return string::npos;
}
-WCardFilter * WCFilterFactory::Construct(string in){
+WCardFilter * WCFilterFactory::Construct(string src){
size_t x = 0;
- string src;
-
- for(x=0;x < in.size();x++){
- if(isspace(in[x]))
- continue;
- src+=in[x];
- }
+ string whitespaces (" \t\f\v\n\r");
+ x = src.find_first_not_of(whitespaces);
+ if(x != string::npos) src = src.substr(x);
if(!src.size())
return NEW WCFilterNULL(); //Empty string.
@@ -89,6 +85,9 @@ WCardFilter * WCFilterFactory::Construct(string in){
WCardFilter * WCFilterFactory::Leaf(string src){
string filter;
+ string whitespaces (" \t\f\v\n\r");
+ size_t x = src.find_first_not_of(whitespaces);
+ if(x != string::npos) src = src.substr(x);
for(size_t i=0;igetCard(mOffset.getPos())) == NULL){
JQuad * q;
- if(bThumb)
+ if(bThumb){
q = resources.GetQuad("back_thumb");
+#if defined WIN32 || defined LINUX
+ if(!q)
+ q = resources.GetQuad("back");
+#endif
+ }
else
q = resources.GetQuad("back");
float scale = p.actZ * 257.f / q->mHeight;
@@ -1116,8 +1121,13 @@ void WGuiCardImage::Render(){
return;
if(bThumb){
JQuad * q = NULL;
- if(!options[Options::DISABLECARDS].number)
+ if(!options[Options::DISABLECARDS].number){
q = source->getThumb(mOffset.getPos());
+#if defined WIN32 || defined LINUX
+ if(!q)
+ q = source->getImage(mOffset.getPos());
+#endif
+ }
if(!q && (q = CardGui::alternateThumbQuad(c)) == NULL)
return; //TODO Some kind of error image.
renderer->RenderQuad(q,p.x,p.y);
@@ -1153,8 +1163,13 @@ void WGuiCardDistort::Render(){
if(!source){
//Default to back.
- if(bThumb)
+ if(bThumb){
q = resources.GetQuad("back_thumb");
+#if defined WIN32 || defined LINUX
+ if(!q)
+ q = resources.GetQuad("back");
+#endif
+ }
else
q = resources.GetQuad("back");
}else {
@@ -1164,6 +1179,10 @@ void WGuiCardDistort::Render(){
if(bThumb){
q = source->getThumb(mOffset.getPos());
+#if defined WIN32 || defined LINUX
+ if(!q)
+ q = source->getImage(mOffset.getPos());
+#endif
if(!q || options[Options::DISABLECARDS].number)
q = CardGui::alternateThumbQuad(c);
}
diff --git a/projects/mtg/template.vcproj b/projects/mtg/template.vcproj
index f7837461b..a9d204eb4 100644
--- a/projects/mtg/template.vcproj
+++ b/projects/mtg/template.vcproj
@@ -306,6 +306,104 @@
Name="VCPostBuildEventTool"
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -424,6 +522,15 @@
PreprocessorDefinitions=""
/>
+
+
+
+
+
+
+
+
@@ -953,6 +1073,10 @@
RelativePath=".\include\MTGGameZones.h"
>
+
+