/*
 *	Spider
 *
 *	(c) Copyright 1989, Donald R. Woods and Sun Microsystems, Inc.
 *	(c) Copyright 1990, David Lemke and Network Computing Devices Inc.
 *
 *	See copyright.h for the terms of the copyright.
 *
 *	@(#)defs.h	2.3	91/05/09
 *
 */

/*
 * std includes and types
 */
#include	<X11/Xlib.h>
#include	<X11/Xutil.h>
#include	<X11/Xos.h>
#include	<stdio.h>
#include	"assert.h"
#include	"copyright.h"

#ifdef DEBUG
/*
 * so i don't have to keep looking up my constants
 */
typedef enum	{Spade, Heart, Diamond, Club}	Suit;

typedef enum	{Ace, Deuce, Three, Four, Five, Six, Seven,
		 Eight, Nine, Ten, Jack, Queen, King}	Rank;

typedef enum	{Faceup, Facedown, Joker}	Type;

#else DEBUG

typedef	char	Suit;
typedef	char	Rank;
typedef	char	Type;

#define	Spade	0
#define	Heart	1
#define	Diamond	2
#define	Club	3

#define	Ace	0
#define	Deuce	1
#define	Three	2
#define	Four	3
#define	Five	4
#define	Six	5
#define	Seven	6
#define	Eight	7
#define	Nine	8
#define	Ten	9
#define	Jack	10
#define	Queen	11
#define	King	12

#define	Faceup		0
#define	Facedown	1
#define	Joker		2

#endif DEBUG

#define	NUM_DECKS	2
#define	NUM_PILES	8
#define	NUM_STACKS	10
#define	NUM_RANKS	13
#define	NUM_SUITS	4
#define	CARDS_PER_DECK	(NUM_RANKS * NUM_SUITS)
#define	NUM_CARDS	(NUM_DECKS * CARDS_PER_DECK)

/* diff locations for a cardlist */
#define	DECK	0

#define	PILE_1	1
#define	PILE_2	2
#define	PILE_3	3
#define	PILE_4	4
#define	PILE_5	5
#define	PILE_6	6
#define	PILE_7	7
#define	PILE_8	8

/* convert a pile value to an array index */
#define	PILE_INDEX(i)	((i) - 1)

#define	STACK_1		11
#define	STACK_2		12
#define	STACK_3		13
#define	STACK_4		14
#define	STACK_5		15
#define	STACK_6		16
#define	STACK_7		17
#define	STACK_8		18
#define	STACK_9		19
#define	STACK_10	20

/* convert a stack value to an array index */
#define	STACK_INDEX(i)	((i) - 11)

#define	LOC_BEFORE	1
#define	LOC_AFTER	2
#define	LOC_END		3
#define	LOC_START	4

typedef	struct	_CardStruct	{
	struct _CardStruct	*prev;
	struct _CardStruct	*next;
	struct	_CardList	*list;
	int	x,y;		/* location */
	Suit	suit;
	Rank	rank;
	Type	type;
	int	draw_count;
}	CardStruct, *CardPtr;

#define	CARDNULL	((CardPtr) 0)

typedef struct _CardList	{
	CardPtr	cards;
	int	place;
	int	card_delta;	/* pixels between cards in stack */
	int	x, y;
}	CardListStruct,	*CardList;

#define	CARDLISTNULL	((CardList) 0)

#ifndef SMALL_CARDS
#define	CARD_DELTA	30	
#else
#define	CARD_DELTA	20
#endif	/* !SMALL_CARDS */


#define	IS_PILE(list)	(((list) != CARDLISTNULL) && (list)->place < STACK_1)

/* gfx defs */

/* card info*/
#ifndef SMALL_CARDS
#define	CARD_HEIGHT	123
#define	CARD_WIDTH	79

#define	FACECARD_WIDTH	47
#define	FACECARD_HEIGHT	92

#define	RANK_WIDTH	9
#define	RANK_HEIGHT	14

#define	RANK_LOC_X	4
#define	RANK_LOC_Y	7

#define	SMALL_LOC_X	4
#define	SMALL_LOC_Y	(RANK_HEIGHT + RANK_LOC_Y + 3)

#define	MID_CARD_X	(CARD_WIDTH/2)
#define	MID_CARD_Y	(CARD_HEIGHT/2)

