/* LORD OF HOSTS - Lord.h --- Headerdatei */

#include <functions.h>
#include <exec/types.h>
#include <exec/interrupts.h>
#include <devices/input.h>
#include <devices/inputevent.h>
#include <devices/gameport.h>
#include <intuition/intuition.h>
#include <graphics/gfxbase.h>
#include <stdlib.h>
#include <req.h>
#include <libraries/reqbase.h>
#include	<libraries/dosextens.h>
#include <stdio.h>
#include <stddef.h>
#include <errno.h>
#include <string.h>

struct Piece
{
   int Number;
   int ID;           /* R/WKING || R/WKNIGHT */
   int Value;
   UBYTE x,y;
   BOOL StillAlive;
};

struct Move
{
   UBYTE fromx,fromy;
   UBYTE tox,toy;
   int   Beaten;
   BOOL  x_first;
   BOOL  GameOver;
   int status;
};

#define VERSION "1.1"
/* für Zugriff auf das Feld Pieces[4] */
#define RKING 0
#define WKING 1
#define RKNIGHT 2
#define WKNIGHT 3
/* JoyMouse */
#define SPEED 5
/* für Feld-Matrix */
#define NOT_OCCUPIED 20
/* Werte für check_move(): Gründe, warum gewünschter Zug ungültig */
#define DIST_EXCEEDED 1
#define MUST_MOVE_FARTHER 2
#define WAY_BLOCKED 4
#define CANT_BEAT_BUDDY 8
#define KING_IN_DANGER 16
/* Bei gültigem Zug gibt check_move() zurück, in welche Richtung erst gezogen
   werden sollte (muß) */
#define MOVE_X_FIRST 128
#define MOVE_Y_FIRST 256
/* Werte für do_move(): Spezialsituation nach einem Zug (Check, Matt) */
#define ENEMY_KING_BEATABLE 1
#define ENEMY_MATED 2
#define ENEMY_OUT_OF_KNIGHTS 4
#define ENEMY_KNIGHT_BEATEN  8

/* für Undo/Redo */
#define MAXUNDO 500
#define NOBODY  20

#define ABS(x) ((x)<0 ? -(x) : (x))

/* board */
#define STD_NORM 0
#define STD_ROTD 1
#define RND_BAL  2
#define RND_UNB  3

/* status */
#define IDLE 0             /* kein Spiel im Gange */
#define IN_GAME 1          /* Spiel läuft */
#define PLAYER1_TO_MOVE 2  /* wenn dieses Bit gesetzt ist, ist Spieler 1 dran */
#define WAITING_FOR_PICK 4 /* Der Computer erwartet, daß der Stein gewählt wird,
                              der ziehen soll */
#define WAITING_FOR_DEST 8 /* Nun soll das Zugziel gewählt werden */
#define WAITING_FOR_CONF 16 /* Im Show...Values-Modus ist der Probezug
                              gemacht und muß nun bestätigt werden */
#define BOARD_UNTOUCHED 32 /* Brett ist noch nicht benutzt worden */

/* help */
#define NOHELP 0
#define SHOWKNOWN 1
#define SHOWALL 2
/* misc */
#define RED FALSE
#define WHITE TRUE

#define SWITCHSIDENR (SHIFTMENU(2)+SHIFTITEM(6)+SHIFTSUB(NOSUB))

/* Prototypes
 * joymouse.c */
void swapjoymouse(BOOL what);
struct InputEvent *JoyMouseHandler(struct InputEvent *Event, ULONG *Data);
/* openclose.c */
void errorstop(char *message);
void open_all(void);
void close_all(void);
/* display.c */
void DrawRect(ULONG Color, ULONG DrMd, ULONG fromx, ULONG fromy, ULONG tox,
     ULONG toy);
void DrawLine(ULONG Color, ULONG DrMd, ULONG fromx, ULONG fromy, ULONG tox,
     ULONG toy);
void FillRect(ULONG Color, ULONG fromx, ULONG fromy, ULONG tox, ULONG toy);
void DrawText(ULONG Color, ULONG DrMd, ULONG x, ULONG y, char *string);
void drawboard(void);
void drawplayers(char *Name1, char *Name2);
void SetPiece(struct Piece Which, BOOL FadeIn, BOOL StayBlend);
void MovePiece(UBYTE x, UBYTE y, int xdist, int ydist, BOOL FadeOut);
void Highlight(UBYTE x, UBYTE y);
/* board.c */
void setup_stdboard(BOOL Rotated);
void setup_rndboard(BOOL Balanced);
UBYTE GetValue(int Num, UBYTE x, UBYTE y);
UBYTE IsOccupied(UBYTE x, UBYTE y);
void InitPiece(int Num, int ID, int Val, UBYTE x, UBYTE y);
void clear_board(void);
/* moves.c */
int check_move(UBYTE board[][8], struct Piece *Pieces, int Num,
               UBYTE tox, UBYTE toy);
int how_to_move(UBYTE board[][8],
                UBYTE fromx, UBYTE fromy, UBYTE tox, UBYTE toy);
int check_check(UBYTE board[][8], struct Piece *Pieces, int Num,
               UBYTE tox, UBYTE toy);
int do_move(UBYTE board[][8], struct Piece *Pieces, int Num,
            UBYTE tox, UBYTE toy, BOOL x_first);
BOOL undo(void);
BOOL redo(void);
/* disk.c */
void FileError(int Error);
BOOL checkrange(int Var, int lo, int hi);
void SaveGame(void);
void LoadGame(void);
/* misc.c */
void Rules(void);
void ExplainError(int Error);
void About(void);
void SetJMSpeed(void);
void EnterNames(void);
BOOL Coords(SHORT MouseX, SHORT MouseY, UBYTE *x, UBYTE *y);
void Exchange(UBYTE *a, UBYTE *b);
void Notify(int Nr, int occurrence);
void NextPlayer(BOOL who);
/* main.c */
void main(void);
void wait_events(void);
void handle_menuevents(void);
void handle_mouseevents(void);
