ftp.nice.ch/Attic/openStep/games/Solitaire.3.1.s.tgz#/Solitaire.3.1/Games/Spider/SpiderGameDelegate.m

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.