#include <stdio.h>
#include <stdlib.h>

#include "game.h"
#include "paigow.h"
#include "ok.h"

LOGFONT lf;

/*
	Function:		Game::Game()

	Parameters:		none

	Description: 	Game constructor initializes inter game counter and seeds the random number generator

	Returns: 		nothing
*/

Game::Game()
{
	number_highlighted = 0;
	randomize();				//seed the random number generator by polling time

	SetNumberHands(0);
	SetNumberWon(0);
   SetNumberLost(0);
   SetNumberTied(0);
   SetCurrentWinStreak(0);
   SetCurrentLoseStreak(0);
   SetCurrentTieStreak(0);
   SetLargestWinStreak(0);
   SetLargestLoseStreak(0);
	SetLargestTieStreak(0);

}

/*
	Function:		Game::Swap()

	Parameters:		a  -- pointer to value 1
                  b  -- pointer to value 2

	Description: 	swaps two integer values

	Returns: 		none
*/

void
Game::Swap(int *a, int *b)
{
	int c;

	c = *a;
	*a = *b;
	*b = c;
}

/*
	Function:		Game::AutoBuildHands()

	Parameters:		seven -- pointer to seven card hand
                  five  -- pointer to five card hand
                  two   -- pointer to two card hand

	Description: 	Parses the seven card hand and builds the five and two card hands

	Returns: 		nothing
*/

void
Game::AutoBuildHands(Hand *seven, Hand *five, Hand *two)
{
   ParseSeven(seven);

	if (seven->have_four_of_a_kind)
      BuildFourOK(seven, five, two);
	else if (seven->type_of_flush != 0) 
      BuildFlush(seven, five, two);
	else if (seven->have_straight)
      BuildStraight(seven, five, two);
   else if (seven->number_of_three_of_a_kinds == 2)
      BuildTwoThreeOKS(seven, five, two);
	else if (seven->number_of_three_of_a_kinds == 1) 
      BuildThreeOK(seven, five, two);
	else if (seven->number_of_pairs == 3) 
      BuildThreePairs(seven, five, two);
	else if (seven->number_of_pairs == 2) 
      BuildTwoPairs(seven, five, two);
	else if (seven->number_of_pairs == 1) 
		BuildOnePair(seven, five, two);
	else                                      	// paigow!!!!!!
      BuildPaigow(seven, five, two);
}

/*
	Function:		Game::ParseSeven()

	Parameters:		seven -- pointer to seven card hand

	Description: 	Determines how many of each suit and value the hand contains.
                  Also figures out how many consecutive cards the player has.

	Returns: 		nothing
*/

void 
Game::ParseSeven(Hand *seven)
{
   int i;

   ParseSuits(seven);
   ParseValues(seven);

}

void
Game::ParseSuits(Hand *seven)
{
	for (int i = 0; i < 7; i++) {
		if (seven->card[i].GetSuit() == HEARTS)
			seven->number_of_hearts++;
		else if (seven->card[i].GetSuit() == SPADES)
			seven->number_of_spades++;
		else if (seven->card[i].GetSuit() == DIAMONDS)
			seven->number_of_diamonds++;
		else if (seven->card[i].GetSuit() == CLUBS)
			seven->number_of_clubs++;
   }

	if (seven->number_of_spades >= 5) {
		seven->type_of_flush = SPADES;
		seven->number_of_same_suit = seven->number_of_spades;
	}
	else if (seven->number_of_hearts >= 5) {
		seven->type_of_flush = HEARTS;
		seven->number_of_same_suit = seven->number_of_hearts;
	}
	else if (seven->number_of_diamonds >= 5) {
		seven->type_of_flush = DIAMONDS;
		seven->number_of_same_suit = seven->number_of_diamonds;
	}
	else if (seven->number_of_clubs >= 5) {
		seven->type_of_flush = CLUBS;
		seven->number_of_same_suit = seven->number_of_clubs;
	}

}

