This is TenpileGameDelegate.m in view mode; [Download] [Up]
/* indent:4 tabsize:8 font:fixed-width */ #import "TenpileGameDelegate.h" #import "TenpileSuitDelegate.h" #import "../Solitaire/Solitaire.h" #import "Tenpile.h" @implementation TenpileGameDelegate - setSuitCardPileViews:(id [])theViews { int i; for (i = 0; i < 4; i++) suitCardPileViews[i] = *(theViews + i); return self; } - setTempCardPileViews:(id [])theViews { int i; for (i = 0; i < 4; i++) tempCardPileViews[i] = *(theViews + i); return self; } - clickedCard:aCard in:aCardPileView { id cardPile = [aCardPileView cardPile]; if ((aCard == [cardPile cardAt:CS_TOP]) && (![aCard isFaceUp])) { [aCard flip]; [aCardPileView display]; } return self; } - doubleClickedCard:aCard in:aCardPileView { int i; id cardPile = [aCardPileView cardPile]; if ((aCard == [cardPile cardAt:CS_TOP]) && (![aCard isFaceUp])) { [aCard flip]; [aCardPileView display]; } else if (aCard == [cardPile cardAt:CS_TOP]) { for (i = 0; i < 4; i++) { [[suitCardPileViews[i] delegate]setDoubleClickCheck]; if ([[suitCardPileViews[i] delegate] canAcceptPile:cardPile from:aCardPileView in:suitCardPileViews[i]]) { [[suitCardPileViews[i] cardPile] addCard:[cardPile cardAt:CS_TOP]]; [cardPile removeCard:[cardPile cardAt:CS_TOP]]; [aCardPileView display]; [suitCardPileViews[i] display]; [SolGameController() checkForWin]; break; } } } return self; } - (BOOL)draggedPile:aCardPile from:aCardPileView { id cardPile = [aCardPileView cardPile]; id firstCard = [aCardPile cardAt:CS_TOP]; int cardIndex = [cardPile cardIndex:firstCard]; int i; int total; id newCard; CardColor color, lastColor; CardValue lastValue; int freePiles; if ([firstCard isFaceUp]) { total = [cardPile cardCount]; lastValue = [firstCard value]; lastColor = [firstCard cardColor]; /* Can only drag if all cards above are alternating color and in descending sequence */ for (i = cardIndex + 1; i < total; i++) { newCard = [cardPile cardAt:i]; if ([newCard value] != --lastValue) return NO; color = [newCard cardColor]; if (color == lastColor) return NO; lastColor = color; } /* Count number of empty temporary piles. */ for (i = freePiles = 0; i < 4; i++) if ([[tempCardPileViews[i] cardPile] cardCount] == 0) freePiles++; /* Move cards above dragged card onto temporary pile */ while (++cardIndex < [cardPile cardCount] && freePiles-- > 0) { [aCardPile addCard:[cardPile cardAt:cardIndex]]; } if (cardIndex == [cardPile cardCount]) return YES; } return NO; } - (BOOL)canAcceptPile:aCardPile from:sender in:aCardPileView { id droppingCard = [aCardPile cardAt:CS_BOTTOM]; id targetCard = [[aCardPileView cardPile] cardAt:CS_TOP]; 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; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.