#include<iostream.h>
#include<stream.h>

#ifndef _GRIDHUNT_INCLUDED_
#define _GRIDHUNT_INCLUDED_

extern "C" {
#include<string.h>
#include<time.h>
#include<math.h>
  int abs(int);
}

#ifndef FALSE
#define TRUE 1
#define FALSE 0
#endif

extern "C" int random();
extern "C" void srandom(time_t);

#define GRIDX 30
#define GRIDY 30
#define MAX_TEAM 6

// HERE ARE THE USER-DEFINES
// #define GRAPH

#define MARK(x) cout << x << "\n";
#define MAX(x,y) ((x)>(y)?(x):(y))

class Coor
{
 public:
  Coor(int x=-1,int y=-1);
  int x;
  int y;
  void print();
  int operator == (Coor&);
};


class Mobile
{
  Coor cds; // internal variables
  char name[40];
  int do_move(int,int);

 public:
  Mobile(char* name="SomeMobile");
  void set_name(char *);
  char *get_name();
  void set_pos(int, int);
  Coor my_pos();
  int move(int);
  int distance(const Mobile&);
  void print_pos();
  void teleport();
  void reset();
};

class Monster : public Mobile
{
public:
  int move();
};

class Player : public Mobile
{
  int turns;
  int wins;
  int c_pos;
  int c_dis;
  int c_mov;
  int a_pos;
  int a_dis;
  int a_mov;
  void tick();

public:
  Player(char* name="Nobody");
  Coor monster_pos();
  int monster_dist();
  Coor player_pos(const Player&);
  int  player_dist(const Player&);
  int  move(int);
  void reset();
  void print_stats(int);
  int teleport(); /* just an overload for cheaters */

  friend update();
};

/* now the extern declarations */
extern Coor ERROR_COORD;
extern Monster *Mobptr;
extern int dice(int);
extern int int_sqr(int);

extern Player team1;
extern Player team2;
extern Player team3;
extern Player team4;
extern Player team5;
extern Player team6;

extern void hunt1();
extern void hunt2();
extern void hunt3();
extern void hunt4();
extern void hunt5();
extern void hunt6();
extern void plotgraph();

extern int games, moves;

#endif






