summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/games/solitaire/canvascardgame.cpp4
-rw-r--r--noncore/games/solitaire/canvascardwindow.cpp28
-rw-r--r--noncore/games/solitaire/canvascardwindow.h1
-rw-r--r--noncore/games/solitaire/cardgamelayout.cpp2
-rw-r--r--noncore/games/solitaire/cardpile.cpp3
-rw-r--r--noncore/games/solitaire/cardpile.h14
-rwxr-xr-xnoncore/games/solitaire/solitaire.pro35
-rw-r--r--noncore/games/solitaire/teeclubcardgame.cpp194
-rw-r--r--noncore/games/solitaire/teeclubcardgame.h217
9 files changed, 476 insertions, 22 deletions
diff --git a/noncore/games/solitaire/canvascardgame.cpp b/noncore/games/solitaire/canvascardgame.cpp
index 357e798..4404b04 100644
--- a/noncore/games/solitaire/canvascardgame.cpp
+++ b/noncore/games/solitaire/canvascardgame.cpp
@@ -282,106 +282,106 @@ void CanvasCardGame::contentsMouseMoveEvent(QMouseEvent *e) {
int tx = (int)p.x() - cardXOff;
int ty = (int)p.y() - cardYOff;
if (snapOn == TRUE) {
CardPile *pile = closestPile( tx, ty, 50 );
if ( pile && pile->isAllowedOnTop( moving ) ) {
QPoint p = pile->getHypertheticalNextCardPos();
if ( alphaCardPile )
alphaCardPile->move( p.x(), p.y() );
return;
}
}
if ( alphaCardPile )
alphaCardPile->move( tx, ty );
}
}
void CanvasCardGame::contentsMouseReleaseEvent(QMouseEvent *e)
{
QPoint p = e->pos();
Q_UNUSED(p);
if ( moving ) {
CanvasCard *item = moving;
if ( item->animated() )
return;
if ( alphaCardPile )
if ( moved ) {
CardPile *pile = closestPile((int)alphaCardPile->x(), (int)alphaCardPile->y(), 30);
if (pile && pile->isAllowedOnTop(item)) {
CardPile *oldPile = item->getCardPile();
Card *c = NULL;
if ( oldPile != pile) {
while ( item ) {
item->show();
if ( oldPile ) {
c = oldPile->cardInfront(item);
oldPile->removeCard(item);
}
pile->addCardToTop(item);
item->setCardPile(pile);
//item->move( pile->getCardPos(item) );
QPoint p = pile->getCardPos(item);
item->setPos( p.x(), p.y(), highestZ );
highestZ++;
if (item->getValue() == king && haveWeWon()) {
alphaCardPile->hide();
gameWon();
moving = NULL;
return;
}
if (oldPile) {
item = (CanvasCard *)c;
} else {
item = NULL;
}
}
alphaCardPile->hide();
moving = NULL;
return;
}
}
alphaCardPile->animatedMove();
}
}
moved = FALSE;
}
void CanvasCardGame::readPile( Config& cfg, CardPile *pile, QString name, int& highestZ )
{
cfg.setGroup( name );
int numberOfCards = cfg.readNumEntry("NumberOfCards", 0);
Card *card = NULL;
for ( int i = 0; i < numberOfCards; i++ ) {
QString cardStr;
cardStr.sprintf( "%i", i );
int val = cfg.readNumEntry( "Card" + cardStr );
bool facing = cfg.readBoolEntry( "CardFacing" + cardStr );
card = cards[ val ];
card->setFace(facing);
- pile->addCardToTop(card);
- card->setCardPile(pile);
+ card->setCardPile(pile); // cam: setCardPile muss vor addCardToTop passieren
+ pile->addCardToTop(card); // weil sonst absturz wg cardAddedToTop
QPoint p = pile->getCardPos( card );
card->setPos( p.x(), p.y(), highestZ );
card->showCard();
highestZ++;
}
}
diff --git a/noncore/games/solitaire/canvascardwindow.cpp b/noncore/games/solitaire/canvascardwindow.cpp
index e1c021e..450b4db 100644
--- a/noncore/games/solitaire/canvascardwindow.cpp
+++ b/noncore/games/solitaire/canvascardwindow.cpp
@@ -1,280 +1,304 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "canvascardwindow.h"
#include "patiencecardgame.h"
#include "freecellcardgame.h"
#include "chicanecardgame.h"
#include "harpcardgame.h"
+#include "teeclubcardgame.h"
#include <qpe/resource.h>
#include <qmainwindow.h>
#include <qpopupmenu.h>
#include <qstyle.h>
CanvasCardWindow::CanvasCardWindow(QWidget* parent, const char* name, WFlags f) :
QMainWindow(parent, name, f), canvas(230, 260), snapOn(TRUE), cardBack(4), gameType(0),
cardGame(NULL)
{
setIcon( Resource::loadPixmap( "cards" ) );
// Create Playing Area for Games
if ( QPixmap::defaultDepth() < 12 ) {
// canvas.setBackgroundColor(QColor(0x51, 0x74, 0x6B));
// canvas.setBackgroundColor(QColor(0x20, 0xb0, 0x50));
canvas.setBackgroundColor(QColor(0x08, 0x98, 0x2D));
} else {
QPixmap bg;
bg.convertFromImage( Resource::loadImage( "table_pattern" ), ThresholdDither );
canvas.setBackgroundPixmap(bg);
}
#if defined( QT_QWS_CASSIOPEIA )
canvas.setAdvancePeriod(70);
#else
canvas.setAdvancePeriod(30);
#endif
#ifdef _PATIENCE_USE_ACCELS_
QPEMenuBar* menu = menuBar();
QPopupMenu* file = new QPopupMenu;
file->insertItem(tr("Patience"), this, SLOT(initPatience()), CTRL+Key_F);
file->insertItem(tr("Freecell"), this, SLOT(initFreecell()), CTRL+Key_F);
file->insertItem(tr("Chicane"), this, SLOT(initChicane()), CTRL+Key_F);
file->insertItem(tr("Harp"), this, SLOT(initHarp()), CTRL+Key_F);
+ file->insertItem(tr("Teeclub"), this, SLOT(initTeeclub()), CTRL+Key_F);
menu->insertItem(tr("&Game"), file);
menu->insertSeparator();
settings = new QPopupMenu;
settings->insertItem(tr("&Change Card Backs"), this, SLOT(changeCardBacks()), Key_F2);
snap_id = settings->insertItem(tr("&Snap To Position"), this, SLOT(snapToggle()), Key_F3);
settings->setCheckable(TRUE);
menu->insertItem(tr("&Settings"),settings);
menu->insertSeparator();
QPopupMenu* help = new QPopupMenu;
help->insertItem(tr("&About"), this, SLOT(help()), Key_F1);
help->setItemChecked(dbf_id, TRUE);
menu->insertItem(tr("&Help"),help);
#else
QMenuBar* menu = menuBar();
QPopupMenu* file = new QPopupMenu;
file->insertItem(tr("Patience"), this, SLOT(initPatience()));
file->insertItem(tr("Freecell"), this, SLOT(initFreecell()));
file->insertItem(tr("Chicane"), this, SLOT(initChicane()));
file->insertItem(tr("Harp"), this, SLOT(initHarp()));
+ file->insertItem(tr("Teeclub"), this, SLOT(initTeeclub()));
menu->insertItem(tr("Play"), file);
menu->insertSeparator();
settings = new QPopupMenu;
settings->setCheckable(TRUE);
settings->insertItem(tr("Change Card Backs"), this, SLOT(changeCardBacks()));
snap_id = settings->insertItem(tr("Snap To Position"), this, SLOT(snapToggle()));
QString m;
drawId = settings->insertItem(tr("Turn One Card"), this, SLOT(drawnToggle()));
menu->insertItem(tr("Settings"),settings);
#endif
menu->show();
Config cfg( "Patience" );
cfg.setGroup( "GlobalSettings" );
snapOn = cfg.readBoolEntry( "SnapOn", TRUE);
settings->setItemChecked(snap_id, snapOn);
gameType = cfg.readNumEntry( "GameType", -1 );
drawThree = cfg.readBoolEntry( "DrawThree", TRUE);
if ( gameType == 0 ) {
cardGame = new PatienceCardGame( &canvas, snapOn, this );
cardGame->setNumberToDraw(drawThree ? 3 : 1);
setCaption(tr("Patience"));
setCentralWidget(cardGame);
cardGame->readConfig( cfg );
setCardBacks();
} else if ( gameType == 1 ) {
cardGame = new FreecellCardGame( &canvas, snapOn, this );
setCaption(tr("Freecell"));
setCentralWidget(cardGame);
//cardGame->newGame(); // Until we know how to handle reading freecell config
cardGame->readConfig( cfg );
setCardBacks();
} else if ( gameType == 2 ) {
cardGame = new ChicaneCardGame( &canvas, snapOn, this );
cardGame->setNumberToDraw(1);
setCaption(tr("Chicane"));
setCentralWidget(cardGame);
- //cardGame->newGame(); // Until we know how to handle reading freecell config
cardGame->readConfig( cfg );
setCardBacks();
} else if ( gameType == 3 ) {
cardGame = new HarpCardGame( &canvas, snapOn, this );
cardGame->setNumberToDraw(1);
setCaption(tr("Harp"));
setCentralWidget(cardGame);
- //cardGame->newGame(); // Until we know how to handle reading freecell config
+ cardGame->readConfig( cfg );
+ setCardBacks();
+ } else if ( gameType == 4 ) {
+ cardGame = new TeeclubCardGame( &canvas, snapOn, this );
+ cardGame->setNumberToDraw(1);
+ setCaption(tr("Teeclub"));
+ setCentralWidget(cardGame);
cardGame->readConfig( cfg );
setCardBacks();
} else {
// Probably there isn't a config file or it is broken
// Start a new game
initPatience();
}
updateDraw();
}
CanvasCardWindow::~CanvasCardWindow()
{
if (cardGame) {
Config cfg("Patience");
cfg.setGroup( "GlobalSettings" );
cfg.writeEntry( "GameType", gameType );
cfg.writeEntry( "SnapOn", snapOn );
cfg.writeEntry( "DrawThree", drawThree);
cardGame->writeConfig( cfg );
delete cardGame;
}
}
void CanvasCardWindow::resizeEvent(QResizeEvent *)
{
QSize s = centralWidget()->size();
int fw = style().defaultFrameWidth();
canvas.resize( s.width() - fw - 2, s.height() - fw - 2);
}
void CanvasCardWindow::initPatience()
{
// Create New Game
if ( cardGame )
delete cardGame;
cardGame = new PatienceCardGame( &canvas, snapOn, this );
cardGame->setNumberToDraw(drawThree ? 3 : 1);
gameType = 0;
setCaption(tr("Patience"));
setCentralWidget(cardGame);
cardGame->newGame();
setCardBacks();
updateDraw();
}
void CanvasCardWindow::initFreecell()
{
// Create New Game
if ( cardGame ) {
delete cardGame;
}
cardGame = new FreecellCardGame( &canvas, snapOn, this );
gameType = 1;
setCaption(tr("Freecell"));
setCentralWidget(cardGame);
cardGame->newGame();
setCardBacks();
}
void CanvasCardWindow::initChicane()
{
// Create New Game
if ( cardGame ) {
delete cardGame;
}
cardGame = new ChicaneCardGame( &canvas, snapOn, this );
cardGame->setNumberToDraw(1);
gameType = 2;
setCaption(tr("Chicane"));
setCentralWidget(cardGame);
cardGame->newGame();
setCardBacks();
}
void CanvasCardWindow::initHarp()
{
// Create New Game
if ( cardGame ) {
delete cardGame;
}
cardGame = new HarpCardGame( &canvas, snapOn, this );
cardGame->setNumberToDraw(1);
gameType = 3;
setCaption(tr("Harp"));
setCentralWidget(cardGame);
cardGame->newGame();
setCardBacks();
}
+void CanvasCardWindow::initTeeclub()
+{
+ // Create New Game
+ if ( cardGame ) {
+ delete cardGame;
+ }
+ cardGame = new TeeclubCardGame( &canvas, snapOn, this );
+ cardGame->setNumberToDraw(1);
+ gameType = 4;
+ setCaption(tr("Teeclub"));
+ setCentralWidget(cardGame);
+ cardGame->newGame();
+ setCardBacks();
+}
+
+
void CanvasCardWindow::snapToggle()
{
snapOn = !snapOn;
settings->setItemChecked(snap_id, snapOn);
cardGame->toggleSnap();
}
void CanvasCardWindow::drawnToggle()
{
cardGame->toggleCardsDrawn();
updateDraw();
}
void CanvasCardWindow::updateDraw() {
if(cardGame->cardsDrawn() == 3)
settings->changeItem(drawId, tr("Turn One Card"));
else
settings->changeItem(drawId, tr("Turn Three Cards"));
}
void CanvasCardWindow::setCardBacks()
{
QCanvasItemList l = canvas.allItems();
for (QCanvasItemList::Iterator it = l.begin(); it != l.end(); ++it) {
if ( (*it)->rtti() == canvasCardId )
((CanvasCard *)(*it))->setCardBack( cardBack );
}
}
void CanvasCardWindow::changeCardBacks()
{
cardBack++;
if (cardBack == 5)
cardBack = 0;
setCardBacks();
}
diff --git a/noncore/games/solitaire/canvascardwindow.h b/noncore/games/solitaire/canvascardwindow.h
index aa76730..eddb184 100644
--- a/noncore/games/solitaire/canvascardwindow.h
+++ b/noncore/games/solitaire/canvascardwindow.h
@@ -1,72 +1,73 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef CANVAS_CARD_WINDOW_H
#define CANVAS_CARD_WINDOW_H
#include <qmainwindow.h>
#include <qcanvas.h>
class CanvasCardGame;
class QPopupMenu;
class CanvasCardWindow : public QMainWindow {
Q_OBJECT
public:
CanvasCardWindow(QWidget* parent=0, const char* name=0, WFlags f=0);
virtual ~CanvasCardWindow();
public slots:
void setCardBacks();
void changeCardBacks();
void snapToggle();
void drawnToggle();
private slots:
void initFreecell();
void initPatience();
void initChicane();
void initHarp();
+ void initTeeclub();
protected:
virtual void resizeEvent(QResizeEvent *e);
void updateDraw();
private:
QCanvas canvas;
bool snapOn;
bool drawThree;
int drawId;
int cardBack;
int gameType;
CanvasCardGame *cardGame;
QPopupMenu* options;
QPopupMenu* settings;
int dbf_id;
int snap_id;
};
#endif
diff --git a/noncore/games/solitaire/cardgamelayout.cpp b/noncore/games/solitaire/cardgamelayout.cpp
index e21d08a..1ceee8d 100644
--- a/noncore/games/solitaire/cardgamelayout.cpp
+++ b/noncore/games/solitaire/cardgamelayout.cpp
@@ -1,61 +1,61 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "cardgamelayout.h"
-#include "card.h"
+
CardGameLayout::~CardGameLayout()
{
// Should I just do setAutoDelete( TRUE ); ?
for (CardPile *p = first(); p != NULL; p = next())
delete p;
}
CardPile *CardGameLayout::closestPile(int x, int y, int maxDistance)
{
int closestDistance = maxDistance * maxDistance;
CardPile *closestPile = NULL;
for (CardPile *p = first(); p != NULL; p = next()) {
int d = p->distanceFromNextPos(x, y);
if (d < closestDistance) {
closestDistance = d;
closestPile = p;
}
}
return closestPile;
}
void CardGameLayout::beginDealing()
{
for (CardPile *p = first(); p != NULL; p = next())
p->beginDealing();
}
void CardGameLayout::endDealing()
{
for (CardPile *p = first(); p != NULL; p = next())
p->endDealing();
}
diff --git a/noncore/games/solitaire/cardpile.cpp b/noncore/games/solitaire/cardpile.cpp
index 3b15e93..aace2e2 100644
--- a/noncore/games/solitaire/cardpile.cpp
+++ b/noncore/games/solitaire/cardpile.cpp
@@ -1,114 +1,115 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "cardpile.h"
#include "card.h"
#include <qpe/config.h>
#include <qpoint.h>
#include <qlist.h>
-CardPile::CardPile(int x, int y) : pileX(x), pileY(y), dealing(FALSE) {
+CardPile::CardPile(int x, int y) : pileX(x), pileY(y), dealing(FALSE), PileResize(FALSE) {
pileWidth = 0;
pileHeight = 0;
pileNextX = pileX;
pileNextY = pileY;
pileCenterX = x + pileWidth / 2;
pileCenterY = y + pileHeight / 2;
pileRadius = (pileWidth > pileHeight) ? pileWidth : pileHeight;
+ pileOffsetDown = 13;
}
int CardPile::distanceFromPile(int x, int y) {
return (pileCenterX-x)*(pileCenterX-x)+(pileCenterY-y)*(pileCenterY-y);
}
int CardPile::distanceFromNextPos(int x, int y) {
return (pileNextX-x)*(pileNextX-x)+(pileNextY-y)*(pileNextY-y);
}
Card *CardPile::cardInfront(Card *c) {
CardPile *p = c->getCardPile();
if (p) {
p->at(p->find(c));
return p->next();
} else {
return NULL;
}
}
bool CardPile::kingOnTop() {
Card *top = cardOnTop();
return top && top->getValue() == king;
}
bool CardPile::addCardToTop(Card *c) {
if (dealing || isAllowedOnTop(c)) {
append((const Card *)c);
cardAddedToTop(c);
return TRUE;
}
return FALSE;
}
bool CardPile::addCardToBottom(Card *c) {
if (dealing || isAllowedOnBottom(c)) {
prepend((const Card *)c);
cardAddedToBottom(c);
return TRUE;
}
return FALSE;
}
bool CardPile::removeCard(Card *c) {
if (dealing || isAllowedToBeMoved(c)) {
take(find(c));
cardRemoved(c);
return TRUE;
}
return FALSE;
}
void CardPile::writeConfig( Config& cfg, QString name ) {
int numberOfCards = 0;
cfg.setGroup( name );
Card *card = cardOnBottom();
while ( card ) {
QString cardStr;
cardStr.sprintf( "%i", numberOfCards );
int val = (int)card->getValue()-1 + ((int)card->getSuit()-1)*13 + (int)card->getDeckNumber()*52;
cfg.writeEntry( "Card" + cardStr, val );
cfg.writeEntry( "CardFacing" + cardStr, card->isFacing() );
card = cardInfront( card );
numberOfCards++;
}
cfg.writeEntry("NumberOfCards", numberOfCards);
}
diff --git a/noncore/games/solitaire/cardpile.h b/noncore/games/solitaire/cardpile.h
index c515bbc..1eb2499 100644
--- a/noncore/games/solitaire/cardpile.h
+++ b/noncore/games/solitaire/cardpile.h
@@ -1,101 +1,115 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef CARD_PILE_H
#define CARD_PILE_H
#include <qpoint.h>
#include <qlist.h>
enum ePileStackingType {
pileCascades = 0, pileStacks, pileCascadesOrStacks
};
enum ePileFaceingType {
pileFaceUp = 0, pileFaceDown, pileFaceUpOrDown
};
class Card;
class Config;
class CardPile : public QList<Card>
{
public:
CardPile(int x, int y);
virtual ~CardPile() { }
int getX() { return pileX; }
int getY() { return pileY; }
int getNextX() { return pileNextX; }
int getNextY() { return pileNextY; }
int getWidth() { return pileWidth; }
int getHeight() { return pileHeight; }
+ int getOffsetDown() { return pileOffsetDown; }
+ int getAnzCardsInPile() {
+ int anz=0;
+ Card *card = cardOnBottom();
+ while (card != NULL) { anz++; card = cardInfront(card); }
+ return anz;
+ }
void setX(int x) { pileX = x; }
void setY(int y) { pileY = y; }
void setNextX(int x) { pileNextX = x; }
void setNextY(int y) { pileNextY = y; }
void setWidth(int width) { pileWidth = width; }
void setHeight(int height) { pileHeight = height; }
+ void setOffsetDown(int down) { pileOffsetDown = down; }
void beginDealing() { dealing = TRUE; }
void endDealing() { dealing = FALSE; }
bool isDealing() { return dealing; }
+ void beginPileResize() { PileResize = TRUE; }
+ void endPileResize() { PileResize = FALSE; }
+ bool isPileResize() { return PileResize; }
+
int distanceFromPile(int x, int y);
int distanceFromNextPos(int x, int y);
Card *cardOnTop() { return getLast(); }
Card *cardOnBottom() { return getFirst(); }
Card *cardInfront(Card *c);
bool kingOnTop();
bool addCardToTop(Card *c);
bool addCardToBottom(Card *c);
bool removeCard(Card *c);
virtual void cardAddedToTop(Card *) { }
virtual void cardAddedToBottom(Card *) { }
virtual void cardRemoved(Card *) { }
virtual bool isAllowedOnTop(Card *) { return FALSE; }
virtual bool isAllowedOnBottom(Card *) { return FALSE; }
virtual bool isAllowedToBeMoved(Card *) { return FALSE; }
virtual QPoint getCardPos(Card *) { return QPoint(pileX, pileY); }
virtual QPoint getHypertheticalNextCardPos() { return QPoint(pileX, pileY); }
void writeConfig( Config& cfg, QString name );
protected:
int pileX, pileY;
int pileNextX, pileNextY;
int pileWidth, pileHeight;
int pileCenterX, pileCenterY;
int pileRadius;
+ int pileOffsetDown;
private:
bool dealing;
+ bool PileResize;
};
#endif
diff --git a/noncore/games/solitaire/solitaire.pro b/noncore/games/solitaire/solitaire.pro
index b2ba5aa..d08dab0 100755
--- a/noncore/games/solitaire/solitaire.pro
+++ b/noncore/games/solitaire/solitaire.pro
@@ -1,28 +1,31 @@
TEMPLATE = app
+
CONFIG += qt warn_on release
DESTDIR = $(OPIEDIR)/bin
-HEADERS = canvascard.h canvasshapes.h cardgame.h cardgamelayout.h cardpile.h card.h carddeck.h canvascardgame.h freecellcardgame.h chicanecardgame.h harpcardgame.h patiencecardgame.h canvascardwindow.h
+HEADERS = canvascard.h canvasshapes.h cardgame.h cardgamelayout.h cardpile.h card.h carddeck.h canvascardgame.h freecellcardgame.h chicanecardgame.h harpcardgame.h teeclubcardgame.h patiencecardgame.h canvascardwindow.h
-SOURCES = canvascard.cpp canvasshapes.cpp cardgame.cpp cardgamelayout.cpp cardpile.cpp card.cpp carddeck.cpp canvascardgame.cpp freecellcardgame.cpp chicanecardgame.cpp harpcardgame.cpp patiencecardgame.cpp canvascardwindow.cpp main.cpp
+SOURCES = canvascard.cpp canvasshapes.cpp cardgame.cpp cardgamelayout.cpp cardpile.cpp card.cpp carddeck.cpp canvascardgame.cpp freecellcardgame.cpp chicanecardgame.cpp harpcardgame.cpp teeclubcardgame.cpp patiencecardgame.cpp canvascardwindow.cpp main.cpp
TARGET = patience
+
INCLUDEPATH += $(OPIEDIR)/include
DEPENDPATH += $(OPIEDIR)/include
LIBS += -lqpe
+
REQUIRES = patience
-TRANSLATIONS = ../../../i18n/de/patience.ts \
- ../../../i18n/en/patience.ts \
- ../../../i18n/es/patience.ts \
- ../../../i18n/fr/patience.ts \
- ../../../i18n/hu/patience.ts \
- ../../../i18n/ja/patience.ts \
- ../../../i18n/ko/patience.ts \
- ../../../i18n/no/patience.ts \
- ../../../i18n/pl/patience.ts \
- ../../../i18n/pt/patience.ts \
- ../../../i18n/pt_BR/patience.ts \
- ../../../i18n/sl/patience.ts \
- ../../../i18n/zh_CN/patience.ts \
- ../../../i18n/zh_TW/patience.ts
+TRANSLATIONS = ../i18n/de/patience.ts
+TRANSLATIONS += ../i18n/es/patience.ts
+TRANSLATIONS += ../i18n/pt/patience.ts
+TRANSLATIONS += ../i18n/pt_BR/patience.ts
+TRANSLATIONS += ../i18n/en/patience.ts
+TRANSLATIONS += ../i18n/hu/patience.ts
+TRANSLATIONS += ../i18n/ja/patience.ts
+TRANSLATIONS += ../i18n/sl/patience.ts
+TRANSLATIONS += ../i18n/ko/patience.ts
+TRANSLATIONS += ../i18n/pl/patience.ts
+TRANSLATIONS += ../i18n/no/patience.ts
+TRANSLATIONS += ../i18n/fr/patience.ts
+TRANSLATIONS += ../i18n/zh_CN/patience.ts
+TRANSLATIONS += ../i18n/zh_TW/patience.ts
diff --git a/noncore/games/solitaire/teeclubcardgame.cpp b/noncore/games/solitaire/teeclubcardgame.cpp
new file mode 100644
index 0000000..e15da96
--- a/dev/null
+++ b/noncore/games/solitaire/teeclubcardgame.cpp
@@ -0,0 +1,194 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**
+** Modified by C.A.Mader 2002
+**
+**********************************************************************/
+#include <qgfx_qws.h>
+#include "teeclubcardgame.h"
+
+
+extern int highestZ;
+
+
+TeeclubCardGame::TeeclubCardGame(QCanvas *c, bool snap, QWidget *parent) : CanvasCardGame(*c, snap, parent, 2) // Use 2 Decks
+{
+ highestZ = 0;
+
+ for (int i = 0; i < 8; i++) {
+ discardPiles[i] = new TeeclubDiscardPile( 27 + i * 26, 10, canvas() );
+ addCardPile(discardPiles[i]);
+ }
+ for (int i = 0; i < 9; i++) {
+ workingPiles[i] = new TeeclubWorkingPile( 2 + i * 26, 50, canvas() );
+ addCardPile(workingPiles[i]);
+ }
+ faceDownDealingPile = new TeeclubFaceDownDeck( 2, 10, canvas() );
+}
+
+
+void TeeclubCardGame::deal(void)
+{
+ highestZ = 1;
+ int t = 0;
+
+ beginDealing();
+
+ for (int i = 0; i < 9; i++) {
+ workingPiles[i]->setOffsetDown(13);
+ workingPiles[i]->beginPileResize();
+ for (int k = 0; k < 5; k++, t++) {
+ Card *card = cards[t];
+ workingPiles[i]->addCardToTop(card);
+ card->setCardPile( workingPiles[i] );
+ card->setPos( 0, 0, highestZ );
+ card->setFace(TRUE);
+ card->move( workingPiles[i]->getCardPos( card ) );
+ card->showCard();
+ highestZ++;
+ }
+ }
+
+ for ( ; t < getNumberOfCards(); t++) {
+ Card *card = cards[t];
+ faceDownDealingPile->addCardToTop(card);
+ card->setCardPile( faceDownDealingPile );
+ QPoint p = faceDownDealingPile->getCardPos( card );
+ card->setPos( p.x(), p.y(), highestZ );
+ card->showCard();
+ highestZ++;
+ }
+
+ endDealing();
+}
+
+
+void TeeclubCardGame::resizePiles()
+{
+ beginDealing();
+ for (int i = 0; i < 9; i++) {
+ while ((workingPiles[i]->getCardPos(NULL).y() > 230) && (workingPiles[i]->getOffsetDown()>1)) {
+ // Resizen des Stapels
+ workingPiles[i]->setOffsetDown(workingPiles[i]->getOffsetDown()-1);
+ Card *card = workingPiles[i]->cardOnBottom();
+ int p=0;
+ while (card != NULL) {
+ card->setPos( 0, 0, p++ );
+ card->move( workingPiles[i]->getCardPos( card ) );
+ card = workingPiles[i]->cardInfront(card);
+ }
+ }
+ }
+ endDealing();
+}
+
+
+void TeeclubCardGame::readConfig( Config& cfg )
+{
+ cfg.setGroup("GameState");
+
+ // Create Cards, but don't shuffle or deal them yet
+ createDeck();
+
+ // Move the cards to their piles (deal them to their previous places)
+ beginDealing();
+
+ highestZ = 1;
+
+ for (int i = 0; i < 8; i++) {
+ QString pile;
+ pile.sprintf( "TeeclubDiscardPile%i", i );
+ readPile( cfg, discardPiles[i], pile, highestZ );
+ }
+
+ for (int i = 0; i < 9; i++) {
+ workingPiles[i]->endPileResize();
+ QString pile;
+ pile.sprintf( "TeeclubWorkingPile%i", i );
+ readPile( cfg, workingPiles[i], pile, highestZ );
+ workingPiles[i]->beginPileResize();
+ }
+
+ readPile( cfg, faceDownDealingPile, "TeeclubFaceDownDealingPile", highestZ );
+
+ highestZ++;
+
+ endDealing();
+ resizePiles();
+}
+
+
+void TeeclubCardGame::writeConfig( Config& cfg )
+{
+ cfg.setGroup("GameState");
+ for ( int i = 0; i < 8; i++ ) {
+ QString pile;
+ pile.sprintf( "TeeclubDiscardPile%i", i );
+ discardPiles[i]->writeConfig( cfg, pile );
+ }
+ for ( int i = 0; i < 9; i++ ) {
+ QString pile;
+ pile.sprintf( "TeeclubWorkingPile%i", i );
+ workingPiles[i]->writeConfig( cfg, pile );
+ }
+ faceDownDealingPile->writeConfig( cfg, "TeeclubFaceDownDealingPile" );
+}
+
+
+bool TeeclubCardGame::mousePressCard( Card *card, QPoint p )
+{
+ Q_UNUSED(p);
+
+ CanvasCard *item = (CanvasCard *)card;
+ if (item->isFacing() != TRUE) {
+ // From facedown stack
+ if ((item->x() == 2) && ((int)item->y() == 10)) { // Deal 1 card
+ // Move 8 cards, one to each workingPile
+ beginDealing();
+ CanvasCard *card = (CanvasCard *)faceDownDealingPile->cardOnTop();
+ card->setZ(highestZ);
+ highestZ++;
+ faceDownDealingPile->removeCard(card);
+ workingPiles[0]->addCardToTop(card);
+ card->setCardPile( workingPiles[0] );
+ card->setFace(FALSE);
+ QPoint p = workingPiles[0]->getCardPos(card);
+ card->flipTo( p.x(), p.y() );
+ endDealing();
+ }
+ moving = NULL;
+ moved = FALSE;
+
+ return TRUE;
+ } else if ( !card->getCardPile()->isAllowedToBeMoved(card) ) { // Don't allow unclean columns to be moved
+ moving = NULL;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+
+void TeeclubCardGame::mousePress(QPoint p)
+{
+ Q_UNUSED(p);
+}
+
+
diff --git a/noncore/games/solitaire/teeclubcardgame.h b/noncore/games/solitaire/teeclubcardgame.h
new file mode 100644
index 0000000..06d49f8
--- a/dev/null
+++ b/noncore/games/solitaire/teeclubcardgame.h
@@ -0,0 +1,217 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+#ifndef TEECLUB_CARD_GAME_H
+#define TEECLUB_CARD_GAME_H
+
+
+#include "patiencecardgame.h"
+
+
+class TeeclubFaceDownDeck : public PatienceFaceDownDeck
+{
+public:
+ TeeclubFaceDownDeck(int x, int y, QCanvas *canvas) :
+ PatienceFaceDownDeck(x, y, canvas) { }
+
+};
+
+
+class TeeclubDiscardPile : public CardPile, public CanvasRoundRect
+{
+public:
+ TeeclubDiscardPile(int x, int y, QCanvas *canvas)
+ : CardPile(x, y), CanvasRoundRect(x, y, canvas) { }
+ virtual bool isAllowedOnTop(Card *card) {
+ if ( card->isFacing() && ( card->getCardPile()->cardInfront(card) == NULL ) &&
+ ( ( ( cardOnTop() == NULL ) && ( card->getValue() == ace ) ) ||
+ ( ( cardOnTop() != NULL ) &&
+ ( (int)card->getValue() == (int)cardOnTop()->getValue() + 1 ) &&
+ ( card->getSuit() == cardOnTop()->getSuit() ) ) ) )
+ return TRUE;
+ return FALSE;
+ }
+ virtual bool isAllowedToBeMoved(Card *card) {
+ if (card->isFacing()) return FALSE;
+ return FALSE; // die Toten ruhn
+ }
+};
+
+
+class TeeclubWorkingPile : public PatienceWorkingPile
+{
+public:
+ TeeclubWorkingPile(int x, int y, QCanvas *canvas) :
+ PatienceWorkingPile(x, y, canvas) { }
+
+ virtual bool isAllowedOnTop(Card *card) {
+ if ( card->isFacing() &&
+// ( ( ( cardOnTop() == NULL ) && (card->getValue() == king) ) || // diese Zeile sorgt dafür dass nur Kings auf leere Plätze dürfen
+ ( (cardOnTop() == NULL) || // auf einen Freiplatz darf alles!
+ ( (cardOnTop() != NULL) &&
+ ((int)card->getValue() + 1 == (int)cardOnTop()->getValue()) // bei teeclub sind die farben zum Anlegen egal
+ ) ) )
+ return TRUE;
+ return FALSE;
+ }
+
+ virtual bool isAllowedToBeMoved(Card *card) {
+ if (!card->isFacing()) return FALSE;
+
+ int nextExpectedValue = (int)card->getValue();
+ eSuit nextExpectedSuit = card->getSuit();
+
+ while ((card != NULL)) {
+ if ( (int)card->getValue() != nextExpectedValue )
+ return FALSE;
+ if ( card->getSuit() != nextExpectedSuit )
+ return FALSE;
+ nextExpectedValue--;;
+ card = cardInfront(card);
+ }
+ return TRUE;
+ }
+
+ virtual void cardRemoved(Card *card) {
+ Q_UNUSED(card);
+
+ Card *newTopCard = cardOnTop();
+
+ if ( !newTopCard ) {
+ top = QPoint( pileX, pileY );
+ setNextX( pileX );
+ setNextY( pileY );
+ setOffsetDown(13);
+ return;
+ } else {
+ top = getCardPos(NULL);
+ if ( newTopCard->isFacing() == FALSE ) {
+ int offsetDown = newTopCard->getCardPile()->getOffsetDown();
+ // correct the position taking in to account the card is not
+ // yet flipped, but will become flipped
+ top = QPoint( top.x(), top.y() - 3 ); // Keine seitliche Verschiebung!
+ newTopCard->flipTo( top.x(), top.y() );
+ top = QPoint( top.x(), top.y() + offsetDown );
+ }
+ setNextX( top.x() );
+ setNextY( top.y() );
+ }
+
+ if ((getCardPos(NULL).y() < 230) && (getOffsetDown()<13)) {
+ // Resizen des Stapels
+ beginDealing();
+ setOffsetDown(getOffsetDown()+1);
+ Card *card = cardOnBottom();
+ int p=0;
+ while (card != NULL) {
+ card->setPos( 0, 0, p++ );
+ card->move( getCardPos( card ) );
+ card = cardInfront(card);
+ }
+ endDealing();
+ }
+ }
+
+ virtual QPoint getCardPos(Card *c) {
+ int x = pileX, y = pileY;
+ Card *card = cardOnBottom();
+ while ((card != c) && (card != NULL)) {
+ if (card->isFacing()) {
+ int offsetDown = card->getCardPile()->getOffsetDown();
+ y += offsetDown;
+ } else {
+ x += 0; // Keine seitliche Verschiebung!
+ y += 3;
+ }
+ card = cardInfront(card);
+ }
+ return QPoint( x, y );
+ }
+
+ virtual QPoint getHypertheticalNextCardPos(void) {
+ return QPoint( getNextX(), getNextY() );
+ }
+
+ virtual void cardAddedToTop(Card *c) {
+ Q_UNUSED(c);
+ setNextX( getCardPos(NULL).x() );
+ setNextY( getCardPos(NULL).y() );
+
+ while (isPileResize() && (getCardPos(NULL).y() > 230) && (getOffsetDown()>1)) {
+ // Resizen des Stapels
+ beginDealing();
+ setOffsetDown(getOffsetDown()-1);
+ Card *card = cardOnBottom();
+ int p=0;
+ while (card != NULL) {
+ card->setPos( 0, 0, p++ );
+ card->move( getCardPos( card ) );
+ card = cardInfront(card);
+ }
+ endDealing();
+ }
+
+ }
+
+
+
+
+private:
+ QPoint top;
+
+};
+
+
+class TeeclubCardGame : public CanvasCardGame
+{
+public:
+ TeeclubCardGame(QCanvas *c, bool snap, QWidget *parent = 0);
+// virtual ~TeeclubCardGame();
+ virtual void deal(void);
+ virtual bool haveWeWon() {
+ return ( discardPiles[0]->kingOnTop() &&
+ discardPiles[1]->kingOnTop() &&
+ discardPiles[2]->kingOnTop() &&
+ discardPiles[3]->kingOnTop() &&
+ discardPiles[4]->kingOnTop() &&
+ discardPiles[5]->kingOnTop() &&
+ discardPiles[6]->kingOnTop() &&
+ discardPiles[7]->kingOnTop() );;
+ }
+ virtual void mousePress(QPoint p);
+ virtual void mouseRelease(QPoint p) { Q_UNUSED(p); }
+// virtual void mouseMove(QPoint p);
+ virtual bool mousePressCard(Card *card, QPoint p);
+ virtual void mouseReleaseCard(Card *card, QPoint p) { Q_UNUSED(card); Q_UNUSED(p); }
+// virtual void mouseMoveCard(Card *card, QPoint p) { Q_UNUSED(card); Q_UNUSED(p); }
+ bool canTurnOverDeck(void) { return (FALSE); }
+ void throughDeck(void) { }
+ bool snapOn;
+ void writeConfig( Config& cfg );
+ void readConfig( Config& cfg );
+ void resizePiles();
+private:
+ TeeclubWorkingPile *workingPiles[9];
+ TeeclubDiscardPile *discardPiles[8];
+ TeeclubFaceDownDeck *faceDownDealingPile;
+};
+
+
+#endif
+