This is CribLayoutDelegate.m in view mode; [Download] [Up]
// indent:4 tabsize:4 font:fixed-width
//
// The Cribbage Solitaire module.
//
// Copyright 1994 by David Fedchenko. All rights reserved.
//
#import "CribLayoutDelegate.h"
#import "CribDrawDelegate.h"
#import "../Solitaire/Solitaire.h"
#import "Cribbage.h"
@implementation CribLayoutDelegate
//--------------------------------------------------------------------------
// - setStrict:
//
// returns: (id) self
//
// Sets the flag which limits card placement.
//--------------------------------------------------------------------------
- setStrict:(BOOL)flag
{
fStrict = flag;
return self;
}
//--------------------------------------------------------------------------
// - setDrawPileView:
//
// returns: (id) self
//
// Sets a pointer to the Draw pile.
//--------------------------------------------------------------------------
- setDrawPileView:idView
{
idDrawPileView = idView;
return self;
}
//--------------------------------------------------------------------------
// - clickedCard:in:
//
// returns: (id) self
//
// Takes care of the speed mode of play. This allows the empty positions
// to be clicked and have the card jump into them.
//--------------------------------------------------------------------------
- clickedCard:aCard in:aCardPileView
{
id idCard;
if (aCard || ![self checkValidity:aCardPileView])
{
return self;
}
idCard = [[idDrawPileView cardPile] cardAt:CS_TOP];
[[aCardPileView cardPile] addCard:idCard];
[[idDrawPileView cardPile] removeCard:idCard];
[[[idDrawPileView cardPile] cardAt:CS_TOP] flip];
[[SolGameController() gameWindow] display];
[SolGameController() checkForWin];
return self;
}
//--------------------------------------------------------------------------
// - acceptPile:in:
//
// returns: (id) self
//
// Does nothing, but makes sure the tableau pile gets the card.
//--------------------------------------------------------------------------
- acceptPile:aCardPile in:aCardPileView
{
return self;
}
//--------------------------------------------------------------------------
// - canAcceptPile:from:in:
//
// returns: (BOOL) flag
//
// Checks, depending on the strict mode flag, whether a card can legally
// be placed in the given pile.
//--------------------------------------------------------------------------
-(BOOL) canAcceptPile:aCardPile from:sender in:aCardPileView
{
if ([[aCardPileView cardPile] cardCount])
{
return NO;
}
return [self checkValidity:aCardPileView];
}
//--------------------------------------------------------------------------
// - checkValidity:
//
// returns: (BOOL) flag
//
// When in strict mode, checks to make sure that the pile being queried has
// at least one neighbor.
//--------------------------------------------------------------------------
-(BOOL) checkValidity:aCardPileView
{
id idGrid[16];
int i;
int j;
int x;
int y;
int x1;
int y1;
int c;
int which = -1;
if (!fStrict)
{
return YES;
}
[SolGameController() loadCardArray:idGrid];
c = 0;
for (i = 0; i < 16; i++)
{
c += [[idGrid[i] cardPile] cardCount];
if (idGrid[i] == aCardPileView)
{
which = i;
}
}
if (c && (which != -1))
{
c = 0;
y = which % 4;
x = which / 4;
for (i = -1; i <= 1; i++)
{
x1 = x + i;
for (j = -1; j <= 1; j++)
{
y1 = y + j;
if (x1 > -1 && x1 < 4 && y1 > -1 && y1 < 4)
{
c += [[idGrid[x1 * 4 + y1] cardPile] cardCount];
}
}
}
if (!c)
{
return NO;
}
}
return YES;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.