00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "patiencecardgame.h"
00022
00023
00024 int highestZ = 0;
00025
00026
00027 PatienceCardGame::PatienceCardGame(QCanvas *c, bool snap, QWidget *parent) : CanvasCardGame(*c, snap, parent)
00028 {
00029 numberOfTimesThroughDeck = 0;
00030 highestZ = 0;
00031
00032 if ( qt_screen->deviceWidth() < 200 )
00033 {
00034 circleCross = new CanvasCircleOrCross( 7, 16, canvas() );
00035 rectangle = new CanvasRoundRect( 30, 10, canvas() );
00036
00037 for (int i = 0; i < 4; i++)
00038 {
00039 discardPiles[i] = new PatienceDiscardPile( 78 + i * 23, 10, canvas() );
00040 addCardPile(discardPiles[i]);
00041 }
00042 for (int i = 0; i < 7; i++)
00043 {
00044 workingPiles[i] = new PatienceWorkingPile( 5 + i * 23, 50, canvas() );
00045 addCardPile(workingPiles[i]);
00046 }
00047 faceDownDealingPile = new PatienceFaceDownDeck( 5, 10, canvas() );
00048 faceUpDealingPile = new PatienceFaceUpDeck( 30, 10, canvas() );
00049 }
00050 else
00051 {
00052 circleCross = new CanvasCircleOrCross( 7, 18, canvas() );
00053 rectangle = new CanvasRoundRect( 35, 10, canvas() );
00054
00055 for (int i = 0; i < 4; i++)
00056 {
00057 discardPiles[i] = new PatienceDiscardPile( 110 + i * 30, 10, canvas() );
00058 addCardPile(discardPiles[i]);
00059 }
00060 for (int i = 0; i < 7; i++)
00061 {
00062 workingPiles[i] = new PatienceWorkingPile( 10 + i * 30, 50, canvas() );
00063 addCardPile(workingPiles[i]);
00064 }
00065 faceDownDealingPile = new PatienceFaceDownDeck( 5, 10, canvas() );
00066 faceUpDealingPile = new PatienceFaceUpDeck( 35, 10, canvas() );
00067 }
00068 }
00069
00070
00071 PatienceCardGame::~PatienceCardGame()
00072 {
00073 delete circleCross;
00074 delete rectangle;
00075 delete faceDownDealingPile;
00076 delete faceUpDealingPile;
00077 }
00078
00079
00080 void PatienceCardGame::deal(void)
00081 {
00082 highestZ = 1;
00083 int t = 0;
00084
00085 beginDealing();
00086
00087 for (int i = 0; i < 7; i++)
00088 {
00089 cards[t]->setFace(TRUE);
00090 for (int k = i; k < 7; k++, t++)
00091 {
00092 Card *card = cards[t];
00093 workingPiles[k]->addCardToTop(card);
00094 card->setCardPile( workingPiles[k] );
00095 QPoint p = workingPiles[k]->getCardPos( card );
00096 card->setPos( p.x(), p.y(), highestZ );
00097 card->showCard();
00098 highestZ++;
00099 }
00100 }
00101
00102 for ( ; t < 52; t++)
00103 {
00104 Card *card = cards[t];
00105 faceDownDealingPile->addCardToTop(card);
00106 card->setCardPile( faceDownDealingPile );
00107 QPoint p = faceDownDealingPile->getCardPos( card );
00108 card->setPos( p.x(), p.y(), highestZ );
00109 card->showCard();
00110 highestZ++;
00111 }
00112
00113 endDealing();
00114 }
00115
00116
00117 void PatienceCardGame::readConfig( Config& cfg )
00118 {
00119 cfg.setGroup("GameState");
00120
00121
00122 deckTurns = cfg.readNumEntry("DeckTurns", 2);
00123
00124 if ( !cfg.hasKey("numberOfTimesThroughDeck") )
00125 {
00126
00127 newGame();
00128 return;
00129 }
00130
00131
00132
00133 createDeck();
00134
00135
00136 numberOfTimesThroughDeck = cfg.readNumEntry("numberOfTimesThroughDeck");
00137
00138
00139 if ( canTurnOverDeck() )
00140 circleCross->setCircle();
00141 else
00142 circleCross->setCross();
00143
00144
00145 beginDealing();
00146
00147 highestZ = 1;
00148
00149 for (int k = 0; k < 7; k++)
00150 {
00151 QString pile;
00152 pile.sprintf( "WorkingPile%i", k );
00153 readPile( cfg, workingPiles[k], pile, highestZ );
00154 }
00155
00156 for (int k = 0; k < 4; k++)
00157 {
00158 QString pile;
00159 pile.sprintf( "DiscardPile%i", k );
00160 readPile( cfg, discardPiles[k], pile, highestZ );
00161 }
00162
00163 readPile( cfg, faceDownDealingPile, "FaceDownDealingPile", highestZ );
00164 readPile( cfg, faceUpDealingPile, "FaceUpDealingPile", highestZ );
00165
00166 highestZ++;
00167
00168 endDealing();
00169 }
00170
00171
00172 void PatienceCardGame::writeConfig( Config& cfg )
00173 {
00174 cfg.setGroup("GameState");
00175 cfg.writeEntry("numberOfTimesThroughDeck", numberOfTimesThroughDeck);
00176
00177 for ( int i = 0; i < 7; i++ )
00178 {
00179 QString pile;
00180 pile.sprintf( "WorkingPile%i", i );
00181 workingPiles[i]->writeConfig( cfg, pile );
00182 }
00183 for ( int i = 0; i < 4; i++ )
00184 {
00185 QString pile;
00186 pile.sprintf( "DiscardPile%i", i );
00187 discardPiles[i]->writeConfig( cfg, pile );
00188 }
00189 faceDownDealingPile->writeConfig( cfg, "FaceDownDealingPile" );
00190 faceUpDealingPile->writeConfig( cfg, "FaceUpDealingPile" );
00191 }
00192
00193
00194 bool PatienceCardGame::mousePressCard( Card *card, QPoint p )
00195 {
00196 Q_UNUSED(p);
00197
00198 CanvasCard *item = (CanvasCard *)card;
00199 if (item->isFacing() != TRUE)
00200 {
00201
00202 if ((item->x() == 5) && ((int)item->y() == 10))
00203 {
00204 item->setZ(highestZ);
00205 highestZ++;
00206
00207
00208 faceDownDealingPile->removeCard(item);
00209 faceUpDealingPile->addCardToTop(item);
00210 item->setCardPile( faceUpDealingPile );
00211
00212 if ( qt_screen->deviceWidth() < 200 )
00213 item->flipTo( 30, (int)item->y() );
00214 else
00215 item->flipTo( 35, (int)item->y() );
00216 }
00217 else return FALSE;
00218
00219 moving = NULL;
00220 moved = FALSE;
00221
00222
00223 int flipped = 1;
00224 QCanvasItemList l = canvas()->collisions( p );
00225 for (QCanvasItemList::Iterator it = l.begin(); (it != l.end()) && (flipped != cardsDrawn()); ++it)
00226 {
00227 if ( (*it)->rtti() == canvasCardId )
00228 {
00229 CanvasCard *item = (CanvasCard *)*it;
00230 if (item->animated())
00231 continue;
00232 item->setZ(highestZ);
00233 highestZ++;
00234 flipped++;
00235
00236
00237 faceDownDealingPile->removeCard(item);
00238 faceUpDealingPile->addCardToTop(item);
00239 item->setCardPile( faceUpDealingPile );
00240
00241 if ( qt_screen->deviceWidth() < 200 )
00242 item->flipTo( 30, (int)item->y(), 8 * flipped );
00243 else
00244 item->flipTo( 35, (int)item->y(), 8 * flipped );
00245 }
00246 }
00247
00248 return TRUE;
00249 }
00250
00251 return FALSE;
00252 }
00253
00254
00255 void PatienceCardGame::mousePress(QPoint p)
00256 {
00257 if ( canTurnOverDeck() &&
00258 (p.x() > 5) && (p.x() < 28) &&
00259 (p.y() > 10) && (p.y() < 46) )
00260 {
00261
00262 beginDealing();
00263 Card *card = faceUpDealingPile->cardOnTop();
00264 while ( card )
00265 {
00266 card->setPos( 5, 10, highestZ );
00267 card->setFace( FALSE );
00268 faceUpDealingPile->removeCard( card );
00269 faceDownDealingPile->addCardToTop( card );
00270 card->setCardPile( faceDownDealingPile );
00271 card = faceUpDealingPile->cardOnTop();
00272 highestZ++;
00273 }
00274 endDealing();
00275
00276 throughDeck();
00277
00278 moved = TRUE;
00279 }
00280 }
00281
00282 bool PatienceCardGame::canTurnOverDeck()
00283 {
00284 return (numberOfTimesThroughDeck != deckTurns);
00285 }
00286
00287 void PatienceCardGame::throughDeck()
00288 {
00289 numberOfTimesThroughDeck++;
00290 if (numberOfTimesThroughDeck == deckTurns)
00291 circleCross->setCross();
00292 }