/*****************************************************************************/
/*									     */
/*									     */
/*	X patience version 2 -- module xpatgame.h			     */
/*									     */
/*	Copyright (C) 1993, 1994 by Heiko Eissfeldt and Michael Bischoff     */
/*	see COPYRIGHT.xpat2 for Copyright details			     */
/*									     */
/*	This file is included by all interface-independent sources	     */
/*									     */
/*									     */
/*****************************************************************************/
#ifndef _POSIX_SOURCE
#define _POSIX_SOURCE
#endif
#include "xpat.h"

/* special values & defs for the "Move" type */
#define MOVE(srcind, dstpile)	((Move)(srcind) | (Move)((dstpile) << 9))
#define MOVE_TURNED	(Move)0x8000
#define DSTPILE(m)	(int)((m >> 9) & 63)
#define SRCIND(m)	(int)(m & 511)

/* special moves have bit 15 set and bit 31 also */
#define SPECIAL_MOVE	0x80008000UL
#define SPECIAL_MASK	0xffff8000UL
#define SPECIAL_ARGS	0x00007fffUL

#define COMPOUND_BEGIN	0xfff08000UL
#define COMPOUND_END	0xfff18000UL
#define ADD_CHEAT	0xfff28000UL	/* | value */
#define ROTATE_UP	0xfff38000UL	/* | srcind */
#define ROTATE_DOWN	0xfff48000UL	/* | srcind */
#define SHUFFLING	0xfff58000UL	/*  */
/* add others here */
#define NEW_CARDS_MOVE	0xffff8000UL
#define NO_MOVE		0xffffffffUL


#define DIFFERENT_COLOR(i, j)	(((i) ^ (j)) & 2)

Move RotateUp(Cardindex);
Move RotateDown(Cardindex);
Move SlotShuffle(int fwd);
void check_win_game(void);
void write_log_file(void);
Cardindex maxsequence(Pileindex ind, Cardindex cardind);

int std_good_hint(int srcindex, int dstpile);

void jumpto_movenr(int movenr);	/* without graphics! */


Cardindex complete_suit(Pileindex pile, Cardindex i);
void check_win_game(void);
int in_relaxed_sequence(int srccard, int dstcard);
int in_strong_sequence(int srccard, int dstcard);
Cardindex slotsequence(Pileindex ind, Cardindex start, Cardindex stop);
Cardindex relaxedslotsequence(Pileindex ind, Cardindex start, Cardindex stop);
int move_valid(int, int );
int default_movevalid(int, int );
int move_to_stack(Pileindex);
int check_new_cards(void);

Cardindex stackable(Pileindex);

/* rules.c */
void memo_alloc(int);
void store_move(Move);
int undo_move(void);		/* returns 1, if undo possible */
int redo_move(void);		/* returns 1, is redo possible */
Move do_move(Cardindex, Pileindex);
int all_to_stack(void);
Move give_new_cards(void);


/* hints.c */
void do_last_hint(void);
int generic_automove(Cardindex);

/* events.c */
void event_loop(void);
void resize_desktop(int w, int h, int request);


/* cards.c */
/* void redraw_buttons(int, int, int, int, Window, int, struct singlebutton *); */
void redraw_one_pile(int, int, int, int, int);


/* buttons.c */

/* commands.c */

/* loadsave.c */

/* tools.c */
#define PRANDMAX 1000000000L
void sprand(long);
long prand(void);