void
Game::ParseValues(Hand *seven)
{
	for (int i = 0; i < 7; i++) {
		seven->numbers[seven->card[i].GetValue()]++;
		if (i != 6) {
			if (seven->card[i].GetValue() - seven->card[i + 1].GetValue() == 1) {
				if (!seven->consecutive_cards && seven->most_consecutive_cards < 4)
					seven->high_consecutive_card = seven->card[i].GetValue();
				seven->consecutive_cards++;
			}
			else if (seven->card[i].GetValue() - seven->card[i + 1].GetValue() == 0)
            ; // do nothing
			else {
				if (seven->most_consecutive_cards < seven->consecutive_cards) {
					seven->most_consecutive_cards = seven->consecutive_cards;
					seven->low_consecutive_card = seven->card[i].GetValue();
				}
				seven->consecutive_cards = 0;
			}
		}
	}

	if (seven->most_consecutive_cards < seven->consecutive_cards) {
		seven->most_consecutive_cards = seven->consecutive_cards;
		seven->low_consecutive_card = seven->card[6].GetValue();
	}

	seven->consecutive_cards = seven->most_consecutive_cards;

	for (i = 0; i != 15; i++) {
		if (seven->numbers[i] == 4) {
			seven->have_four_of_a_kind = 1;
         seven->have_four_of_what = i;
		}
		else if (seven->numbers[i] == 3) {
			seven->three_of_a_kinds[seven->number_of_three_of_a_kinds] = i;
			seven->number_of_three_of_a_kinds++;
		}
		else if (seven->numbers[i] == 2) {
			seven->pairs[seven->number_of_pairs] = i;
			seven->number_of_pairs++;
		}
	}

	if (seven->numbers[ACE])				// used to be == 1
		seven->have_ace++;
	if (seven->numbers[KING])		   	// used to be == 1
		seven->have_king++;

	if (seven->consecutive_cards == 3 && seven->high_consecutive_card == FIVE && seven->have_ace) {
		seven->have_straight = 1;
		seven->have_baby_straight = 1;
		seven->low_consecutive_card = LOWACE;
		seven->consecutive_cards = 4;
	}
	else if (seven->consecutive_cards == 4 && seven->high_consecutive_card == SIX && seven->have_ace) {
		seven->have_straight = 1;
		seven->have_baby_straight = 1;
		seven->low_consecutive_card = LOWACE;
		seven->consecutive_cards = 5;
	}
	else if (seven->consecutive_cards == 5 && seven->high_consecutive_card == SEVEN && seven->have_ace) {
		seven->have_straight = 1;
		seven->have_baby_straight = 1;
		seven->low_consecutive_card = LOWACE;
		seven->consecutive_cards = 6;
	}

	if (seven->consecutive_cards >= 4) {
		if (debug)
			OkMsgBox("Build Dealer Hand",
                  "I have %d consec cards so I have a straight",
                  seven->consecutive_cards);
		seven->have_straight = 1;
	}
}


