windows-nt/Source/XPSP1/NT/shell/osshell/ep/pegged/pegged.c
2020-09-26 16:20:57 +08:00

2332 lines
55 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Pegged.C -- Windows Game*/
/* (c) By Mike Blaylock - 1989, 1990 */
#include "windows.h"
#include <port1632.h>
#include "math.h"
#include "pegged.h"
#define DIVISIONS 7
#define ICON_NAME "Pegged"
#define HELP_FILE "pegged.hlp"
VOID checkfvmove();
VOID checkfanymoves();
VOID APIENTRY AboutWEP(HWND, HICON, LPSTR, LPSTR);
RECT r;
INT prevxorg, prevyorg;
INT prevwidth, prevheight;
HWND hWnd ;
HANDLE hAccTable;
INT m = 0, nDefault = 3;
LONG_PTR prevwarea, newarea;
INT xPrevpoint, yPrevpoint, xLeft, yTop;
WPARAM wprevmenuitem;
HANDLE hPeggedIcon;
HANDLE hBitmap, hWBitmap , hIntBitmap, hOldWBitmap, hOldIntBitmap,
hBoardBitmap, hOldBoardBitmap, htmpBitmap, hWtmpBitmap , hInttmpBitmap,
hOldWtmpBitmap, hOldInttmpBitmap, hBoardtmpBitmap, hOldBoardtmpBitmap;
INT icross = 1, iplus = 0, ifireplace = 0, ipyramid = 0, ilamp
= 0, idiamond = 0, iuparrow = 0, isolitaire = 0, fanymoremoves
= 0, ntotal = 0, fignorelbutton = 0, fmousefocusd = 0;
INT ffirst = 1, foomed = 0;
LPSTR lpszCommands[10], lpszHowToPlay[10];
LONG lPrevSizeParam ;
struct {
INT xsource;
INT ysource;
INT xdest;
INT ydest;
INT xjumped;
INT yjumped;
} move[34];
LRESULT APIENTRY WndProc (HWND, UINT, WPARAM, LPARAM) ;
CHAR szAppName [] = "Pegged";
static BOOL bState [DIVISIONS][DIVISIONS];
HDC hDC, hMemDC, hMemwinDC, hIntDC, hBoardDC, htmpMemDC, htmpMemwinDC,
htmpIntDC, htmpBoardDC;
HBRUSH hLtgrybrush, hDkgrybrush, hYbrush, hBbrush, hBlkbrush,
hGbrush, hMedgrybrush;
HPEN hWpen, hLtwpen, hBlkpen, hDkgrypen, hThkdkgrypen, hMedgrypen,
hLtgrypen;
INT first = 1, fhitbutton = 0, fmovingchip = 0, fvalidmove = 0,
fcanundo = 0, foom = 0, foomonsize = 0;
INT ixdownblock, iydownblock, ixupblock, iyupblock, ixkilledblock,
iykilledblock, ixjumpedblock, iyjumpedblock, ixprevsource, iyprevsource,
ixprevdest, iyprevdest, ixprevkilled, iyprevkilled;
MMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
/* { */
/* HWND hWnd ;*/
MSG msg ;
WNDCLASS wndclass ;
static INT xScreen, yScreen, xSize, ySize;
/*multinst.c */
if (hPrevInstance)
{
hWnd = FindWindow(szAppName, NULL);
SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, (LONG) 0);
hWnd = GetLastActivePopup(hWnd);
BringWindowToTop(hWnd);
return FALSE;
}
if (!hPrevInstance)
{
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon(hInstance, (LPSTR) ICON_NAME);
hPeggedIcon = wndclass.hIcon;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
return FALSE ;
}
xScreen = GetSystemMetrics(SM_CXSCREEN);
yScreen = GetSystemMetrics(SM_CYSCREEN);
if (xScreen > yScreen)
{
xSize = (xScreen / 8) * 3;
ySize = xSize;
} else
{
ySize = (yScreen / 8) * 3;
xSize = ySize;
}
hWnd = CreateWindow (szAppName, "Pegged",
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX,
(xScreen-xSize)
/ 2, (yScreen-ySize)
/ 2,
xSize, ySize,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hWnd, nCmdShow) ;
UpdateWindow (hWnd) ;
hAccTable = LoadAccelerators(hInstance, "MainAcc");
while (GetMessage (&msg, NULL, 0, 0)
)
if (!TranslateAccelerator(hWnd, hAccTable, &msg)
)
{
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
return (INT) msg.wParam ;
}
LRESULT APIENTRY WndProc (
HWND hWnd,
UINT iMessage,
WPARAM wParam,
LPARAM lParam)
{
static INT xBlock, xsizedBlock, yBlock, ysizedBlock, xEdge,
yEdge, xShadow, yShadow, xHalf, yHalf, winxEdge, winyEdge;
HDC hDC;
PAINTSTRUCT ps;
RECT rect;
LONG xul, yul;
INT x, y, j, k;
static INT xClient, xsizedClient, yClient, ysizedClient,
xCenter, yCenter, oldxCenter, oldyCenter, xTotal, yTotal,
xRadius, yRadius, xMove, yMove, xPixel, yPixel, i;
INT xPoint, yPoint, xUp, yUp;
SHORT nScale;
BOOL bShow;
MSG message;
HMENU hMenu;
switch (iMessage) {
case WM_INITMENUPOPUP:
if (m)
EnableMenuItem((HMENU)wParam, IDM_UNDO, MF_ENABLED);
else
EnableMenuItem((HMENU)wParam, IDM_UNDO, MF_GRAYED);
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDM_NEW:
m = 0;
hDC = GetDC(hWnd);
if (isolitaire) {
for (j = 0; j < 7; ++j)
for (k = 0; k < 7; ++k) {
if ((j > 1 && j < 5) || (k > 1 && k < 5))
if (!(j == 3 && k == 3))
bState[j][k] = 1;
else
bState[j][k] = 0;
}
}
if (icross) {
bState[0][2] = 0;
bState[0][3] = 0;
bState[0][4] = 0;
bState[1][2] = 0;
bState[1][3] = 0;
bState[1][4] = 0;
bState[2][0] = 0;
bState[2][1] = 0;
bState[2][2] = 1;
bState[2][3] = 0;
bState[2][4] = 0;
bState[2][5] = 0;
bState[2][6] = 0;
bState[3][0] = 0;
bState[3][1] = 1;
bState[3][2] = 1;
bState[3][3] = 1;
bState[3][4] = 1;
bState[3][5] = 0;
bState[3][6] = 0;
bState[4][0] = 0;
bState[4][1] = 0;
bState[4][2] = 1;
bState[4][3] = 0;
bState[4][4] = 0;
bState[4][5] = 0;
bState[4][6] = 0;
bState[5][2] = 0;
bState[5][3] = 0;
bState[5][4] = 0;
bState[6][2] = 0;
bState[6][3] = 0;
bState[6][4] = 0;
}
if (iuparrow) {
bState[0][2] = 0;
bState[0][3] = 0;
bState[0][4] = 0;
bState[1][2] = 1;
bState[1][3] = 0;
bState[1][4] = 0;
bState[2][0] = 0;
bState[2][1] = 1;
bState[2][2] = 1;
bState[2][3] = 0;
bState[2][4] = 0;
bState[2][5] = 1;
bState[2][6] = 1;
bState[3][0] = 1;
bState[3][1] = 1;
bState[3][2] = 1;
bState[3][3] = 1;
bState[3][4] = 1;
bState[3][5] = 1;
bState[3][6] = 1;
bState[4][0] = 0;
bState[4][1] = 1;
bState[4][2] = 1;
bState[4][3] = 0;
bState[4][4] = 0;
bState[4][5] = 1;
bState[4][6] = 1;
bState[5][2] = 1;
bState[5][3] = 0;
bState[5][4] = 0;
bState[6][2] = 0;
bState[6][3] = 0;
bState[6][4] = 0;
}
if (iplus) {
bState[0][2] = 0;
bState[0][3] = 0;
bState[0][4] = 0;
bState[1][2] = 0;
bState[1][3] = 1;
bState[1][4] = 0;
bState[2][0] = 0;
bState[2][1] = 0;
bState[2][2] = 0;
bState[2][3] = 1;
bState[2][4] = 0;
bState[2][5] = 0;
bState[2][6] = 0;
bState[3][0] = 0;
bState[3][1] = 1;
bState[3][2] = 1;
bState[3][3] = 1;
bState[3][4] = 1;
bState[3][5] = 1;
bState[3][6] = 0;
bState[4][0] = 0;
bState[4][1] = 0;
bState[4][2] = 0;
bState[4][3] = 1;
bState[4][4] = 0;
bState[4][5] = 0;
bState[4][6] = 0;
bState[5][2] = 0;
bState[5][3] = 1;
bState[5][4] = 0;
bState[6][2] = 0;
bState[6][3] = 0;
bState[6][4] = 0;
}
if (ifireplace) {
bState[0][2] = 0;
bState[0][3] = 0;
bState[0][4] = 0;
bState[1][2] = 0;
bState[1][3] = 0;
bState[1][4] = 0;
bState[2][0] = 1;
bState[2][1] = 1;
bState[2][2] = 1;
bState[2][3] = 1;
bState[2][4] = 0;
bState[2][5] = 0;
bState[2][6] = 0;
bState[3][0] = 1;
bState[3][1] = 1;
bState[3][2] = 1;
bState[3][3] = 0;
bState[3][4] = 0;
bState[3][5] = 0;
bState[3][6] = 0;
bState[4][0] = 1;
bState[4][1] = 1;
bState[4][2] = 1;
bState[4][3] = 1;
bState[4][4] = 0;
bState[4][5] = 0;
bState[4][6] = 0;
bState[5][2] = 0;
bState[5][3] = 0;
bState[5][4] = 0;
bState[6][2] = 0;
bState[6][3] = 0;
bState[6][4] = 0;
}
if (ipyramid) {
bState[0][2] = 0;
bState[0][3] = 0;
bState[0][4] = 1;
bState[1][2] = 0;
bState[1][3] = 1;
bState[1][4] = 1;
bState[2][0] = 0;
bState[2][1] = 0;
bState[2][2] = 1;
bState[2][3] = 1;
bState[2][4] = 1;
bState[2][5] = 0;
bState[2][6] = 0;
bState[3][0] = 0;
bState[3][1] = 1;
bState[3][2] = 1;
bState[3][3] = 1;
bState[3][4] = 1;
bState[3][5] = 0;
bState[3][6] = 0;
bState[4][0] = 0;
bState[4][1] = 0;
bState[4][2] = 1;
bState[4][3] = 1;
bState[4][4] = 1;
bState[4][5] = 0;
bState[4][6] = 0;
bState[5][2] = 0;
bState[5][3] = 1;
bState[5][4] = 1;
bState[6][2] = 0;
bState[6][3] = 0;
bState[6][4] = 1;
}
if (idiamond) {
bState[0][2] = 0;
bState[0][3] = 1;
bState[0][4] = 0;
bState[1][2] = 1;
bState[1][3] = 1;
bState[1][4] = 1;
bState[2][0] = 0;
bState[2][1] = 1;
bState[2][2] = 1;
bState[2][3] = 1;
bState[2][4] = 1;
bState[2][5] = 1;
bState[2][6] = 0;
bState[3][0] = 1;
bState[3][1] = 1;
bState[3][2] = 1;
bState[3][3] = 0;
bState[3][4] = 1;
bState[3][5] = 1;
bState[3][6] = 1;
bState[4][0] = 0;
bState[4][1] = 1;
bState[4][2] = 1;
bState[4][3] = 1;
bState[4][4] = 1;
bState[4][5] = 1;
bState[4][6] = 0;
bState[5][2] = 1;
bState[5][3] = 1;
bState[5][4] = 1;
bState[6][2] = 0;
bState[6][3] = 1;
bState[6][4] = 0;
}
/******Erase all the chips *************************************/
for (x = 0; x < DIVISIONS; x++)
for (y = 0; y < DIVISIONS; y++) {
if ((x > 1 && x < 5) || (y > 1 && y < 5)) {
BitBlt(hDC, xBlock * x + winxEdge, yBlock
*y + winyEdge, xBlock, yBlock, hBoardDC,
xBlock * x + winxEdge, yBlock * y + winyEdge,
SRCCOPY);
}
}
/*************************************************************/
/********* Put chips where they go *****************************/
for (x = 0; x < DIVISIONS; x++)
for (y = 0; y < DIVISIONS; y++) {
if (bState[x][y]) {
SelectObject(hDC, hDkgrypen);
SelectObject(hDC, hDkgrybrush);
Ellipse(hDC, x * xBlock + xEdge + xShadow +
winxEdge, y * yBlock + yEdge + yShadow +
winyEdge, (x + 1) * xBlock - xEdge + xShadow +
winxEdge, (y + 1) * yBlock - yEdge + yShadow +
winyEdge);
SelectObject(hDC, hBlkpen);
SelectObject(hDC, hBbrush);
Ellipse(hDC, x * xBlock + xEdge + winxEdge,
y * yBlock + yEdge + winyEdge, (x + 1) *
xBlock - xEdge + winxEdge, (y + 1) * yBlock -
yEdge + winyEdge);
SelectObject(hDC, hWpen);
Arc(hDC, x * xBlock + xEdge + xShadow +
winxEdge, y * yBlock + yEdge + yShadow +
winyEdge, (x + 1) * xBlock - xEdge - xShadow +
winxEdge, (y + 1) * yBlock - yEdge - yShadow +
winyEdge , x * xBlock + xHalf + winxEdge ,
y * yBlock + yShadow + winyEdge, x * xBlock
+ xShadow + winxEdge, y * yBlock + yHalf +
winyEdge);
}
}
/***************************************************************/
BitBlt(hMemwinDC, 0, 0, xClient, yClient, hDC, 0, 0,
SRCCOPY);
ReleaseDC(hWnd, hDC);
break;
case IDM_UNDO:
if (m) {
--m;
/*put a chip back in the original location */
hDC = GetDC(hWnd);
/*erase the destination chip on screen*/
BitBlt(hDC, move[m].xdest * xBlock + winxEdge,
move[m].ydest * yBlock + winyEdge, xBlock, yBlock,
hBoardDC, move[m].xdest * xBlock + winxEdge, move[m].ydest
*yBlock + winyEdge , SRCCOPY);
/*Erase the destination chip on the memdc */
SelectObject(hMemwinDC, hWBitmap);
BitBlt(hMemwinDC, move[m].xdest * xBlock + winxEdge,
move[m].ydest * yBlock + winyEdge, xBlock, yBlock,
hBoardDC, move[m].xdest * xBlock + winxEdge, move[m].ydest
*yBlock + winyEdge , SRCCOPY);
/*Put back the jumped chip on the screen*/
x = move[m].xjumped;
y = move[m].yjumped;
SelectObject(hDC, hDkgrypen);
SelectObject(hDC, hDkgrybrush);
Ellipse(hDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge + xShadow + winxEdge, (y +
1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hDC, hBlkpen);
SelectObject(hDC, hBbrush);
Ellipse(hDC, x * xBlock + xEdge + winxEdge, y *
yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge +
winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hDC, hWpen);
Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge - xShadow + winxEdge, (y +
1) * yBlock - yEdge - yShadow + winyEdge , x *
xBlock + xHalf + winxEdge , y * yBlock + yShadow +
winyEdge, x * xBlock + xShadow + winxEdge, y *
yBlock + yHalf + winyEdge);
/* Put back the jumped chip in the memdc */
SelectObject(hMemwinDC, hWBitmap);
BitBlt(hMemwinDC, move[m].xjumped * xBlock + winxEdge,
move[m].yjumped * yBlock + winyEdge, xBlock, yBlock,
hDC, move[m].xjumped * xBlock + winxEdge, move[m].yjumped
*yBlock + winyEdge , SRCCOPY);
/*Put back the source chip on the screen*/
x = move[m].xsource;
y = move[m].ysource;
SelectObject(hDC, hDkgrypen);
SelectObject(hDC, hDkgrybrush);
Ellipse(hDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge + xShadow + winxEdge, (y +
1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hDC, hBlkpen);
SelectObject(hDC, hBbrush);
Ellipse(hDC, x * xBlock + xEdge + winxEdge, y *
yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge +
winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hDC, hWpen);
Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge - xShadow + winxEdge, (y +
1) * yBlock - yEdge - yShadow + winyEdge , x *
xBlock + xHalf + winxEdge , y * yBlock + yShadow +
winyEdge, x * xBlock + xShadow + winxEdge, y *
yBlock + yHalf + winyEdge);
/* Put back the source chip in the memdc */
SelectObject(hMemwinDC, hWBitmap);
BitBlt(hMemwinDC, move[m].xsource * xBlock + winxEdge,
move[m].ysource * yBlock + winyEdge, xBlock, yBlock,
hDC, move[m].xsource * xBlock + winxEdge, move[m].ysource
*yBlock + winyEdge , SRCCOPY);
/*Restore the matrix to previous state*/
bState[move[m].xsource][move[m].ysource] = 1;
bState[move[m].xjumped][move[m].yjumped] = 1;
bState[move[m].xdest][move[m].ydest] = 0;
ReleaseDC(hWnd, hDC);
} else
MessageBox(hWnd, "Can't Backup", szAppName, MB_ICONASTERISK |
MB_OK);
break;
case IDM_CROSS:
icross = 1;
iplus = 0;
ifireplace = 0;
ipyramid = 0;
ilamp = 0;
idiamond = 0;
iuparrow = 0;
isolitaire = 0;
hMenu = GetMenu(hWnd);
CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED);
CheckMenuItem(hMenu, IDM_CROSS, MF_CHECKED);
wprevmenuitem = wParam;
PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_PLUS:
iplus = 1;
icross = 0;
ifireplace = 0;
ipyramid = 0;
ilamp = 0;
idiamond = 0;
iuparrow = 0;
isolitaire = 0;
hMenu = GetMenu(hWnd);
CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED);
CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam;
PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_FIREPLACE:
iplus = 0;
icross = 0;
ifireplace = 1;
ipyramid = 0;
ilamp = 0;
idiamond = 0;
iuparrow = 0;
isolitaire = 0;
hMenu = GetMenu(hWnd);
CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED);
CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam;
PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_UPARROW:
iplus = 0;
icross = 0;
ifireplace = 0;
ipyramid = 0;
ilamp = 0;
idiamond = 0;
iuparrow = 1;
isolitaire = 0;
hMenu = GetMenu(hWnd);
CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED);
CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam;
PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_DIAMOND:
iplus = 0;
icross = 0;
ifireplace = 0;
ipyramid = 0;
ilamp = 0;
idiamond = 1;
iuparrow = 0;
isolitaire = 0;
hMenu = GetMenu(hWnd);
CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED);
CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam;
PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_PYRAMID:
iplus = 0;
icross = 0;
ifireplace = 0;
ipyramid = 1;
ilamp = 0;
idiamond = 0;
iuparrow = 0;
isolitaire = 0;
hMenu = GetMenu(hWnd);
CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED);
CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam;
PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_SOLITAIRE:
iplus = 0;
icross = 0;
ifireplace = 0;
ipyramid = 0;
ilamp = 0;
idiamond = 0;
iuparrow = 0;
isolitaire = 1;
hMenu = GetMenu(hWnd);
CheckMenuItem(hMenu, (WORD)wprevmenuitem, MF_UNCHECKED);
CheckMenuItem(hMenu, (WORD)wParam, MF_CHECKED);
wprevmenuitem = wParam;
PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
break;
case IDM_ABOUT:
AboutWEP(hWnd, hPeggedIcon , "Pegged! Version 1.0",
"by Mike Blaylock");
/*
MessageBox(hWnd,"Pegged\n\nA Windows Solitaire Game\n\nCopyright 1989-90\n\nby Mike Blaylock\n\nAlpha v1.011",szAppName, MB_ICONASTERISK | MB_OK);
*/
break;
case IDM_INDEX:
WinHelp(hWnd, HELP_FILE, HELP_INDEX, (ULONG_PTR) NULL);
break;
case IDM_HOWTO:
WinHelp(hWnd, HELP_FILE, HELP_KEY, (ULONG_PTR) "How To Play");
break;
case IDM_COMMANDS:
WinHelp(hWnd, HELP_FILE, HELP_KEY, (ULONG_PTR) "Commands");
break;
case IDM_USING:
WinHelp(hWnd, HELP_FILE, HELP_HELPONHELP, (ULONG_PTR) NULL);
break;
case IDM_ICONIZE:
ShowWindow(hWnd, SW_MINIMIZE);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
break;
}
break;
case WM_CREATE:
hDC = GetDC (hWnd) ;
xPixel = GetDeviceCaps (hDC, ASPECTX) ;
yPixel = GetDeviceCaps (hDC, ASPECTY) ;
hWpen = CreatePen(0, 2, RGB(255, 255, 255));
hLtwpen = CreatePen(0, 1, RGB(255, 255, 255));
hMedgrypen = CreatePen(0, 1, RGB (128, 128, 128));
hDkgrypen = CreatePen(0, 1, RGB (64, 64, 64));
hThkdkgrypen = CreatePen(0, 2, RGB (64, 64, 64));
hMedgrybrush = CreateSolidBrush(RGB (128, 128, 128));
hDkgrybrush = CreateSolidBrush(RGB (64, 64, 64));
hBlkpen = GetStockObject(BLACK_PEN);
hBbrush = CreateSolidBrush (RGB (0, 0, 255));
hBlkbrush = CreateSolidBrush(RGB (0, 0, 0));
hGbrush = CreateSolidBrush (RGB (0, 64, 0));
hLtgrybrush = CreateSolidBrush (RGB (192, 192, 192));
hLtgrypen = CreatePen(0, 1, RGB (192, 192, 192));
hYbrush = CreateSolidBrush (RGB (255, 255, 0));
nDefault = 3;
hMenu = GetMenu(hWnd);
wprevmenuitem = GetPrivateProfileInt((LPSTR)"Pegged", (LPSTR)"Option",
nDefault, (LPSTR)"entpack.ini");
CheckMenuItem(hMenu, (WORD)wprevmenuitem
, MF_CHECKED);
icross = 0;
iplus = 0;
ifireplace = 0;
ipyramid = 0;
idiamond = 0;
iuparrow = 0;
isolitaire = 0;
switch (wprevmenuitem) {
case 3:
icross = 1;
break;
case 4:
iplus = 1;
break;
case 5:
ifireplace = 1;
break;
case 6:
iuparrow = 1;
break;
case 7:
ipyramid = 1;
break;
case 8:
idiamond = 1;
break;
case 9:
isolitaire = 1;
break;
default:
icross = 1;
break;
}
PostMessage(hWnd, WM_COMMAND, IDM_NEW, 0L);
ffirst = 1;
ReleaseDC (hWnd, hDC) ;
break ;
case WM_SIZE:
foom = 0;
hDC = GetDC (hWnd) ;
MGetViewportOrg(hDC, &xLeft, &yTop);
newarea = (LONG)LOWORD(lParam) * (LONG)HIWORD(lParam);
if (ffirst) {
xBlock = LOWORD (lParam) / (DIVISIONS + 2);
yBlock = HIWORD (lParam) / (DIVISIONS + 2);
xClient = LOWORD (lParam);
yClient = HIWORD (lParam);
xEdge = xBlock / 4;
yEdge = yBlock / 4;
xShadow = xBlock / 10;
yShadow = yBlock / 10;
xHalf = xBlock / 2;
yHalf = yBlock / 2;
winxEdge = xBlock;
winyEdge = yBlock;
if (!(hIntDC = CreateCompatibleDC(hDC))) {
MessageBox(hWnd, "Not Enough Memory", szAppName,
MB_ICONASTERISK | MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
break;
}
if (!(hBoardBitmap = CreateCompatibleBitmap(hDC, xClient,
yClient))) {
MessageBox(hWnd, "Not Enough Memory", szAppName,
MB_ICONASTERISK | MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
break;
}
if (!(hIntBitmap = CreateCompatibleBitmap(hDC, xBlock
*4, yBlock * 4))) {
MessageBox(hWnd, "Not Enough Memory", szAppName,
MB_ICONASTERISK | MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
break;
}
if (!(hMemwinDC = CreateCompatibleDC(hDC))) {
MessageBox(hWnd, "Not Enough Memory", szAppName,
MB_ICONASTERISK | MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
break;
}
if (!(hBoardDC = CreateCompatibleDC(hDC))) {
MessageBox(hWnd, "Not Enough Memory", szAppName,
MB_ICONASTERISK | MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
break;
}
if (!(hWBitmap = CreateCompatibleBitmap(hDC, xClient,
yClient))) {
MessageBox(hWnd, "Not Enough Memory", szAppName,
MB_ICONASTERISK | MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
break;
}
hOldIntBitmap = SelectObject(hIntDC, hIntBitmap);
hOldWBitmap = SelectObject(hMemwinDC, hWBitmap);
hOldBoardBitmap = SelectObject(hBoardDC, hBoardBitmap);
}
xsizedClient = LOWORD (lParam);
ysizedClient = HIWORD (lParam);
xsizedBlock = LOWORD (lParam) / (DIVISIONS + 2);
ysizedBlock = HIWORD (lParam) / (DIVISIONS + 2);
/*If we are actually sizing and not simply being restored from running OOM on a previous size attempt, see if there is enough memory for all the new bitmaps for the new size by trying to create temporary versions of all the bitmaps and DC's*/
if ((!foomonsize) && (newarea > prevwarea) && (!ffirst)) {
if (!(hBoardtmpBitmap = CreateCompatibleBitmap(hDC,
xsizedClient, ysizedClient))) {
foomonsize = 1;
}
if (!foomonsize)
if (!(htmpBoardDC = CreateCompatibleDC(hDC))) {
foomonsize = 1;
DeleteObject(hBoardtmpBitmap);
}
if (!foomonsize)
if (!(hWtmpBitmap = CreateCompatibleBitmap(hDC,
xsizedClient, ysizedClient))) {
foomonsize = 1;
SelectObject(htmpBoardDC, hBoardtmpBitmap);
DeleteDC(htmpBoardDC);
DeleteObject(hBoardtmpBitmap);
}
if (!foomonsize)
if (!(htmpMemwinDC = CreateCompatibleDC(hDC))) {
foomonsize = 1;
SelectObject(htmpBoardDC, hBoardtmpBitmap);
DeleteDC(htmpBoardDC);
DeleteObject(hBoardtmpBitmap);
DeleteObject(hWtmpBitmap);
}
if (!foomonsize)
if (!(hInttmpBitmap = CreateCompatibleBitmap(hDC,
xsizedBlock * 4, ysizedBlock * 4))) {
foomonsize = 1;
SelectObject(htmpBoardDC, hBoardtmpBitmap);
DeleteDC(htmpBoardDC);
DeleteObject(hBoardtmpBitmap);
SelectObject(htmpMemwinDC, hWtmpBitmap);
DeleteDC(htmpMemwinDC);
DeleteObject(hWtmpBitmap);
}
if (!foomonsize)
if (!(htmpIntDC = CreateCompatibleDC(hDC))) {
foomonsize = 1;
SelectObject(htmpBoardDC, hBoardtmpBitmap);
DeleteDC(htmpBoardDC);
DeleteObject(hBoardtmpBitmap);
SelectObject(htmpMemwinDC, hWtmpBitmap);
DeleteDC(htmpMemwinDC);
DeleteObject(hWtmpBitmap);
DeleteObject(hInttmpBitmap);
}
if (foomonsize)
foomed = 1;
/*If there isn't enough memory do a MoveWindow to the old size, and break*/
if (foomonsize) {
ReleaseDC(hWnd, hDC);
MoveWindow(hWnd, prevxorg, prevyorg, prevwidth,
prevheight, TRUE);
break;
}
/*If there IS enough memory, destroy the temp bitmaps and DC's and continue*/
else
{
SelectObject(htmpBoardDC, hBoardtmpBitmap);
DeleteDC(htmpBoardDC);
DeleteObject(hBoardtmpBitmap);
SelectObject(htmpMemwinDC, hWtmpBitmap);
DeleteDC(htmpMemwinDC);
DeleteObject(hWtmpBitmap);
SelectObject(htmpIntDC, hInttmpBitmap);
DeleteDC(htmpIntDC);
DeleteObject(hInttmpBitmap);
}
}/*End if not previous foomonsize and sizing smaller and not first time*/
if ((!ffirst) && (!foomonsize))/*if this isn't the first start and we're not restoring from previous failed size */ {
SelectObject(hBoardDC, hOldBoardBitmap);
DeleteDC(hBoardDC);
}
if ((!ffirst) && (!foomonsize)) {
SelectObject(hIntDC, hOldIntBitmap);
DeleteDC(hIntDC);
}
if ((!ffirst) && (!foomonsize)) {
SelectObject(hMemwinDC, hOldWBitmap);
DeleteDC(hMemwinDC);
}
if ((!ffirst) && (!foomonsize))
DeleteObject(hWBitmap);
if ((!ffirst) && (!foomonsize))
DeleteObject(hOldWBitmap);
if ((!ffirst) && (!foomonsize))
DeleteObject(hIntBitmap);
if ((!ffirst) && (!foomonsize))
DeleteObject(hOldIntBitmap);
if ((!ffirst) && (!foomonsize))
DeleteObject(hBoardBitmap);
if ((!ffirst) && (!foomonsize))
DeleteObject(hOldBoardBitmap);
if ((!ffirst) && (!foomonsize)) /*this assumes the test for enough memory works and update the size of the client area*/ {
xBlock = LOWORD (lParam) / (DIVISIONS + 2);
yBlock = HIWORD (lParam) / (DIVISIONS + 2);
xClient = LOWORD (lParam);
yClient = HIWORD (lParam);
xEdge = xBlock / 4;
yEdge = yBlock / 4;
xShadow = xBlock / 10;
yShadow = yBlock / 10;
xHalf = xBlock / 2;
yHalf = yBlock / 2;
winxEdge = xBlock;
winyEdge = yBlock;
}
if ((!ffirst) && (!foomonsize))
if (!(hBoardBitmap = CreateCompatibleBitmap(hDC, xClient,
yClient))) {
foom = 1;
MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK |
MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
ReleaseDC(hWnd, hDC);
break;
}
if ((!ffirst) && (!foomonsize))
if (!(hBoardDC = CreateCompatibleDC(hDC))) {
foom = 1;
MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK |
MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
ReleaseDC(hWnd, hDC);
break;
}
if ((!ffirst) && (!foomonsize))
if (!(hMemwinDC = CreateCompatibleDC(hDC))) {
foom = 1;
MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK |
MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
ReleaseDC(hWnd, hDC);
break;
}
if ((!ffirst) && (!foomonsize))
if (!(hWBitmap = CreateCompatibleBitmap(hDC, xClient,
yClient))) {
foom = 1;
MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK |
MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
ReleaseDC(hWnd, hDC);
break;
}
if ((!ffirst) && (!foomonsize))
if (!(hIntDC = CreateCompatibleDC(hDC))) {
foom = 1;
MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK |
MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
ReleaseDC(hWnd, hDC);
break;
}
if ((!ffirst) && (!foomonsize))
if (!(hIntBitmap = CreateCompatibleBitmap(hDC, xBlock
*4, yBlock * 4))) {
foom = 1;
MessageBox(hWnd, "Out of Memory ", szAppName, MB_ICONASTERISK |
MB_OK);
PostMessage(hWnd, WM_DESTROY, 0, 0L);
ReleaseDC(hWnd, hDC);
break;
}
if ((!ffirst) && (!foomonsize))
hOldBoardBitmap = SelectObject(hBoardDC, hBoardBitmap);
if ((!ffirst) && (!foomonsize))
hOldIntBitmap = SelectObject(hIntDC, hIntBitmap);
if ((!ffirst) && (!foomonsize))
hOldWBitmap = SelectObject(hMemwinDC, hWBitmap);
foomonsize = 0;
ffirst = 0;
/*
** We've successfully created all the bitmaps so this size
** can be done without running out of memory. Therefore, we'll
** record the current size of the window in case it has to be
** restored on a subsequent OOM due to a sizing of the window
*/
GetWindowRect(hWnd, (LPRECT) & r);
prevxorg = r.left;
prevyorg = r.top;
prevwidth = max(r.right, r.left) - min(r.right, r.left);
prevheight = max(r.bottom, r.top) - min(r.bottom, r.top);
prevwarea = (LONG)LOWORD(lParam) * (LONG)HIWORD(lParam);
ReleaseDC(hWnd, hDC);
break ;
case WM_MOVE:
GetWindowRect(hWnd, (LPRECT) & r);
prevxorg = r.left;
prevyorg = r.top;
break;
case WM_MOUSEACTIVATE:
fmousefocusd = 1;
break;
case WM_ERASEBKGND:
if (fmousefocusd)
fignorelbutton = 1;
break;
case WM_LBUTTONDOWN:
/*If we just got the erasebackground message due to activation via a mouse click, ignore all lbuttondowns until the window is painted */
if (fignorelbutton == 1)
break;
else
fmousefocusd = 0;
hDC = GetDC(hWnd);
xPoint = LOWORD(lParam);
yPoint = HIWORD(lParam);
if (foom == 1) {
MessageBox(hWnd, "Out of Memory", szAppName, MB_ICONASTERISK |
MB_OK);
} else
{
/*If the mouse is clicked in to the left or above or to the right of or below the game board, we have to ignore*/
if (xPoint > winxEdge && yPoint > winyEdge && xPoint
< xBlock * 8 && yPoint < yBlock * 8) {
ixdownblock = (xPoint / xBlock) - 1;
iydownblock = (yPoint / yBlock) - 1;
} else
{
ReleaseDC(hWnd, hDC);
break;
}
/*check to see if the mouse location is on a chip*/
/* if it is on a chip, allow it to be moved*/
if (bState[ixdownblock][iydownblock]) {
if ((ixdownblock > 1 && ixdownblock < 5) || (iydownblock
> 1 && iydownblock < 5)) {
BitBlt(hDC, ixdownblock * xBlock + winxEdge,
iydownblock * yBlock + winyEdge, xBlock, yBlock,
hBoardDC, ixdownblock * xBlock + winxEdge,
iydownblock * yBlock + winyEdge, SRCCOPY);
SelectObject(hMemwinDC, hWBitmap);
BitBlt(hMemwinDC, ixdownblock * xBlock + winxEdge,
iydownblock * yBlock + winyEdge, xBlock, yBlock,
hBoardDC, ixdownblock * xBlock + winxEdge,
iydownblock * yBlock + winyEdge, SRCCOPY);
fmovingchip = 1;
/*Capture all mouse messages */
SetCapture(hWnd);
/*erase the mouse cursor too */
bShow = 0;
ShowCursor(bShow);
SelectObject(hIntDC, hIntBitmap);
BitBlt(hIntDC, 0, 0, xBlock * 4, yBlock * 4,
hMemwinDC, xPoint - 2 * xBlock, yPoint - 2
*yBlock, SRCCOPY);
/* commented out the use of shadow while moving chips
SelectObject(hIntDC,hMedgrypen);
SelectObject(hIntDC,hMedgrybrush);
Ellipse(hIntDC,xBlock+xBlock/2+xEdge+2*xShadow, yBlock+yBlock/2+yEdge+2*yShadow, 2*xBlock+xBlock/2-xEdge+2*xShadow, 2*yBlock+yBlock/2-yEdge+2*yShadow);
*/
SelectObject(hIntDC, hBlkpen);
SelectObject(hIntDC, hBbrush);
Ellipse(hIntDC, xBlock + xBlock / 2 + xEdge,
yBlock + yBlock / 2 + yEdge, 2 * xBlock +
xBlock / 2 - xEdge, 2 * yBlock + yBlock / 2
-yEdge);
SelectObject(hIntDC, hWpen);
Arc(hIntDC, xBlock + xBlock / 2 + xEdge + xShadow,
yBlock + yBlock / 2 + yEdge + yShadow, 2 *
xBlock + xBlock / 2 - xEdge - xShadow, 2 *
yBlock + yBlock / 2 - yEdge - yShadow, xBlock
+ xBlock / 2 + xHalf, yBlock + yBlock / 2 +
yShadow, xBlock + xBlock / 2 + xShadow, yBlock
+ yBlock / 2 + yHalf);
xPrevpoint = xPoint;
yPrevpoint = yPoint;
}
}
}
ReleaseDC(hWnd, hDC);
break;
case WM_MOUSEMOVE:
xPoint = LOWORD(lParam);
yPoint = HIWORD(lParam);
if (fmovingchip) {
if (xPoint > xLeft + xClient || xPoint < xLeft || yPoint
> yClient + yTop || yPoint < yTop) {
/* Do what we would do if it wasn't a valid destination . This fixes the problem where moving the mouse outside the window causes us to lose the mouse cursor forever*/
bShow = 1;
ShowCursor(bShow);
fmovingchip = 0;
ReleaseCapture();
x = ixdownblock;
y = iydownblock;
SelectObject(hMemwinDC, hWBitmap);
SelectObject(hMemwinDC, hDkgrypen);
SelectObject(hMemwinDC, hDkgrybrush);
Ellipse(hMemwinDC, x * xBlock + xEdge + xShadow +
winxEdge, y * yBlock + yEdge + yShadow + winyEdge,
(x + 1) * xBlock - xEdge + xShadow + winxEdge,
(y + 1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hMemwinDC, hBlkpen);
SelectObject(hMemwinDC, hBbrush);
Ellipse(hMemwinDC, x * xBlock + xEdge + winxEdge,
y * yBlock + yEdge + winyEdge, (x + 1) * xBlock -
xEdge + winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hMemwinDC, hWpen);
Arc(hMemwinDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge - xShadow + winxEdge, (y +
1) * yBlock - yEdge - yShadow + winyEdge , x *
xBlock + xHalf + winxEdge , y * yBlock + yShadow +
winyEdge, x * xBlock + xShadow + winxEdge, y *
yBlock + yHalf + winyEdge);
hDC = GetDC(hWnd);
BitBlt(hDC, 0, 0, xClient, yClient, hMemwinDC,
0, 0, SRCCOPY);
ReleaseDC(hWnd, hDC);
}
}
/*check if a chip is in a move state */
if (fmovingchip) {
/* if it is, bitblt as the mouse moves */
hDC = GetDC(hWnd);
/* if we are moving the mouse too fast, we have to erase the old ellipse manually */
if ((xPrevpoint > xPoint + xBlock) || (xPoint > xPrevpoint
+ xBlock) || (yPrevpoint > yPoint + yBlock) || (yPoint
> yBlock + yPrevpoint)) {
SelectObject(hIntDC, hIntBitmap);
BitBlt(hIntDC, 0, 0, xBlock * 2, yBlock * 2, hMemwinDC,
xPrevpoint - xBlock, yPrevpoint - yBlock, SRCCOPY);
BitBlt(hDC, xPrevpoint - xBlock, yPrevpoint - yBlock,
xBlock * 2, yBlock * 2, hIntDC, 0, 0, SRCCOPY);
}
SelectObject(hIntDC, hIntBitmap);
BitBlt(hIntDC, 0, 0, xBlock * 4, yBlock * 4, hMemwinDC,
xPoint - 2 * xBlock, yPoint - 2 * yBlock, SRCCOPY);
/* Commented out shadow while moving *****
SelectObject(hIntDC,hmedgrypen);
SelectObject(hIntDC,hMedgrybrush);
Ellipse(hIntDC,xBlock+xBlock/2+xEdge+2*xShadow, yBlock+yBlock/2+yEdge+2*yShadow, 2*xBlock+xBlock/2-xEdge+2*xShadow, 2*yBlock+yBlock/2-yEdge+2*yShadow);
*/
SelectObject(hIntDC, hBlkpen);
SelectObject(hIntDC, hBbrush);
Ellipse(hIntDC, xBlock + xBlock / 2 + xEdge, yBlock
+ yBlock / 2 + yEdge, 2 * xBlock + xBlock / 2 - xEdge,
2 * yBlock + yBlock / 2 - yEdge);
SelectObject(hIntDC, hWpen);
Arc(hIntDC, xBlock + xBlock / 2 + xEdge + xShadow,
yBlock + yBlock / 2 + yEdge + yShadow, 2 * xBlock +
xBlock / 2 - xEdge - xShadow, 2 * yBlock + yBlock /
2 - yEdge - yShadow, xBlock + xBlock / 2 + xHalf, yBlock
+ yBlock / 2 + yShadow, xBlock + xBlock / 2 + xShadow,
yBlock + yBlock / 2 + yHalf);
BitBlt(hDC, xPoint - 2 * xBlock, yPoint - 2 * yBlock,
xBlock * 4, yBlock * 4, hIntDC, 0, 0, SRCCOPY);
ReleaseDC(hWnd, hDC);
xPrevpoint = xPoint;
yPrevpoint = yPoint;
}
break ;
case WM_LBUTTONUP:
xUp = LOWORD (lParam);
yUp = HIWORD (lParam);
/* if we were in a button move state */
if (fmovingchip) {
ixupblock = xUp / xBlock - 1;
iyupblock = yUp / yBlock - 1;
ReleaseCapture();
checkfvmove();
/*and if it was a valid destination */
if ((!bState[ixupblock][iyupblock]) && (!(ixupblock
< 2 && iyupblock < 2)) && (!(ixupblock > 4 && iyupblock
> 4)) && (!(ixupblock < 2 && iyupblock > 4)) && (!(ixupblock
> 4 && iyupblock < 2)) && fvalidmove && ( xUp > winxEdge) &&
( yUp > winyEdge) &&
( xUp < xBlock * 8) &&
( yUp < yBlock * 8)
) {
/*
** adjust the chip in the valid destination rectangle
** on the screen and on the memory device context, erase
** the chip that was jumped- on the screen and in the
** WinMemDC,set fmovingchip to false, and check to see
** if there are any more valid moves. If t here aren't,
** message and show score
*/
hDC = GetDC(hWnd);
/*erase the chip at its current location*/
BitBlt(hDC, xUp - xBlock / 2 , yUp - yBlock / 2 ,
xBlock, yBlock, hMemwinDC, xUp - xBlock / 2 ,
yUp - yBlock / 2 , SRCCOPY);
/*center the chip at the new destination */
x = ixupblock;
y = iyupblock;
/* Draw the peg at its new location */
SelectObject(hDC, hDkgrypen);
SelectObject(hDC, hDkgrybrush);
Ellipse(hDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge + xShadow + winxEdge, (y +
1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hDC, hBlkpen);
SelectObject(hDC, hBbrush);
Ellipse(hDC, x * xBlock + xEdge + winxEdge, y *
yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge +
winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hDC, hWpen);
Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge - xShadow + winxEdge, (y +
1) * yBlock - yEdge - yShadow + winyEdge , x *
xBlock + xHalf + winxEdge , y * yBlock + yShadow +
winyEdge, x * xBlock + xShadow + winxEdge, y *
yBlock + yHalf + winyEdge);
/*erase the jumped chip */
BitBlt(hDC, xBlock * ixkilledblock + winxEdge,
yBlock * iykilledblock + winyEdge, xBlock, yBlock,
hBoardDC, xBlock * ixkilledblock + winxEdge, yBlock
*iykilledblock + winyEdge , SRCCOPY);
ReleaseDC(hWnd, hDC);
/*center the chip in the memory dc as well*/
#ifdef OLDWAY
SelectObject(hMemwinDC, hWBitmap);
BitBlt(hMemwinDC, xBlock * ixupblock + winxEdge,
yBlock * iyupblock + winyEdge, xBlock, yBlock,
hDC, xBlock * ixupblock + winxEdge, yBlock * iyupblock +
winyEdge , SRCCOPY);
#endif
/* Draw the peg at its new location in the memory DC*/
SelectObject(hMemwinDC, hDkgrypen);
SelectObject(hMemwinDC, hDkgrybrush);
Ellipse(hMemwinDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge + xShadow + winxEdge, (y +
1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hMemwinDC, hBlkpen);
SelectObject(hMemwinDC, hBbrush);
Ellipse(hMemwinDC, x * xBlock + xEdge + winxEdge, y *
yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge +
winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hMemwinDC, hWpen);
Arc(hMemwinDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge - xShadow + winxEdge, (y +
1) * yBlock - yEdge - yShadow + winyEdge , x *
xBlock + xHalf + winxEdge , y * yBlock + yShadow +
winyEdge, x * xBlock + xShadow + winxEdge, y *
yBlock + yHalf + winyEdge);
/*erase the jumped chip in memory DC*/
BitBlt(hMemwinDC, xBlock * ixkilledblock + winxEdge,
yBlock * iykilledblock + winyEdge, xBlock, yBlock,
hBoardDC, xBlock * ixkilledblock + winxEdge, yBlock
*iykilledblock + winyEdge , SRCCOPY);
/*update the data structure */
bState[ixdownblock][iydownblock] = 0;
bState[ixupblock][iyupblock] = 1;
bState[ixkilledblock][iykilledblock] = 0;
/*record move in array list */
move[m].xsource = ixdownblock;
move[m].ysource = iydownblock;
move[m].xdest = ixupblock;
move[m].ydest = iyupblock;
move[m].xjumped = ixkilledblock;
move[m].yjumped = iykilledblock;
++m;
/*
ixvdownblock=ixdownblock;
ixvupblock=ixupblock;
ixvkilledblock=ixkilledblock;
*/
/* Check if there are anymore valid moves*/
bShow = 1;
ShowCursor(bShow);
fanymoremoves = 0;
checkfanymoves();
if (fanymoremoves == 0) {/* if there aren't - declare game at an end and score */
/*add up the remaining chips*/
ntotal = 0;
for (j = 0; j < 7; ++j)
for (k = 0; k < 7; ++k)
ntotal += bState[j][k];
if (ntotal > 1)
MessageBox(hWnd, "Game Over", szAppName,
MB_ICONASTERISK | MB_OK);
else
MessageBox(hWnd, "You Win!", szAppName,
MB_ICONASTERISK | MB_OK);
}
}
else /*it wasn't a valid destination */ {
/*put a chip back in the original location */
hDC = GetDC(hWnd);
/*erase the current chip on screen*/
BitBlt(hDC, xUp - xBlock / 2 , yUp - yBlock / 2 ,
xBlock, yBlock, hMemwinDC, xUp - xBlock / 2 ,
yUp - yBlock / 2 , SRCCOPY);
/*Draw the chip back at the original location*/
x = ixdownblock;
y = iydownblock;
SelectObject(hDC, hDkgrypen);
SelectObject(hDC, hDkgrybrush);
Ellipse(hDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge + xShadow + winxEdge, (y +
1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hDC, hBlkpen);
SelectObject(hDC, hBbrush);
Ellipse(hDC, x * xBlock + xEdge + winxEdge, y *
yBlock + yEdge + winyEdge, (x + 1) * xBlock - xEdge +
winxEdge, (y + 1) * yBlock - yEdge + winyEdge);
SelectObject(hDC, hWpen);
Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x +
1) * xBlock - xEdge - xShadow + winxEdge, (y +
1) * yBlock - yEdge - yShadow + winyEdge , x *
xBlock + xHalf + winxEdge , y * yBlock + yShadow +
winyEdge, x * xBlock + xShadow + winxEdge, y *
yBlock + yHalf + winyEdge);
SelectObject(hMemwinDC, hWBitmap);
BitBlt(hMemwinDC, ixdownblock * xBlock + winxEdge,
iydownblock * yBlock + winyEdge, xBlock, yBlock,
hDC, ixdownblock * xBlock + winxEdge, iydownblock
*yBlock + winyEdge , SRCCOPY);
bShow = 1;
ShowCursor(bShow);
ReleaseDC(hWnd, hDC);
}
fmovingchip = 0;
fvalidmove = 0;
}
/*
** if we aren't at a valid destination, take the chip back to
** the original rectangle in the window DC, restore the original
** whole-window-Mem-DC as well,and restore the destination area,
** and show an error message, and set fmovingchip to false
*/
break;
case WM_PAINT:
hDC = BeginPaint (hWnd, &ps);
/*Draw the board with holes in it in memory*/
SelectObject(hDC, hLtgrypen);
SelectObject(hDC, hLtgrybrush);
Rectangle(hDC, 0, 0, xClient, yClient);
SelectObject(hMemwinDC, hWBitmap);
SelectObject(hMemwinDC, hBlkpen);
SelectObject(hMemwinDC, hLtgrybrush);
Rectangle(hMemwinDC, 0, 0, xClient, yClient);
/*Draw shadows on playing board on right and bottom edges*/
SelectObject(hMemwinDC, hThkdkgrypen);
(VOID)MMoveTo(hMemwinDC, winxEdge + 1, yBlock * 5 + winyEdge
+ 1);
LineTo(hMemwinDC, xBlock * 2 + winxEdge - 1, yBlock * 5 +
winyEdge + 1);
(VOID)MMoveTo(hMemwinDC, xBlock * 2 + winxEdge, yBlock
*7 + winyEdge + 1);
LineTo(hMemwinDC, xBlock * 5 + winxEdge, yBlock * 7 + winyEdge
+ 1);
(VOID)MMoveTo(hMemwinDC, xBlock * 5 + winxEdge + 1, yBlock
*7 + winyEdge + 1);
LineTo(hMemwinDC, xBlock * 5 + winxEdge + 1, yBlock * 5 +
winyEdge + 1);
(VOID)MMoveTo(hMemwinDC, xBlock * 5 + winxEdge + 1, yBlock
*5 + winyEdge + 1);
LineTo(hMemwinDC, xBlock * 7 + winxEdge + 1, yBlock * 5 +
winyEdge + 1);
(VOID)MMoveTo(hMemwinDC, xBlock * 5 + winxEdge + 1, yBlock
*2 + winyEdge - 1);
LineTo(hMemwinDC, xBlock * 5 + winxEdge + 1, winyEdge);
(VOID)MMoveTo(hMemwinDC, xBlock * 7 + winxEdge + 1, yBlock
*2 + winyEdge + 1);
LineTo(hMemwinDC, xBlock * 7 + winxEdge + 1, yBlock * 5 +
winyEdge + 1);
SelectObject(hMemwinDC, hWpen);
(VOID)MMoveTo(hMemwinDC, winxEdge - 1, yBlock * 2 + winyEdge);
LineTo(hMemwinDC, winxEdge - 1, yBlock * 5 + winyEdge -
1);
(VOID)MMoveTo(hMemwinDC, winxEdge, yBlock * 2 - 1 + winyEdge);
LineTo(hMemwinDC, xBlock * 2 - 1 + winxEdge, yBlock * 2
-1 + winyEdge);
(VOID)MMoveTo(hMemwinDC, xBlock * 2 - 1 + winxEdge, yBlock
*2 + winyEdge - 1);
LineTo(hMemwinDC, xBlock * 2 - 1 + winxEdge, yBlock * 0 +
winyEdge);
(VOID)MMoveTo(hMemwinDC, xBlock * 2 + winxEdge, winyEdge -
1);
LineTo(hMemwinDC, xBlock * 5 - 1 + winxEdge, winyEdge -
1);
(VOID)MMoveTo(hMemwinDC, xBlock * 5 + 2 + winxEdge, yBlock
*2 - 1 + winyEdge);
LineTo(hMemwinDC, xBlock * 7 + winxEdge, yBlock * 2 - 1 +
winyEdge);
(VOID)MMoveTo(hMemwinDC, xBlock * 2 - 1 + winxEdge, yBlock
*5 + 1 + winyEdge);
LineTo(hMemwinDC, xBlock * 2 - 1 + winxEdge, yBlock * 7 -
1 + winyEdge);
/* Draw the holes*/
SelectObject(hMemwinDC, hBlkpen);
for (x = 0; x < DIVISIONS; x++)
for (y = 0; y < DIVISIONS; y++) {
if ((x > 1 && x < 5) || (y > 1 && y < 5)) {
Arc(hMemwinDC, x * xBlock + xEdge + winxEdge,
y * yBlock + yEdge + winyEdge, (x + 1) * xBlock
-xEdge + winxEdge, (y + 1) * yBlock - yEdge +
winyEdge, (x + 1) * xBlock - 3 * xEdge / 2 +
winxEdge, y * yBlock + 3 * yEdge / 2 + winyEdge,
x * xBlock + 3 * xEdge / 2 + winxEdge, (y
+ 1) * yBlock - 3 * yEdge / 2 + winyEdge);
}
}
SelectObject(hMemwinDC, hLtwpen);
for (x = 0; x < DIVISIONS; x++)
for (y = 0; y < DIVISIONS; y++) {
if ((x > 1 && x < 5) || (y > 1 && y < 5)) {
Arc(hMemwinDC, x * xBlock + xEdge + winxEdge,
y * yBlock + yEdge + winyEdge, (x + 1) * xBlock
-xEdge + winxEdge, (y + 1) * yBlock - yEdge +
winyEdge, x * xBlock + 3 * xEdge / 2 + winxEdge,
(y + 1) * yBlock - 3 * yEdge / 2 + winyEdge,
(x + 1) * xBlock - 3 * xEdge / 2 + winxEdge,
y * yBlock + 3 * yEdge / 2 + winyEdge);
}
}
BitBlt(hDC, 0, 0, xClient, yClient, hMemwinDC , 0, 0, SRCCOPY);
/*Get a picture of an empty board*/
SelectObject(hBoardDC, hBoardBitmap);
BitBlt(hBoardDC, 0, 0, xClient, yClient, hMemwinDC , 0,
0, SRCCOPY);
for (x = 0; x < DIVISIONS; x++)
for (y = 0; y < DIVISIONS; y++) {
if (bState[x][y]) {
SelectObject(hDC, hDkgrypen);
SelectObject(hDC, hDkgrybrush);
Ellipse(hDC, x * xBlock + xEdge + xShadow +
winxEdge, y * yBlock + yEdge + yShadow + winyEdge,
(x + 1) * xBlock - xEdge + xShadow + winxEdge,
(y + 1) * yBlock - yEdge + yShadow + winyEdge);
SelectObject(hDC, hBlkpen);
SelectObject(hDC, hBbrush);
Ellipse(hDC, x * xBlock + xEdge + winxEdge,
y * yBlock + yEdge + winyEdge, (x + 1) * xBlock -
xEdge + winxEdge, (y + 1) * yBlock - yEdge +
winyEdge);
SelectObject(hDC, hWpen);
Arc(hDC, x * xBlock + xEdge + xShadow + winxEdge,
y * yBlock + yEdge + yShadow + winyEdge, (x
+ 1) * xBlock - xEdge - xShadow + winxEdge,
(y + 1) * yBlock - yEdge - yShadow + winyEdge ,
x * xBlock + xHalf + winxEdge , y * yBlock +
yShadow + winyEdge, x * xBlock + xShadow +
winxEdge, y * yBlock + yHalf + winyEdge);
}
}
BitBlt(hMemwinDC, 0, 0, xClient, yClient, hDC, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
fignorelbutton = 0;
fmousefocusd = 0;
if (foomed) {
MessageBox(hWnd, "Not Enough Memory to Re-size Window",
szAppName, MB_ICONASTERISK | MB_OK);
foomed = 0;
}
break;
case WM_DESTROY:
if (hBitmap)
DeleteObject (hBitmap) ;
KillTimer (hWnd, 1) ;
SelectObject(hIntDC, hOldIntBitmap);
DeleteDC(hIntDC);
SelectObject(hMemwinDC, hOldWBitmap);
DeleteDC(hMemwinDC);
SelectObject(hBoardDC, hOldBoardBitmap);
DeleteDC(hBoardDC);
DeleteObject(hBoardBitmap);
DeleteObject(hOldBoardBitmap);
DeleteObject(hWBitmap);
DeleteObject(hOldWBitmap);
DeleteObject(hIntBitmap);
DeleteObject(hOldIntBitmap);
DeleteObject(hBbrush);
DeleteObject(hBlkpen);
DeleteObject(hBlkbrush);
DeleteObject(hDkgrybrush);
DeleteObject(hDkgrypen);
DeleteObject(hGbrush);
DeleteObject(hMedgrypen);
DeleteObject(hMedgrybrush);
DeleteObject(hLtgrybrush);
DeleteObject(hLtgrypen);
DeleteObject(hLtwpen);
DeleteObject(hThkdkgrypen);
DeleteObject(hWpen);
DeleteObject(hYbrush);
WinHelp(hWnd, HELP_FILE, HELP_QUIT, (ULONG_PTR) NULL);
switch (wprevmenuitem) {
case 3:
WritePrivateProfileString((LPSTR)"Pegged", (LPSTR) "Option",
(LPSTR)"3", (LPSTR)"entpack.ini" );
break;
case 4:
WritePrivateProfileString( (LPSTR)"Pegged", (LPSTR)"Option",
(LPSTR) "4", (LPSTR)"entpack.ini" );
break;
case 5:
WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option",
(LPSTR)"5", (LPSTR)"entpack.ini" );
break;
case 6:
WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option",
(LPSTR)"6", (LPSTR)"entpack.ini" );
break;
case 7:
WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option",
(LPSTR)"7", (LPSTR)"entpack.ini");
break;
case 8:
WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option",
(LPSTR)"8", (LPSTR)"entpack.ini");
break;
case 9:
WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option",
(LPSTR)"9", (LPSTR)"entpack.ini");
break;
default:
WritePrivateProfileString((LPSTR)"Pegged", (LPSTR)"Option",
(LPSTR)"3", (LPSTR)"entpack.ini" );
break;
}
PostQuitMessage (0) ;
break ;
default:
return DefWindowProc (hWnd, iMessage, wParam, lParam) ;
}
return 0L ;
}
VOID checkfvmove()
{
if (ixupblock == ixdownblock)
if ((iyupblock == iydownblock - 2) || (iyupblock == iydownblock +
2)) {
ixjumpedblock = ixupblock;
if (iyupblock == iydownblock - 2)
iyjumpedblock = iydownblock - 1;
if (iyupblock == iydownblock + 2)
iyjumpedblock = iydownblock + 1;
if (bState[ixjumpedblock][iyjumpedblock]) {
fvalidmove = 1;
ixkilledblock = ixupblock;
if (iyupblock == iydownblock - 2)
iykilledblock = iydownblock - 1;
if (iyupblock == iydownblock + 2)
iykilledblock = iydownblock + 1;
}
}
if (iyupblock == iydownblock)
if ((ixupblock == ixdownblock - 2) || (ixupblock == ixdownblock +
2)) {
iyjumpedblock = iyupblock;
if (ixupblock == ixdownblock - 2)
ixjumpedblock = ixdownblock - 1;
if (ixupblock == ixdownblock + 2)
ixjumpedblock = ixdownblock + 1;
if (bState[ixjumpedblock][iyjumpedblock]) {
fvalidmove = 1;
iykilledblock = iyupblock;
if (ixupblock == ixdownblock - 2)
ixkilledblock = ixdownblock - 1;
if (ixupblock == ixdownblock + 2)
ixkilledblock = ixdownblock + 1;
}
}
return;
}
VOID checkfanymoves()
{
/*corners*/
if (bState[2][0]) {
if (bState[3][0])
if (!bState[4][0])
fanymoremoves = 1;
if (bState[2][1])
if (!bState[2][2])
fanymoremoves = 1;
}
if (bState[4][0]) {
if (bState[3][0])
if (!bState[2][0])
fanymoremoves = 1;
if (bState[4][1])
if (!bState[4][2])
fanymoremoves = 1;
}
if (bState[0][2]) {
if (bState[1][2])
if (!bState[2][2])
fanymoremoves = 1;
if (bState[0][3])
if (!bState[0][4])
fanymoremoves = 1;
}
if (bState[0][4]) {
if (bState[0][3])
if (!bState[0][2])
fanymoremoves = 1;
if (bState[1][4])
if (!bState[2][4])
fanymoremoves = 1;
}
if (bState[2][6]) {
if (bState[3][6])
if (!bState[4][6])
fanymoremoves = 1;
if (bState[2][5])
if (!bState[2][4])
fanymoremoves = 1;
}
if (bState[4][6]) {
if (bState[3][6])
if (!bState[2][6])
fanymoremoves = 1;
if (bState[4][5])
if (!bState[4][4])
fanymoremoves = 1;
}
if (bState[6][4]) {
if (bState[5][4])
if (!bState[4][4])
fanymoremoves = 1;
if (bState[6][3])
if (!bState[6][2])
fanymoremoves = 1;
}
if (bState[6][2]) {
if (bState[5][2])
if (!bState[4][2])
fanymoremoves = 1;
if (bState[6][3])
if (!bState[6][4])
fanymoremoves = 1;
}
/* center ends */
if (bState[3][0]) {
if (bState[3][1])
if (!bState[3][2])
fanymoremoves = 1;
}
if (bState[0][3]) {
if (bState[1][3])
if (!bState[2][3])
fanymoremoves = 1;
}
if (bState[3][6]) {
if (bState[3][5])
if (!bState[3][4])
fanymoremoves = 1;
}
if (bState[6][3]) {
if (bState[5][3])
if (!bState[4][3])
fanymoremoves = 1;
}
/*center sides */
if (bState[2][1]) {
if (bState[3][1])
if (!bState[4][1])
fanymoremoves = 1;
if (bState[2][2])
if (!bState[2][3])
fanymoremoves = 1;
}
if (bState[1][2]) {
if (bState[2][2])
if (!bState[3][2])
fanymoremoves = 1;
if (bState[1][3])
if (!bState[1][4])
fanymoremoves = 1;
}
if (bState[1][4]) {
if (bState[2][4])
if (!bState[3][4])
fanymoremoves = 1;
if (bState[1][3])
if (!bState[1][2])
fanymoremoves = 1;
}
if (bState[2][5]) {
if (bState[3][5])
if (!bState[4][5])
fanymoremoves = 1;
if (bState[2][4])
if (!bState[2][3])
fanymoremoves = 1;
}
if (bState[4][5]) {
if (bState[3][5])
if (!bState[2][5])
fanymoremoves = 1;
if (bState[4][4])
if (!bState[4][3])
fanymoremoves = 1;
}
if (bState[5][4]) {
if (bState[4][4])
if (!bState[3][4])
fanymoremoves = 1;
if (bState[5][3])
if (!bState[5][2])
fanymoremoves = 1;
}
if (bState[5][2]) {
if (bState[4][2])
if (!bState[3][2])
fanymoremoves = 1;
if (bState[5][3])
if (!bState[5][4])
fanymoremoves = 1;
}
if (bState[4][1]) {
if (bState[3][1])
if (!bState[2][1])
fanymoremoves = 1;
if (bState[4][2])
if (!bState[4][3])
fanymoremoves = 1;
}
/* inside center arms */
if (bState[3][1]) {
if (bState[3][2])
if (!bState[3][3])
fanymoremoves = 1;
}
if (bState[1][3]) {
if (bState[2][3])
if (!bState[3][3])
fanymoremoves = 1;
}
if (bState[3][5]) {
if (bState[3][4])
if (!bState[3][3])
fanymoremoves = 1;
}
if (bState[5][3]) {
if (bState[4][3])
if (!bState[3][3])
fanymoremoves = 1;
}
/*Center 9 squares */
if (bState[2][2]) {
if (bState[1][2])
if (!bState[0][2])
fanymoremoves = 1;
if (bState[3][2])
if (!bState[4][2])
fanymoremoves = 1;
if (bState[2][1])
if (!bState[2][0])
fanymoremoves = 1;
if (bState[2][3])
if (!bState[2][4])
fanymoremoves = 1;
}
if (bState[3][2]) {
if (bState[2][2])
if (!bState[2][1])
fanymoremoves = 1;
if (bState[4][2])
if (!bState[5][2])
fanymoremoves = 1;
if (bState[3][1])
if (!bState[3][0])
fanymoremoves = 1;
if (bState[3][3])
if (!bState[3][4])
fanymoremoves = 1;
}
if (bState[4][2]) {
if (bState[3][2])
if (!bState[2][2])
fanymoremoves = 1;
if (bState[5][2])
if (!bState[6][2])
fanymoremoves = 1;
if (bState[4][1])
if (!bState[4][0])
fanymoremoves = 1;
if (bState[4][3])
if (!bState[4][4])
fanymoremoves = 1;
}
if (bState[2][3]) {
if (bState[1][3])
if (!bState[0][3])
fanymoremoves = 1;
if (bState[3][3])
if (!bState[4][3])
fanymoremoves = 1;
if (bState[2][2])
if (!bState[2][1])
fanymoremoves = 1;
if (bState[2][4])
if (!bState[2][5])
fanymoremoves = 1;
}
if (bState[2][4]) {
if (bState[1][4])
if (!bState[0][4])
fanymoremoves = 1;
if (bState[3][4])
if (!bState[4][4])
fanymoremoves = 1;
if (bState[2][3])
if (!bState[2][2])
fanymoremoves = 1;
if (bState[2][5])
if (!bState[2][6])
fanymoremoves = 1;
}
if (bState[3][4]) {
if (bState[2][4])
if (!bState[1][4])
fanymoremoves = 1;
if (bState[4][4])
if (!bState[5][4])
fanymoremoves = 1;
if (bState[3][3])
if (!bState[3][2])
fanymoremoves = 1;
if (bState[3][5])
if (!bState[3][6])
fanymoremoves = 1;
}
if (bState[4][4]) {
if (bState[3][4])
if (!bState[2][4])
fanymoremoves = 1;
if (bState[5][4])
if (!bState[6][4])
fanymoremoves = 1;
if (bState[4][3])
if (!bState[4][2])
fanymoremoves = 1;
if (bState[4][5])
if (!bState[4][6])
fanymoremoves = 1;
}
if (bState[4][3]) {
if (bState[3][3])
if (!bState[2][3])
fanymoremoves = 1;
if (bState[5][3])
if (!bState[6][3])
fanymoremoves = 1;
if (bState[4][2])
if (!bState[4][1])
fanymoremoves = 1;
if (bState[4][4])
if (!bState[4][5])
fanymoremoves = 1;
}
if (bState[3][3]) {
if (bState[2][3])
if (!bState[1][3])
fanymoremoves = 1;
if (bState[4][3])
if (!bState[5][3])
fanymoremoves = 1;
if (bState[3][2])
if (!bState[3][1])
fanymoremoves = 1;
if (bState[3][4])
if (!bState[3][5])
fanymoremoves = 1;
}
}