#ifndef DUNGEON_H
#define DUNGEON_H

#include <stdint.h>

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

#define MAP_WIDTH 80
#define MAP_HEIGHT 21

#define MAX_ROOMS 12
#define MIN_ROOMS 6

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];
	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_t* upstair_list;
	
	uint16_t downstair_count;
	position_t* downstair_list;
  
  position_t player_pos;
  
  character *characters[MAP_HEIGHT][MAP_WIDTH];

 private:
	bool fog_of_war;
	uint8_t fow_map[MAP_HEIGHT][MAP_WIDTH];
	
	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();
};

#endif