#include <windows.h>
#include <string.h>
#include <stdio.h>
#include "watzee.h"


/*
 * DrawScoreCard -- draw the lines that make up the score card
 */

extern void DrawScoreCard( HDC hdc )
/**********************************/
{
    short   score_card_right;
    short   score_card_bottom;
    short   x;
    short   y;
    short   i;

    /*  draw the horizontal lines of the score card  */
    score_card_right = CharWidth + CharWidth * SCORE_CARD_WIDTH;
    score_card_bottom = CharHeight * 23;
    y = CharHeight + CharHeight / 2 - 1;
    for( i = 0; i < 2; i++, y++ ) {
        MoveToEx( hdc, CharWidth + CharWidth * SCORE_OPTIONS_WIDTH - 1,
                  y, NULL );
        LineTo( hdc, score_card_right + 2, y );
    }
    y = CharHeight * 3 - 1;
    MoveToEx( hdc, CharWidth, y, NULL );
    LineTo( hdc, score_card_right, y );
    for( ++y; y <= CharHeight * 9; y += CharHeight ) {
        MoveToEx( hdc, CharWidth, y, NULL );
        LineTo( hdc, score_card_right, y );
    }
    y += CharHeight / 2;
    MoveToEx( hdc, CharWidth, y, NULL );
    LineTo( hdc, score_card_right, y );
    y += CharHeight + CharHeight / 2 - 1;
    MoveToEx( hdc, CharWidth, y, NULL );
    LineTo( hdc, score_card_right, y );
    for( ++y; y <= CharHeight * 20; y += CharHeight ) {
        MoveToEx( hdc, CharWidth, y, NULL );
        LineTo( hdc, score_card_right, y );
    }
    y += CharHeight / 2 - 1;
    MoveToEx( hdc, CharWidth, y, NULL );
    LineTo( hdc, score_card_right, y );
    y++;
    MoveToEx( hdc, CharWidth, y, NULL );
    LineTo( hdc, score_card_right, y );
    y += CharHeight + CharHeight / 2;
    MoveToEx( hdc, CharWidth, y, NULL );
    LineTo( hdc, score_card_right, y );
    y++;
    MoveToEx( hdc, CharWidth, y, NULL );
    LineTo( hdc, score_card_right, y );
    /*  draw the vertical lines of the score card  */
    x = CharWidth;
    for( i = 0; i < 2; i++, x++ ) {
        MoveToEx( hdc, x, CharHeight * 3, NULL );
        LineTo( hdc, x, score_card_bottom );
    }
    x = CharWidth + CharWidth * SCORE_OPTIONS_WIDTH - 1;
    y = CharHeight + CharHeight / 2;
    MoveToEx( hdc, x, y, NULL );
    LineTo( hdc, x, score_card_bottom );
    for( ++x; x <= score_card_right; x += CharWidth * 3 ) {
        MoveToEx( hdc, x, y, NULL );
        LineTo( hdc, x, score_card_bottom );
    }
    x = score_card_right + 1;
    MoveToEx( hdc, x, y, NULL );
    LineTo( hdc, x, score_card_bottom );
    /*  draw the score card's shadow */
    y = CharHeight * 3 - CharHeight / 3;
    x = score_card_right + 1;
    score_card_right += 3 * CharWidth / 4;
    for(; x < score_card_right; x++ ) {
        MoveToEx( hdc, x, y, NULL );
        LineTo( hdc, x, score_card_bottom );
    }
    x = CharWidth * 2;
    y = score_card_bottom;
    score_card_bottom += 3 * CharHeight / 4;
    for(; y < score_card_bottom; y++ ) {
        MoveToEx( hdc, x, y, NULL );
        LineTo( hdc, score_card_right, y );
    }
}



/*
 * WriteScoreOptions -- fill in the score options down the leftmost column
 *                      of the score card
 */

