/*-----------------------------------------------------------------------------
|    CARDS.H
|    
|    cards.dll external .h file
|    
|  Insert standard MS copyright BS here. 
-----------------------------------------------------------------------------*/

typedef int RA;             /* Rank */
typedef int SU;             /* Suit */
typedef int CD;             /* Card */

/*-----------------------------------------------------------------------------
| cdtDraw and cdtDrawExt mode flags 
-----------------------------------------------------------------------------*/
#define mdFaceUp          0   /* Draw card face up, card to draw specified by cd */
#define mdFaceDown        1   /* Draw card face down, back specified by cd (cdFaceDownFirst..cdFaceDownLast) */
#define mdHilite          2   /* Same as FaceUp except drawn with NOTSRCCOPY mode */
#define mdGhost           3   /* Draw a ghost card -- for ace piles */
#define mdRemove          4   /* draw background specified by rgbBgnd */
#define mdInvisibleGhost  5   /* ? */
#define mdDeckX           6   /* Draw X */
#define mdDeckO           7   /* Draw O */

/*-----------------------------------------------------------------------------
| Suit and card indices.  Orders of BOTH are important 
-----------------------------------------------------------------------------*/
#define suClub              0
#define suDiamond           1
#define suHeart             2
#define suSpade             3
#define suMax               4
#define suFirst             suClub
#define raAce               0
#define raTwo               1
#define raThree             2
#define raFour              3
#define raFive              4
#define raSix               5
#define raSeven             6
#define raEight             7
#define raNine              8
#define raTen               9
#define raJack              10
#define raQueen             11
#define raKing              12
#define raMax               13
#define raNil               15
#define raFirst             raAce


/*-----------------------------------------------------------------------------
|    Su, Ra and Cd macros
-----------------------------------------------------------------------------*/
#define SuFromCd(cd) ((cd) & 0x03)
#define RaFromCd(cd) ((cd) >> 2)
#define Cd(ra, su) (((ra) << 2)| (su))


/*-----------------------------------------------------------------------------
|    Card cds
-----------------------------------------------------------------------------*/
#define cdAClubs        Cd(raAce,   suClub)
#define cd2Clubs        Cd(raTwo,   suClub) 
#define cd3Clubs        Cd(raThree, suClub) 
#define cd4Clubs        Cd(raFour,  suClub) 
#define cd5Clubs        Cd(raFive,  suClub) 
#define cd6Clubs        Cd(raSix,   suClub) 
#define cd7Clubs        Cd(raSeven, suClub) 
#define cd8Clubs        Cd(raEight, suClub) 
#define cd9Clubs        Cd(raNine,  suClub) 
#define cdTClubs        Cd(raTen,   suClub) 
#define cdJClubs        Cd(raJack,  suClub) 
#define cdQClubs        Cd(raQueen, suClub) 
#define cdKClubs        Cd(raKing,  suClub) 
#define cdADiamonds     Cd(raAce,   suDiamond)  
#define cd2Diamonds     Cd(raTwo,   suDiamond)   
#define cd3Diamonds     Cd(raThree, suDiamond)   
#define cd4Diamonds     Cd(raFour,  suDiamond)   
#define cd5Diamonds     Cd(raFive,  suDiamond)   
#define cd6Diamonds     Cd(raSix,   suDiamond)   
#define cd7Diamonds     Cd(raSeven, suDiamond)   
#define cd8Diamonds     Cd(raEight, suDiamond)   
#define cd9Diamonds     Cd(raNine,  suDiamond)   
#define cdTDiamonds     Cd(raTen,   suDiamond)   
#define cdJDiamonds     Cd(raJack,  suDiamond)   
#define cdQDiamonds     Cd(raQueen, suDiamond)   
#define cdKDiamonds     Cd(raKing,  suDiamond)   
#define cdAHearts       Cd(raAce,   suHeart) 
#define cd2Hearts       Cd(raTwo,   suHeart) 
#define cd3Hearts       Cd(raThree, suHeart) 
#define cd4Hearts       Cd(raFour,  suHeart) 
#define cd5Hearts       Cd(raFive,  suHeart) 
#define cd6Hearts       Cd(raSix,   suHeart) 
#define cd7Hearts       Cd(raSeven, suHeart) 
#define cd8Hearts       Cd(raEight, suHeart) 
#define cd9Hearts       Cd(raNine,  suHeart) 
#define cdTHearts       Cd(raTen,   suHeart) 
#define cdJHearts       Cd(raJack,  suHeart) 
#define cdQHearts       Cd(raQueen, suHeart) 
#define cdKHearts       Cd(raKing,  suHeart) 
#define cdASpades       Cd(raAce,   suSpade) 
#define cd2Spades       Cd(raTwo,   suSpade) 
#define cd3Spades       Cd(raThree, suSpade) 
#define cd4Spades       Cd(raFour,  suSpade) 
#define cd5Spades       Cd(raFive,  suSpade) 
#define cd6Spades       Cd(raSix,   suSpade) 
#define cd7Spades       Cd(raSeven, suSpade) 
#define cd8Spades       Cd(raEight, suSpade) 
#define cd9Spades       Cd(raNine,  suSpade) 
#define cdTSpades       Cd(raTen,   suSpade) 
#define cdJSpades       Cd(raJack,  suSpade) 
#define cdQSpades       Cd(raQueen, suSpade) 
#define cdKSpades       Cd(raKing,  suSpade) 

