#ifndef _CARDSELECTOR_H_ #define _CARDSELECTOR_H_ #include #include #include "CardGui.h" #include "GuiLayers.h" #include "Pos.h" using std::vector; class PlayGuiObject; class DuelLayers; template struct LimitorFunctor { virtual bool select(T*) = 0; virtual bool greyout(T*) = 0; typedef T Target; }; class CardSelectorBase: public GuiLayer { public: CardSelectorBase(int inDrawMode = DrawMode::kNormal) : mDrawMode(inDrawMode) { } ; virtual void Add(PlayGuiObject*) = 0; virtual void Remove(PlayGuiObject*) = 0; virtual bool CheckUserInput(JButton key) = 0; virtual void PushLimitor() = 0; virtual void PopLimitor() = 0; virtual void Limit(LimitorFunctor* inLimitor, CardView::SelectorZone inZone) = 0; virtual void Push() = 0; virtual void Pop() = 0; virtual int GetDrawMode() { return mDrawMode; } protected: int mDrawMode; }; class CardSelector: public CardSelectorBase { public: struct SelectorMemory { PlayGuiObject* object; float x, y; SelectorMemory(PlayGuiObject* object); SelectorMemory(); }; protected: vector cards; PlayGuiObject* active; DuelLayers* duel; LimitorFunctor* limitor; Pos bigpos; map lasts; stack*, CardView::SelectorZone> > limitorStack; stack memoryStack; PlayGuiObject* fetchMemory(SelectorMemory&); public: CardSelector(DuelLayers*); void Add(PlayGuiObject*); void Remove(PlayGuiObject*); bool CheckUserInput(JButton key); void Update(float dt); void Render(); void Push(); void Pop(); void Limit(LimitorFunctor* limitor, CardView::SelectorZone); void PushLimitor(); void PopLimitor(); typedef PlayGuiObject Target; }; typedef LimitorFunctor Limitor; struct Exp { static inline bool test(CardSelector::Target*, CardSelector::Target*); }; #endif