/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void
Game::BuildFourOK(Hand *seven, Hand *five, Hand *two)
{
	int i, two_card_number = 0, five_card_number = 0;

	if (seven->number_of_three_of_a_kinds) {
		for (i = 0; i != 7; i++) {
			if (seven->card[i].GetValue() == seven->three_of_a_kinds[0] && two_card_number != 2) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else if (five_card_number != 5) {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
	if (seven->number_of_pairs) {
		for (i = 0; i != 7; i++) {
			if (seven->card[i].GetValue() == seven->pairs[0] && two_card_number != 2) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else if (five_card_number != 5) {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
	else if (seven->have_ace || seven->four_of_what < JACK) {
		for (i = 0; i != 7; i++) {
			if (seven->card[i].GetValue() != seven->four_of_what && two_card_number != 2) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else if (five_card_number != 5) {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
	else {
		for (i = 0; i != 7; i++) {
			if (seven->card[i].GetValue() == seven->four_of_what && two_card_number != 2) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
		  	}
			else if (five_card_number != 5) {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void
Game::BuildFlush(Hand *seven, Hand *five, Hand *two)
{
	int i, two_card_number = 0, five_card_number = 0;

	if (debug)
		OkMsgBox("IN FLUSH CODE", "In Flush Code");
	if (seven->number_of_same_suit == 7) {
		for (i = 0; i != 7; i++) {
			if (two_card_number != 2) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
	else if (seven->number_of_same_suit == 6) {
		if (seven->number_of_pairs) {
			for (i = 0; i != 7; i++) {
				if (seven->card[i].GetValue() == seven->pairs[0]) {
					two->card[two_card_number] = seven->card[i];
					two_card_number++;
				}
				else {
					five->card[five_card_number] = seven->card[i];
					five_card_number++;
				}
			}
		}
		else {
			for (i = 0; i != 7; i++)
			if (two_card_number != 2 && seven->number_of_same_suit == 6) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
				seven->number_of_same_suit--;
			}
			else if (two_card_number != 2 && seven->card[i].GetSuit() != seven->type_of_flush) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
	else {	// just make the flush
		for (i = 0; i != 7; i++) {
			if (seven->card[i].GetSuit() != seven->type_of_flush) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::BuildStraight(Hand *seven, Hand *five, Hand *two)
{
	int i, used_high_pair = 0, used_low_pair = 0, two_card_number = 0, five_card_number = 0;

	if (debug)
		OkMsgBox("IN STRAIGHT CODE", "In straight Code");
	if (seven->consecutive_cards == 6) {
		for (i = 0; i != 7; i++) {
			if (two_card_number != 2) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
	else if (seven->consecutive_cards == 5) { // they have six cards to the straight
		if (seven->number_of_pairs == 1 && (seven->low_consecutive_card == seven->pairs[0] ||
         (seven->low_consecutive_card == LOWACE && seven->pairs[0] == ACE))) {
			for (i = 0; i != 7; i++) {
				if (seven->card[i].GetValue() == seven->pairs[0]) {
					two->card[two_card_number] = seven->card[i];
					two_card_number++;
				}
				else {
					five->card[five_card_number] = seven->card[i];
					five_card_number++;
				}
			}
		}
		else {	// six cards to a straight but no pair
			for (i = 0; i != 7; i++) {
				if (seven->card[i].GetValue() >= seven->high_consecutive_card || seven->card[i].GetValue() < seven->low_consecutive_card) {
// don't forget the baby straight possibility
					two->card[two_card_number] = seven->card[i];
					two_card_number++;
				}
				else {
					five->card[five_card_number] = seven->card[i];
					five_card_number++;
				}
			}
		}
	}
	else {	// they only have the five cards to the straight
		if (seven->number_of_three_of_a_kinds && (seven->three_of_a_kinds[0] == seven->high_consecutive_card || seven->three_of_a_kinds[0] == seven->low_consecutive_card))	{
			for (i = 0; i != 7; i++) {
				if (seven->card[i].GetValue() == seven->three_of_a_kinds[0] && two_card_number != 2) {
					two->card[two_card_number] = seven->card[i];
					two_card_number++;
				}
				else {
					five->card[five_card_number] = seven->card[i];
					five_card_number++;
				}
			}
		}
		else if ((seven->have_king && KING > seven->high_consecutive_card) ||
			(seven->have_ace && (ACE != seven->high_consecutive_card && LOWACE != seven->low_consecutive_card)) // was ||
			|| (seven->number_of_pairs == 1 && (seven->pairs[0] > seven->high_consecutive_card || seven->pairs[0] < seven->low_consecutive_card))) {
			for (i = 0; i != 7; i++) {
				if (five_card_number != 5 && seven->have_baby_straight && seven->card[i].GetValue() == ACE) {
					five->card[five_card_number] = seven->card[i];
					five_card_number++;
				}
				else if (two_card_number != 2 && (seven->card[i].GetValue() > seven->high_consecutive_card || seven->card[i].GetValue() < seven->low_consecutive_card)) {
					two->card[two_card_number] = seven->card[i];
					two_card_number++;
				}
				else {
					five->card[five_card_number] = seven->card[i];
					five_card_number++;
				}
			}
		}
		else {	// have a straight but would have a low card so determine how many pairs we have
			if (seven->number_of_pairs == 2) {
				if (debug)
					OkMsgBox("IN STRAIGHT CODE", "also have 2 pairs");
				if (seven->pairs[1] > 6) {
					for (i = 0; i != 7; i++) {
						if (seven->card[i].GetValue() == seven->pairs[0]) {
							two->card[two_card_number] = seven->card[i];
							two_card_number++;
						}
						else {
							five->card[five_card_number] = seven->card[i];
							five_card_number++;
						}
					}
				}
				else if (seven->have_ace) {
					for (i = 0; i != 7; i++) {
						if (two_card_number != 2 && seven->card[i].GetValue() != seven->pairs[0] && seven->card[i].GetValue() != seven->pairs[1]) {
							two->card[two_card_number] = seven->card[i];
							two_card_number++;
						}
						else {
							five->card[five_card_number] = seven->card[i];
							five_card_number++;
						}
					}
				}
				else { // just make the straight
// new problem spot SDB 5/19/92!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- check to make sure that straight is made properly similar to below
					if (debug)
						OkMsgBox("IN STRAIGHT CODE", "5/24 code straight and 2 pairs");

					if ((seven->pairs[0] <= seven->high_consecutive_card || seven->pairs[0] >= seven->low_consecutive_card) && (seven->pairs[1] <= seven->high_consecutive_card || seven->pairs[1] >= seven->low_consecutive_card)) {
						for (i = 0; i != 7; i++) {
							if (i == 0 && (seven->card[i].GetValue() <= seven->high_consecutive_card || seven->card[i].GetValue() >= seven->low_consecutive_card)) {
								five->card[five_card_number] = seven->card[i];
								five_card_number++;
							}
							else if (i != 0 && (seven->card[i].GetValue() <= seven->high_consecutive_card || seven->card[i].GetValue() >= seven->low_consecutive_card) && (seven->card[i].GetValue() != seven->card[i - 1].GetValue())) {
								if (five_card_number != 5 && seven->have_baby_straight && seven->card[i].GetValue() == ACE) {
									five->card[five_card_number] = seven->card[i];
									five_card_number++;
								}
								else if (two_card_number != 2 && ((seven->card[i].GetValue() > seven->high_consecutive_card || seven->card[i].GetValue() < seven->low_consecutive_card) ||
									(i != 0 && seven->card[i].GetValue() == seven->card[i - 1].GetValue() ))) {
									two->card[two_card_number] = seven->card[i];
									two_card_number++;
								}
								else {
									five->card[five_card_number] = seven->card[i];
									five_card_number++;
								}
							}
						}
					}
					else {
						for (i = 0; i != 7; i++) {
							if (seven->card[i].GetValue() == seven->pairs[0] && used_low_pair == 0 && two_card_number != 2) {
								two->card[two_card_number] = seven->card[i];
								used_low_pair++;
								two_card_number++;
							}
							else if (seven->card[i].GetValue() == seven->pairs[1] && used_high_pair == 0 && two_card_number != 2) {
								two->card[two_card_number] = seven->card[i];
								used_high_pair++;
								two_card_number++;
							}
							else {
								five->card[five_card_number] = seven->card[i];
								five_card_number++;
							}
						}
					}
				}	  
			}
			else if (seven->number_of_pairs == 1) {	//new code 5/10/92 -- under construction
				if (debug)
					OkMsgBox("IN STRAIGHT CODE", "straight and a pair");
// determine if pair falls into straight
// if it does make sure you only use one of them -- set flag
				for (i = 0; i != 7; i++) {
					if (i == 0 && (seven->card[i].GetValue() <= seven->high_consecutive_card || seven->card[i].GetValue() >= seven->low_consecutive_card)) {
						five->card[five_card_number] = seven->card[i];
						five_card_number++;
					}
					else if (i != 0 && (seven->card[i].GetValue() <= seven->high_consecutive_card || seven->card[i].GetValue() >= seven->low_consecutive_card) && (seven->card[i].GetValue() != seven->card[i - 1].GetValue())) {
						if (five_card_number != 5 && seven->have_baby_straight && seven->card[i].GetValue() == ACE) {
							five->card[five_card_number] = seven->card[i];
							five_card_number++;
						}
						else if (two_card_number != 2 && ((seven->card[i].GetValue() > seven->high_consecutive_card || seven->card[i].GetValue() < seven->low_consecutive_card) ||
							(i != 0 && seven->card[i].GetValue() == seven->card[i - 1].GetValue() ))) {
							two->card[two_card_number] = seven->card[i];
							two_card_number++;
						}
						else {
							five->card[five_card_number] = seven->card[i];
							five_card_number++;
						}
					}
					else {
						two->card[two_card_number] = seven->card[i];
						two_card_number++;
					}
				}
			}
			else { // make the straight and whatever is left
				for (i = 0; i != 7; i++) {
					if (five_card_number != 5 && seven->have_baby_straight && seven->card[i].GetValue() == ACE) {
						five->card[five_card_number] = seven->card[i];
						five_card_number++;
					}
					else if (two_card_number != 2 && ((seven->card[i].GetValue() > seven->high_consecutive_card || seven->card[i].GetValue() < seven->low_consecutive_card) ||
						(i != 0 && seven->card[i].GetValue() == seven->card[i - 1].GetValue() ))) {
						two->card[two_card_number] = seven->card[i];
						two_card_number++;
					}
					else {
						five->card[five_card_number] = seven->card[i];
						five_card_number++;
					}
				}
			}
		}
	}
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::BuildTwoThreeOKS(Hand *seven, Hand *five, Hand *two)
{
	int i, two_card_number = 0, five_card_number = 0;

	for (i = 0; i != 7; i++) {
		if (seven->card[i].GetValue() == seven->three_of_a_kinds[1] && two_card_number != 2) {
			two->card[two_card_number] = seven->card[i];
			two_card_number++;
		}
		else {
			five->card[five_card_number] = seven->card[i];
			five_card_number++;
		}
	}
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::BuildThreeOK(Hand *seven, Hand *five, Hand *two)
{
	int i, two_card_number = 0, five_card_number = 0;

	if (seven->number_of_pairs == 2) {
		for (i = 0; i != 7; i++) {
			if (seven->card[i].GetValue() == seven->pairs[1]) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
	else if (seven->number_of_pairs == 1) {
		for (i = 0; i != 7; i++) {
			if (seven->card[i].GetValue() == seven->pairs[0]) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
	else {	// have only 1 type of three_of_a_kind
		if (seven->three_of_a_kinds[0] == ACE) {
			two->card[0] = seven->card[0];
			two->card[1] = seven->card[3];
			five->card[0] = seven->card[1];
			five->card[1] = seven->card[2];
			five->card[2] = seven->card[4];
			five->card[3] = seven->card[5];
			five->card[4] = seven->card[6];
		}
		else {
			for (i = 0; i != 7; i++) {
				if (seven->card[i].GetValue() != seven->three_of_a_kinds[0] && two_card_number != 2) {
					two->card[two_card_number] = seven->card[i];
					two_card_number++;
				}
				else {
					five->card[five_card_number] = seven->card[i];
					five_card_number++;
				}
			}
		}
	}
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::BuildThreePairs(Hand *seven, Hand *five, Hand *two)
{
	int i, two_card_number = 0, five_card_number = 0;

	for (i = 0; i != 7; i++) {
		if (seven->card[i].GetValue() == seven->pairs[2] && two_card_number != 2) {
			two->card[two_card_number] = seven->card[i];
			two_card_number++;
		}
		else {
			five->card[five_card_number] = seven->card[i];
			five_card_number++;
		}
	}
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::BuildTwoPairs(Hand *seven, Hand *five, Hand *two)
{
	int i, two_card_number = 0, five_card_number = 0;

	if (seven->pairs[1] > 6 || !seven->have_ace) {
		for (i = 0; i != 7; i++) {
			if (seven->card[i].GetValue() == seven->pairs[0]) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
	else if (seven->have_ace) {
		for (i = 0; i != 7; i++) {
			if (two_card_number != 2 && seven->card[i].GetValue() != seven->pairs[0] && seven->card[i].GetValue() != seven->pairs[1]) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::BuildOnePair(Hand *seven, Hand *five, Hand *two)
{
	int i, two_card_number = 0, five_card_number = 0;

	if (seven->pairs[0] == ACE && seven->card[2].GetValue() < JACK) {
		two->card[0] = seven->card[0];
		two->card[1] = seven->card[3];
		five->card[0] = seven->card[1];
		five->card[1] = seven->card[2];
		five->card[2] = seven->card[4];
		five->card[3] = seven->card[5];
		five->card[4] = seven->card[6];
	}
	else {
		for (i = 0; i != 7; i++) {
			if (seven->card[i].GetValue() != seven->pairs[0] && two_card_number != 2) {
				two->card[two_card_number] = seven->card[i];
				two_card_number++;
			}
			else {
				five->card[five_card_number] = seven->card[i];
				five_card_number++;
			}
		}
	}
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::BuildPaigow(Hand *seven, Hand *five, Hand *two)
{
	int i;

	two->card[0] = seven->card[1];
	two->card[1] = seven->card[2];
	five->card[0] = seven->card[0];
	five->card[1] = seven->card[3];
	five->card[2] = seven->card[4];
	five->card[3] = seven->card[5];
	five->card[4] = seven->card[6];
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::BuildPlayerHands(Hand *seven, Hand *five, Hand *two)
{
	int i, j = 0, k = 0;

	for (i = 0; i != 7; i++) {
		if (box_status[i]) {
			two->card[j] = seven->card[i];
			seven->card[i].SetUsed(1);
			j++;
		}
		else {
			five->card[k] = seven->card[i];
			seven->card[i].SetUsed(1);
			k++;
		}
	}
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::ClearPlayingField(HDC hdc)
{
	HBRUSH hBrush;
	HPEN hPen;

	hBrush = SelectObject(hdc, CreateSolidBrush(RGB_GREEN));
	hPen = SelectObject(hdc, GetStockObject(NULL_PEN));

	Rectangle(hdc, PLAYER_RIGHTBOX, PLAYER_TWOHANDTOP, 640, PLAYER_BOTTOMBOX);
	Rectangle(hdc, DEALER_RIGHTBOX, DEALER_TWOHANDTOP, 640, DEALER_BOTTOMBOX);

	Rectangle(hdc, RESULTSX, RESULTSY, RESULTSX + 190, RESULTSY + 50);
	Rectangle(hdc, RESULTSX, RESULTSY, RESULTSX + 180, RESULTSY + 20);

	DeleteObject(SelectObject(hdc, hBrush));
	DeleteObject(SelectObject(hdc, hPen));
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

int 
Game::DealDealer(HDC hdc, int which_card_back)
{
	int i, card_back;
	short x = DEALER_RIGHTBOX, y = DEALER_TOPBOX;
	char *backnames[] = {
		"PCB1", "PCB2", "PCB3", "PCB4", "PCB5", "PCB6", "PCB7", "PCB8"
	};
   Card card;
	
	if (which_card_back == -1)
		card_back = random(8);				// 0 to 7
	else
		card_back = which_card_back;

	hBitmap = LoadBitmap(hInst, backnames[card_back]);

	for (i = 0; i != 7; i++) {
		card.DrawBitmap(hdc, hBitmap, x, y);
		x += BOXXSPACING;	
	}
	DeleteObject(hBitmap);
	return(card_back);
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::ClearHighlights(HDC hdc)
{

	HPEN hPen;
	int box;

	hPen = SelectObject(hdc, CreatePen(PS_SOLID, 1, RGB_GREEN));

	for (box = 0; box != 7; box++) {
		MoveTo(hdc, mybox[box].left, mybox[box].top);
		LineTo(hdc, mybox[box].right, mybox[box].top);
		LineTo(hdc, mybox[box].right, mybox[box].bottom);
		LineTo(hdc, mybox[box].left, mybox[box].bottom);
		LineTo(hdc, mybox[box].left, mybox[box].top);
	}

	DeleteObject(SelectObject(hdc, hPen));
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::HighLiteCard(HDC hdc, short x, short y)
{
	int box = -1, drawit = 0;
	char messagebuffer[100];

	HPEN hPen;
   
	if (y >= PLAYER_TOPBOX + 5 && y <= PLAYER_BOTTOMBOX - 5) {
		if (x >= PLAYER_RIGHTBOX + 4 && x <= PLAYER_LEFTBOX - 9)
			box = 0;
		else if (x >= PLAYER_RIGHTBOX + BOXXSPACING * 1 + 4 && x <= PLAYER_LEFTBOX + BOXXSPACING * 1 - 9)
			box = 1;
		else if (x >= PLAYER_RIGHTBOX + BOXXSPACING * 2 + 4 && x <= PLAYER_LEFTBOX + BOXXSPACING * 2 - 9)
			box = 2;
		else if (x >= PLAYER_RIGHTBOX + BOXXSPACING * 3 + 4 && x <= PLAYER_LEFTBOX + BOXXSPACING * 3 - 9)
			box = 3;
		else if (x >= PLAYER_RIGHTBOX + BOXXSPACING * 4 + 4 && x <= PLAYER_LEFTBOX + BOXXSPACING * 4 - 9)
			box = 4;
		else if (x >= PLAYER_RIGHTBOX + BOXXSPACING * 5 + 4 && x <= PLAYER_LEFTBOX + BOXXSPACING * 5 - 9)
			box = 5;
		else if (x >= PLAYER_RIGHTBOX + BOXXSPACING * 6 + 4 && x <= PLAYER_LEFTBOX + BOXXSPACING * 6 - 9)
			box = 6;


		if (box >= 0) {
			if (box_status[box]) {
				hPen = SelectObject(hdc, CreatePen(PS_SOLID, 1, RGB(0, 255, 0)));
				box_status[box] = 0;

				number_highlighted--;

				drawit++;
			}
			else {
				hPen = SelectObject(hdc, CreatePen(PS_SOLID, 1, RGB(0, 0, 0)));
				if (number_highlighted != 2) {
					box_status[box] = 1;

					number_highlighted++;

					drawit++;
				}
			}
			if (drawit) {
				MoveTo(hdc, mybox[box].left, mybox[box].top);
				LineTo(hdc, mybox[box].right, mybox[box].top);
				LineTo(hdc, mybox[box].right, mybox[box].bottom);
				LineTo(hdc, mybox[box].left, mybox[box].bottom);
				LineTo(hdc, mybox[box].left, mybox[box].top);
			}
			DeleteObject(SelectObject(hdc, hPen));
		}
	}
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::ShowHighlites(HDC hdc)
{
	int i;
	HPEN hPen;

	hPen = SelectObject(hdc, CreatePen(PS_SOLID, 1, RGB(0, 0, 0)));

	for (i = 0; i != 7; i++) {
		if (box_status[i]) {
			MoveTo(hdc, mybox[i].left, mybox[i].top);
			LineTo(hdc, mybox[i].right, mybox[i].top);
			LineTo(hdc, mybox[i].right, mybox[i].bottom);
			LineTo(hdc, mybox[i].left, mybox[i].bottom);
			LineTo(hdc, mybox[i].left, mybox[i].top);
		}
	}
	DeleteObject(SelectObject(hdc, hPen));
}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::Results(HDC hdc, int calculate, Hand *player_two, Hand *player_five, Hand *dealer_two, Hand *dealer_five)
{

	char szBuffer[100];
	short x = RESULTSX, y = RESULTSY, nLength;
 	int outcome_top, outcome_bottom, ival;

	HBRUSH hBrush;
	HPEN hPen;
   HFONT hFont;
   
   hFont = SelectObject(hdc, CreateFontIndirect(&lf));

	ival = player_five->Check(player_two);

	if (ival == 1) {
		outcome_top = *player_two > *dealer_two;
		if (outcome_top == -1)
			nLength = sprintf(szBuffer, "I win the top");
		else if (outcome_top == 1)
			nLength = sprintf(szBuffer, "You win the top");
		else
			nLength = sprintf(szBuffer, "We tied on top so I win");
		TextOut(hdc, x, y, szBuffer, nLength);
		y += 30;

		outcome_bottom = *player_five > *dealer_five;
		if (outcome_bottom == -1)
			nLength = sprintf(szBuffer, "I win the bottom");
		else if (outcome_bottom == 1)
			nLength = sprintf(szBuffer, "You win the bottom");
		else
			nLength = sprintf(szBuffer, "We tied on bottom so I win");

		TextOut(hdc, x, y, szBuffer, nLength);

		if (calculate) {
			if (outcome_top == 1 && outcome_bottom == 1) {
				current_lose_streak = current_tie_streak = 0;
				number_won++;
				current_win_streak++;
				if (current_win_streak > largest_win_streak)
					largest_win_streak = current_win_streak;
			}
			else if ((outcome_top == -1 || outcome_top == 0) && (outcome_bottom == -1 || outcome_bottom == 0)) {
				current_win_streak = current_tie_streak = 0;
				number_lost++;
				current_lose_streak++;
				if (current_lose_streak > largest_lose_streak)
					largest_lose_streak = current_lose_streak;
			}
			else {
				current_win_streak = current_lose_streak = 0;
				number_tied++;
				current_tie_streak++;
				if (current_tie_streak > largest_tie_streak)
					largest_tie_streak = current_tie_streak;
			}
		}

	}
	else {
		nLength = sprintf(szBuffer, "You did not set your hand properly so you lose");
		TextOut(hdc, x, y, szBuffer, nLength);
		if (calculate) {
			current_win_streak = current_tie_streak = 0;
			number_lost++;
			current_lose_streak++;
			if (current_lose_streak > largest_lose_streak)
				largest_lose_streak = current_lose_streak;
		}
	}

	hBrush = SelectObject(hdc, CreateSolidBrush(RGB(0, 255, 0)));
	hPen = SelectObject(hdc, GetStockObject(NULL_PEN));

//	Rectangle(hdc, 250, 370, 640, 440);

	DeleteObject(SelectObject(hdc, hBrush));
	DeleteObject(SelectObject(hdc, hPen));

}

/*
	Function:		

	Parameters:		

	Description: 	

	Returns: 		
*/

void 
Game::PrintStats(HDC hdc)
{
	char szBuffer[100];
   HFONT hFont;
   
//   hFont = SelectObject(hdc, CreateFontIndirect(&lf));

//   OkMsgBox("In PrintStats", "Welcome to PrintStats");

	TextOut(hdc, 5, 20,  szBuffer, sprintf(szBuffer, "Number of Hands %d", number_of_hands));
//	TextOut(hdc, 0, 50,  szBuffer, sprintf(szBuffer, "Won  %4d   Current Win Streak   %4d  Longest Win Streak    %4d", number_won, current_win_streak, largest_win_streak));
//	TextOut(hdc, 0, 100, szBuffer, sprintf(szBuffer, "Lost %4d  Current Losing Streak %4d  Longest Losing Streak %4d", number_lost, current_lose_streak, largest_lose_streak));
//	TextOut(hdc, 0, 150, szBuffer, sprintf(szBuffer, "Tied %4d  Current Tie Streak    %4d  Longest Tie Streak    %4d", number_tied, current_tie_streak, largest_tie_streak));

//	OkMsgBox("In PrintStats", "Leaving PrintStats");

}

