This is SpiderGameDelegate.m in view mode; [Download] [Up]
/* indent:4 tabsize:8 font:fixed-width */ #import "SpiderGameDelegate.h" #import "SpiderSuitDelegate.h" //#import "../Solitaire/Solitaire.h" #import "Spider.h" @implementation SpiderGameDelegate - (void) clickedCard:(Card*)aCard in:(CardPileView*)aCardPileView { CardPile* cardPile = [aCardPileView cardPile]; if ((aCard == [cardPile topCard]) && (![aCard isFaceUp])) { [aCard flip]; [aCardPileView display]; } } - (BOOL) draggedPile:(CardPile*)aCardPile from:(CardPileView*)aCardPileView { CardPile* cardPile = [aCardPileView cardPile]; Card* firstCard = [aCardPile topCard]; int cardIndex = [cardPile indexOfCard:firstCard]; int i; int total; Card* newCard; CardSuit suit; CardValue lastValue; if ([firstCard isFaceUp]) { total = [cardPile cardCount]; lastValue = [firstCard value]; suit = [firstCard suit]; /* Can only drag if all cards above are same suit and in descending sequence */ for (i = cardIndex + 1; i < total; i++) { newCard = [cardPile cardAtIndex:i]; if ([newCard suit] != suit) return NO; if ([newCard value] != --lastValue) return NO; } /* Move cards above dragged card onto temporary pile */ while (++cardIndex < [cardPile cardCount]) { [aCardPile addCard:[cardPile cardAtIndex:cardIndex]]; } return YES; } return NO; } - (BOOL) canAcceptPile:(CardPile*)aCardPile from:sender in:(CardPileView*)aCardPileView { Card* droppingCard = [aCardPile bottomCard]; Card* targetCard = [[aCardPileView cardPile] topCard]; if (targetCard) { if (([targetCard isFaceUp]) && ([targetCard value] == [droppingCard value] + 1)) { return YES; } } else { return YES; } return NO; } - (void) getOffset:(float*)xOffset :(float*)yOffset forSize:(CardSize)aSize { *xOffset = 0.0; if (aSize == CS_SMALL) *yOffset = 20.0; else *yOffset = 25.0; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.