/*
 *    DATA.H
 *
 *      GLOBALNI DATOVE TYPY A FUNKCE
 *      =============================
 *
 *      Martin Macok
 *
 */

#define VERSION "0.2.00"
#define UNIX	1		/* nastaveni osetreni signalu SIGINT */

#define BILYH	0
#define CERNYH	1

#define MAXPOCTAH	200
#define MAXGENTAH	160
#define BOOKDEPTH	120
#define BOOKWIDTH	8
#define BOOKFILE	"sachy.bk"
#define CFGFILE		"sachy.cfg"

/* FIGURY na sachovnici */
#define PPOL	0
#define BPES	1
#define BSTR	2
#define BJEZ	3
#define BVEZ	4
#define BDAM	5
#define BKRA	6
#define CPES	-1
#define CSTR	-2
#define CJEZ	-3
#define CVEZ	-4
#define CDAM	-5
#define CKRA	-6
/* HODNOTY FIGUR */
#define HPES	2
#define HSTR	7
#define HJEZ	8
#define HVEZ	14
#define HDAM	27
#define MATVAL	1000

typedef char TSachovnice[8][8];	/* SACHOVNICE */

typedef struct {		/* POZICE */
	char x, y;
} TPozice;

typedef struct {		/* TAH */
	TPozice odkud, kam;
} TTah;

typedef struct {		/* FIGURA */
	char fig;
	TPozice pos;
} TFigura;

typedef struct {		/* HRAC */
	TFigura figury[16];
	char rochada[3];	/* kterou jeste muze - malou, velkou */
	/* [2] -> zda byla nejaka provedena */
} THrac;

/* typedef TTah THistorie[MAXPOCTAH];    HISTORIE TAHU */

typedef struct {		/* HRA */
	TSachovnice sachovnice;
	THrac bily, cerny;
	char natahu;		/* BILY/CERNY */
	char enpas;		/* sloupec s pescem */
	int PHT;		/* pocet hranych tahu */
} THra;

typedef TTah TMG[MAXGENTAH];

typedef struct {		/* zaznam v knihovne zahajeni */
	/* TSachovnice sachovnice; */
	/* char natahu; */
	int poctah;
	char tahy[BOOKWIDTH][5];	/* jake tahy jsou mozne */
	int kam[BOOKWIDTH];	/* kam vedou prislusne tahy (node) */
} TBookPos;

typedef struct {		/* knihovna zahajeni */
	TBookPos p[BOOKDEPTH];
	int last, aktual;	/* last -> posledni prvek */
} TBook;

/* FUNKCE */

/* interface.c */
int ReadCFG(void);		/* nacte konfiguraci */
void SaveFile(THra *, char *);	/* ulozi hru do souboru */
void OpenFile(THra *, char *);	/* HraInic + nacteni hry ze souboru */
void TiskSach(THra);		/* vytiskne sachovnici */
void TiskHist(THra);		/* vytiskne historii tahu */
void TiskTahu(TMG, int);	/* vytiskne vsechny mozne tahy */
void TiskFig(THra);		/* vytiskne pozice vsech figur */
void Num2Not(TPozice, char *);	/* Pozice -> e4 atd */
void Not2Num(char *, TPozice *);	/* e4 -> Pozice ... */
void KonecHry(void);		/* konec hry */

/* rules.c */
int a1b1(char *);		/* zda to je e1e3,d4d5,b1c3 ... proste tah */
int PreJTT(char *, THra *);
int JeToTah(char *, THra *, int);	/* vrati, zda je tah("aXfY") podle pravidel */
				/* posledni parametr = "ukecanost" funkce */
	/*
	   neni mimo sachovnici?
	   stoji tam figura?
	   stoji tam figura stejne barvy?
	   kam ... neni tam figura stejne barvy?
	   lze tou figurou takto tahnout? (zavola TahFigurou)
	   rochada ??? ! nebudu pak v sachu?
	 */
int TahPescem(TTah, THra *);	/* muze takto pesec tahnout? */
int VolnaCesta(TTah, TSachovnice);	/* ma figura volnou cestu? */
int TahFigurou(TTah, THra *);	/* zjisti, zda dana figurka takto tahne */
int JeVSachu(int, THra *);	/* zda je hrac v sachu */
int BilaFigura(int);		/* zda figurka F je bila */
int CernaFigura(int);		/* ... -||- */
int NajdiFiguru(TPozice, TSachovnice, THrac *, int *);	/* dostane pozici na
							   sachovnici a vrati prislusnou figuru, ktera se tam
							   naleza */
void OdeberFiguru(THrac *);	/* odeber PPOL z figurek a shiftne je */
int JeMat(THra *);		/* vrati, zda je hrac na tahu v matove pozici */
int JePat(THra *);		/* vrati, zda je hrac na tahu v patove pozici */
int SMove(THra *, TTah);	/* zda je tah pro dohl. do tichych pozic */
		/* zatim jenom braci tahy */

/* makemove.c */
void ZpracujTah(char *, THra *);	/* defakto provede tah ... */
int NejlepsiTah(THra *, char *, int);	/* najde a provede nejlepsi tah */

/* movegen.c */
int MoveGen(THra *, TMG, int);	/* naplni pole TMG a vrati jejich pocet ... */
	/* pokud je INT 1, tak nas pouze zajima, zda existuje tah, ci ne
	   - pri testovani matove pozice (obvykle mat neni) */
int SMoveGen(THra *, TMG);	/* pouze tahy pro dohledavani do
				   tichych pozic */

/* search.c */
int AlfaBeta(THra *, int, int, int);
		/* ... proste alfabeta => value */
		/* posledni parametr 0..normal 1..dohl. tichych pozic */

/* inic.c */
void HraInic(THra *);		/* nastavi prvotni pozici */

/* value.c */
int Ohodnot(THra *);		/* vrati hodnotu pozice ... */
int OhodnotM(THra *);		/* ohodnoti pouze material */

/* test.c */
int benchmark(THra *);		/* pocet testu za sekundu (orientacni) */

/* sort.c */
void Sort(TMG, int[], int);
/* void SortPart(int, int, TMG, int[]); */

/* book.c */
int openbook(TBook *);		/* nacte soubor BOOKFILE do TBook */
void printbook(TBook *);	/* vytiskne TBook na obrazovku */