extern void WriteScoreOptions( HDC hdc )
/**************************************/
{
    static char *score_options[] = { NULL, "Aces", "Twos", "Threes",
                                     "Fours", "Fives", "Sixes",
                                     "3 of a Kind", "4 of a Kind",
                                     "Full House", "Small Straight",
                                     "Large Straight", "WATZEE",
                                     "Chance", "WATZEE Bonus" };
    HFONT       hfont;
    RECT        rect;
    short       pass;
    short       score;
    short       y;
    short       i;

    SelectObject( hdc, GetStockObject( SYSTEM_FONT ) );
    rect.left = CharWidth + 2;
    rect.right = CharWidth + CharWidth * SCORE_OPTIONS_WIDTH - 1;
    rect.top = CharHeight * 9 + 3;
    rect.bottom = rect.top + 3 * CharHeight / 2 - 2;
    DrawText( hdc, "BONUS", 5, &rect, DT_CENTER | DT_VCENTER );
    rect.top = rect.bottom + 3;
    rect.bottom += 3 * CharHeight / 2;
    DrawText( hdc, "TOTAL", 5, &rect, DT_CENTER | DT_VCENTER );
    rect.top = CharHeight * 20 + 4;
    rect.bottom = rect.top + CharHeight + CharHeight / 2;
    DrawText( hdc, "TOTAL", 5, &rect, DT_CENTER | DT_VCENTER );
    rect.top = rect.bottom + 1;
    rect.bottom = rect.top + CharHeight + CharHeight / 2 - 1;
    DrawText( hdc, "GRAND TOTAL", 11, &rect, DT_CENTER | DT_VCENTER );
    hfont = SelectObject( hdc, CreateFontIndirect( &SmallBoldFont ) );
    for( pass = 0; pass < 2; pass++ ) {
        y = CharHeight * 3;
        if( pass == 1 ) {
            hfont = SelectObject( hdc, CreateFontIndirect( &SmallNormalFont ) );
        }
        for( i = ACES; i <= SIXES; i++ ) {
            score = Player[CurrentPlayer][i];
            if( ( pass == 0 && score == UNDEFINED )
             || ( pass && score != UNDEFINED ) )   {
                rect.top = y + 1;
                rect.bottom = y + CharHeight - 1;
                FillRect( hdc, &rect, GetStockObject( WHITE_BRUSH ) );
                DrawText( hdc,score_options[i],-1,&rect,DT_CENTER|DT_VCENTER );
            }
            y += CharHeight;
        }
        y = CharHeight * 12;
        for( i = THREE_KIND; i <= CHANCE; i++ ) {
            score = Player[CurrentPlayer][i];
            if( ( pass == 0 && score == UNDEFINED )
             || ( pass && score != UNDEFINED ) )   {
                rect.top = y + 1;
                rect.bottom = y + CharHeight - 1;
                FillRect( hdc, &rect, GetStockObject( WHITE_BRUSH ) );
                DrawText( hdc,score_options[i],-1,&rect,DT_CENTER|DT_VCENTER );
            }
            y += CharHeight;
        }
        if( ( pass == 0 && Player[CurrentPlayer][WATZEE] == 50 )
         || ( pass == 1 && Player[CurrentPlayer][WATZEE] != 50 ) ) {
             rect.top = CharHeight * 19 + 1;
             rect.bottom = rect.top + CharHeight - 1;
             FillRect( hdc, &rect, GetStockObject( WHITE_BRUSH ) );
             DrawText( hdc, score_options[WATZEE_BONUS], -1, &rect,
                       DT_CENTER|DT_VCENTER );
        }
        DeleteObject( SelectObject( hdc, hfont ) );
    }
}




/*
 * WriteInitials -- write the players' initials across the top of the
 *                  score card
 */

extern void WriteInitials( HDC hdc )
/**********************************/
{
    RECT    rect;
    short   i;

    SelectObject( hdc, GetStockObject( SYSTEM_FONT ) );
    rect.left = CharWidth + CharWidth * SCORE_OPTIONS_WIDTH + 1;
    rect.right = rect.left + 3 * CharWidth - 2;
    rect.top = CharHeight + CharHeight / 2 + 2;
    rect.bottom = CharHeight * 3 - 2;
    rect.top++;
    rect.bottom++;
    for( i = 0; i < NumberOfPlayers; i++ ) {
        FillRect( hdc, &rect, GetStockObject( WHITE_BRUSH ) );
        DrawText( hdc, PlayerName[i], -1, &rect, DT_CENTER | DT_VCENTER );
        rect.left += 3 * CharWidth;
        rect.right += 3 * CharWidth;
    }
}



/*
 * DrawDice -- "blit" out the dice bitmaps
 */

