39
39
#include "dealerinfo.h"
40
#include "pileutils.h"
40
41
#include "patsolve/simonsolver.h"
48
void Simon::initialize()
49
setDeck(new CardDeck());
50
static_cast<KStandardCardDeck*>( deck() )->setDeckContents();
51
52
const qreal dist_x = 1.11;
53
for (int i=0; i<4; i++) {
54
target[i] = new Pile(i+1, QString( "target%1" ).arg( i ));
55
target[i]->setPilePos((i+3)*dist_x, 0);
56
target[i]->setRemoveFlags(Pile::disallow);
57
target[i]->setAddFlags(Pile::several);
58
target[i]->setCheckIndex(0);
59
target[i]->setTarget(true);
54
for ( int i = 0; i < 4; ++i )
56
target[i] = new PatPile( this, i + 1, QString( "target%1" ).arg( i ) );
57
target[i]->setPileRole(PatPile::Foundation);
58
target[i]->setLayoutPos((i+3)*dist_x, 0);
59
target[i]->setSpread(0, 0);
60
target[i]->setKeyboardSelectHint( KCardPile::NeverFocus );
61
target[i]->setKeyboardDropHint( KCardPile::AutoFocusTop );
63
for (int i=0; i<10; i++) {
64
store[i] = new Pile(5+i, QString( "store%1" ).arg( i ));
65
store[i]->setPilePos(dist_x*i, 1.2);
66
store[i]->setAddFlags(Pile::addSpread | Pile::several);
67
store[i]->setRemoveFlags(Pile::several);
68
store[i]->setReservedSpace( QSizeF( 1.0, 3.5 ) );
69
store[i]->setCheckIndex(1);
64
for ( int i = 0; i < 10; ++i )
66
store[i] = new PatPile( this, 5 + i, QString( "store%1" ).arg( i ) );
67
store[i]->setPileRole(PatPile::Tableau);
68
store[i]->setLayoutPos(dist_x*i, 1.2);
69
store[i]->setReservedSpace( 0, 0, 1, 3.5 );
70
store[i]->setZValue( 0.01 * i );
71
store[i]->setKeyboardSelectHint( KCardPile::AutoFocusDeepestRemovable );
72
store[i]->setKeyboardDropHint( KCardPile::AutoFocusTop );
73
75
setActions(DealerScene::Hint | DealerScene::Demo);
75
77
//setNeededFutureMoves( 1 ); // could be some nonsense moves
78
void Simon::restart() {
79
deck()->returnAllCards();
80
deck()->shuffle( gameNumber() );
85
for ( int piles = 9; piles >= 3; piles-- )
87
for (int j = 0; j < piles; j++)
88
addCardForDeal(store[j], deck()->takeCard(), true, QPointF(0,-deck()->cardHeight()));
90
for ( int j = 0; j < 10; j++ )
91
addCardForDeal(store[j], deck()->takeCard(), true, QPointF(0,-deck()->cardHeight()));
93
Q_ASSERT(!deck()->hasUndealtCards());
82
QList<KCard*> cards = shuffled( deck()->cards(), gameNumber() );
84
QPointF initPos( 0, -deck()->cardHeight() );
86
for ( int piles = 9; piles >= 3; --piles )
87
for ( int j = 0; j < piles; ++j )
88
addCardForDeal( store[j], cards.takeLast(), true, initPos );
90
for ( int j = 0; j < 10; ++j )
91
addCardForDeal( store[j], cards.takeLast(), true, initPos );
93
Q_ASSERT( cards.isEmpty() );
95
95
startDealAnimation();
98
bool Simon::checkPrefering( int checkIndex, const Pile *c1, const CardList& c2) const
100
if (checkIndex == 1) {
104
return (c1->top()->suit() == c2.first()->suit());
105
} else return false; // it's just important to keep this unique
108
bool Simon::checkAdd( int checkIndex, const Pile *c1, const CardList& c2) const
110
if (checkIndex == 1) {
114
return (c1->top()->rank() == c2.first()->rank() + 1);
118
return (c2.first()->rank() == Card::King && c2.last()->rank() == Card::Ace);
122
bool Simon::checkRemove(int checkIndex, const Pile *p, const Card *c) const
127
// ok if just one card
131
// Now we're trying to move two or more cards.
133
// First, let's check if the column is in valid
134
// (that is, in sequence, alternated colors).
135
int index = p->indexOf(c) + 1;
136
const Card *before = c;
141
if (!((c->rank() == (before->rank()-1))
142
&& (c->suit() == before->suit())))
98
bool Simon::checkPrefering(const PatPile * pile, const QList<KCard*> & oldCards, const QList<KCard*> & newCards) const
100
return pile->pileRole() == PatPile::Tableau
101
&& !oldCards.isEmpty()
102
&& getSuit( oldCards.last() ) == getSuit( newCards.first() );
105
bool Simon::checkAdd(const PatPile * pile, const QList<KCard*> & oldCards, const QList<KCard*> & newCards) const
107
if (pile->pileRole() == PatPile::Tableau)
109
return oldCards.isEmpty()
110
|| getRank( oldCards.last() ) == getRank( newCards.first() ) + 1;
114
return oldCards.isEmpty()
115
&& getRank( newCards.first() ) == KStandardCardDeck::King
116
&& getRank( newCards.last() ) == KStandardCardDeck::Ace;
120
bool Simon::checkRemove(const PatPile * pile, const QList<KCard*> & cards) const
122
return pile->pileRole() == PatPile::Tableau
123
&& isSameSuitDescending(cards);