summaryrefslogtreecommitdiff
path: root/noncore/games/solitaire/cardpile.cpp
blob: 0b738d23fc40e640023108368310cba71b542078 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/**********************************************************************
** 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) {
    pileWidth = 0;
    pileHeight = 0;
    pileNextX = pileX;
    pileNextY = pileY;
    pileCenterX = x + pileWidth / 2;
    pileCenterY = y + pileHeight / 2;
    pileRadius = (pileWidth > pileHeight) ? pileWidth : pileHeight;
}


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;
	cfg.writeEntry( "Card" + cardStr, val );
	cfg.writeEntry( "CardFacing" + cardStr, card->isFacing() );
	card = cardInfront( card );
	numberOfCards++;
    }
    cfg.writeEntry("NumberOfCards", numberOfCards);
}