extern void DrawDice( HWND hwnd, HDC hdc )
/****************************************/
{
    HDC         hdcMem;
    HBITMAP     hdicebitmap[7];
    BITMAP      bm;
    short       x;
    short       y;
    short       i;

    for( i = 0; i < 6; i++ ) {
        hdicebitmap[i+1] = (HBITMAP)GetWindowLong( hwnd, i * sizeof( DWORD ) );
    }
    hdcMem = CreateCompatibleDC( hdc );
    GetObject( hdicebitmap[1], sizeof( BITMAP ), (LPSTR) &bm );
    x = CharWidth * 24;
    y = CharHeight * 2;
    for( i = 0; i < 5; i++ ) {
        SelectObject( hdcMem, hdicebitmap[Dice[i].value] );
        BitBlt( hdc, x, y, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY );
        y += bm.bmHeight + bm.bmHeight / 7;
    }
    DeleteDC( hdcMem );
}




/*
 * HighliteName -- invert the rectangle at the top of the score card that
 *                 contains the initials of the player whose turn it is
 */

extern void HighliteName( HDC hdc, short player )
/***********************************************/
{
    RECT    rect;

    rect.left = CharWidth + CharWidth * SCORE_OPTIONS_WIDTH
                + player * 3 * CharWidth + 1;
    rect.right = rect.left + 3 * CharWidth - 1;
    rect.top = CharHeight + CharHeight / 2 + 1;
    rect.bottom = CharHeight * 3 - 1;
    InvertRect( hdc, &rect );
}



/*
 * WriteScore -- write out a particular score
 */

extern void WriteScore( HDC hdc, short player, short selection )
/**************************************************************/
{
    RECT    rect;
    char    score_str[4];
    short   score;

    score = Player[player][selection];
    rect.left = CharWidth + CharWidth * SCORE_OPTIONS_WIDTH + player * 3
                * CharWidth + 1;
    rect.right = rect.left + CharWidth * 3 - 2;
    switch( selection ) {
    case ACES :
    case TWOS :
    case THREES :
    case FOURS :
    case FIVES :
    case SIXES :
        rect.top = CharHeight * ( 2 + selection );
        rect.bottom = rect.top + CharHeight;
        break;
    case BONUS :
        rect.top = CharHeight * 9 + 3;
        rect.bottom = rect.top + CharHeight + CharHeight / 2 - 3;
        break;
    case UPPER_TOTAL :
        rect.top = CharHeight * 10 + CharHeight / 2 + 3;
        rect.bottom = rect.top + CharHeight + CharHeight / 2 - 3;
        break;
    case THREE_KIND :
    case FOUR_KIND :
    case FULL_HOUSE :
    case SMALL_STRAIGHT :
    case LARGE_STRAIGHT :
    case WATZEE :
    case CHANCE :
    case WATZEE_BONUS :
        rect.top = CharHeight * ( 12 + selection - THREE_KIND );
        rect.bottom = rect.top + CharHeight;
        break;
    case LOWER_TOTAL :
        rect.top = CharHeight * 20 + 3;
        rect.bottom = rect.top + CharHeight + CharHeight / 2 - 3;
        break;
    case GRAND_TOTAL :
        rect.top = CharHeight * 21 + CharHeight / 2 + 3;
        rect.bottom = rect.top + CharHeight + CharHeight / 2 - 3;
        break;
    }
    rect.top++;
    rect.bottom--;
    FillRect( hdc, &rect, GetStockObject( WHITE_BRUSH ) );
    if( score != UNDEFINED ) {
        sprintf( score_str, "%d", score );
        DrawText( hdc, score_str, -1, &rect, DT_CENTER | DT_VCENTER );
    }
}



/*
 * WriteScores -- write out all of the scores
 */

extern void WriteScores( HDC hdc )
/********************************/
{
    HFONT       hfont;
    short       i;
    short       j;

    hfont = SelectObject( hdc, CreateFontIndirect( &SmallBoldFont ) );
    for( i = 0; i < NumberOfPlayers; i++ ) {
        for( j = ACES; j < BONUS; j++ ) {
            WriteScore( hdc, i, j );
        }
    }
    DeleteObject( SelectObject( hdc, hfont ) );
    SelectObject( hdc, GetStockObject( SYSTEM_FONT ) );
    for( i = 0; i < NumberOfPlayers; i++ ) {
        for( j = BONUS; j <= GRAND_TOTAL; j++ ) {
            WriteScore( hdc, i, j );
        }
    }
}
