Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

patiencecardgame.cpp

Go to the documentation of this file.
00001 /**********************************************************************
00002 ** Copyright (C) 2000 Trolltech AS.  All rights reserved.
00003 **
00004 ** This file is part of Qtopia Environment.
00005 **
00006 ** This file may be distributed and/or modified under the terms of the
00007 ** GNU General Public License version 2 as published by the Free Software
00008 ** Foundation and appearing in the file LICENSE.GPL included in the
00009 ** packaging of this file.
00010 **
00011 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00012 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00013 **
00014 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
00015 **
00016 ** Contact info@trolltech.com if any conditions of this licensing are
00017 ** not clear to you.
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     // todo: make this eventually configurable
00122     deckTurns = cfg.readNumEntry("DeckTurns", 2);
00123     // Do we have a config file to read in?
00124     if ( !cfg.hasKey("numberOfTimesThroughDeck") )
00125     {
00126         // if not, create a new game
00127         newGame();
00128         return;
00129     }
00130     // We have a config file, lets read it in and use it
00131 
00132     // Create Cards, but don't shuffle or deal them yet
00133     createDeck();
00134 
00135     // How many times through the deck have we been
00136     numberOfTimesThroughDeck = cfg.readNumEntry("numberOfTimesThroughDeck");
00137 
00138     // restore state to the circle/cross under the dealing pile
00139     if ( canTurnOverDeck() )
00140         circleCross->setCircle();
00141     else
00142         circleCross->setCross();
00143 
00144     // Move the cards to their piles (deal them to their previous places)
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         // From facedown stack
00202         if ((item->x() == 5) && ((int)item->y() == 10))
00203         {
00204             item->setZ(highestZ);
00205             highestZ++;
00206 
00207             // Added Code
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;              // <- was missing, caused facedown card to react
00218         // to clicking, which is wrong
00219         moving = NULL;
00220         moved = FALSE;
00221 
00222         // move two other cards if we flip three at a time
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                 // Added Code
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 }

Generated on Sat Nov 5 16:17:26 2005 for OPIE by  doxygen 1.4.2