summaryrefslogtreecommitdiffstats
path: root/kpat/dealer.h
diff options
context:
space:
mode:
Diffstat (limited to 'kpat/dealer.h')
-rw-r--r--kpat/dealer.h228
1 files changed, 228 insertions, 0 deletions
diff --git a/kpat/dealer.h b/kpat/dealer.h
new file mode 100644
index 00000000..c5593cbd
--- /dev/null
+++ b/kpat/dealer.h
@@ -0,0 +1,228 @@
+#ifndef _DEALER_H_
+#define _DEALER_H_
+
+#include "pile.h"
+#include "hint.h"
+#include <krandomsequence.h>
+
+class QDomDocument;
+class KMainWindow;
+class Dealer;
+class DealerInfo;
+class KAction;
+class KSelectAction;
+class KToggleAction;
+class KPixmap;
+
+class DealerInfoList {
+public:
+ static DealerInfoList *self();
+ void add(DealerInfo *);
+
+ const QValueList<DealerInfo*> games() const { return list; }
+private:
+ QValueList<DealerInfo*> list;
+ static DealerInfoList *_self;
+};
+
+class DealerInfo {
+public:
+ DealerInfo(const char *_name, int _index)
+ : name(_name),
+ gameindex(_index)
+{
+ DealerInfoList::self()->add(this);
+}
+ const char *name;
+ uint gameindex;
+ virtual Dealer *createGame(KMainWindow *parent) = 0;
+};
+
+class CardState;
+
+typedef QValueList<CardState> CardStateList;
+
+struct State
+{
+ CardStateList cards;
+ QString gameData;
+};
+
+
+/***************************************************************
+
+ Dealer -- abstract base class of all varieties of patience
+
+***************************************************************/
+class Dealer: public QCanvasView
+{
+ Q_OBJECT
+
+public:
+
+ Dealer( KMainWindow* parent = 0, const char* name = 0 );
+ virtual ~Dealer();
+
+ static const Dealer *instance();
+
+ void enlargeCanvas(QCanvasRectangle *c);
+ void setGameNumber(long gmn);
+ long gameNumber() const;
+
+ virtual bool isGameWon() const;
+ virtual bool isGameLost() const;
+
+ void setViewSize(const QSize &size);
+
+ void addPile(Pile *p);
+ void removePile(Pile *p);
+
+ virtual bool checkRemove( int checkIndex, const Pile *c1, const Card *c) const;
+ virtual bool checkAdd ( int checkIndex, const Pile *c1, const CardList& c2) const;
+ virtual bool checkPrefering( int checkIndex, const Pile *c1, const CardList& c2) const;
+
+ virtual Card *demoNewCards();
+
+ virtual void setupActions();
+
+ bool demoActive() const;
+
+ void drawPile(KPixmap &, Pile *p, bool selected);
+
+ QColor midColor() const { return _midcolor; }
+ void setBackgroundPixmap(const QPixmap &background, const QColor &midcolor);
+
+ void saveGame(QDomDocument &doc);
+ void openGame(QDomDocument &doc);
+
+ void setGameId(int id) { _id = id; }
+ int gameId() const { return _id; }
+
+ void setTakeTargetForHints(bool e) { takeTargets = e; }
+ bool takeTargetForHints() const { return takeTargets; }
+
+ bool isMoving(Card *c) const;
+
+ virtual QSize minimumCardSize() const;
+ virtual void resizeEvent(QResizeEvent *);
+
+ int freeCells() const;
+
+ QString anchorName() const;
+ void setAnchorName(const QString &name);
+
+ void setAutoDropEnabled(bool a);
+ bool autoDrop() const { return _autodrop; }
+
+ int getMoves() const { return undoList.count(); }
+
+public slots:
+
+ // restart is pure virtual, so we need something else
+ virtual void startNew();
+ void undo();
+ virtual void takeState();
+ virtual bool startAutoDrop();
+ void hint();
+ void slotTakeState(Card *c);
+
+signals:
+ void undoPossible(bool poss);
+ void gameWon(bool withhelp);
+ void gameLost();
+ void saveGame(); // emergency
+ void gameInfo(const QString &info);
+ void updateMoves();
+
+public slots:
+ virtual void demo();
+ void waitForDemo(Card *);
+ void toggleDemo();
+ virtual void stopDemo();
+ void waitForAutoDrop(Card *);
+
+protected:
+
+ enum { None = 0, Hint = 1, Demo = 2, Redeal = 4 } Actions;
+
+ void setActions(int actions) { myActions = actions; }
+ int actions() const { return myActions; }
+
+ virtual void restart() = 0;
+
+ virtual void contentsMousePressEvent(QMouseEvent* e);
+ virtual void contentsMouseMoveEvent( QMouseEvent* );
+ virtual void contentsMouseReleaseEvent( QMouseEvent* );
+ virtual void contentsMouseDoubleClickEvent( QMouseEvent* );
+ virtual void wheelEvent( QWheelEvent *e );
+
+ void unmarkAll();
+ void mark(Card *c);
+ Pile *findTarget(Card *c);
+ virtual bool cardClicked(Card *);
+ virtual void pileClicked(Pile *);
+ virtual bool cardDblClicked(Card *);
+ void won();
+
+ virtual void getHints();
+ void newHint(MoveHint *mh);
+ void clearHints();
+ // it's not const because it changes the random seed
+ virtual MoveHint *chooseHint();
+
+ KMainWindow *parent() const;
+
+ bool waiting() const { return _waiting != 0; }
+ void setWaiting(bool w);
+
+protected:
+ PileList piles;
+
+ State *getState();
+ void setState(State *);
+
+ // reimplement this to add game-specific information in the state structure
+ virtual QString getGameState() const { return QString::null; }
+ // reimplement this to use the game-specific information from the state structure
+ virtual void setGameState( const QString & ) {}
+
+ virtual void newDemoMove(Card *m);
+
+ bool moved;
+ CardList movingCards;
+ QCanvasItemList marked;
+ QPoint moving_start;
+ Dealer( Dealer& ); // don't allow copies or assignments
+ void operator = ( Dealer& ); // don't allow copies or assignments
+ QCanvas myCanvas;
+ QSize minsize;
+ QSize viewsize;
+ QPtrList<State> undoList;
+ long gamenumber;
+ QValueList<MoveHint*> hints;
+ Card *towait;
+ QTimer *demotimer;
+ int myActions;
+ bool toldAboutLostGame;
+
+ KToggleAction *ademo;
+ KAction *ahint, *aredeal;
+
+ KRandomSequence randseq;
+ QColor _midcolor;
+ Q_UINT32 _id;
+ bool takeTargets;
+ bool _won;
+ int _waiting;
+ bool stop_demo_next;
+ QString ac;
+ static Dealer *s_instance;
+ bool _autodrop;
+ bool _gameRecorded;
+
+private:
+ void countLoss();
+ void countGame();
+};
+
+#endif