/* game stuff */

/* GaMe struct  */
typedef struct _gm
{
	LRESULT (FAR *lpfnGmProc)(GM, INT, WPARAM, LPARAM); /* our illustrious gameproc  */
	UDR  udr;          /* undo record  */
	BOOL fDealt;       /* TRUE if cards have been dealt  */
	BOOL fInput;       /* TRUE if input has been recieved after dealing */
	BOOL fWon;         /* TRUE if game is won (and in win sequence)  */
	INT  sco;          /* da sco  */
	INT  iqsecScore;   /* # of quarter seconds since first input  */
	INT  dqsecScore;   /* # of quarter seconds betweeen decrementing score  */
	INT  ccrdDeal;     /* # of cards to deal from deck  */
	INT  irep;         /* # of times thru the deck */
	PT   ptMousePrev;  /* cache of previous mouse position */
	BOOL fButtonDown;  /* TRUE if mouse button down or kbd sel */
	INT  icolKbd;      /* Current cursor position via kbd */
	INT  icrdKbd;					
	INT  icolSel;      /* Current selection  */
	INT  icolHilight;  /* Column currently hilighted (while draggin)  */
	DY	 dyDragMax;    /* maximum height of column (for dragging)  */
	INT  icolMac;
	INT  icolMax;
	COL  *rgpcol[1];
} GM;


// Constants - earlier they were generated in the game.msg file.

#define icolNil             -1
#define msggInit            0		
#define msggEnd             1		
#define msggKeyHit          2	
#define msggMouseDown       3
#define msggMouseUp         4	
#define msggMouseMove       5
#define msggMouseDblClk     6
#define msggPaint           7		
#define msggDeal            8		
#define msggUndo            9		
#define msggSaveUndo        10	
#define msggKillUndo        11	
#define msggIsWinner        12	
#define msggWinner          13	
#define msggScore           14		
#define msggChangeScore     15
#define msggDrawStatus      16
#define msggTimer           17
#define msggForceWin        18	
#define msggMouseRightClk   19


#define ID_ICON_MAIN        500

HICON   hIconMain;              // the main freecell icon.
HICON   hImageMain;             // the main freecell image.

/* Score MoDe  */
typedef INT SMD;
#define smdStandard   ideScoreStandard
#define smdVegas      ideScoreVegas
#define smdNone       ideScoreNone


#define FSelOfGm(pgm)      ((pgm)->icolSel != icolNil)
#define FHilightOfGm(pgm)  ((pgm)->icolHilight != icolNil)



BOOL FInitKlondGm( VOID );
VOID FreeGm(GM *pgm);

#ifdef DEBUG
LRESULT SendGmMsg(GM *pgm, INT msgg, WPARAM wp1, LPARAM wp2);
#else
#define SendGmMsg(pgm, msgg, wp1, wp2) \
	(*((pgm)->lpfnGmProc))((pgm), (msgg), (wp1), (wp2))
#endif	
INT DefGmProc(GM *pgm, INT msgg, WPARAM wp1, LPARAM wp2);


/* standard change score notification codes */
/* instance specific codes should be positive  */
#define csNil     -1  /* no score change  */
#define csAbs     -2  /* change score to an absolute #  */
#define csDel     -3  /* change score by an absolute #  */
#define csDelPos  -4  /* change score by an absolute #, but don't let it get negative */


// define the virtual key constant for key a
#define  VK_A     (INT) 'A'