Jeck - Deck editor filtering now works much better- single filter, automatically recolors itself to match the active color.

This commit is contained in:
wagic.jeck
2010-02-17 04:08:51 +00:00
parent a123cebfe5
commit ab22719e4d
5 changed files with 46 additions and 47 deletions
+1 -1
View File
@@ -105,7 +105,7 @@ private:
int mStage; int mStage;
int nbDecks; int nbDecks;
int deckNum; int deckNum;
int useFilter[2]; int useFilter;
JMusic * bgMusic; JMusic * bgMusic;
JQuad * backQuad; JQuad * backQuad;
WGuiFilters * filterDeck; WGuiFilters * filterDeck;
+12
View File
@@ -19,6 +19,8 @@ private:
class WCardFilter{ class WCardFilter{
public: public:
WCardFilter() {}; WCardFilter() {};
virtual void recolor(int mtgcolor) {};
virtual bool filtersColor() {return false;};
virtual ~WCardFilter() {}; virtual ~WCardFilter() {};
virtual bool isMatch(MTGCard * c) {return true;}; virtual bool isMatch(MTGCard * c) {return true;};
virtual string getCode() = 0; virtual string getCode() = 0;
@@ -29,8 +31,10 @@ class WCFBranch: public WCardFilter{
public: public:
WCFBranch(WCardFilter * a, WCardFilter * b) {lhs=a;rhs=b;}; WCFBranch(WCardFilter * a, WCardFilter * b) {lhs=a;rhs=b;};
~WCFBranch() {SAFE_DELETE(lhs); SAFE_DELETE(rhs);}; ~WCFBranch() {SAFE_DELETE(lhs); SAFE_DELETE(rhs);};
virtual bool filtersColor() {return (rhs->filtersColor() || lhs->filtersColor());};
virtual bool isMatch(MTGCard * c) = 0; virtual bool isMatch(MTGCard * c) = 0;
virtual string getCode() = 0; virtual string getCode() = 0;
virtual void recolor(int mtgcolor) {rhs->recolor(mtgcolor);lhs->recolor(mtgcolor);};
virtual WCardFilter * Right(){return rhs;}; virtual WCardFilter * Right(){return rhs;};
virtual WCardFilter * Left(){return lhs;}; virtual WCardFilter * Left(){return lhs;};
protected: protected:
@@ -57,6 +61,8 @@ class WCFilterGROUP: public WCardFilter{
public: public:
WCFilterGROUP(WCardFilter * _k) {kid = _k;}; WCFilterGROUP(WCardFilter * _k) {kid = _k;};
~WCFilterGROUP() {SAFE_DELETE(kid);}; ~WCFilterGROUP() {SAFE_DELETE(kid);};
virtual void recolor(int mtgcolor) {kid->recolor(mtgcolor);};
virtual bool filtersColor() {return (kid->filtersColor());};
bool isMatch(MTGCard *c) {return kid->isMatch(c);}; bool isMatch(MTGCard *c) {return kid->isMatch(c);};
string getCode(); string getCode();
float filterFee() {return kid->filterFee();}; float filterFee() {return kid->filterFee();};
@@ -68,6 +74,8 @@ class WCFilterNOT: public WCardFilter{
public: public:
WCFilterNOT(WCardFilter * _k) {kid = _k;}; WCFilterNOT(WCardFilter * _k) {kid = _k;};
~WCFilterNOT() {SAFE_DELETE(kid);}; ~WCFilterNOT() {SAFE_DELETE(kid);};
virtual void recolor(int mtgcolor) {kid->recolor(mtgcolor);};
virtual bool filtersColor() {return (kid->filtersColor());};
bool isMatch(MTGCard *c) {return !kid->isMatch(c);}; bool isMatch(MTGCard *c) {return !kid->isMatch(c);};
string getCode(); string getCode();
protected: protected:
@@ -105,9 +113,11 @@ protected:
class WCFilterColor: public WCardFilter{ class WCFilterColor: public WCardFilter{
public: public:
WCFilterColor(int _c) {color = _c;}; WCFilterColor(int _c) {color = _c;};
virtual void recolor(int mtgcolor) {color = mtgcolor;};
WCFilterColor(string arg); WCFilterColor(string arg);
bool isMatch(MTGCard * c); bool isMatch(MTGCard * c);
string getCode(); string getCode();
bool filtersColor() {return true;};
float filterFee() {return 0.2f;}; float filterFee() {return 0.2f;};
protected: protected:
int color; int color;
@@ -124,6 +134,8 @@ public:
WCFilterProducesColor(int _c) : WCFilterColor(_c) {}; WCFilterProducesColor(int _c) : WCFilterColor(_c) {};
WCFilterProducesColor(string arg) : WCFilterColor(arg) {}; WCFilterProducesColor(string arg) : WCFilterColor(arg) {};
bool isMatch(MTGCard * c); bool isMatch(MTGCard * c);
void recolor(int mtgcolor) {return;};
bool filtersColor() {return false;}; //We only want to know about filtering against card color, not produced.
string getCode(); string getCode();
}; };
class WCFilterNumeric: public WCardFilter{ class WCFilterNumeric: public WCardFilter{
+2
View File
@@ -421,6 +421,7 @@ public:
void Render(); void Render();
void Entering(JButton key); void Entering(JButton key);
void addColumn(); void addColumn();
void recolorFilter(int color);
bool isAvailable(int type); bool isAvailable(int type);
bool isAvailableCode(string code); bool isAvailableCode(string code);
bool Finish(); //Returns true if card set reasonably expected to be changed. bool Finish(); //Returns true if card set reasonably expected to be changed.
@@ -433,6 +434,7 @@ protected:
vector< pair<string,string> > tempArgs; //TODO FIXME this is inefficient vector< pair<string,string> > tempArgs; //TODO FIXME this is inefficient
bool bFinished; bool bFinished;
string priorFilter; string priorFilter;
int recolorTo, priorRecolor;
WSrcCards* source; WSrcCards* source;
SimpleMenu* subMenu; SimpleMenu* subMenu;
WGuiList * list; WGuiList * list;
+17 -44
View File
@@ -32,8 +32,7 @@ GameStateDeckViewer::GameStateDeckViewer(GameApp* parent): GameState(parent) {
bgMusic = NULL; bgMusic = NULL;
nbDecks = 0; nbDecks = 0;
deckNum = 0; deckNum = 0;
useFilter[0] = 0; useFilter = 0;
useFilter[1] = 0;
mSwitching = false; mSwitching = false;
welcome_menu = NULL; welcome_menu = NULL;
myCollection = NULL; myCollection = NULL;
@@ -74,41 +73,15 @@ void GameStateDeckViewer::updateFilters(){
if(!displayed_deck) return; if(!displayed_deck) return;
displayed_deck->clearFilters(); displayed_deck->clearFilters();
int i = (displayed_deck == myDeck); int i = (displayed_deck == myDeck);
if(i && filterDeck){
if(useFilter[i] == 0){ filterDeck->recolorFilter(useFilter-1);
if(i && filterDeck)
filterDeck->Finish(); filterDeck->Finish();
else if(filterCollection)
filterCollection->Finish();
return;
} }
WCFilterFactory * wc = WCFilterFactory::GetInstance(); else if(filterCollection){
switch(useFilter[i]-1){ filterCollection->recolorFilter(useFilter-1);
case Constants::MTG_COLOR_ARTIFACT: filterCollection->Finish();
displayed_deck->addFilter(wc->Construct("c:x;"));
break;
case Constants::MTG_COLOR_GREEN:
displayed_deck->addFilter(wc->Construct("c:g;"));
break;
case Constants::MTG_COLOR_BLUE:
displayed_deck->addFilter(wc->Construct("c:u;"));
break;
case Constants::MTG_COLOR_RED:
displayed_deck->addFilter(wc->Construct("c:r;"));
break;
case Constants::MTG_COLOR_BLACK:
displayed_deck->addFilter(wc->Construct("c:b;"));
break;
case Constants::MTG_COLOR_WHITE:
displayed_deck->addFilter(wc->Construct("c:w;"));
break;
case Constants::MTG_COLOR_LAND:
displayed_deck->addFilter(wc->Construct("t:Land;"));
break;
} }
//No sanity checking for color filters return;
//if(!displayed_deck->Size())
// displayed_deck->clearFilters();
} }
void GameStateDeckViewer::loadIndexes(){ void GameStateDeckViewer::loadIndexes(){
int x=0; int x=0;
@@ -299,16 +272,16 @@ void GameStateDeckViewer::Update(float dt)
case JGE_BTN_UP : case JGE_BTN_UP :
last_user_activity = 0; last_user_activity = 0;
mStage = STAGE_TRANSITION_UP; mStage = STAGE_TRANSITION_UP;
useFilter[myD]++; useFilter++;
if(useFilter[myD] >= MAX_SAVED_FILTERS) if(useFilter >= MAX_SAVED_FILTERS)
useFilter[myD] = 0; useFilter = 0;
break; break;
case JGE_BTN_DOWN : case JGE_BTN_DOWN :
last_user_activity = 0; last_user_activity = 0;
mStage = STAGE_TRANSITION_DOWN; mStage = STAGE_TRANSITION_DOWN;
useFilter[myD]--; useFilter--;
if(useFilter[myD] < 0) if(useFilter < 0)
useFilter[myD] = MAX_SAVED_FILTERS-1; useFilter = MAX_SAVED_FILTERS-1;
break; break;
case JGE_BTN_CANCEL: case JGE_BTN_CANCEL:
options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number; options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number;
@@ -446,7 +419,7 @@ void GameStateDeckViewer::Update(float dt)
if (displayed_deck == myDeck) { if (displayed_deck == myDeck) {
if (filterDeck) { if (filterDeck) {
if (key == JGE_BTN_CTRL) { if (key == JGE_BTN_CTRL) {
useFilter[(displayed_deck == myDeck)] = 0; useFilter = 0;
filterDeck->Finish(); filterDeck->Finish();
filterDeck->Update(dt); filterDeck->Update(dt);
loadIndexes(); loadIndexes();
@@ -463,7 +436,7 @@ void GameStateDeckViewer::Update(float dt)
} else { } else {
if (filterCollection) { if (filterCollection) {
if (key == JGE_BTN_CTRL) { if (key == JGE_BTN_CTRL) {
useFilter[(displayed_deck == myDeck)] = 0; useFilter = 0;
filterCollection->Finish(); filterCollection->Finish();
filterCollection->Update(dt); filterCollection->Update(dt);
loadIndexes(); loadIndexes();
@@ -501,8 +474,8 @@ void GameStateDeckViewer::renderOnScreenBasicInfo(){
float w = mFont->GetStringWidth(buffer); float w = mFont->GetStringWidth(buffer);
JRenderer::GetInstance()->FillRoundRect(SCREEN_WIDTH-(w+27),y-5,w+10,15,5,ARGB(128,0,0,0)); JRenderer::GetInstance()->FillRoundRect(SCREEN_WIDTH-(w+27),y-5,w+10,15,5,ARGB(128,0,0,0));
mFont->DrawString(buffer, SCREEN_WIDTH-22, y+5,JGETEXT_RIGHT); mFont->DrawString(buffer, SCREEN_WIDTH-22, y+5,JGETEXT_RIGHT);
if (useFilter[myD] != 0) if (useFilter != 0)
JRenderer::GetInstance()->RenderQuad(mIcons[useFilter[myD]-1], SCREEN_WIDTH-10 , y + 10 , 0.0f,0.5,0.5); JRenderer::GetInstance()->RenderQuad(mIcons[useFilter-1], SCREEN_WIDTH-10 , y + 10 , 0.0f,0.5,0.5);
} }
+14 -2
View File
@@ -1326,12 +1326,18 @@ bool WGuiFilters::Finish(){
string src; string src;
if(source){ if(source){
src = getCode(); src = getCode();
if(priorFilter == src) if(priorFilter == src && recolorTo == priorRecolor)
return false; return false;
source->clearFilters(); source->clearFilters();
if(src.size()){ if(src.size()){
WCFilterFactory * wc = WCFilterFactory::GetInstance(); WCFilterFactory * wc = WCFilterFactory::GetInstance();
source->addFilter(wc->Construct(src)); WCardFilter * f = wc->Construct(src);
if(recolorTo > -1 && recolorTo < Constants::MTG_NB_COLORS){
if(!f->filtersColor())
f = NEW WCFilterAND(f,NEW WCFilterColor(recolorTo));
f->recolor(recolorTo);
}
source->addFilter(f);
} }
if(!source->Size()){ if(!source->Size()){
source->clearFilters(); //TODO: Pop a "No results found" warning source->clearFilters(); //TODO: Pop a "No results found" warning
@@ -1375,8 +1381,14 @@ void WGuiFilters::buildList(){
WGuiFilters::WGuiFilters(string header, WSrcCards * src) : WGuiItem(header) { WGuiFilters::WGuiFilters(string header, WSrcCards * src) : WGuiItem(header) {
bFinished = false; bFinished = false;
source = src; source = src;
recolorTo = -1;
priorRecolor = -1;
buildList(); buildList();
} }
void WGuiFilters::recolorFilter(int color){
priorRecolor = recolorTo;
recolorTo = color;
}
string WGuiFilters::getCode(){ string WGuiFilters::getCode(){
if(!list) if(!list)
return ""; return "";