/* Nertz: multi-player card game
 * by Jonathan Cooper
 *
 * Main header file
 */

#ifndef INCLUDED_NERTZ_H
#define INCLUDED_NERTZ_H
#include <stdio.h>

typedef struct socket_block {
  int ip;                /* IP of computer */
} socket_block;

typedef struct centre_pile_str {
  int suit;             /* 1=clubs,2=diamonds,3=spades,4=hearts */
  int top;              /* highest card in pile (with 11=jack, etc.) */
} centre_pile_str;

typedef struct card {
  int suit;
  int number;
} card;

typedef struct player_data {
  BOOL human;            /* TRUE if player human */
  socket_block *sock;
  card nertz_pile[13];   /* Array of cards in player's nertz pile */
  int nertz_cards;       /* Top card in player's nertz pile */
  card pile[13][4];      /* Array of cards for other 4 piles */
  int cards[4];          /* Top card in other 4 piles */
  card turnover_pile[35]; /* Array of cards in turnover pile */
  int turnover_cards;    /* No. of cards in turnover pile */
  int turnover_pos;      /* Current position in turnover pile */
} player_data;

typedef struct game_data_str {
  int ai_players;       /* Number of computer players */
  int difficulty;       /* Inversely proportional to speed of ai players */
  BOOL linked_game;     /* TRUE if game being played over a network */
  BOOL master;          /* TRUE if this incarnation is the master */
  player_data *player;  /* Ptr to block of player data, malloc'ed for each game */
  int centre_piles;      /* No. of piles in the centre */
  centre_pile_str *centre_pile;    /* Ptr to block of centre piles */
  struct {    /* Contains data for whole of network game */
    int human_players;   /* Number of human players */
    int ai_players;      /* Number of computer players */
    player_data *player; /* Ptr to block of player data */
  } link;
} game_data_str;

extern game_data_str game_data;

extern window_handle gamewin;
extern icon_handle nertz_icon;
extern int gamewin_h; /* Height of game window */
extern FILE *debugfile;
extern BOOL playing;

/* Flags: which area of screen to redraw */
#define pile_CENTRE   0
#define pile_NERTZ    1
#define pile_PATIENCE 2
#define pile_TURNOVER 3

/* Flags: where did drag originate */
#define drag_NERTZ    0
#define drag_TURNOVER 1
#define drag_PATIENCE 2 /* +pile no. */

/* Data for scoring matches */
extern window_handle scoreswin;
extern window_info scoresinfo;
extern icon_block scicons[10];
extern int *scores;
extern wimp_box scores_minwork, scores_minscreen;
extern char sctext[10][15];
extern char scvalid[10][15];
extern char **scctext;
extern int sccsize;
#define SCICN_MATCH     0
#define SCICN_TOTAL     1
#define SCICN_CONTINUE  2
#define SCICN_ABANDON   3
#define SCICN_HUMAN     4
#define SCICN_H_MATCH   5
#define SCICN_H_TOTAL   6
#define SCICN_COMPUTER  7
#define SCICN_C_MATCH   8
#define SCICN_C_TOTAL   9

/* Prototyping */
extern BOOL gamewin_redraw(event_pollblock *ev, void *ref);
extern BOOL gamewin_close(event_pollblock *ev, void *ref);
extern BOOL gamewin_click(event_pollblock *ev, void *ref);
extern BOOL gamewin_drag(event_pollblock *ev, void *ref);
extern BOOL gamewin_scroll(event_pollblock *ev, void *ref);
extern BOOL gamewin_null(event_pollblock *ev, void *ref);
extern BOOL sc_continue(event_pollblock *ev, void *ref);
extern BOOL sc_abandon(event_pollblock *ev, void *ref);
extern void begin_game(void);
extern window_handle nertz_createwindow(void);
extern void mark_for_redraw(int area, int pile);
extern void game_over(player_data *pl);
extern int ai_turn(player_data *pl);
extern void load_scores_win(void);
extern int *calculate_scores(player_data *winpl);

#endif
