This is GamePileDelegate.m in view mode; [Download] [Up]
/* indent:4 tabsize:8 font:fixed-width */ #import "GamePileDelegate.h" #import "SuitPileDelegate.h" #import "Klondike.h" @implementation GamePileDelegate - setEnabled:(BOOL)flag { isEnabled = flag; return self; } - setSuitCardPileViews:(id [])theViews { int i; for (i=0; i<4; i++) suitCardPileViews[i] = *(theViews + i); return self; } - clickedCard:aCard in:aCardPileView { id cardPile = [aCardPileView cardPile]; if(!isEnabled) return nil; if ((aCard == [cardPile cardAt:CS_TOP]) && (![aCard isFaceUp])) { [aCard flip]; //[PBoss() playSound:NV_CARDSOUND]; [aCardPileView display]; } return self; } - doubleClickedCard:aCard in:aCardPileView { int i; id cardPile = [aCardPileView cardPile]; if(!isEnabled) return nil; if ((aCard == [cardPile cardAt:CS_TOP]) && (![aCard isFaceUp])) { [aCard flip]; [aCardPileView display]; } else if([aCard isFaceUp]) { id homePileView; id movePile = [[CardPile allocFromZone:[self zone]] initForCardSize:[cardPile returnSize]]; int cardIndex = [cardPile cardIndex:aCard]; [movePile addCard:aCard]; [self draggedPile:movePile from:aCardPileView]; if(homePileView = [Dealer() findHomeFor:movePile fromPileView:aCardPileView]) { [[homePileView cardPile] addPile:movePile]; for(i=0; i<[movePile cardCount]; i++) { [cardPile removeCard:[movePile cardAt:i]]; } [aCardPileView display]; [homePileView display]; [Dealer() checkForWin]; // flip over card under the one we moved, if it isn't already. if(![[cardPile cardAt:cardIndex-1] isFaceUp]) { [[cardPile cardAt:cardIndex-1] setFaceUp:YES]; [aCardPileView display]; } } } return self; } - (BOOL)draggedPile:aCardPile from:aCardPileView { id cardPile = [aCardPileView cardPile]; id firstCard = [aCardPile cardAt:CS_TOP]; int cardIndex = [cardPile cardIndex:firstCard]; if(!isEnabled) return NO; if ([firstCard isFaceUp]) { while (++cardIndex < [cardPile cardCount]) { [aCardPile addCard:[cardPile cardAt:cardIndex]]; } //[PBoss() playSound:NV_CARDSOUND]; return YES; } return NO; } // sender is the pasteboard, aCardPileView is the receiving view, aCardPile is the // pile that is being dragged. - (BOOL)canAcceptPile:aCardPile from:sender in:aCardPileView { id droppingCard = [aCardPile cardAt:CS_BOTTOM]; id targetCard = [[aCardPileView cardPile] cardAt:CS_TOP]; if(!isEnabled) return NO; if (targetCard) { if (([targetCard isFaceUp]) && ([targetCard cardColor] != [droppingCard cardColor]) && ([targetCard value] == [droppingCard value] + 1)) { return YES; } } else { if ([droppingCard value] == CS_KING) { return YES; } } return NO; } - getOffset:(float *) xOffset :(float *) yOffset forSize:(CardSize)aSize { *xOffset = 0.0; if (aSize == CS_SMALL) *yOffset = 20.0; else *yOffset = 25.0; return self; } - removedPile:aCardPile from:gameCardPileView /* * Flip over top card if it isn't already. */ { if(![[[gameCardPileView cardPile] cardAt:CS_TOP] isFaceUp]) [[[gameCardPileView cardPile] cardAt:CS_TOP] setFaceUp:YES]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.