#ifndef CHARACTER_H
#define CHARACTER_H

#include <cstdint>

#include "dice.h"
#include "heap.h"
#include "util.h"

#define NPC_SMART   0x00000001
#define NPC_TELE    0x00000002
#define NPC_TUNNEL  0x00000004
#define NPC_ERRATIC 0x00000008
#define NPC_BOSS		0x00000010
#define NPC_UNIQ		0x00000020
#define NPC_DESTROY_OBJ 0x00000040
#define NPC_PICKUP_OBJ  0x00000080
#define NPC_PASS_WALL   0x00000100

class dungeon;
class monster_description;
class object_description;

class character {
 public:
  position pos;
  int speed;
  int seq_num;
  int next_turn;
  int alive;
  char symbol;
  int hitpoints;
	
	character(int speed, char symbol, int hitpoints);
	virtual ~character();
	
	virtual bool is_player() = 0;
	virtual int has_characteristic(int bit) = 0;
  virtual int next_color() = 0;
};

class player_character : public character {
 public:
	player_character(uint8_t x, uint8_t y);
	
  bool is_player();
	int has_characteristic(int bit);
  
  int next_color();
};

class monster : public character {
 private:
  monster_description *desc;
  dice *damage;
	uint32_t characteristics;
	position last_seen;
  int color_index;
	
	position next_monster_move_tunnel_erratic(dungeon &d);
	position next_monster_move_erratic(dungeon &d);
	position next_monster_move_smart(dungeon &d);
	position next_monster_move_dumb(dungeon &d);
	
 public:
	monster(uint8_t x, uint8_t y, monster_description *desc, int speed, uint32_t abilities, int hitpoints, dice *damage, char symbol);
	~monster();
  
	bool is_player();
	int has_characteristic(int bit);
	
	position monster_move(dungeon &d);
	void init_position(uint8_t x, uint8_t y);
  
  int next_color();
  
  void die();
};

void init_character_turn_heap(heap_t *h);

class item {
 public:
  object_description *desc;
  dice *damage;
  int hit;
  int dodge;
  int defence;
  int weight;
  int speed;
  int attribute;
  int value;
  
  item(object_description *desc, dice *damage, int hit, int dodge, int defence, int weight, int speed, int attribute, int value);
  ~item();
  
  int get_color();
  char get_symbol();
};

#endif