ftp.nice.ch/pub/next/games/card/Solitaire.2.1.s.tar.gz#/Solitaire.2.1.s/Tenpile/TenpileGameDelegate.m

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.