Jeck - Added full filtering system to deck editor and shop. I've spent 24hours on pure debugging, but there are likely a couple bugs I've missed. So please, if you find something, make an issue of it! :P Also split OptionItem classes into separate files, and added support for mixed-set boosters (which I think are way, way cool).

This commit is contained in:
wagic.jeck
2010-02-08 01:03:07 +00:00
parent 64d592f588
commit 83e2b04547
31 changed files with 4125 additions and 2742 deletions
+9 -13
View File
@@ -4,6 +4,7 @@
#include "../include/MTGDefinitions.h"
#include "../include/MTGCard.h"
#include "../include/CardPrimitive.h"
#include "../include/WDataSrc.h"
#include <map>
#include <string>
using std::map;
@@ -23,27 +24,22 @@ class Cmp1 { // compares cards by their name
}
};
class DeckDataWrapper{
class DeckDataWrapper: public WSrcDeck {
public:
int colors[Constants::MTG_NB_COLORS+1];
int currentColor;
map<MTGCard *, int,Cmp1> cards;
MTGDeck * parent;
int counts[Constants::MTG_NB_COLORS];
DeckDataWrapper(MTGDeck * deck);
~DeckDataWrapper();
int Add(MTGCard * card, int quantity = 1);
int Add(MTGCard * c, int quantity=1);
int Remove(MTGCard * c, int quantity=1, bool erase=false);
int Add(MTGDeck * deck);
int Remove(MTGCard * card);
MTGCard * getNext(MTGCard * previous = NULL, int color = -1);
MTGCard * getPrevious(MTGCard * next = NULL, int color = -1);
void updateCounts(MTGCard * card = NULL, int quantity = 1);
int getCount(int color = -1);
int totalPrice();
int getCount(int color=-1);
void updateCounts();
bool next() {currentPos++; return true;};
bool prev() {currentPos--; return true;};
void save();
int countByName(MTGCard * card);
int count(MTGCard * card);
};
#endif
+2 -2
View File
@@ -7,7 +7,7 @@
class WGuiList;
class WGuiMenu;
class WSrcMTGSet;
class WSrcCards;
class GameStateAwards: public GameState, public JGuiListener
{
@@ -16,7 +16,7 @@ class GameStateAwards: public GameState, public JGuiListener
WGuiMenu * detailview;
JQuad * mBg;
JTexture * mBgTex;
WSrcMTGSet * setSrc;
WSrcCards * setSrc;
SimpleMenu * menu;
bool showMenu;
bool showAlt;
+11 -6
View File
@@ -15,6 +15,8 @@
#include "../include/PlayerData.h"
#include "../include/DeckDataWrapper.h"
#include "../include/DeckStats.h"
#include "../include/WDataSrc.h"
#include "../include/WGui.h"
#define NO_USER_ACTIVITY_HELP_DELAY 10
#define NO_USER_ACTIVITY_SHOWCARD_DELAY 0.1
@@ -28,7 +30,8 @@ enum
STAGE_TRANSITION_DOWN = 4,
STAGE_ONSCREEN_MENU = 5,
STAGE_WELCOME = 6,
STAGE_MENU = 7
STAGE_MENU = 7,
STAGE_FILTERS = 8
};
@@ -41,6 +44,8 @@ enum
#define MED_SPEED 5.0
#define LOW_SPEED 1.5
#define MAX_SAVED_FILTERS 8
static const int STATS_FOR_TURNS = 8;
static const int STATS_MAX_MANA_COST = 9;
@@ -100,11 +105,12 @@ private:
int mStage;
int nbDecks;
int deckNum;
int colorFilter;
int useFilter[2];
JMusic * bgMusic;
JQuad * backQuad;
WGuiFilters * filterDeck;
WGuiFilters * filterCollection;
SimpleMenu * welcome_menu;
bool showing_user_deck;
SimpleMenu * menu;
SimpleMenu * sellMenu;
PriceList* pricelist;
@@ -116,7 +122,6 @@ private:
MTGCard * currentCard;
MTGCard * cardIndex[7];
int hudAlpha;
float scrollSpeed;
int delSellMenu;
string newDeckname;
StatsWrapper stw;
@@ -127,12 +132,12 @@ public:
virtual ~GameStateDeckViewer();
void updateDecks();
void rotateCards(int direction);
void loadIndexes(MTGCard * current = NULL);
void loadIndexes();
void updateFilters();
void switchDisplay();
void Start();
virtual void End();
void addRemove(MTGCard * card);
int Remove(MTGCard * card);
virtual void Update(float dt);
void renderOnScreenBasicInfo();
void renderSlideBar();
+57 -6
View File
@@ -4,7 +4,11 @@
#include <JGE.h>
#include "../include/GameState.h"
#include "../include/SimpleMenu.h"
#include "../include/ShopItem.h"
#include "../include/OptionItem.h"
#include "../include/PriceList.h"
#include "../include/PlayerData.h"
#include "../include/CardDisplay.h"
#include "../include/DeckDataWrapper.h"
#include "../include/Tasks.h"
@@ -14,28 +18,74 @@
#define STAGE_SHOP_SHOP 4
#define STAGE_SHOP_TASKS 5
#define STAGE_FADE_IN 6
#define STAGE_ASK_ABOUT 7
#define BOOSTER_SLOTS 3
#define SHOP_SLOTS 11
#define SHOP_ITEMS SHOP_SLOTS+1
#define LIST_FADEIN 11
struct ShopBooster{
MTGSetInfo * mainSet;
MTGSetInfo * altSet;
};
class GameStateShop: public GameState, public JGuiListener
{
private:
ShopItems * shop;
WSrcCards * srcCards;
JTexture * altThumb[8];
JQuad * mBack;
JQuad * mBg;
JTexture * mBgTex;
TaskList * taskList;
float mElapsed;
WGuiMenu * shopMenu;
WGuiFilters * filterMenu; //Filter menu slides in sideways from right, or up from bottom.
WGuiCardImage * bigDisplay;
CardDisplay * boosterDisplay;
vector<MTGCardInstance*> subBooster;
MTGDeck * booster;
bool bListCards;
SimpleMenu * menu;
void beginFilters();
void makeDisplay(MTGDeck * d);
void deleteDisplay();
WSyncable bigSync;
SimpleMenu * menu;
PriceList * pricelist;
PlayerData * playerdata;
bool mTouched;
int mPrices[SHOP_ITEMS];
int mCounts[SHOP_ITEMS];
int mInventory[SHOP_ITEMS];
int lightAlpha;
int alphaChange;
DeckDataWrapper * myCollection;
int mStage;
char starterBuffer[128], boosterBuffer[128];
char setNames[SHOP_BOOSTERS][128];
int setIds[SHOP_BOOSTERS];
ShopBooster mBooster[BOOSTER_SLOTS];
void load();
void save(bool force=false);
void assembleBooster(int controlId);
void beginPurchase(int controlId);
void purchaseCard(int controlId);
void purchaseBooster(int controlId);
int purchasePrice(int offset);
string descPurchase(int controlId, bool tiny = false);
static int randomKey;
public:
GameStateShop(GameApp* parent);
virtual ~GameStateShop();
static void passOneDay() {randomKey = rand();};
virtual void Start();
virtual void End();
virtual void Create();
@@ -43,6 +93,7 @@ class GameStateShop: public GameState, public JGuiListener
virtual void Update(float dt);
virtual void Render();
virtual void ButtonPressed(int controllerId, int controlId);
static float _x1[],_y1[],_x2[],_y2[],_x3[],_y3[],_x4[],_y4[];
};
+1 -1
View File
@@ -19,6 +19,7 @@ using namespace std;
class MTGCard {
protected:
friend class MTGSetInfo;
int mtgid;
char rarity;
char image_name[MTGCARD_NAME_SIZE];
@@ -38,7 +39,6 @@ class MTGCard {
int getId();
char getRarity();
void setRarity(char _rarity);
+4 -2
View File
@@ -61,14 +61,16 @@ public:
int Add(const char * subtype);
int findSet(string value);
int findBlock(string s);
int size();
int getSetNum(MTGSetInfo*i);
int operator[](string id); //Returns set id index, -1 for failure.
string operator[](int id); //Returns set id name, "" for failure.
MTGSetInfo* getInfo(int setID);
MTGSetInfo* randomSet(int blockId = -1, int atleast = -1); //Tries to match, otherwise 100% random unlocked set
protected:
vector<string> blocks;
vector<MTGSetInfo*> setinfo;
+3 -437
View File
@@ -6,6 +6,9 @@
#include <string>
#include "../include/GameApp.h"
#include "../include/GameOptions.h"
#include "../include/WFilter.h"
#include "../include/WDataSrc.h"
#include "../include/WGui.h"
using std::string;
@@ -16,122 +19,6 @@ using std::string;
#define PATH_MAX 4096
#endif
class WGuiColor{
public:
enum {
SCROLLBAR,
SCROLLBUTTON,
//Foregrounds only after this
TEXT,
TEXT_HEADER,
TEXT_FAIL,
TEXT_TAB,
TEXT_BODY,
//Backgrounds only after this
BACK,
BACK_ALERT,
BACK_HEADER,
BACK_FAIL,
BACK_TAB,
};
};
//Complete item interface
class WGuiBase{
public:
WGuiBase() {};
virtual ~WGuiBase() {};
virtual bool Selectable() {return true;};
virtual bool isModal() {return false;};
virtual bool Visible() {return true;};
virtual bool Changed() {return false;};
virtual void confirmChange(bool confirmed) {};
virtual PIXEL_TYPE getColor(int type);
virtual void Entering(u32 key)=0;
virtual bool Leaving(u32 key)=0;
virtual void Update(float dt)=0;
virtual void updateValue(){};
virtual void Render()=0;
virtual void setData()=0;
virtual void ButtonPressed(int controllerId, int controlId){};
virtual void Reload(){};
virtual void Overlay(){};
virtual void Underlay(){};
virtual bool hasFocus()=0;
virtual void setFocus(bool bFocus)=0;
virtual float getX()=0;
virtual float getY()=0;
virtual float getWidth()=0;
virtual float getHeight()=0;
virtual int getId() {return INVALID_ID;};
virtual string getDisplay(){return "";};
virtual void setModal(bool val){};
virtual void setDisplay(string s){};
virtual void setX(float _x){};
virtual void setY(float _y){};
virtual void setWidth(float _w){};
virtual void setHeight(float _h){};
virtual void setId(int _id){};
virtual void setHidden(bool bHidden) {};
virtual void setVisible(bool bVisisble) {};
virtual void renderBack(WGuiBase * it);
virtual void subBack(WGuiBase * item) {};
virtual bool CheckUserInput(u32 key) {return false;};
};
//This is our base class for concrete items.
class WGuiItem: public WGuiBase{
public:
virtual void Entering(u32 key);
virtual bool Leaving(u32 key);
virtual bool CheckUserInput(u32 key);
virtual void Update(float dt) {};
virtual void Render();
WGuiItem(string _display, u8 _mF = 0);
virtual ~WGuiItem() {};
string _(string input); //Override global with our flag checker.
virtual void setData(){};
virtual bool hasFocus() {return mFocus;};
virtual void setFocus(bool bFocus) {mFocus = bFocus;};
virtual string getDisplay(){return displayValue;};
virtual void setDisplay(string s){displayValue=s;};
virtual int getId() {return INVALID_ID;};
virtual float getX() {return x;};
virtual float getY() {return y;};
virtual float getWidth() {return width;};
virtual float getHeight() {return height;};
virtual void setId(int _id){};
virtual void setX(float _x){x = _x;};
virtual void setY(float _y){y = _y;};
virtual void setWidth(float _w){width = _w;};
virtual void setHeight(float _h){height = _h;};
enum {
NO_TRANSLATE = (1<<1),
};
u8 mFlags;
protected:
bool mFocus;
float x, y;
float width, height;
string displayValue;
};
class OptionItem: public WGuiItem{
public:
OptionItem( int _id, string _displayValue);
@@ -145,327 +32,6 @@ protected:
int id;
};
class WDataSource{
public:
WDataSource() {};
virtual JQuad * getImage() {return NULL;};
virtual MTGCard * getCard() {return NULL;};
virtual bool thisCard(int mtgid) {return false;};
virtual int getControlID() {return -1;}; //TODO FIXME: Need a "not a valid button" define.
virtual int getPos() {return -1;};
virtual bool setPos(int pos) {return false;};
virtual bool next() {return false;};
virtual bool prev() {return false;};
virtual void Update(float dt) {};
};
class WSrcImage: public WDataSource{
public:
virtual JQuad * getImage();
WSrcImage(string s);
protected:
string filename;
};
class WSrcMTGSet: public WDataSource{
public:
WSrcMTGSet(int setid, float mDelay=0.2);
virtual JQuad * getImage();
virtual MTGCard * getCard();
virtual bool thisCard(int mtgid);
virtual bool next();
virtual bool prev();
virtual int getPos() {return currentCard;};
virtual bool setPos(int pos);
virtual void Update(float dt);
protected:
vector<MTGCard*> cards;
int currentCard;
float mDelay;
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);
virtual bool Selectable() {return false;};
virtual void Render();
virtual float getHeight();
virtual void imageScale(float _w, float _h);
protected:
int margin;
float imgW, imgH;
WDataSource * source;
};
class WGuiCardImage: public WGuiImage{
public:
WGuiCardImage(WDataSource * wds, int _offset=0);
virtual void Render();
protected:
int offset;
};
//This is our base class for decorators. It wraps everything about WGuiBase.
class WGuiDeco: public WGuiBase{
public:
WGuiDeco(WGuiBase* _it) {it = _it;};
virtual ~WGuiDeco() {SAFE_DELETE(it);};
virtual bool Selectable() {return it->Selectable();};
virtual bool Visible() {return it->Visible();};
virtual bool Changed() {return it->Changed();};
virtual void confirmChange(bool confirmed) {it->confirmChange(confirmed);};
virtual void Entering(u32 key) {it->Entering(key);};
virtual bool Leaving(u32 key) {return it->Leaving(key);};
virtual void Update(float dt) {it->Update(dt);};
virtual void updateValue() {it->updateValue();};
virtual void Reload() {it->Reload();};
virtual void Overlay() {it->Overlay();};
virtual void Underlay() {it->Underlay();};
virtual void Render() {it->Render();};
virtual void setData() {it->setData();};
virtual void ButtonPressed(int controllerId, int controlId) {it->ButtonPressed(controllerId, controlId);};
virtual bool hasFocus() {return it->hasFocus();};
virtual string getDisplay() {return it->getDisplay();};
virtual int getId() {return it->getId();};
virtual float getX() {return it->getX();};
virtual float getY() {return it->getY();};
virtual float getWidth() {return it->getWidth();};
virtual float getHeight() {return it->getHeight();};
virtual PIXEL_TYPE getColor(int type) {return it->getColor(type);};
WGuiBase * getDecorated() {return it;};
virtual void setFocus(bool bFocus) {it->setFocus(bFocus);};
virtual void setDisplay(string s) {it->setDisplay(s);};
virtual void setId(int _id) {it->setId(_id);};
virtual void setX(float _x) {it->setX(_x);};
virtual void setY(float _y) {it->setY(_y);};
virtual void setWidth(float _w) {it->setWidth(_w);};
virtual void setHeight(float _h) {it->setHeight(_h);};
virtual void setHidden(bool bHidden) {it->setHidden(bHidden);};
virtual void setVisible(bool bVisisble) {it->setVisible(bVisisble);};
virtual bool CheckUserInput(u32 key) {return it->CheckUserInput(key);};
protected:
WGuiBase * it;
};
class WGuiAward: public WGuiItem{
public:
WGuiAward(int _id, string name, string _text, string _details="");
virtual ~WGuiAward();
virtual void Render();
virtual bool Selectable() {return Visible();};
virtual bool Visible();
virtual int getId() {return id;};
virtual void Underlay();
virtual void Overlay();
protected:
string details;
int id;
string text;
};
class WGuiSplit: public WGuiItem{
public:
WGuiSplit(WGuiBase* _left,WGuiBase* _right);
virtual ~WGuiSplit();
virtual void Reload();
virtual void Overlay();
virtual void Underlay();
virtual void setData();
virtual bool isModal();
virtual void setModal(bool val);
virtual void Render();
virtual void Update(float dt);
virtual void setX(float _x);
virtual void setY(float _y);
virtual void setWidth(float _w);
virtual void setHeight(float _h);
virtual float getHeight();
virtual void ButtonPressed(int controllerId, int controlId);
virtual void confirmChange(bool confirmed);
virtual void Entering(u32 key);
virtual bool Leaving(u32 key);
virtual bool CheckUserInput(u32 key);
bool bRight;
float percentRight;
WGuiBase* right;
WGuiBase* left;
};
class WDecoConfirm: public WGuiDeco{
public:
WDecoConfirm(JGuiListener * _listener, WGuiBase * it);
virtual ~WDecoConfirm();
virtual bool isModal();
virtual void setData();
virtual void setModal(bool val);
virtual void Entering(u32 key);
virtual bool Leaving(u32 key);
virtual void Update(float dt);
virtual void Overlay();
virtual void ButtonPressed(int controllerId, int controlId);
virtual bool CheckUserInput(u32 key);
string confirm;
string cancel;
protected:
enum {
OP_UNCONFIRMED,
OP_CONFIRMING,
OP_CONFIRMED,
} mState;
SimpleMenu * confirmMenu;
JGuiListener * listener;
bool bModal;
};
class WDecoEnum : public WGuiDeco {
public:
WDecoEnum(WGuiBase * _it,EnumDefinition *_edef = NULL);
virtual void Render();
string lookupVal(int value);
protected:
EnumDefinition * edef;
};
class WDecoCheat: public WGuiDeco {
public:
WDecoCheat(WGuiBase * _it);
virtual bool Visible();
bool Selectable();
virtual void Reload();
protected:
bool bVisible;
};
class WGuiButton: public WGuiDeco{
public:
WGuiButton( WGuiBase* _it, int _controller, int _control, JGuiListener * jgl);
virtual void updateValue();
virtual bool CheckUserInput(u32 key);
virtual bool Selectable() {return Visible();};
virtual PIXEL_TYPE getColor(int type);
protected:
int control, controller;
JGuiListener * mListener;
};
class WGuiHeader:public WGuiItem{
public:
WGuiHeader(string _displayValue): WGuiItem(_displayValue) {};
virtual bool Selectable() {return false;};
virtual void Render();
};
class WDecoStyled: public WGuiDeco{
public:
WDecoStyled(WGuiItem * _it) : WGuiDeco(_it) {mStyle=DS_DEFAULT;};
PIXEL_TYPE getColor(int type);
void subBack(WGuiBase * item);
enum {
DS_DEFAULT = (1<<0),
DS_COLOR_BRIGHT = (1<<1),
DS_COLOR_DARK = (1<<2),
DS_STYLE_ALERT = (1<<3),
DS_STYLE_EDGED = (1<<4),
DS_STYLE_BACKLESS = (1<<5),
};
u8 mStyle;
};
class WGuiMenu: public WGuiItem{
public:
virtual ~WGuiMenu();
WGuiMenu(u32 next, u32 prev);
virtual void Render();
virtual void Reload();
virtual void Update(float dt);
virtual void ButtonPressed(int controllerId, int controlId);
virtual void Add(WGuiBase* item); //Remember, does not set X & Y of items automatically.
virtual void confirmChange(bool confirmed);
virtual bool Leaving(u32 key);
virtual void Entering(u32 key);
virtual void subBack(WGuiBase * item);
virtual bool CheckUserInput(u32 key);
WGuiBase * Current();
virtual bool nextItem();
virtual bool prevItem();
virtual bool isModal();
virtual void setModal(bool val);
void setData();
protected:
u32 buttonNext, buttonPrev;
vector<WGuiBase*> items;
int currentItem;
u32 held;
float duration;
};
class WGuiList: public WGuiMenu{
public:
WGuiList(string name, WDataSource * syncme = NULL);
string failMsg;
virtual void Render();
virtual void confirmChange(bool confirmed);
virtual void ButtonPressed(int controllerId, int controlId);
virtual void setData();
virtual bool nextItem();
virtual bool prevItem();
WGuiBase * operator[](int);
protected:
WDataSource * sync;
bool mFocus;
};
class WGuiTabMenu: public WGuiMenu {
public:
WGuiTabMenu() : WGuiMenu(PSP_CTRL_RTRIGGER,PSP_CTRL_LTRIGGER) {};
virtual void Render();
virtual void Add(WGuiBase * it);
void save();
};
class OptionInteger:public OptionItem{
public:
int value; //Current value.
-93
View File
@@ -1,93 +0,0 @@
#ifndef _SHOP_ITEM_H
#define _SHOP_ITEM_H
#include <JGui.h>
#include <JLBFont.h>
#include "SimpleMenu.h"
#include "MTGDeck.h"
#include "../include/PriceList.h"
#include "../include/PlayerData.h"
#include "../include/CardDisplay.h"
#include "../include/DeckDataWrapper.h"
#include <string>
using std::string;
class hgeDistortionMesh;
#define SHOP_BOOSTERS 3
class ShopItem:public JGuiObject{
private:
friend class ShopItems;
bool mHasFocus;
bool mRelease;
JLBFont *mFont;
string mText;
float xy[8];
JQuad * quad;
JQuad * thumb;
float mScale;
float mTargetScale;
hgeDistortionMesh* mesh;
void updateThumb();
public:
int nameCount;
int quantity;
MTGCard * card;
int price;
ShopItem(int id, JLBFont * font, int _cardid, float _xy[], bool hasFocus, MTGAllCards * collection, int _price, DeckDataWrapper * ddw);
ShopItem(int id, JLBFont * font, char* text, JQuad * _quad, JQuad * _thumb,float _xy[], bool hasFocus, int _price);
~ShopItem();
int updateCount(DeckDataWrapper * ddw);
virtual void Render();
virtual void Update(float dt);
virtual void Entering();
virtual bool Leaving(u32 key);
virtual bool ButtonPressed();
const char * getText();
virtual ostream& toString(ostream& out) const;
};
class ShopItems:public JGuiController,public JGuiListener{
private:
PlayerData * playerdata;
PriceList * pricelist;
int mX, mY, mHeight;
JLBFont* mFont;
JTexture * mBgAATex;
JQuad * mBgAA;
MTGAllCards * collection;
SimpleMenu * dialog;
int showPriceDialog;
int setIds[SHOP_BOOSTERS];
MTGCardInstance * displayCards[100];
CardDisplay * display;
void safeDeleteDisplay();
DeckDataWrapper * myCollection;
int lightAlpha;
int alphaChange;
public:
bool showCardList;
ShopItems(int id, JGuiListener* listener, JLBFont* font, int x, int y, MTGAllCards * _collection, int _setIds[]);
~ShopItems();
void Render();
virtual void Update(float dt);
void Add(int cardid);
void Add(char * text, JQuad * quad, JQuad * thumb,int _price);
void pricedialog(int id, int mode=1);
virtual void ButtonPressed(int controllerId, int controlId);
bool CheckUserInput(u32 key);
void savePriceList();
void saveAll();
static float _x1[],_y1[],_x2[],_y2[],_x3[],_y3[],_x4[],_y4[];
};
#endif
+126
View File
@@ -0,0 +1,126 @@
#ifndef _WDATASRC_H_
#define _WDATASRC_H_
class WCardFilter;
struct WCardSort;
struct WDistort;
class PriceList;
class MTGDeck;
class MTGAllCards;
class WSyncable{
public:
WSyncable(int i=0) {hooked = NULL;currentPos = 0;};
virtual ~WSyncable() {};
//Local
virtual bool Hook(WSyncable* s);
virtual int getOffset() {return currentPos;};
virtual bool setOffset(int i) {currentPos = i; return true;};
//Recursive
virtual int getPos();
virtual bool next();
virtual bool prev();
protected:
WSyncable * hooked; //Simple link list
int currentPos;
};
class WDataSource: public WSyncable{
public:
WDataSource() {};
virtual JQuad * getImage(int offset=0) {return NULL;};
virtual JQuad * getThumb(int offset=0) {return NULL;};
virtual MTGCard * getCard(int offset=0, bool ignore=false) {return NULL;};
virtual MTGDeck * getDeck(int offset=0) {return NULL;};
virtual WDistort * getDistort(int offset=0) {return NULL;};
virtual bool thisCard(int mtgid) {return false;};
virtual int getControlID() {return -1;}; //TODO FIXME: Need a "not a valid button" define.
virtual void Update(float dt) {mLastInput += dt;};
virtual void Touch() {mLastInput = 0;};
virtual float getElapsed() {return mLastInput;};
virtual void setElapsed(float f) {mLastInput = f;};
protected:
float mLastInput;
};
class WSrcImage: public WDataSource{
public:
virtual JQuad * getImage(int offset=0);
WSrcImage(string s);
protected:
string filename;
};
class WSrcCards: public WDataSource{
public:
WSrcCards(float delay=0.2);
~WSrcCards();
virtual JQuad * getImage(int offset=0);
virtual JQuad * getThumb(int offset=0);
virtual MTGCard * getCard(int offset=0, bool ignore=false);
virtual int Size(bool all=false); //Returns the number of cards currently matched
virtual void Shuffle();
virtual bool thisCard(int mtgid);
virtual bool next();
virtual bool prev();
virtual void Sort(int method);
virtual bool setOffset(int pos);
virtual void addFilter(WCardFilter * f);
virtual void clearFilters();
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
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.
enum {
MAX_CYCLES = 4, //How many cycles to search, for addToDeck
SORT_COLLECTOR,
SORT_ALPHA
};
protected:
vector<MTGCard*> cards;
vector<size_t> validated;
WCardFilter * filtersRoot;
float mDelay;
};
class WSrcUnlockedCards: public WSrcCards{ //Only unlocked cards.
public:
WSrcUnlockedCards(float mDelay=0.2);
};
class WSrcDeck: public WSrcCards{
public:
WSrcDeck(float delay=0.2) : WSrcCards(delay) {totalCards=0;};
virtual int loadMatches(MTGDeck * deck);
virtual int Add(MTGCard * c, int quantity=1);
virtual int Remove(MTGCard * c, int quantity=1, bool erase=false);
void Rebuild(MTGDeck * d);
int count(MTGCard * c);
int countByName(MTGCard * card, bool editions=false);
int totalPrice();
int totalCopies();
protected:
map<int,int> copies; //Maps MTGID to card counts.
int totalCards;
};
struct WCSortCollector{
bool operator()(const MTGCard*l, const MTGCard*r);
};
struct WCSortAlpha{
bool operator()(const MTGCard*l, const MTGCard*r);
};
#endif
+136
View File
@@ -0,0 +1,136 @@
#ifndef _WFILTER_H_
#define _WFILTER_H_
class WCardFilter;
class WCFilterFactory{
public:
WCFilterFactory() {};
static WCFilterFactory * GetInstance();
static void Destroy();
WCardFilter * Construct(string x);
private:
size_t findNext(string src, size_t start, char open='(', char close=')');
WCardFilter * Leaf(string src);
WCardFilter * Terminal(string type, string arg);
static WCFilterFactory * me;
};
class WCardFilter{
public:
WCardFilter() {};
virtual ~WCardFilter() {};
virtual bool isMatch(MTGCard * c) {return true;};
virtual string getCode() = 0;
virtual float filterFee() {return 0.0f;};
};
class WCFBranch: public WCardFilter{
public:
WCFBranch(WCardFilter * a, WCardFilter * b) {lhs=a;rhs=b;};
~WCFBranch() {SAFE_DELETE(lhs); SAFE_DELETE(rhs);};
virtual bool isMatch(MTGCard * c) = 0;
virtual string getCode() = 0;
virtual WCardFilter * Right(){return rhs;};
virtual WCardFilter * Left(){return lhs;};
protected:
WCardFilter *lhs, *rhs;
};
class WCFilterOR: public WCFBranch{
public:
WCFilterOR(WCardFilter * a, WCardFilter * b): WCFBranch(a,b) {};
bool isMatch(MTGCard *c);
string getCode();
float filterFee();
};
class WCFilterAND: public WCFBranch{
public:
WCFilterAND(WCardFilter * a, WCardFilter * b): WCFBranch(a,b) {};
bool isMatch(MTGCard *c) {return (lhs->isMatch(c) && rhs->isMatch(c));};
string getCode();
float filterFee();
};
class WCFilterGROUP: public WCardFilter{
public:
WCFilterGROUP(WCardFilter * _k) {kid = _k;};
~WCFilterGROUP() {SAFE_DELETE(kid);};
bool isMatch(MTGCard *c) {return kid->isMatch(c);};
string getCode();
float filterFee() {return kid->filterFee();};
protected:
WCardFilter * kid;
};
class WCFilterNOT: public WCardFilter{
public:
WCFilterNOT(WCardFilter * _k) {kid = _k;};
~WCFilterNOT() {SAFE_DELETE(kid);};
bool isMatch(MTGCard *c) {return !kid->isMatch(c);};
string getCode();
protected:
WCardFilter * kid;
};
class WCFilterNULL: public WCardFilter{
public:
WCFilterNULL() {};
string getCode() {return "NULL";};
bool isMatch(MTGCard *c) {return true;};
};
//Filter terminals:
class WCFilterSet: public WCardFilter{
public:
WCFilterSet(int _setid=-1) {setid=_setid;};
WCFilterSet(string arg);
bool isMatch(MTGCard *c) {return (setid==-1 || c->setId == setid);};
string getCode();
float filterFee() {return 0.1f;};
protected:
int setid;
};
class WCFilterColor: public WCardFilter{
public:
WCFilterColor(int _c) {color = _c;};
WCFilterColor(string arg);
bool isMatch(MTGCard * c);
string getCode();
float filterFee() {return 0.1f;};
protected:
int color;
};
class WCFilterType: public WCardFilter{
public:
WCFilterType(string arg) {type = arg;};
bool isMatch(MTGCard * c);
string getCode();
float filterFee() {return 0.2f;};
protected:
string type;
};
class WCFilterRarity: public WCardFilter{
public:
WCFilterRarity(char _r) {rarity = _r;};
WCFilterRarity(string arg);
bool isMatch(MTGCard * c);
string getCode();
float filterFee();
protected:
char rarity;
};
class WCFilterAbility: public WCardFilter{
public:
WCFilterAbility(int _a) {ability = _a;};
WCFilterAbility(string arg);
bool isMatch(MTGCard * c);
string getCode();
float filterFee();
protected:
int ability;
};
#endif
+479
View File
@@ -0,0 +1,479 @@
#ifndef _WGUI_H_
#define _WGUI_H_
class hgeDistortionMesh;
class WGuiColor{
public:
enum {
SCROLLBAR,
SCROLLBUTTON,
//Foregrounds only after this
TEXT,
TEXT_HEADER,
TEXT_FAIL,
TEXT_TAB,
TEXT_BODY,
//Backgrounds only after this
BACK,
BACK_ALERT,
BACK_HEADER,
BACK_FAIL,
BACK_TAB,
};
};
struct WDistort {
WDistort();
WDistort(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4);
float & operator[](int p);
protected:
float xy[8];
};
//Complete item interface
class WGuiBase: public JGuiListener {
public:
WGuiBase() {};
virtual ~WGuiBase() {};
virtual bool Selectable() {return true;};
virtual bool isModal() {return false;};
virtual bool Visible() {return true;};
virtual bool Changed() {return false;};
virtual void confirmChange(bool confirmed) {};
virtual PIXEL_TYPE getColor(int type);
virtual float getMargin(int type) {return 4;};
virtual void Entering(u32 key)=0;
virtual bool Leaving(u32 key)=0;
virtual void Update(float dt)=0;
virtual void updateValue(){};
virtual void Render()=0;
virtual void setData()=0;
virtual void ButtonPressed(int controllerId, int controlId){};
virtual void Reload(){};
virtual void Overlay(){};
virtual void Underlay(){};
virtual bool hasFocus()=0;
virtual void setFocus(bool bFocus)=0;
virtual float getX()=0;
virtual float getY()=0;
virtual float getWidth()=0;
virtual float getHeight()=0;
virtual int getId() {return INVALID_ID;};
virtual string getDisplay() const {return "";};
virtual float minWidth(){return getWidth();};
virtual float minHeight(){return getHeight();};
virtual void setModal(bool val){};
virtual void setDisplay(string s){};
virtual void setX(float _x){};
virtual void setY(float _y){};
virtual void setWidth(float _w){};
virtual void setHeight(float _h){};
virtual void setId(int _id){};
virtual void setHidden(bool bHidden) {};
virtual void setVisible(bool bVisisble) {};
virtual void renderBack(WGuiBase * it);
virtual void subBack(WGuiBase * item) {};
virtual bool CheckUserInput(u32 key) {return false;};
};
//This is our base class for concrete items.
class WGuiItem: public WGuiBase{
public:
virtual void Entering(u32 key);
virtual bool Leaving(u32 key);
virtual bool CheckUserInput(u32 key);
virtual void Update(float dt) {};
virtual void Render();
WGuiItem(string _display, u8 _mF = 0);
virtual ~WGuiItem() {};
string _(string input); //Override global with our flag checker.
virtual void setData(){};
virtual bool hasFocus() {return mFocus;};
virtual void setFocus(bool bFocus) {mFocus = bFocus;};
virtual string getDisplay() const {return displayValue;};
virtual void setDisplay(string s){displayValue=s;};
virtual int getId() {return INVALID_ID;};
virtual float getX() {return x;};
virtual float getY() {return y;};
virtual float getWidth() {return width;};
virtual float getHeight() {return height;};
virtual float minWidth();
virtual float minHeight();
virtual void setId(int _id){};
virtual void setX(float _x){x = _x;};
virtual void setY(float _y){y = _y;};
virtual void setWidth(float _w){width = _w;};
virtual void setHeight(float _h){height = _h;};
enum {
NO_TRANSLATE = (1<<1),
};
u8 mFlags;
protected:
bool mFocus;
float x, y;
float width, height;
string displayValue;
};
class WGuiImage: public WGuiItem{
public:
WGuiImage(WDataSource * wds, float _w = 0, float _h = 0, int _margin = 0);
virtual bool Selectable() {return false;};
virtual void Render();
virtual float getHeight();
virtual void imageScale(float _w, float _h);
virtual void setSource(WDataSource *s) {source = s;};
protected:
int margin;
float imgW, imgH;
WDataSource * source;};
class WGuiCardImage: public WGuiImage{
public:
WGuiCardImage(WDataSource * wds, bool _thumb=false);
virtual void Render();
WSyncable mOffset;
protected:
bool bThumb;
};
class WGuiCardDistort: public WGuiCardImage{
public:
WGuiCardDistort(WDataSource * wds, bool _thumb=false, WDataSource * _distort=NULL);
~WGuiCardDistort();
virtual void Render();
WDistort xy;
protected:
hgeDistortionMesh* mesh;
WDataSource * distortSrc;
};
//This is our base class for decorators. It wraps everything about WGuiBase.
class WGuiDeco: public WGuiBase{
public:
WGuiDeco(WGuiBase* _it) {it = _it;};
virtual ~WGuiDeco() {SAFE_DELETE(it);};
virtual bool Selectable() {return it->Selectable();};
virtual bool Visible() {return it->Visible();};
virtual bool Changed() {return it->Changed();};
virtual void confirmChange(bool confirmed) {it->confirmChange(confirmed);};
virtual void Entering(u32 key) {it->Entering(key);};
virtual bool Leaving(u32 key) {return it->Leaving(key);};
virtual void Update(float dt) {it->Update(dt);};
virtual void updateValue() {it->updateValue();};
virtual void Reload() {it->Reload();};
virtual void Overlay() {it->Overlay();};
virtual void Underlay() {it->Underlay();};
virtual void Render() {it->Render();};
virtual void setData() {it->setData();};
virtual void ButtonPressed(int controllerId, int controlId) {it->ButtonPressed(controllerId, controlId);};
virtual bool hasFocus() {return it->hasFocus();};
virtual string getDisplay() const {return it->getDisplay();};
virtual int getId() {return it->getId();};
virtual float getX() {return it->getX();};
virtual float getY() {return it->getY();};
virtual float getWidth() {return it->getWidth();};
virtual float getHeight() {return it->getHeight();};
virtual PIXEL_TYPE getColor(int type) {return it->getColor(type);};
WGuiBase * getDecorated() {return it;};
virtual void setFocus(bool bFocus) {it->setFocus(bFocus);};
virtual void setDisplay(string s) {it->setDisplay(s);};
virtual void setId(int _id) {it->setId(_id);};
virtual void setX(float _x) {it->setX(_x);};
virtual void setY(float _y) {it->setY(_y);};
virtual void setWidth(float _w) {it->setWidth(_w);};
virtual void setHeight(float _h) {it->setHeight(_h);};
virtual void setHidden(bool bHidden) {it->setHidden(bHidden);};
virtual void setVisible(bool bVisisble) {it->setVisible(bVisisble);};
virtual bool CheckUserInput(u32 key) {return it->CheckUserInput(key);};
protected:
WGuiBase * it;
};
class WGuiAward: public WGuiItem{
public:
WGuiAward(int _id, string name, string _text, string _details="");
virtual ~WGuiAward();
virtual void Render();
virtual bool Selectable() {return Visible();};
virtual bool Visible();
virtual int getId() {return id;};
virtual void Underlay();
virtual void Overlay();
protected:
string details;
int id;
string text;
};
class WGuiSplit: public WGuiItem{
public:
WGuiSplit(WGuiBase* _left,WGuiBase* _right);
virtual ~WGuiSplit();
virtual void Reload();
virtual void Overlay();
virtual void Underlay();
virtual void setData();
virtual bool isModal();
virtual void setModal(bool val);
virtual void Render();
virtual void Update(float dt);
virtual void setX(float _x);
virtual void setY(float _y);
virtual void setWidth(float _w);
virtual void setHeight(float _h);
virtual float getHeight();
virtual void ButtonPressed(int controllerId, int controlId);
virtual void confirmChange(bool confirmed);
virtual void Entering(u32 key);
virtual bool Leaving(u32 key);
virtual bool CheckUserInput(u32 key);
bool bRight;
float percentRight;
WGuiBase* right;
WGuiBase* left;
};
class WDecoConfirm: public WGuiDeco{
public:
WDecoConfirm(JGuiListener * _listener, WGuiBase * it);
virtual ~WDecoConfirm();
virtual bool isModal();
virtual void setData();
virtual void setModal(bool val);
virtual void Entering(u32 key);
virtual bool Leaving(u32 key);
virtual void Update(float dt);
virtual void Overlay();
virtual void ButtonPressed(int controllerId, int controlId);
virtual bool CheckUserInput(u32 key);
string confirm;
string cancel;
protected:
enum {
OP_UNCONFIRMED,
OP_CONFIRMING,
OP_CONFIRMED,
} mState;
SimpleMenu * confirmMenu;
JGuiListener * listener;
bool bModal;
};
class WDecoEnum : public WGuiDeco {
public:
WDecoEnum(WGuiBase * _it,EnumDefinition *_edef = NULL);
virtual void Render();
string lookupVal(int value);
protected:
EnumDefinition * edef;
};
class WDecoCheat: public WGuiDeco {
public:
WDecoCheat(WGuiBase * _it);
virtual bool Visible();
bool Selectable();
virtual void Reload();
protected:
bool bVisible;
};
class WGuiButton: public WGuiDeco{
public:
WGuiButton( WGuiBase* _it, int _controller, int _control, JGuiListener * jgl);
virtual void updateValue();
virtual bool CheckUserInput(u32 key);
virtual bool Selectable() {return Visible();};
virtual PIXEL_TYPE getColor(int type);
virtual int getControlID() {return control;};
virtual int getControllerID() {return controller;};
protected:
int control, controller;
JGuiListener * mListener;
};
class WGuiHeader:public WGuiItem{
public:
WGuiHeader(string _displayValue): WGuiItem(_displayValue) {};
virtual bool Selectable() {return false;};
virtual void Render();
};
class WDecoStyled: public WGuiDeco{
public:
WDecoStyled(WGuiItem * _it) : WGuiDeco(_it) {mStyle=DS_DEFAULT;};
PIXEL_TYPE getColor(int type);
void subBack(WGuiBase * item);
enum {
DS_DEFAULT = (1<<0),
DS_COLOR_BRIGHT = (1<<1),
DS_COLOR_DARK = (1<<2),
DS_STYLE_ALERT = (1<<3),
DS_STYLE_EDGED = (1<<4),
DS_STYLE_BACKLESS = (1<<5),
};
u8 mStyle;
};
class WGuiMenu: public WGuiItem{
public:
friend class WGuiFilters;
virtual ~WGuiMenu();
WGuiMenu(u32 next, u32 prev, bool mDPad = false, WSyncable * syncme=NULL);
virtual void Render();
virtual void Reload();
virtual void Update(float dt);
virtual void ButtonPressed(int controllerId, int controlId);
virtual void Add(WGuiBase* item); //Remember, does not set X & Y of items automatically.
virtual void confirmChange(bool confirmed);
virtual bool Leaving(u32 key);
virtual void Entering(u32 key);
virtual void subBack(WGuiBase * item);
virtual bool CheckUserInput(u32 key);
WGuiBase * Current();
virtual int getSelected() {return currentItem;};
virtual bool nextItem();
virtual bool prevItem();
virtual bool isModal();
virtual void setModal(bool val);
void setData();
protected:
virtual void syncMove();
virtual bool isButtonDir(u32 key, int dir); //For the DPad override.
u32 buttonNext, buttonPrev;
bool mDPad;
vector<WGuiBase*> items;
int currentItem;
u32 held;
WSyncable * sync;
float duration;
};
class WGuiList: public WGuiMenu{
public:
WGuiList(string name, WSyncable * syncme = NULL);
string failMsg;
virtual void Render();
virtual void confirmChange(bool confirmed);
virtual void ButtonPressed(int controllerId, int controlId);
virtual void setData();
WGuiBase * operator[](int);
protected:
bool mFocus;
};
class WGuiTabMenu: public WGuiMenu {
public:
WGuiTabMenu() : WGuiMenu(PSP_CTRL_RTRIGGER,PSP_CTRL_LTRIGGER) {};
virtual void Render();
virtual void Add(WGuiBase * it);
void save();
};
class WGuiListRow: public WGuiList{
public:
WGuiListRow(string n, WSyncable * s = NULL);
virtual void Render();
};
class WGuiFilters: public WGuiItem {
public:
friend class WGuiFilterItem;
WGuiFilters(string header, WSrcCards * src);
~WGuiFilters();
bool CheckUserInput(u32 key);
string getCode(); //For use in filter factory.
void Update(float dt);
void Render();
void Entering(u32 key);
void addColumn();
bool isAvailable(int type);
bool isAvailableCode(string code);
void Finish();
bool isFinished() {return bFinished;};
void ButtonPressed(int controllerId, int controlId);
void buildList();
protected:
bool bFinished;
WSrcCards* source;
SimpleMenu* subMenu;
WGuiList * list;
};
class WGuiFilterItem: public WGuiItem {
public:
friend class WGuiFilters;
friend struct WLFiltersSort;
WGuiFilterItem(WGuiFilters * parent);
void updateValue();
void ButtonPressed(int controllerId, int controlId);
string getCode();
bool isModal();
enum {
STATE_UNSET,
STATE_CHOOSE_TYPE,
STATE_CHOOSE_VAL,
STATE_FINISHED,
STATE_REMOVE,
STATE_CANCEL,
BEGIN_FILTERS = 0,
FILTER_SET = BEGIN_FILTERS,
FILTER_RARITY,
FILTER_COLOR,
FILTER_TYPE,
FILTER_BASIC,
END_FILTERS
};
protected:
void addArg(string display, string code);
int filterType;
int filterVal;
vector< pair<string,string> > args;
int mState;
bool mNew;
WGuiFilters * mParent;
};
struct WListSort{
virtual bool operator()(const WGuiBase*l, const WGuiBase*r);
};
struct WLFiltersSort{
bool operator()(const WGuiBase*l, const WGuiBase*r);
};
#endif