This content is archived and may be deprecated or obsolete and is presented in the hope that it may still be useful.
REM CardLib.bbc 0.10 31-May-2005 REM Library for using the MicrosoftTM cards DLLs REM (C) Jon Ripley 2005 : REM Setup constants DEF PROCcdtConst : REM PROCcdtDraw and PROCcdtDrawExt mode flags mdFaceUp = 0 : REM Draw card face up, card to draw specified by cd mdFaceDown = 1 : REM Draw card face down, back specified by cd (cdFaceDownFirst..cdFaceDownLast) mdHilite = 2 : REM Same as FaceUp except drawn with NOTSRCCOPY mode mdGhost = 3 : REM Draw a ghost card -- for ace piles mdRemove = 4 : REM draw background specified by rgbBgnd mdInvisibleGhost = 5 : REM Draw empty card spot but don't paint background mdDeckX = 6 : REM Draw X mdDeckO = 7 : REM Draw O : REM Suit and card indices. Orders of BOTH are important suClub = 0 suDiamond = 1 suHeart = 2 suSpade = 3 suMax = 4 suFirst = suClub raAce = 0 raTwo = 1 raThree = 2 raFour = 3 raFive = 4 raSix = 5 raSeven = 6 raEight = 7 raNine = 8 raTen = 9 raJack = 10 raQueen = 11 raKing = 12 raMax = 13 raNil = 15 raFirst = raAce REM Card IDs cdAClubs = FNcdtCd(raAce, suClub) cd2Clubs = FNcdtCd(raTwo, suClub) cd3Clubs = FNcdtCd(raThree, suClub) cd4Clubs = FNcdtCd(raFour, suClub) cd5Clubs = FNcdtCd(raFive, suClub) cd6Clubs = FNcdtCd(raSix, suClub) cd7Clubs = FNcdtCd(raSeven, suClub) cd8Clubs = FNcdtCd(raEight, suClub) cd9Clubs = FNcdtCd(raNine, suClub) cdTClubs = FNcdtCd(raTen, suClub) cdJClubs = FNcdtCd(raJack, suClub) cdQClubs = FNcdtCd(raQueen, suClub) cdKClubs = FNcdtCd(raKing, suClub) cdADiamonds = FNcdtCd(raAce, suDiamond) cd2Diamonds = FNcdtCd(raTwo, suDiamond) cd3Diamonds = FNcdtCd(raThree, suDiamond) cd4Diamonds = FNcdtCd(raFour, suDiamond) cd5Diamonds = FNcdtCd(raFive, suDiamond) cd6Diamonds = FNcdtCd(raSix, suDiamond) cd7Diamonds = FNcdtCd(raSeven, suDiamond) cd8Diamonds = FNcdtCd(raEight, suDiamond) cd9Diamonds = FNcdtCd(raNine, suDiamond) cdTDiamonds = FNcdtCd(raTen, suDiamond) cdJDiamonds = FNcdtCd(raJack, suDiamond) cdQDiamonds = FNcdtCd(raQueen, suDiamond) cdKDiamonds = FNcdtCd(raKing, suDiamond) cdAHearts = FNcdtCd(raAce, suHeart) cd2Hearts = FNcdtCd(raTwo, suHeart) cd3Hearts = FNcdtCd(raThree, suHeart) cd4Hearts = FNcdtCd(raFour, suHeart) cd5Hearts = FNcdtCd(raFive, suHeart) cd6Hearts = FNcdtCd(raSix, suHeart) cd7Hearts = FNcdtCd(raSeven, suHeart) cd8Hearts = FNcdtCd(raEight, suHeart) cd9Hearts = FNcdtCd(raNine, suHeart) cdTHearts = FNcdtCd(raTen, suHeart) cdJHearts = FNcdtCd(raJack, suHeart) cdQHearts = FNcdtCd(raQueen, suHeart) cdKHearts = FNcdtCd(raKing, suHeart) cdASpades = FNcdtCd(raAce, suSpade) cd2Spades = FNcdtCd(raTwo, suSpade) cd3Spades = FNcdtCd(raThree, suSpade) cd4Spades = FNcdtCd(raFour, suSpade) cd5Spades = FNcdtCd(raFive, suSpade) cd6Spades = FNcdtCd(raSix, suSpade) cd7Spades = FNcdtCd(raSeven, suSpade) cd8Spades = FNcdtCd(raEight, suSpade) cd9Spades = FNcdtCd(raNine, suSpade) cdTSpades = FNcdtCd(raTen, suSpade) cdJSpades = FNcdtCd(raJack, suSpade) cdQSpades = FNcdtCd(raQueen, suSpade) cdKSpades = FNcdtCd(raKing, suSpade) REM Face down cards cdFaceDown1 = 54 cdFaceDown2 = 55 cdFaceDown3 = 56 cdFaceDown4 = 57 cdFaceDown5 = 58 cdFaceDown6 = 59 cdFaceDown7 = 60 cdFaceDown8 = 61 cdFaceDown9 = 62 cdFaceDown10 = 63 cdFaceDown11 = 64 cdFaceDown12 = 65 cdFaceDownFirst = cdFaceDown1 cdFaceDownLast = cdFaceDown12 ENDPROC : REM Return suit from card number DEF FNcdtSuFromCd(card%) = ((card%) AND 3) : REM Return rank from card number DEF FNcdtRaFromCd(card%) = ((card%) >> 2) : REM Return card number from rank and suit DEF FNcdtCd(rank%, suit%) = (((rank%) << 2) OR (suit%)) : REM Load and initialise cards32.dll call once at program start DEF PROCcdtInit : REM Load library SYS "LoadLibrary","CARDS32.DLL" TO hdll_cards% IF hdll_cards%=0 SYS "LoadLibrary","CARDS.DLL" TO hdll_cards% IF hdll_cards%=0 ERROR 0, "This program requires Cards32.dll or Cards.dll to be present in the same directory" : REM One time initialization function. Also returns dimensions of a card SYS "GetProcAddress",hdll_cards%, "cdtInit" TO cdtinit% REM Draws a card SYS "GetProcAddress",hdll_cards%, "cdtDraw" TO cdtdraw% REM Same as cdtDraw except will stretch the card by an arbitrary extent SYS "GetProcAddress",hdll_cards%, "cdtDrawExt" TO cdtdrawext% REM Draws the animation on the back of a card SYS "GetProcAddress",hdll_cards%, "cdtAnimate" TO cdtanimate% REM One time uninitialization function SYS "GetProcAddress",hdll_cards%, "cdtTerm" TO cdtterm% : cdtWidth%=0:cdtHeight%=0 SYS cdtinit%,^cdtWidth%,^cdtHeight% TO res% : cdtRedraw%=TRUE : PROCcdtConst ENDPROC : REM Draw a card DEF PROCcdtDrawEx(hdc%,x%,y%,rank%,suit%,md%,rgb%) LOCAL card%:card%=face%*4+suit% DEF PROCcdtDraw(hdc%,x%,y%,card%,md%,rgb%) SYS cdtdraw%,hdc%,x%,y%,card%,md%,rgb% IF cdtRedraw% THEN PROCcdtRedrawArea(x%,y%,cdtWidth%,cdtHeight%) ENDPROC : REM Same as cdtDraw except will stretch the cards to an arbitray extent DEF PROCcdtDrawExtEx(hdc%,x%,y%,dx%,dy%,rank%,suit%,md%,rgb%) LOCAL card%:card%=face%*4+suit% DEF PROCcdtDrawExt(hdc%,x%,y%,dx%,dy%,card%,md%,rgb%) SYS cdtdrawext%,hdc%,x%,y%,dx%,dy%,card%,md%,rgb% IF cdtRedraw% THEN PROCcdtRedrawArea(x%,y%,dx%,dy%) ENDPROC REM Draws the animation on a supported card DEF PROCcdtAnimate(hdc%,card%,x%,y%,ispr%) SYS cdtanimate%,hdc%,card%,x%,y%,ispr% IF cdtRedraw% THEN PROCcdtRedrawArea(x%,y%,cdtWidth%,cdtHeight%) ENDPROC REM Call once at app termination DEF PROCcdtTerm SYS cdtterm% SYS "FreeLibrary",hdll_cards% : REM Unload DLL ENDPROC : REM Redraw the selected area of the screen DEF PROCcdtRedrawArea(x%,y%,dx%,dy%) LOCAL rect% DIM rect% LOCAL 16 !rect%=x%:rect%!4=y%:rect%!8=x%+dx%:rect%!12=y%+dy% SYS "InvalidateRect", @hwnd%, rect%, 0 ENDPROC : REM Redraw the entire screen DEF PROCcdtRedrawAll SYS "InvalidateRect", @hwnd%, 0, 0 ENDPROC : REM Set the automatic redraw flag DEF PROCcdtRedraw(bool%) cdtRedraw%=bool% ENDPROC