You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegames/kpat/golf.cpp

170 lines
3.7 KiB

#include "golf.h"
#include <klocale.h>
#include "deck.h"
#include <kdebug.h>
#include "cardmaps.h"
HorRightPile::HorRightPile( int _index, Dealer* parent)
: Pile(_index, parent)
{
}
TQSize HorRightPile::cardOffset( bool _spread, bool, const Card *) const
{
if (_spread)
return TQSize(+hspread(), 0);
return TQSize(0, 0);
}
//-------------------------------------------------------------------------//
Golf::Golf( KMainWindow* parent, const char* _name)
: Dealer( parent, _name )
{
const int dist_x = cardMap::CARDX() * 11 / 10 + 1;
const int pile_dist = 10 + 3 * cardMap::CARDY();
deck = Deck::new_deck( this);
deck->move(10, pile_dist);
connect(deck, TQT_SIGNAL(clicked(Card*)), TQT_SLOT(deckClicked(Card*)));
for( int r = 0; r < 7; r++ ) {
stack[r]=new Pile(1+r, this);
stack[r]->move(10+r*dist_x,10);
stack[r]->setAddFlags( Pile::addSpread | Pile::disallow);
stack[r]->setCheckIndex( 1 );
}
waste=new HorRightPile(8,this);
waste->move(10 + cardMap::CARDX() * 5 / 4, pile_dist);
waste->setTarget(true);
waste->setCheckIndex( 0 );
waste->setAddFlags( Pile::addSpread);
setActions(Dealer::Hint | Dealer::Demo);
}
//-------------------------------------------------------------------------//
bool Golf::checkAdd( int checkIndex, const Pile *c1, const CardList& cl) const
{
if (checkIndex == 1)
return false;
Card *c2 = cl.first();
kdDebug(11111)<<"check add "<< c1->name()<<" " << c2->name() <<" "<<endl;
if ((c2->rank() != (c1->top()->rank()+1)) && (c2->rank() != (c1->top()->rank()-1)))
return false;
return true;
}
bool Golf::checkRemove( int checkIndex, const Pile *, const Card *c2) const
{
if (checkIndex == 0)
return false;
return (c2 == c2->source()->top());
}
//-------------------------------------------------------------------------//
void Golf::restart()
{
deck->collectAndShuffle();
deal();
}
void Golf::deckClicked(Card *)
{
if (deck->isEmpty()) {
return;
}
Card *c = deck->nextCard();
waste->add(c, true, true);
int x = int(c->x());
int y = int(c->y());
c->move(deck->x(), deck->y());
c->flipTo(x, y, 8);
}
//-------------------------------------------------------------------------//
void Golf::deal()
{
for(int r=0;r<7;r++)
{
for(int i=0;i<5;i++)
{
stack[r]->add(deck->nextCard(),false,true);
}
}
waste->add(deck->nextCard(),false,false);
}
Card *Golf::demoNewCards()
{
deckClicked(0);
return waste->top();
}
bool Golf::cardClicked(Card *c)
{
if (c->source()->checkIndex() !=1) {
return Dealer::cardClicked(c);
}
if (c != c->source()->top())
return false;
Pile*p=findTarget(c);
if (p)
{
CardList empty;
empty.append(c);
c->source()->moveCards(empty, p);
canvas()->update();
return true;
}
return false;
}
bool Golf::isGameLost() const
{
if( !deck->isEmpty())
return false;
bool onecard = false;
for( int r = 0; r < 7; r++ ) {
if( !stack[r]->isEmpty()){
onecard = true;
CardList stackTops;
stackTops.append(stack[r]->top());
if(this->checkAdd(0,waste,stackTops))
return false;
}
}
return onecard;
}
static class LocalDealerInfo13 : public DealerInfo
{
public:
LocalDealerInfo13() : DealerInfo(I18N_NOOP("Go&lf"), 12) {}
virtual Dealer *createGame(KMainWindow *parent) { return new Golf(parent); }
} ldi13;
//-------------------------------------------------------------------------//
#include"golf.moc"
//-------------------------------------------------------------------------//