summaryrefslogtreecommitdiffstats
path: root/kpat/clock.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kpat/clock.cpp')
-rw-r--r--kpat/clock.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/kpat/clock.cpp b/kpat/clock.cpp
new file mode 100644
index 00000000..7fcb94b4
--- /dev/null
+++ b/kpat/clock.cpp
@@ -0,0 +1,91 @@
+#include "clock.h"
+#include <klocale.h>
+#include "deck.h"
+#include <assert.h>
+#include "cardmaps.h"
+
+Clock::Clock( KMainWindow* parent, const char *name )
+ : Dealer( parent, name )
+{
+ const int dist_x = cardMap::CARDX() * 11 / 10 + 1;
+ const int dist_y = cardMap::CARDY() * 11 / 10 + 1;
+
+ deck = Deck::new_deck(this);
+ deck->move(10, 10+dist_y*3);
+ deck->hide();
+
+ for (int i=0; i<12; i++) {
+ target[i] = new Pile(i+1, this);
+ const double ys[12] = { 0./96, 15./96, 52./96, 158./96, 264./96, 301./96, 316./96, 301./96, 264./96, 158./96, 52./96, 15./96};
+ const double xs[12] = { 200./72, 280./72, 360./72, 400./72, 360./72, 280./72, 200./72, 120./72, 40./72, 0./72, 40./72, 120./72};
+ target[i]->move(15 + cardMap::CARDX() * 24 / 5 + xs[i] * cardMap::CARDX(), 10 + ys[i] * cardMap::CARDY());
+ target[i]->setCheckIndex(1);
+ target[i]->setTarget(true);
+ target[i]->setRemoveFlags(Pile::disallow);
+ }
+
+ for (int i=0; i<8; i++) {
+ store[i] = new Pile(14+i, this);
+ store[i]->move(15+dist_x*(i%4), 10 + cardMap::CARDY() * 5 / 2 * (i/4));
+ store[i]->setAddFlags(Pile::addSpread);
+ store[i]->setCheckIndex(0);
+ }
+
+ setActions(Dealer::Hint | Dealer::Demo);
+}
+
+void Clock::restart()
+{
+ deck->collectAndShuffle();
+ deal();
+}
+
+bool Clock::checkAdd( int ci, const Pile *c1, const CardList& c2) const
+{
+ Card *newone = c2.first();
+ if (ci == 0) {
+ if (c1->isEmpty())
+ return true;
+
+ return (newone->rank() == c1->top()->rank() - 1);
+ } else {
+ if (c1->top()->suit() != newone->suit())
+ return false;
+ if (c1->top()->rank() == Card::King)
+ return (newone->rank() == Card::Ace);
+ return (newone->rank() == c1->top()->rank() + 1);
+ }
+}
+
+void Clock::deal() {
+ static const Card::Suit suits[12] = { Card::Diamonds, Card::Spades, Card::Hearts, Card::Clubs,
+ Card::Diamonds, Card::Spades, Card::Hearts, Card::Clubs,
+ Card::Diamonds, Card::Spades, Card::Hearts, Card::Clubs, };
+ static const Card::Rank ranks[12] = { Card::Nine, Card::Ten, Card::Jack, Card::Queen,
+ Card::King, Card::Two, Card::Three, Card::Four,
+ Card::Five, Card::Six, Card::Seven, Card::Eight};
+
+ int j = 0;
+ while (!deck->isEmpty()) {
+ Card *c = deck->nextCard();
+ for (int i = 0; i < 12; i++)
+ if (c->rank() == ranks[i] && c->suit() == suits[i]) {
+ target[i]->add(c, false, true);
+ c = 0;
+ break;
+ }
+ if (c)
+ store[j++]->add(c, false, true);
+ if (j == 8)
+ j = 0;
+ }
+}
+
+static class LocalDealerInfo11 : public DealerInfo
+{
+public:
+ LocalDealerInfo11() : DealerInfo(I18N_NOOP("G&randfather's Clock"), 11) {}
+ virtual Dealer *createGame(KMainWindow *parent) { return new Clock(parent); }
+} gfi11;
+
+#include "clock.moc"