contest/
contest/Merc21/
contest/Merc21/log/
contest/Merc21/player/
/******************************************************************************
 Copyright 2007 Richard Woolcock.  All rights reserved.

 Redistribution and use in source and binary forms, with or without 
 modification, are permitted provided that the following conditions are met:

 * Redistributions of source code must retain the above copyright notice, 
   this list of conditions and the following disclaimer. 

 * Redistributions in binary form must reproduce the above copyright notice, 
   this list of conditions and the following disclaimer in the documentation 
   and/or other materials provided with the distribution. 

 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 POSSIBILITY OF SUCH DAMAGE.
 ******************************************************************************/

#ifndef HEADER_GAME
#define HEADER_GAME

/******************************************************************************
 Headers
 ******************************************************************************/

#include "card.h"
#include "hand.h"

/******************************************************************************
 Enumerated types
 ******************************************************************************/

typedef enum
{
   eGameNone = -1,

/* Add any new games below this line */

   eGameDrawPoker, 
   eGameTexasHoldem, 
   eGameBlackjack, 

/* Add any new games above this line */

   eGameMax
} game_t;	


typedef enum /* Possible scoring systems */
{
   eScorePoker, 
   eScoreBlackjack
} score_t;

/******************************************************************************
 Global functions
 ******************************************************************************/

/* Call this once at mud startup, to validate the game data order */
boolean_t   GameValidate( void );

/* Return the name of the game */
const char *GameName( game_t aGame );

/* Return the index of the game */
game_t      GameIndex( const char *apGame );

/* Return the scoring system of the game */
score_t     GameScoring( game_t aGame );

/* Does each player have their own bet, separate from the other players? */
boolean_t   GameSoloBet( game_t aGame );

/* Is a minimum bet required before dealing? */
boolean_t   GameMinimumBet( game_t aGame );

/* Advice a move for the game */
char       *GameAdvice( game_t aGame, hand_t *apHand );

/* Return the maximum number of players permitted */
int         GameMaxPlayers( game_t aGame );

/* Return how many cards should be initially drawn */
int         GameInitialDraw( game_t aGame );

/* Return how many cards make up a full hand */
int         GameFullHand( game_t aGame );

/* Return how many turns are in the game */
int         GameLastTurn( game_t aGame );

/* Some games burn cards on certain turns */
int         GameBurnCards( game_t aGame, int aTurn );

/* Some games deal shared cards ('flops') on certain turns */
int         GameSharedDraw( game_t aGame, int aTurn );

/* Does this game allow you to view your hand? */
int         GameViewHand( game_t aGame, int aTurn );

/* Does this game allow you to place bets? */
int         GameCanBet( game_t aGame, int aTurn );

/* Does this game allow you to fold? */
int         GameCanFold( game_t aGame, int aTurn );

/* Does this game allow you to discard cards? */
int         GameCanDiscard( game_t aGame, int aTurn );

/* Does this game allow you to draw cards? */
int         GameCanDraw( game_t aGame, int aTurn );

/* Does this game allow you to stick? */
int         GameCanStick( game_t aGame, int aTurn );

/* Does this game allow you to double down (double bet then draw)? */
int         GameCanDouble( game_t aGame, int aTurn );

#endif /* HEADER_GAME */