This is GameCardPileDelegate.m in view mode; [Download] [Up]
/* indent:4 tabsize:8 font:fixed-width */ #import "GameCardPileDelegate.h" #import <Solitaire/CardSet.h> #import "Pyramid.h" @implementation GameCardPileDelegate /*-------------------------------------------------------------------------- | | - setDiscardLeft:left discardRight:right | |--------------------------------------------------------------------------- | | Set connections to other piles. | \--------------------------------------------------------------------------*/ - (void) setDiscardLeft:(CardPileView*)left discardRight:(CardPileView*)right { discardCardPileViewL = left; discardCardPileViewR = right; } /*-------------------------------------------------------------------------- | | - (BOOL)draggedPile:aCardPile from:gameCardPileView | | returns: (BOOL) YES if it is legal to drag the card. | | (BOOL) NO if it is not legal to drag the card. | |--------------------------------------------------------------------------- | | Called by a GamePileCardView when the user tries to drag a card. | \--------------------------------------------------------------------------*/ - (BOOL) draggedPile:(CardPile*)aCardPile from:(CardPileView*)gameCardPileView { /*----------------------------------------------------------------------- * * Dragging is only allowed if the pile is not covered. * *-----------------------------------------------------------------------*/ if ([gameCardPileView pileCovered:self]) return NO; else return YES; } /*-------------------------------------------------------------------------- | | - removedPile: aCardPile from: gameCardPileView | |--------------------------------------------------------------------------- | | Called by a GamePileCardView after cards have been dragged off | the pile. | \--------------------------------------------------------------------------*/ - (void) removedPile:(CardPile*)aCardPile from:(CardPileView*)aCardPileView { /*----------------------------------------------------------------------- | | Since the game piles only contain a single card, we | know that the pile is now empty, so we remove it from | its superview's list of subviews. This prevents the pile | from getting any more mouse events. | \----------------------------------------------------------------------*/ [aCardPileView removeFromSuperview]; [[Pyramid sharedInstance] checkForWin]; } /*-------------------------------------------------------------------------- | | - (BOOL) canAcceptPile:aCardPile from:sender in:gameCardPileView | | returns: (BOOL) YES if card pile will accept dropped cards. | | (BOOL) NO if this card pile rejects the dropped cards. | |--------------------------------------------------------------------------- | | Called by a GamePileCardView when the user tries to drop cards on it. | \---------------------------------------------------------------------------*/ - (BOOL) canAcceptPile:(CardPile*)aCardPile from:sender in:(CardPileView*)gameCardPileView { Card* card1 = [aCardPile topCard]; Card* card2 = [[gameCardPileView cardPile] topCard]; /*----------------------------------------------------------------------- | | Can only accept a card if this pile is not covered by | others, and the two cards add to 13. | \----------------------------------------------------------------------*/ if (![gameCardPileView pileCovered:sender]) { /* #define PYRAMID_CHEAT_CHEAT_CHEAT */ #ifndef PYRAMID_CHEAT_CHEAT_CHEAT if (card1 && card2) { if (([card1 value] + [card2 value]) == 11) return YES; } #else return YES; #endif } return NO; } /*-------------------------------------------------------------------------- | | - acceptPile: aCardPile in: gameCardPileView | |--------------------------------------------------------------------------- | | Called by a GamePileCardView after cards have been successfully | added to the pile as a result of cards being dropped on it. | \---------------------------------------------------------------------------*/ - (void) acceptPile:(CardPile*)aCardPile in:(CardPileView*)gameCardPileView { CardPile* leftMatchPile = [discardCardPileViewL cardPile]; CardPile* rightMatchPile = [discardCardPileViewR cardPile]; CardPile* gamePile = [gameCardPileView cardPile]; Card* aCard; /*----------------------------------------------------------------------- | | Remove both cards from the game pile, and move | them to the match piles. Then remove the game pile | view from it's superviews list, so that it doesn't get | any more mouse events. \------------------------------------------------------------------------*/ aCard = [gamePile dealTopCard]; [leftMatchPile addCard:aCard]; aCard = [gamePile dealTopCard]; [rightMatchPile addCard:aCard]; [discardCardPileViewL display]; [discardCardPileViewR display]; [gameCardPileView display]; [gameCardPileView removeFromSuperview]; [[Pyramid sharedInstance] checkForWin]; } /*-------------------------------------------------------------------------- | | doubleClickedCard:aCard in:aCardPileView | |--------------------------------------------------------------------------- | | Double clicked on a card; discard if it is a King. | \--------------------------------------------------------------------------*/ - (void) doubleClickedCard:(Card*)aCard in:(CardPileView*)aCardPileView { CardPile* cardPile = [aCardPileView cardPile]; // can't remove a card that's covered if ([aCardPileView pileCovered:self]) { return; } if (aCard && (aCard == [cardPile topCard]) && [aCard value] == CS_KING) { [[discardCardPileViewL cardPile] addCard:[cardPile topCard]]; [cardPile removeCard:[cardPile topCard]]; [aCardPileView display]; [aCardPileView removeFromSuperview]; [discardCardPileViewL display]; [[Pyramid sharedInstance] checkForWin]; } } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.