diff --git a/projects/mtg/include/GameStateDeckViewer.h b/projects/mtg/include/GameStateDeckViewer.h index 29eb27df0..25835f90d 100644 --- a/projects/mtg/include/GameStateDeckViewer.h +++ b/projects/mtg/include/GameStateDeckViewer.h @@ -105,7 +105,7 @@ private: int mStage; int nbDecks; int deckNum; - int useFilter[2]; + int useFilter; JMusic * bgMusic; JQuad * backQuad; WGuiFilters * filterDeck; diff --git a/projects/mtg/include/WFilter.h b/projects/mtg/include/WFilter.h index 3d9c4c4a7..b581521e6 100644 --- a/projects/mtg/include/WFilter.h +++ b/projects/mtg/include/WFilter.h @@ -19,6 +19,8 @@ private: class WCardFilter{ public: WCardFilter() {}; + virtual void recolor(int mtgcolor) {}; + virtual bool filtersColor() {return false;}; virtual ~WCardFilter() {}; virtual bool isMatch(MTGCard * c) {return true;}; virtual string getCode() = 0; @@ -29,8 +31,10 @@ class WCFBranch: public WCardFilter{ public: WCFBranch(WCardFilter * a, WCardFilter * b) {lhs=a;rhs=b;}; ~WCFBranch() {SAFE_DELETE(lhs); SAFE_DELETE(rhs);}; + virtual bool filtersColor() {return (rhs->filtersColor() || lhs->filtersColor());}; virtual bool isMatch(MTGCard * c) = 0; virtual string getCode() = 0; + virtual void recolor(int mtgcolor) {rhs->recolor(mtgcolor);lhs->recolor(mtgcolor);}; virtual WCardFilter * Right(){return rhs;}; virtual WCardFilter * Left(){return lhs;}; protected: @@ -57,6 +61,8 @@ class WCFilterGROUP: public WCardFilter{ public: WCFilterGROUP(WCardFilter * _k) {kid = _k;}; ~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);}; string getCode(); float filterFee() {return kid->filterFee();}; @@ -68,6 +74,8 @@ class WCFilterNOT: public WCardFilter{ public: WCFilterNOT(WCardFilter * _k) {kid = _k;}; ~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);}; string getCode(); protected: @@ -105,9 +113,11 @@ protected: class WCFilterColor: public WCardFilter{ public: WCFilterColor(int _c) {color = _c;}; + virtual void recolor(int mtgcolor) {color = mtgcolor;}; WCFilterColor(string arg); bool isMatch(MTGCard * c); string getCode(); + bool filtersColor() {return true;}; float filterFee() {return 0.2f;}; protected: int color; @@ -124,6 +134,8 @@ public: WCFilterProducesColor(int _c) : WCFilterColor(_c) {}; WCFilterProducesColor(string arg) : WCFilterColor(arg) {}; 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(); }; class WCFilterNumeric: public WCardFilter{ diff --git a/projects/mtg/include/WGui.h b/projects/mtg/include/WGui.h index c74046051..dcf3af7c7 100644 --- a/projects/mtg/include/WGui.h +++ b/projects/mtg/include/WGui.h @@ -421,6 +421,7 @@ public: void Render(); void Entering(JButton key); void addColumn(); + void recolorFilter(int color); bool isAvailable(int type); bool isAvailableCode(string code); bool Finish(); //Returns true if card set reasonably expected to be changed. @@ -433,6 +434,7 @@ protected: vector< pair > tempArgs; //TODO FIXME this is inefficient bool bFinished; string priorFilter; + int recolorTo, priorRecolor; WSrcCards* source; SimpleMenu* subMenu; WGuiList * list; diff --git a/projects/mtg/src/GameStateDeckViewer.cpp b/projects/mtg/src/GameStateDeckViewer.cpp index d5b760f58..c99c67aec 100644 --- a/projects/mtg/src/GameStateDeckViewer.cpp +++ b/projects/mtg/src/GameStateDeckViewer.cpp @@ -32,8 +32,7 @@ GameStateDeckViewer::GameStateDeckViewer(GameApp* parent): GameState(parent) { bgMusic = NULL; nbDecks = 0; deckNum = 0; - useFilter[0] = 0; - useFilter[1] = 0; + useFilter = 0; mSwitching = false; welcome_menu = NULL; myCollection = NULL; @@ -74,41 +73,15 @@ void GameStateDeckViewer::updateFilters(){ if(!displayed_deck) return; displayed_deck->clearFilters(); int i = (displayed_deck == myDeck); - - if(useFilter[i] == 0){ - if(i && filterDeck) + if(i && filterDeck){ + filterDeck->recolorFilter(useFilter-1); filterDeck->Finish(); - else if(filterCollection) - filterCollection->Finish(); - return; } - WCFilterFactory * wc = WCFilterFactory::GetInstance(); - switch(useFilter[i]-1){ - case Constants::MTG_COLOR_ARTIFACT: - 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; + else if(filterCollection){ + filterCollection->recolorFilter(useFilter-1); + filterCollection->Finish(); } - //No sanity checking for color filters - //if(!displayed_deck->Size()) - // displayed_deck->clearFilters(); + return; } void GameStateDeckViewer::loadIndexes(){ int x=0; @@ -299,16 +272,16 @@ void GameStateDeckViewer::Update(float dt) case JGE_BTN_UP : last_user_activity = 0; mStage = STAGE_TRANSITION_UP; - useFilter[myD]++; - if(useFilter[myD] >= MAX_SAVED_FILTERS) - useFilter[myD] = 0; + useFilter++; + if(useFilter >= MAX_SAVED_FILTERS) + useFilter = 0; break; case JGE_BTN_DOWN : last_user_activity = 0; mStage = STAGE_TRANSITION_DOWN; - useFilter[myD]--; - if(useFilter[myD] < 0) - useFilter[myD] = MAX_SAVED_FILTERS-1; + useFilter--; + if(useFilter < 0) + useFilter = MAX_SAVED_FILTERS-1; break; case JGE_BTN_CANCEL: options[Options::DISABLECARDS].number = !options[Options::DISABLECARDS].number; @@ -446,7 +419,7 @@ void GameStateDeckViewer::Update(float dt) if (displayed_deck == myDeck) { if (filterDeck) { if (key == JGE_BTN_CTRL) { - useFilter[(displayed_deck == myDeck)] = 0; + useFilter = 0; filterDeck->Finish(); filterDeck->Update(dt); loadIndexes(); @@ -463,7 +436,7 @@ void GameStateDeckViewer::Update(float dt) } else { if (filterCollection) { if (key == JGE_BTN_CTRL) { - useFilter[(displayed_deck == myDeck)] = 0; + useFilter = 0; filterCollection->Finish(); filterCollection->Update(dt); loadIndexes(); @@ -501,8 +474,8 @@ void GameStateDeckViewer::renderOnScreenBasicInfo(){ float w = mFont->GetStringWidth(buffer); 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); - if (useFilter[myD] != 0) - JRenderer::GetInstance()->RenderQuad(mIcons[useFilter[myD]-1], SCREEN_WIDTH-10 , y + 10 , 0.0f,0.5,0.5); + if (useFilter != 0) + JRenderer::GetInstance()->RenderQuad(mIcons[useFilter-1], SCREEN_WIDTH-10 , y + 10 , 0.0f,0.5,0.5); } diff --git a/projects/mtg/src/WGui.cpp b/projects/mtg/src/WGui.cpp index a439721cc..fe3503164 100644 --- a/projects/mtg/src/WGui.cpp +++ b/projects/mtg/src/WGui.cpp @@ -1326,12 +1326,18 @@ bool WGuiFilters::Finish(){ string src; if(source){ src = getCode(); - if(priorFilter == src) + if(priorFilter == src && recolorTo == priorRecolor) return false; source->clearFilters(); if(src.size()){ 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()){ source->clearFilters(); //TODO: Pop a "No results found" warning @@ -1375,8 +1381,14 @@ void WGuiFilters::buildList(){ WGuiFilters::WGuiFilters(string header, WSrcCards * src) : WGuiItem(header) { bFinished = false; source = src; + recolorTo = -1; + priorRecolor = -1; buildList(); } +void WGuiFilters::recolorFilter(int color){ + priorRecolor = recolorTo; + recolorTo = color; +} string WGuiFilters::getCode(){ if(!list) return "";