|
|
/****************************************************************************
FREECELL.H
June 91, JimH initial code Oct 91, JimH port to Win32
Main header file for Windows Free Cell. Constants are in freecons.h
****************************************************************************/
#include <windows.h>
#include <port1632.h>
#define WINHEIGHT 480
#define WINWIDTH 640
#define FACEUP 0 // card mode
#define FACEDOWN 1
#define HILITE 2
#define GHOST 3
#define REMOVE 4
#define INVISIBLEGHOST 5
#define DECKX 6
#define DECKO 7
#define EMPTY 0xFFFFFFFF
#define IDGHOST 52 // eg, empty free cell
#define MAXPOS 21
#define MAXCOL 9 // includes top row as column 0
#define MAXMOVELIST 150 // size of movelist array
#define TOPROW 0 // column 0 is really the top row
#define BLACK 0 // COLOUR(card)
#define RED 1
#define ACE 0 // VALUE(card)
#define DEUCE 1
#define CLUB 0 // SUIT(card)
#define DIAMOND 1
#define HEART 2
#define SPADE 3
#define FROM 0 // wMouseMode
#define TO 1
#define ICONWIDTH 32 // in pixels
#define ICONHEIGHT 32
#define BIG 128 // str buf sizes
#define SMALL 32
#define MAXGAMENUMBER 1000000
#define CANCELGAME (MAXGAMENUMBER + 1)
#define NONE 0 // king bitmap identifiers
#define SAME 1
#define RIGHT 2
#define LEFT 3
#define SMILE 4
#define BMWIDTH 32 // bitmap width
#define BMHEIGHT 32 // bitmap height
#define LOST 0 // used for streaks
#define WON 1
#define FLASH_TIMER 2 // timer id for main window flash
#define FLASH_INTERVAL 400 // flash timer interval
#define FLIP_TIMER 3 // timer id for flipping column
#define FLIP_INTERVAL 300
#define CHEAT_LOSE 1 // used with bCheating
#define CHEAT_WIN 2
/* Macros */
#define SUIT(card) ((card) % 4)
#define VALUE(card) ((card) / 4)
#define COLOUR(card) (SUIT(card) == 1 || SUIT(card) == 2)
#define REGOPEN RegCreateKey(HKEY_CURRENT_USER, pszRegPath, &hkey);
#define REGCLOSE RegCloseKey(hkey);
#define DeleteValue(v) RegDeleteValue(hkey, v)
/* Types */
typedef INT CARD;
typedef struct { // movelist made up of these
UINT fcol; UINT fpos; UINT tcol; UINT tpos; } MOVE;
/* Callback function prototypes */
// INT PASCAL MMain(HANDLE, HANDLE, LPSTR, INT);
LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR APIENTRY About(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); INT_PTR APIENTRY GameNumDlg(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); INT_PTR APIENTRY MoveColDlg(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); INT_PTR APIENTRY StatsDlg(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); INT_PTR APIENTRY YouLoseDlg(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); INT_PTR APIENTRY YouWinDlg(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); INT_PTR APIENTRY OptionsDlg(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);
/* Functions imported from cards.dll */
BOOL APIENTRY cdtInit(UINT FAR *pdxCard, UINT FAR *pdyCard); BOOL APIENTRY cdtDraw(HDC hdc, INT x, INT y, INT cd, INT mode, DWORD rgbBgnd); BOOL APIENTRY cdtDrawExt(HDC hdc, INT x, INT y, INT dx, INT dy, INT cd, INT mode, DWORD rgbBgnd); BOOL APIENTRY cdtTerm(VOID);
/* Other function prototypes */
VOID CalcOffsets(HWND hWnd); UINT CalcPercentage(UINT cWins, UINT cLosses); VOID Card2Point(UINT col, UINT pos, UINT *x, UINT *y); VOID Cleanup(VOID); VOID CreateMenuFont(VOID); VOID DisplayCardCount(HWND hWnd); VOID DrawCard(HDC hDC, UINT col, UINT pos, CARD c, INT mode); VOID DrawCardMem(HDC hMemDC, CARD c, INT mode); VOID DrawKing(HDC hDC, UINT state, BOOL bDraw); UINT FindLastPos(UINT col); BOOL FitsUnder(CARD fcard, CARD tcard); VOID Flash(HWND hWnd); VOID Flip(HWND hWnd); UINT GenerateRandomGameNum(VOID); CHAR *GetHelpFileName(VOID); INT GetInt(CONST TCHAR *pszValue, INT nDefault); VOID Glide(HWND hWnd, UINT fcol, UINT fpos, UINT tcol, UINT tpos); VOID GlideStep(HDC hDC, UINT x1, UINT y1, UINT x2, UINT y2); BOOL InitApplication(HANDLE hInstance); BOOL InitInstance(HANDLE hInstance, INT nCmdShow); VOID IsGameLost(HWND hWnd); BOOL IsValidMove(HWND hWnd, UINT tcol, UINT tpos); VOID KeyboardInput(HWND hWnd, UINT keycode); UINT MaxTransfer(VOID); UINT MaxTransfer2(UINT freecells, UINT freecols); VOID MoveCards(HWND hWnd); VOID MoveCol(UINT fcol, UINT tcol); VOID MultiMove(UINT fcol, UINT tcol); UINT NumberToTransfer(UINT fcol, UINT tcol); VOID PaintMainWindow(HWND hWnd); VOID Payoff(HDC hDC); BOOL Point2Card(UINT x, UINT y, UINT *col, UINT *pos); BOOL ProcessDoubleClick(HWND hWnd); VOID ProcessMoveRequest(HWND hWnd, UINT x, UINT y); VOID ProcessTimer(HWND hWnd); VOID QueueTransfer(UINT fcol, UINT fpos, UINT tcol, UINT tpos); VOID ReadOptions(VOID); VOID RestoreColumn(HWND hWnd); VOID RevealCard(HWND hWnd, UINT x, UINT y); VOID SetCursorShape(HWND hWnd, UINT x, UINT y); VOID SetFromLoc(HWND hWnd, UINT x, UINT y); LONG SetInt(CONST TCHAR *pszValue, INT n); VOID ShuffleDeck(HWND hWnd, UINT_PTR seed); VOID StartMoving(HWND hWnd); VOID Transfer(HWND hWnd, UINT fcol, UINT fpos, UINT tcol, UINT tpos); VOID Undo(HWND hWnd); VOID UpdateLossCount(VOID); BOOL Useless(CARD c); VOID WMCreate(HWND hWnd); VOID WriteOptions(VOID);
/* Global variables */
TCHAR bigbuf[BIG]; // general purpose LoadString() buffer
CHAR bighelpbuf[BIG]; // general purpose char buffer.
BOOL bCheating; // hit magic key to win?
BOOL bDblClick; // honor double click?
BOOL bFastMode; // hidden option, don't do glides?
BOOL bFlipping; // currently flipping cards in a column?
BOOL bGameInProgress; // true if game is in progress
BOOL bMessages; // are "helpful" MessageBoxen shown?
BOOL bMonochrome; // 2 colour display?
BOOL bMoveCol; // did user request column move (or 1 card)?
BOOL bSelecting; // is user selecting game numbers?
BOOL bWonState; // TRUE if game won and new game not started
UINT dxCrd, dyCrd; // extents of card bitmaps in pixels
CARD card[MAXCOL][MAXPOS]; // current layout of cards
INT cFlashes; // count of main window flashes remaining
UINT cGames; // number of games played in current session
UINT cLosses; // number of losses in current session
UINT cWins; // number of wins in current session
UINT cMoves; // number of moves in this game
UINT dyTops; // vert space between cards in columns
CARD shadow[MAXCOL][MAXPOS]; // shadows card array for multi-moves & cleanup
INT gamenumber; // current game number (rand seed)
HBITMAP hBM_Ghost; // bitmap for ghost (empty) free/home cells
HBITMAP hBM_Bgnd1; // screen under source location
HBITMAP hBM_Bgnd2; // screen under destination location
HBITMAP hBM_Fgnd; // bitmap that moves across screen
HICON hIconMain; // the main freecell icon.
HKEY hkey; // registry key
HPEN hBrightPen; // 3D highlight colour
HANDLE hInst; // current instance
HWND hMainWnd; // hWnd for main window
HFONT hMenuFont; // for Cards Left display
CARD home[4]; // card on top of home pile for this suit
CARD homesuit[4]; // suit for each home pile
HBRUSH hBgndBrush; // green background brush
UINT_PTR idTimer; // flash timer id
UINT moveindex; // index to end of movelist
MOVE movelist[MAXMOVELIST]; // compacted list of pending moves for timer
INT oldgamenumber; // previous game (repeats don't count in score)
TCHAR *pszIni; // .ini filename
TCHAR smallbuf[SMALL]; // generic small buffer for LoadString()
TCHAR titlebuf[BIG]; // a buffer used to store the window title.
UINT wCardCount; // cards not yet in home cells (0 == win)
UINT wFromCol; // col user has selected to transfer from
UINT wFromPos; // pos "
UINT wMouseMode; // selecting place to transfer FROM or TO
UINT xOldLoc; // previous location of cards left text
INT cUndo; // number of cards to undo
/* registry value names */
extern CONST TCHAR pszRegPath[]; extern CONST TCHAR pszWon[]; extern CONST TCHAR pszLost[]; extern CONST TCHAR pszWins[]; extern CONST TCHAR pszLosses[]; extern CONST TCHAR pszStreak[]; extern CONST TCHAR pszSType[]; extern CONST TCHAR pszMessages[]; extern CONST TCHAR pszQuick[]; extern CONST TCHAR pszDblClick[]; extern CONST TCHAR pszAlreadyPlayed[];
/* TRACE mechanism */
#if 0
TCHAR szDebugBuffer[256]; #define DEBUGMSG(parm1,parm2)\
{ wsprintf(szDebugBuffer,parm1,parm2);\ OutputDebugString(szDebugBuffer); }
#define assert(p) { if (!(p)) {wsprintf(szDebugBuffer, TEXT("assert: %s %d\r\n"),\
__FILE__, __LINE__); OutputDebugString(szDebugBuffer);}}
#else
#define DEBUGMSG(parm1,parm2)
#endif
#define SPY(parm1) // not used in NT version
|