windows-nt/Source/XPSP1/NT/shell/osshell/games/sol/col.c

880 lines
18 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "sol.h"
VSZASSERT
BOOL fMegaDiscardHack = fFalse; /* See klond.c's DiscardMove */
MOVE move = {0}; /* move data, pointed to by current pcol->pmove */
COLCLS *PcolclsCreate(INT tcls, INT (FAR *lpfnColProc)(),
DX dxUp, DY dyUp, DX dxDn, DY dyDn,
INT dcrdUp, INT dcrdDn)
{
COLCLS *pcolcls;
if((pcolcls = PAlloc(sizeof(COLCLS)))==NULL)
return NULL;
Assert(lpfnColProc != NULL);
pcolcls->tcls = tcls;
pcolcls->lpfnColProc = lpfnColProc;
pcolcls->ccolDep = 0;
pcolcls->dxUp = dxUp;
pcolcls->dyUp = dyUp;
pcolcls->dxDn = dxDn;
pcolcls->dyDn = dyDn;
pcolcls->dcrdUp = dcrdUp;
pcolcls->dcrdDn = dcrdDn;
return pcolcls;
}
COL *PcolCreate(COLCLS *pcolcls, X xLeft, Y yTop, X xRight, Y yBot, INT icrdMax)
{
COL *pcol;
if((pcol = PAlloc(sizeof(COL) + (icrdMax-1)*sizeof(CRD)))==NULL)
return NULL;
if( (pcol->pcolcls = pcolcls) != NULL )
pcol->lpfnColProc = pcolcls->lpfnColProc;
pcol->rc.xLeft = xLeft;
pcol->rc.yTop = yTop;
pcol->rc.xRight = xRight;
pcol->rc.yBot = yBot;
pcol->icrdMax = icrdMax;
pcol->icrdMac = 0;
pcol->pmove = NULL;
if(pcol->pcolcls != NULL)
pcol->pcolcls->ccolDep++;
return pcol;
}
#ifdef DEBUG
INT SendColMsg(COL *pcol, INT msgc, WPARAM wp1, LPARAM wp2)
{
INT imdbg;
INT wResult;
Assert(pcol != NULL);
imdbg = ILogMsg(pcol, msgc, wp1, wp2, fFalse);
wResult = (*(pcol->lpfnColProc))(pcol, msgc, wp1, wp2);
LogMsgResult(imdbg, wResult);
return wResult;
}
#endif
VOID DrawBackExcl(COL *pcol, PT *ppt)
{
COLCLS *pcolcls;
pcolcls = pcol->pcolcls;
if(pcolcls->dxUp != 0 || pcolcls->dxDn != 0)
DrawBackground(ppt->x+dxCrd, pcol->rc.yTop, pcol->rc.xRight, pcol->rc.yBot);
if(pcolcls->dyUp != 0 || pcolcls->dyDn != 0)
DrawBackground(pcol->rc.xLeft, ppt->y+dyCrd, pcol->rc.xRight, pcol->rc.yBot);
}
BOOL DefFreeCol(COL *pcol)
{
COLCLS *pcolcls;
if((pcolcls = pcol->pcolcls) != NULL)
{
pcolcls = pcol->pcolcls;
Assert(pcolcls->ccolDep > 0);
if(--pcolcls->ccolDep == 0)
{
FreeP(pcol->pcolcls);
}
}
FreeP(pcol);
return fTrue;
}
INT DefHit(COL *pcol, PT *ppt, INT icrdMin)
{
INT icrd;
CRD *pcrd;
HDC hdc, hdcCurSav;
PT ptCrd;
RC rc;
INT OldusehdcCur;
if(!PtInRect((LPRECT)&pcol->rc, *(POINT *)ppt) || pcol->icrdMac == 0)
return icrdNil;
for(icrd = pcol->icrdMac-1; icrd >= icrdMin && (pcrd = &pcol->rgcrd[icrd])->fUp; icrd--)
{
if(FPtInCrd(pcrd, *ppt))
{
move.ccrdSel = pcol->icrdMac-icrd;
/* save where mouse hit card */
ptCrd = pcol->rgcrd[icrd].pt;
move.delHit.dx = ptCrd.x - ppt->x;
move.delHit.dy = ptCrd.y - ppt->y;
if(fOutlineDrag)
goto Return;
hdc = GetDC(hwndApp);
if(hdc == NULL)
{
// No longer referenced label.
//
//OOM0:
OOM();
return icrdNil;
}
move.hdcScreen = hdc;
move.dyCol = dyCrd+(move.ccrdSel-1)*pcol->pcolcls->dyUp;
rc.xRight = (rc.xLeft = ptCrd.x) + dxCrd;
rc.yTop = ptCrd.y;
rc.yBot = rc.yTop+move.dyCol;
/* optimization: if column already drawn and visible on screen */
/* then blt it to col image right here. */
if(FRectAllVisible(hdc, &rc))
{
BitBlt(move.hdcCol, 0, 0, dxCrd, move.dyCol, hdc, ptCrd.x, ptCrd.y, SRCCOPY);
}
else
{
OldusehdcCur = usehdcCur;
usehdcCur = 1;
hdcCurSav = HdcSet(move.hdcCol, ptCrd.x, ptCrd.y);
DrawBackground(ptCrd.x, ptCrd.y, pcol->rc.xRight, pcol->rc.yBot);
SendColMsg(pcol, msgcRender, icrd, pcol->icrdMac);
HdcSet(hdcCurSav, 0, 0);
usehdcCur = OldusehdcCur;
}
OldusehdcCur = usehdcCur;
usehdcCur = 1;
hdcCurSav = HdcSet(move.hdcScreenSave, ptCrd.x, ptCrd.y);
DrawBackground(ptCrd.x, ptCrd.y, pcol->rc.xRight, pcol->rc.yBot);
SendColMsg(pcol, msgcRender, icrd-1, WMax(0, icrd));
HdcSet(hdcCurSav, 0, 0);
usehdcCur = OldusehdcCur;
Return:
pcol->pmove = &move;
move.icrdSel = icrd;
return icrd;
}
}
return icrdNil;
}
BOOL DefMouseUp(COL *pcol, PT *pptPrev, BOOL fRender)
{
MOVE *pmove;
VOID DrawOutline();
if(fRender)
SendColMsg(pcol, msgcZip, 0, 0);
if(fOutlineDrag)
{
if(pptPrev->x != ptNil.x)
SendColMsg(pcol, msgcDrawOutline, (INT_PTR) pptPrev, (INT_PTR) &ptNil);
return fTrue;
}
pmove = pcol->pmove;
if (pcol->pmove == NULL)
return fTrue;
if(pmove->fHdc)
{
if(pptPrev->x != ptNil.x)
{
BitBlt(pmove->hdcScreen, pptPrev->x+pmove->delHit.dx, pptPrev->y+pmove->delHit.dy,
dxCrd, pmove->dyCol, pmove->hdcScreenSave, 0, 0, SRCCOPY);
}
if(fRender)
{
SendColMsg(pcol, msgcRender, pmove->icrdSel-1, icrdToEnd);
}
ReleaseDC(hwndApp, pmove->hdcScreen);
pmove->hdcScreen = NULL;
}
return fTrue;
}
/* Removes cards from pcol and puts them into pcolTemp */
/* ccrdSel and icrdSel must be set in pcol->pmove */
BOOL DefRemove(COL *pcol, COL *pcolTemp)
{
INT icrdSel;
INT ccrdSel;
INT ccrdShiftDown; /* amount left over in pcol */
Assert(pcol->pmove != NULL);
if (pcol->pmove == NULL)
return fTrue;
icrdSel = pcol->pmove->icrdSel;
ccrdSel = pcol->pmove->ccrdSel;
Assert(ccrdSel <= pcolTemp->icrdMax);
/* save the cards to remove in pcolTemp */
bltb(&pcol->rgcrd[icrdSel], &pcolTemp->rgcrd[0], sizeof(CRD) * ccrdSel);
pcolTemp->icrdMac = ccrdSel;
/* remove the cards from pcol */
Assert(icrdSel+ccrdSel <= pcol->icrdMax);
ccrdShiftDown = pcol->icrdMac - (icrdSel+ccrdSel);
/* copy down any left over above the deleted cards */
if (ccrdShiftDown > 0)
{
bltb(&pcol->rgcrd[icrdSel+ccrdSel], &pcol->rgcrd[icrdSel],
sizeof(CRD) * ccrdShiftDown);
}
pcol->icrdMac -= ccrdSel; /* no longer have this many cards */
/* pcol->pmove = NULL; Done in DefEndSel.. */
return fTrue;
}
/* insert cards from pcolTemp into pcol at icrd */
BOOL DefInsert(COL *pcol, COL *pcolTemp, INT icrd)
{
INT icrdT;
icrdT = icrd == icrdToEnd ? pcol->icrdMac : icrd;
Assert(icrdT <= pcol->icrdMac);
Assert(pcol->icrdMac+pcolTemp->icrdMac <= pcol->icrdMax);
/* is it the hard case of inserting in the middle of a col? */
/* if so, expand pcol->rgcrd */
if(icrd != icrdToEnd)
bltb(&pcol->rgcrd[icrdT], &pcol->rgcrd[icrdT+pcolTemp->icrdMac],
sizeof(CRD) * pcolTemp->icrdMac);
else
icrd = pcol->icrdMac;
/* Insert the cards from pcolTemp to pcol */
bltb(&pcolTemp->rgcrd[0], &pcol->rgcrd[icrdT], sizeof(CRD) * pcolTemp->icrdMac);
pcol->icrdMac += pcolTemp->icrdMac;
pcolTemp->icrdMac = 0;
return fTrue;
}
BOOL DefMove(COL *pcolDest, COL *pcolSrc, INT icrd)
{
INT icrdMacDestSav, icrdSelSav;
COL *pcolTemp;
BOOL fResult;
BOOL fZip;
fZip = icrd & bitFZip;
icrd &= icrdMask;
Assert(pcolSrc->pmove != NULL);
if (pcolSrc->pmove == NULL)
return fTrue;
icrdSelSav = WMax(pcolSrc->pmove->icrdSel-1, 0);
icrdMacDestSav = (icrd == icrdToEnd) ? pcolDest->icrdMac : icrd;
if((pcolTemp = PcolCreate(NULL, 0, 0, 0, 0, pcolSrc->pmove->ccrdSel)) == NULL)
return fFalse;
fResult = SendColMsg(pcolSrc, msgcRemove, (INT_PTR)pcolTemp, 0) &&
SendColMsg(pcolDest, msgcInsert, (INT_PTR) pcolTemp, icrd) &&
SendColMsg(pcolDest, msgcComputeCrdPos, icrdMacDestSav, fFalse) &&
(!fZip || SendColMsg(pcolSrc, msgcZip, 0, 0)) &&
(!fOutlineDrag || SendColMsg(pcolSrc, msgcRender, icrdSelSav, icrdToEnd)) &&
SendColMsg(pcolDest, msgcRender, icrdMacDestSav, icrdToEnd) &&
SendColMsg(pcolSrc, msgcEndSel, fFalse, 0);
FreeP(pcolTemp);
return fResult;
}
BOOL DefCopy(COL *pcolDest, COL *pcolSrc, BOOL fAll)
{
Assert(pcolSrc->icrdMac <= pcolDest->icrdMax);
if(fAll)
bltb(pcolSrc, pcolDest, sizeof(COL)+(pcolSrc->icrdMac-1)*sizeof(CRD));
else
{
bltb(pcolSrc->rgcrd, pcolDest->rgcrd, pcolSrc->icrdMac*sizeof(CRD));
pcolDest->icrdMac = pcolSrc->icrdMac;
}
return(SendColMsg(pcolDest, msgcRender, 0, icrdToEnd));
}
BOOL DefRender(COL *pcol, INT icrdFirst, INT icrdLast)
{
INT icrd;
INT icrdMac;
CRD *pcrd, *pcrdPrev;
COLCLS *pcolcls;
icrdFirst = WMax(icrdFirst, 0);
Assert(icrdLast >= 0);
if(!FGetHdc())
return fFalse;
if(pcol->icrdMac == 0 || icrdLast == 0)
{
DrawBackground(pcol->rc.xLeft, pcol->rc.yTop, pcol->rc.xRight, pcol->rc.yBot);
if(icrdLast == 0)
goto EraseExtra;
}
else
{
Assert(icrdToEnd >= 0);
Assert(icrdToEnd > pcol->icrdMac);
Assert(icrdLast == icrdToEnd || icrdLast <= pcol->icrdMac);
icrdMac = WMin(pcol->icrdMac, icrdLast);
for(icrd = icrdFirst; icrd < icrdMac; icrd++)
{
pcrd = &pcol->rgcrd[icrd];
if(icrd == icrdFirst ||
pcrd->pt.x != pcrdPrev->pt.x || pcrd->pt.y != pcrdPrev->pt.y ||
pcrd->fUp)
DrawCard(pcrd);
pcrdPrev = pcrd;
}
EraseExtra:
/* hack to make dealing quicker */
if(pgmCur->fDealt || pcol->pcolcls->tcls == tclsDeck)
{
pcolcls = pcol->pcolcls;
pcrd = &pcol->rgcrd[icrdLast == 0 ? 0 : icrdMac-1];
DrawBackExcl(pcol, &pcrd->pt);
}
}
ReleaseHdc();
return fTrue;
}
BOOL DefPaint(COL *pcol, PAINTSTRUCT *ppaint)
{
INT icrd;
if(ppaint == NULL)
icrd = 0;
else
{
if(!FRectIsect(&pcol->rc, (RC *)&ppaint->rcPaint))
return fFalse;
if(pcol->icrdMac == 0)
icrd = 0;
else
{
for(icrd = 0; icrd < pcol->icrdMac ;icrd++)
if(FCrdRectIsect(&pcol->rgcrd[icrd], (RC *)&ppaint->rcPaint))
break;
if(icrd == pcol->icrdMac)
return fFalse;
}
}
return SendColMsg(pcol, msgcRender, icrd, icrdToEnd);
}
/* New super cool dragging, does five blts, but no clippin' */
BOOL DefDrawOutline(COL *pcol, PT *ppt, PT *pptPrev)
{
HDC hdc, hdcT;
HBITMAP hbmT;
MOVE *pmove;
PT pt, ptPrev;
DEL del;
COLCLS *pcolcls;
Assert(pcol->pmove != NULL);
pmove = pcol->pmove;
if (pcol->pmove == NULL)
return fTrue;
OffsetPt(ppt, &pmove->delHit, &pt);
if(pptPrev->x != ptNil.x)
OffsetPt(pptPrev, &pmove->delHit, &ptPrev);
if(fOutlineDrag)
{
pcolcls = pcol->pcolcls;
DrawOutline(&pt, pmove->ccrdSel, 0, pcolcls->dyUp);
if(pptPrev->x != ptNil.x)
{
DrawOutline(&ptPrev, pmove->ccrdSel, 0, pcolcls->dyUp);
}
return fTrue;
}
hdc = pmove->hdcScreen;
Assert(hdc != NULL);
hdcT = pmove->hdcT;
Assert(hdcT != NULL);
hbmT = pmove->hbmT;
Assert(hbmT != NULL);
/* screen to save hdc */
BitBlt(hdcT, 0, 0, dxCrd, pmove->dyCol, hdc, pt.x, pt.y, SRCCOPY);
/* if not the first time */
if(pptPrev->x != ptNil.x)
{
del.dx = pptPrev->x - ppt->x;
del.dy = pptPrev->y - ppt->y;
/* save old screen to save hdc */
BitBlt(hdcT, del.dx, del.dy, dxCrd, pmove->dyCol, pmove->hdcScreenSave, 0, 0, SRCCOPY);
BitBlt(pmove->hdcScreenSave, -del.dx, -del.dy, dxCrd, pmove->dyCol, pmove->hdcCol, 0, 0, SRCCOPY);
}
BitBlt(hdc, pt.x, pt.y, dxCrd, pmove->dyCol, pmove->hdcCol, 0, 0, SRCCOPY);
if(pptPrev->x != ptNil.x)
{
BitBlt(hdc, ptPrev.x, ptPrev.y, dxCrd, pmove->dyCol, pmove->hdcScreenSave, 0, 0, SRCCOPY);
}
/* swap pmove->hdcT and pmove->hdcScreenSave */
hdcT = pmove->hdcScreenSave;
pmove->hdcScreenSave = pmove->hdcT;
pmove->hdcT = hdcT;
/* swap pmove->hbmT and pmove->hbmScreenSaveOld */
hbmT = pmove->hbmScreenSaveOld;
pmove->hbmScreenSaveOld = pmove->hbmT;
pmove->hbmT = hbmT;
return fTrue;
}
BOOL DefComputeCrdPos(COL *pcol, INT icrdFirst, BOOL fAssumeDown)
{
INT icrd;
CRD *pcrd;
COLCLS *pcolcls;
PT pt;
Assert(icrdFirst >= 0);
if(icrdFirst == 0)
{
pt.x = pcol->rc.xLeft;
pt.y = pcol->rc.yTop;
}
else
{
Assert(icrdFirst < pcol->icrdMac);
pt = pcol->rgcrd[--icrdFirst].pt;
/* Used by discard, because discard piles are handled differently */
if(fMegaDiscardHack)
icrdFirst++;
}
pcolcls = pcol->pcolcls;
for(icrd = icrdFirst; icrd < pcol->icrdMac; icrd++)
{
pcrd = &pcol->rgcrd[icrd];
pcrd->pt = pt;
if(pcrd->fUp && !fAssumeDown)
{
if(icrd % pcolcls->dcrdUp == pcolcls->dcrdUp-1)
{
pt.x += pcolcls->dxUp;
pt.y += pcolcls->dyUp;
}
}
else if(icrd % pcolcls->dcrdDn == pcolcls->dcrdDn-1)
{
pt.x += pcolcls->dxDn;
pt.y += pcolcls->dyDn;
}
}
return fTrue;
}
VOID InvertCardPt(PT *ppt)
{
RC rc;
rc.xRight = (rc.xLeft = ppt->x) + dxCrd;
rc.yBot = (rc.yTop = ppt->y) + dyCrd;
InvertRc(&rc);
}
INT DefValidMovePt(COL *pcolDest, COL *pcolSrc, PT *ppt)
{
RC rc;
Assert(pcolSrc->pmove != NULL);
if (pcolSrc->pmove == NULL)
return fTrue;
Assert((X *)&(((RC *)(0))->xLeft) == (X *)&(((PT *)(0))->x));
Assert((Y *)&(((RC *)(0))->yTop) == (Y *)&(((PT *)(0))->y));
OffsetPt(ppt, &pcolSrc->pmove->delHit, (PT *)&rc);
rc.xRight = rc.xLeft+dxCrd;
rc.yBot = rc.yTop+dyCrd;
if(pcolDest->icrdMac == 0)
{
if(!FRectIsect(&rc, &pcolDest->rc))
return icrdNil;
}
else if(!(FCrdRectIsect(&pcolDest->rgcrd[pcolDest->icrdMac-1], &rc)))
return icrdNil;
return SendColMsg(pcolDest, msgcValidMove, (INT_PTR) pcolSrc, 0) ? pcolDest->icrdMac : icrdNil;
}
BOOL DefSel(COL *pcol, INT icrdFirst, INT ccrd)
{
#ifdef DEBUG
INT icol;
for(icol = 0; icol < pgmCur->icolMac; icol++)
Assert(pgmCur->rgpcol[icol]->pmove == NULL);
#endif
move.delHit.dx = move.delHit.dy = 0;
if(icrdFirst == icrdEnd)
{
if(pcol->icrdMac > 0)
{
move.icrdSel = pcol->icrdMac-1;
move.ccrdSel = 1;
goto Return;
}
else
return icrdNil;
}
if(ccrd == ccrdToEnd)
ccrd = pcol->icrdMac-icrdFirst;
Assert(icrdFirst < pcol->icrdMac);
Assert(icrdFirst+ccrd <= pcol->icrdMac);
move.icrdSel = icrdFirst;
move.ccrdSel = ccrd;
Return:
pcol->pmove = &move;
return move.icrdSel;
}
BOOL DefEndSel(COL *pcol, BOOL fReleaseDC)
{
pcol->pmove = NULL;
return fTrue;
}
BOOL DefFlip(COL *pcol, BOOL fUp)
{
INT icrd;
MOVE *pmove;
INT icrdMac;
Assert(pcol->pmove != NULL);
if (pcol->pmove == NULL)
return fTrue;
pmove = pcol->pmove;
icrdMac = pmove->icrdSel+pmove->ccrdSel;
for(icrd = pmove->icrdSel; icrd < icrdMac; icrd++)
pcol->rgcrd[icrd].fUp = (short)fUp;
return fTrue;
}
BOOL DefInvert(COL *pcol)
{
INT icrdSel, ccrdSel;
INT icrd, icrdMid;
Assert(pcol->pmove != NULL);
if (pcol->pmove == NULL)
return fTrue;
icrdSel = pcol->pmove->icrdSel;
ccrdSel = pcol->pmove->ccrdSel;
icrdMid = icrdSel+ccrdSel/2;
for(icrd = icrdSel; icrd < icrdMid; icrd++)
SwapCards(&pcol->rgcrd[icrd], &pcol->rgcrd[2*icrdSel+ccrdSel-1-icrd]);
return fTrue;
}
BOOL DefDragInvert(COL *pcol)
{
if(fOutlineDrag)
{
if(!FGetHdc())
return fFalse;
Assert((X *)&((RC *)(0))->xLeft == (X *)&((PT *)(0))->x);
Assert((Y *)&((RC *)(0))->yTop == (Y *)&((PT *)(0))->y);
InvertCardPt(pcol->icrdMac > 0 ? &pcol->rgcrd[pcol->icrdMac-1].pt : (PT *)&pcol->rc);
ReleaseHdc();
}
return fTrue;
}
INT DefNumCards(COL *pcol, BOOL fUpOnly)
{
INT icrd;
if(fUpOnly)
{
for(icrd = pcol->icrdMac-1; icrd >= 0 && pcol->rgcrd[icrd].fUp; icrd--)
;
Assert(pcol->icrdMac-1-icrd >= 0);
return pcol->icrdMac-1-icrd;
}
else
return pcol->icrdMac;
}
BOOL DefGetPtInCrd(COL *pcol, INT icrd, PT *ppt)
{
PT *pptT;
if(icrd == 0)
pptT = (PT *)&pcol->rc;
else
{
pptT = &pcol->rgcrd[icrd].pt;
Assert(icrd < pcol->icrdMac);
}
ppt->x = pptT->x+dxCrd/2;
ppt->y = pptT->y;
return fTrue;
}
BOOL DefShuffle(COL *pcol)
{
INT iSwitch;
CRD crdT;
INT icrd;
CRD *pcrdS;
// INT cdecl rand();
#define iSwitchMax 5
for(iSwitch = 0; iSwitch < iSwitchMax; iSwitch++)
{
for(icrd = 0; icrd < pcol->icrdMac; icrd++)
{
pcrdS = &pcol->rgcrd[rand() % pcol->icrdMac];
crdT = pcol->rgcrd[icrd];
pcol->rgcrd[icrd] = *pcrdS;
*pcrdS = crdT;
}
}
return fTrue;
}
#define izipMax 35
VOID APIENTRY DdaProc(INT x, INT y, LPARAM lpextra)
{
COL *pcol;
PT pt;
pcol = (COL *)lpextra;
if (pcol->pmove == NULL)
return;
if(pcol->pmove->izip++ < izipMax)
return;
pcol->pmove->izip = 0;
pt.x = x;
pt.y = y;
SendColMsg(pcol, msgcDrawOutline, (INT_PTR) &pt, (INT_PTR) &pgmCur->ptMousePrev);
pgmCur->ptMousePrev = pt;
}
INT DefZip(COL *pcol)
{
PT ptDest;
MOVE *pmove;
/* When outline-dragging is checked, that starting point can be ptNil and
* in this case we draw a line starting from (7FFF, 7FFF) and this
* causes the temporary hang! So, avoid the LineDDA() call when the
* prev point is ptNil;
* Fix for Bug #8182 --SANKAR-- 01-23-90
*/
if(pgmCur->ptMousePrev.x == ptNil.x)
return(fTrue);
pmove = pcol->pmove;
if (pcol->pmove == NULL)
return fTrue;
/* Don't use OffsetPt here, it's sense is wrong */
ptDest = pcol->rgcrd[pmove->icrdSel].pt;
ptDest.x -= pmove->delHit.dx;
ptDest.y -= pmove->delHit.dy;
pmove->izip = 0;
LineDDA(pgmCur->ptMousePrev.x, pgmCur->ptMousePrev.y, ptDest.x, ptDest.y, DdaProc, (LPARAM) pcol );
return fTrue;
}
INT DefColProc(COL *pcol, INT msgc, WPARAM wp1, LPARAM wp2)
{
switch(msgc)
{
case msgcInit:
return fTrue;
case msgcEnd:
return DefFreeCol(pcol);
case msgcClearCol:
pcol->pmove = NULL;
pcol->icrdMac = 0;
/* more? */
return fTrue;
case msgcHit: /* wp1 = ppt, return icrdHit/icrdNil */
return DefHit(pcol, (PT *)wp1, (INT)wp2);
case msgcMouseUp:
return DefMouseUp(pcol, (PT *) wp1, (INT)wp2);
case msgcDblClk:
return fFalse;
case msgcSel: /* wp1 = icrdSel, icrdEnd if last card, wp2 = ccrdSel, ccrdToEnd if all to end */
return DefSel(pcol, (INT)wp1, (INT)wp2);
case msgcEndSel:
return DefEndSel(pcol, (BOOL)wp1);
case msgcNumCards:
return DefNumCards(pcol, (BOOL)wp1);
case msgcFlip: /* wp1 = fUp */
return DefFlip(pcol, (BOOL)wp1);
case msgcInvert:
return DefInvert(pcol);
case msgcRemove: /* wp1 = pcolTemp, return fTrue/fFalse */
return DefRemove(pcol, (COL *) wp1);
case msgcInsert: /* wp1 = pcolTemp, */
/* wp2 = icrd to insert after, icrdToEnd if at end*/
return DefInsert(pcol, (COL *)wp1, (INT)wp2);
case msgcMove: /* wp1 = pcolSrc, wp2 = icrd, (icrdToEnd = to endcrd) */
/* return fTrue/fFalse */
return DefMove(pcol, (COL *) wp1, (INT)wp2);
case msgcCopy: /* wp1 = pcolSrc, wp2 = fAll (if true then copy all of col struct)*/
return DefCopy(pcol, (COL *) wp1, (BOOL)wp2);
case msgcValidMove: /* wp1 = pcolSrc, wp2 = icrd, (icrdToEnd = to endcrd) */
/* this must be supplied by game */
return fFalse;
case msgcValidMovePt:
return DefValidMovePt(pcol, (COL *) wp1, (PT *)wp2);
case msgcRender: /* wp1 = icrdFirst, return fTrue/fFalse*/
return DefRender(pcol, (INT)wp1, (INT)wp2);
case msgcPaint: /* wp1 = ppaint, if NULL then paint all */
return DefPaint(pcol, (PAINTSTRUCT *) wp1);
case msgcDrawOutline: /* wp1 = ppt , wp2 = pptPrev*/
return DefDrawOutline(pcol, (PT *) wp1, (PT *) wp2);
case msgcComputeCrdPos: /* wp1 = icrdFirst */
return DefComputeCrdPos(pcol, (INT)wp1, (BOOL)wp2);
case msgcDragInvert:
return DefDragInvert(pcol);
case msgcGetPtInCrd:
return DefGetPtInCrd(pcol, (INT)wp1, (PT *)wp2);
case msgcValidKbdColSel:
return fTrue;
case msgcValidKbdCrdSel:
return fTrue;
case msgcShuffle:
return DefShuffle(pcol);
case msgcAnimate:
return fFalse;
case msgcZip:
return DefZip(pcol);
}
Assert(fFalse);
return fFalse;
}