#ifndef DUNGEON_H
#define DUNGEON_H

#include <cstdint>

#include "character.h"
#include "descriptions.h"
#include "util.h"

#define MAP_WIDTH 80
#define MAP_HEIGHT 21

#define MAX_ROOMS 12
#define MIN_ROOMS 6

class character;

class room {
 public:
	uint8_t x;
	uint8_t y;
	uint8_t w;
	uint8_t h;
	
	room();
};

class dungeon {
 public:
	uint8_t hardness[MAP_HEIGHT][MAP_WIDTH];
	bool hardness_dirty;
	
	std::vector<monster_description> monster_descriptions;
	std::vector<object_description> object_descriptions;
	
	uint8_t pc_sight[MAP_HEIGHT][MAP_WIDTH];
	
	char terrain[MAP_HEIGHT][MAP_WIDTH];
	char remembered_terrain[MAP_HEIGHT][MAP_WIDTH];
	
	uint16_t room_count;
	room* room_list;
	
	uint16_t upstair_count;
	position* upstair_list;
	
	uint16_t downstair_count;
	position* downstair_list;
  
  position player_pos;
  
  character *characters[MAP_HEIGHT][MAP_WIDTH];

 private:
	bool fog_of_war;
	uint8_t fow_map[MAP_HEIGHT][MAP_WIDTH];
	
	bool target_mode;
	position targeting_pointer;
	
	void generate_rooms();
	void generate_corridors();
	void connect_rooms(int room1, int room2);
	void init_dungeon_hardness();
	void generate_stairs();
	
	char get_map_char(int y, int x);
	
 public:
	dungeon();
	~dungeon();
	
	void gen_random_dungeon();
	void init_turn_heap(heap_t *h);
	void gen_monsters(int nummon);
	
	void draw();
	
	void free_data();
	
	void toggle_fog_of_war();
	void update_fog_of_war();
	
	int targeting_mode();
	int display_monster_list();
};

#endif