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