This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/WATCOM/samples/win/watzee/wdraw.c

343 lines
10 KiB
C

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