#define	CARD_COL1_X	(3 * CARD_WIDTH/10)
#define	CARD_COL2_X	(CARD_WIDTH/2)
#define	CARD_COL3_X	(7 * CARD_WIDTH/10)

/* 5 diff rows for the two main columns */
/* 1 and 5 are top and bottom, 3 is the middle */
/* 2 & 4 are for the 10 & 9 */
#define	CARD_ROW1_Y	(CARD_HEIGHT/5)
#define	CARD_ROW2_Y	(2 * CARD_HEIGHT/5)
#define	CARD_ROW3_Y	(CARD_HEIGHT/2)
#define	CARD_ROW4_Y	(CARD_HEIGHT - 2 * CARD_HEIGHT/5)
#define	CARD_ROW5_Y	(CARD_HEIGHT - CARD_HEIGHT/5)

/* between 1 & 3, 3 & 5 */
#define	CARD_SEVEN_Y	(7 * CARD_HEIGHT/20)
#define	CARD_EIGHT_Y	(CARD_HEIGHT - 7 * CARD_HEIGHT/20)

/* between rows 1 & 2, 4 & 5 */
#define	CARD_TEN_Y1	(3 * CARD_HEIGHT/10)
#define	CARD_TEN_Y2	(CARD_HEIGHT - 3 * CARD_HEIGHT/10)

/* card positioning */
#define	CARD_INSET_X	10
#define	CARD_INSET_Y	(CARD_HEIGHT/8)

#define	STACK_WIDTH	(CARD_WIDTH + 10)
#define	STACK_LOC_X(i)	((STACK_INDEX(i) * STACK_WIDTH) + CARD_INSET_X)
#define	STACK_LOC_Y	(CARD_HEIGHT + 3 * CARD_INSET_Y)

#define	PILE_WIDTH	STACK_WIDTH
#define	PILE_INSET_X	(STACK_WIDTH + CARD_INSET_X + CARD_WIDTH)
#define	PILE_LOC_X(i)	((PILE_INDEX(i) * PILE_WIDTH) + PILE_INSET_X)
#define	PILE_LOC_Y	(CARD_INSET_Y)

#define	DECK_X		CARD_INSET_X
#define	DECK_Y		CARD_INSET_Y

#define	TABLE_X		10
#define	TABLE_Y		10

#define	TABLE_WIDTH	(STACK_WIDTH * NUM_STACKS + 2 * CARD_INSET_X)
#define	TABLE_HEIGHT	(STACK_LOC_Y + 2 * CARD_HEIGHT)
#define	TABLE_BW	2

/* pip info */
#define	PIP_WIDTH	10
#define	PIP_HEIGHT	10

#else	/* SMALL_CARDS */

#define	CARD_HEIGHT	60
#define	CARD_WIDTH	40

/* card positioning */
#define	CARD_INSET_X	10
#define	CARD_INSET_Y	(CARD_HEIGHT/8)

#define	STACK_WIDTH	(CARD_WIDTH + 10)
#define	STACK_LOC_X(i)	((STACK_INDEX(i) * STACK_WIDTH) + CARD_INSET_X)
#define	STACK_LOC_Y	(CARD_HEIGHT + 4 * CARD_INSET_Y)

#define	PILE_WIDTH	STACK_WIDTH
#define	PILE_INSET_X	(STACK_WIDTH + CARD_INSET_X + CARD_WIDTH)
#define	PILE_LOC_X(i)	((PILE_INDEX(i) * PILE_WIDTH) + PILE_INSET_X)
#define	PILE_LOC_Y	(CARD_INSET_Y)

#define	DECK_X		CARD_INSET_X
#define	DECK_Y		CARD_INSET_Y

#define	TABLE_X		10
#define	TABLE_Y		10

#define	TABLE_WIDTH	(STACK_WIDTH * NUM_STACKS + 2 * CARD_INSET_X)
#define	TABLE_HEIGHT	(STACK_LOC_Y + 2 * CARD_HEIGHT)
#define	TABLE_BW	2

#endif /* !SMALL_CARDS */

#ifdef KITLESS
#define	MESSAGE_FONT	"fixed"
#define	MESSAGE_X	10
#endif /* KITLESS */