/*-----------------------------------------------------------------------------
| Face down cds    
-----------------------------------------------------------------------------*/
#define cdFaceDown1     54
#define cdFaceDown2     55
#define cdFaceDown3     56
#define cdFaceDown4     57
#define cdFaceDown5     58
#define cdFaceDown6     59
#define cdFaceDown7     60
#define cdFaceDown8     61
#define cdFaceDown9     62
#define cdFaceDown10    63
#define cdFaceDown11    64
#define cdFaceDown12    65
#define cdFaceDownFirst cdFaceDown1
#define cdFaceDownLast  cdFaceDown12




/*-----------------------------------------------------------------------------
|    cdtInit
|    
|        Initialize cards.dll -- called once at app boot time.  
|    
|    Arguments:
|        int FAR *pdxCard: returns card width
|        int FAR *pdyCard: returns card height
|    
|    Returns:
|        TRUE if successful.
-------------------------------------------------------------------------------*/
BOOL _declspec(dllexport) cdtInit(int FAR *pdxCard, int FAR *pdyCard);

/*-----------------------------------------------------------------------------
|    cdtDraw
|    
|        Draw a card
|    
|    Arguments:
|        HDC hdc
|        int x: upper left corner of the card
|        int y: upper left corner of the card
|        int cd: card to draw (depends on md)
|        int md: mode
|            mdFaceUp:    draw face up card (cd in cdAClubs..cdKSpades)
|           mdFaceDown:  draw face down card (cd in cdFaceDown1..cdFaceDown12)
|           mdHilite:    draw face up card inversely
|           mdGhost:     draw a ghost card, cd ignored
|           mdRemove:    draw rectangle of background color at x,y
|           mdDeckX:     draw an X
|           mdDeckO:     draw an O
|        DWORD rgbBgnd: table background color (only required for mdGhost and mdRemove)
|    
|    Returns:
|        TRUE if successful
-----------------------------------------------------------------------------*/
BOOL _declspec(dllexport) cdtDraw(HDC hdc, int x, int y, int cd, int md, DWORD rgbBgnd);

/*-----------------------------------------------------------------------------
|    cdtDrawExt
|    
|        Same as cdtDraw except will stretch the cards to an arbitray extent
|    
|    Arguments:
|        HDC hdc
|        int x
|        int y
|        int dx
|        int dy
|        int cd
|        int md
|        DWORD rgbBgnd:
|   
|    Returns:
|        TRUE if successful
-----------------------------------------------------------------------------*/
BOOL _declspec(dllexport) cdtDrawExt(HDC hdc, int x, int y, int dx, int dy, 
                                    int cd, int md, DWORD rgbBgnd);
/*-----------------------------------------------------------------------------
|    cdtAnimate
|    
|        Draws the animation on a card.  Four cards support animation:
|
|      cd         #frames    description       
|   cdFaceDown3   4          robot meters
|   cdFaceDown10  2          bats flapping
|   cdFaceDown11  4          sun sticks tongue out
|    cdFaceDown12  4          cards running up and down sleave
|
|    Call cdtAnimate every 250 ms for proper animation speed.
|    
|    Arguments:
|        HDC hdc
|        int cd    cdFaceDown3, cdFaceDown10, cdFaceDown11 or cdFaceDown12
|        int x:    upper left corner of card
|        int y
|        int ispr  sprite to draw (0..1 for cdFaceDown10, 0..3 for others)
|    
|    Returns:
|       TRUE if successful
-----------------------------------------------------------------------------*/
BOOL _declspec(dllexport) cdtAnimate(HDC hdc, int cd, int x, int y, int ispr);

/*-----------------------------------------------------------------------------
|    cdtTerm
|    
|        Call once at app termination
-----------------------------------------------------------------------------*/
VOID _declspec(dllexport) cdtTerm(VOID);



