/* Cards dragged from a stack */ bool CARDLIBPROC StackDragProc(CardRegion &stackobj, int numDragCards) { int numfacedown, numcards; stackobj.GetFaceDirection(&numfacedown); numcards = stackobj.NumCards(); /* Only cards facing up */ if (numDragCards <= numcards - numfacedown) { const CardStack &mystack = stackobj.GetCardStack(); /* Don't allow to drag unsuited cards */ if (!stackLookingGood(mystack, numDragCards - 1)) { return false; } /* Remember where the cards come from */ from = &stackobj; return true; } else { return false; } }
/* Cards dropped to a stack */ bool CARDLIBPROC StackDropProc(CardRegion &stackobj, CardStack &dragcards) { Card dragcard = dragcards[dragcards.NumCards() - 1]; int faceup, facedown; /* Only drop our cards on other stacks */ if (stackobj.Id() == from->Id()) { return false; } /* If stack is empty, everything can be dropped */ if (stackobj.NumCards() != 0) { const CardStack &mystack = stackobj.GetCardStack(); /* Can only drop if card is 1 less */ if (mystack[0].LoVal() != dragcard.LoVal() + 1) { return false; } /* Check if stack complete */ stackobj.GetFaceDirection(&facedown); faceup = stackobj.NumCards() - facedown; if (faceup + dragcards.NumCards() >= NUM_ONECOLOR_CARDS) { int i, max = NUM_ONECOLOR_CARDS - dragcards.NumCards() - 1; /* Dragged cards have been checked to be in order, check stack cards */ if (mystack[0].Suit() == dragcard.Suit() && stackLookingGood(mystack, max)) { CardStack s = stackobj.GetCardStack(); CardStack f; /* Remove from card stack */ for (i = 0; i < max + 1; i++) { s.RemoveCard(0); } /* Remove dragged cards */ dragcards = f; stackobj.SetCardStack(s); cardsFinished += NUM_ONECOLOR_CARDS; /* Flip top card of the dest stack */ TurnStackCard(stackobj); } } } /* Flip the top card of the source stack */ TurnStackCard(*from); fGameStarted = true; return true; }
/* Card to be turned from a stack */ void TurnStackCard(CardRegion &stackobj) { int numfacedown; stackobj.GetFaceDirection(&numfacedown); if (stackobj.NumCards() <= numfacedown) { if (numfacedown > 0) numfacedown--; stackobj.SetFaceDirection(CS_FACE_DOWNUP, numfacedown); stackobj.Redraw(); } }
// // Single-click on one of the row-stacks // Turn the top-card over if they are all face-down // void CARDLIBPROC RowStackClickProc(CardRegion &stackobj, int iNumClicked) { TRACE("ENTER RowStackClickProc()\n"); int numfacedown; stackobj.GetFaceDirection(&numfacedown); //if all face-down, then make top card face-up if(stackobj.NumCards() == numfacedown) { if(numfacedown > 0) numfacedown--; stackobj.SetFaceDirection(CS_FACE_DOWNUP, numfacedown); stackobj.Redraw(); } TRACE("EXIT RowStackClickProc()\n"); }
// // Can only drag face-up cards // bool CARDLIBPROC RowStackDragProc(CardRegion &stackobj, int iNumDragCards) { TRACE("ENTER RowStackDragProc()\n"); int numfacedown; int numcards; stackobj.GetFaceDirection(&numfacedown); numcards = stackobj.NumCards(); TRACE("EXIT RowStackDragProc()\n"); if(iNumDragCards <= numcards-numfacedown) return true; else return false; }