/*
 *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 *%									   %
 *%	Copyright (C) 1991,1994 by WATCOM International Inc.		   %
 *%	All rights reserved.						   %
 *%									   %
 *%     Permission is granted to anyone to use this example program for	   %
 *%     any purpose on any computer system, subject to the following	   %
 *%	restrictions:							   %
 *%									   %
 *%     1. This example is provided on an "as is" basis, without warranty. %
 *%	   You indemnify, hold harmless and defend WATCOM from and against %
 *%	   any claims or lawsuits, including attorney's, that arise or	   %
 *%	   result from the use or distribution of this example, or any     %
 *%	   modification thereof.					   %
 *%									   %
 *%     2. You may not remove, alter or suppress this notice from this	   %
 *%        example program or any modification thereof.			   %
 *%									   %
 *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 *
 * WDRAW.C
 *
 *  Output-related functions for WATZEE
 *
 */

#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 );
	}
    }
}
