Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

262 lines
9.8 KiB

/****************************************************************************
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