#pragma once
#include "module2.h"
#include "War3Map.h"
#include <windows.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <cstring>

#include <io.h>
#include <stdio.h>
#include <stdlib.h>

#include <string>
using namespace std;

#define TREE 1
#define CUTTREE 2
#define BLOOD 3
#define PORTAL1 4
#define PORTAL2 5
#define RUNE 6
#define HERB1 7
#define HERB2 8
#define HERB3 9
#define FLAGALLIANCE 10
#define STONES 11
#define OBELISK1 12
#define OBELISK2 13
#define STATUE1 14
#define RUNETELEPORT 15
#define EMPTY1 16
#define EMPTY2 17
#define EMPTY3 18
#define EMPTY4 19
#define EMPTY5 20
#define EMPTY6 21
#define U_NIZHNIY_MAGAZIN 22
#define U_VERHNIY_MAGAZIN 23
#define U_GATE 24
#define U_SVEN 25
#define U_BANSHA 26
#define U_MANA_KOLODEC 27
#define U_KOLODEC_ZHIZNI 28
#define U_BAZA_UNITOV 29
#define EMPTY7 30
#define U_PIT1 31
#define U_PIT2 32
#define U_PINGVIN 33

#define TILE_FL_NULL 0
#define WATER_NULL 0
#define WATER_SHALLOW 1
#define WATER_DEEPLY 2

#define NONE -1
#define SOIL1 0x00
#define COARSESOIL 0x01
#define SOIL2 0x02
#define GRASS 0x03
#define DARKGRASS 0x04
#define STONE 0x05
#define ROCKYTRAIL 0x06

#define SLOPESOIL1 0x10
#define SLOPECOARSESOIL 0x11
#define SLOPESOIL2 0x12
#define SLOPEGRASS 0x13
#define SLOPEDARKGRASS 0x14
#define SLOPESTONE 0x15
#define SLOPEROCKYTRAIL 0x16

#define CORRUPTIONSOIL1 0x20
#define CORRUPTIONCOARSESOIL 0x21
#define CORRUPTIONSOIL2 0x22
#define CORRUPTIONGRASS 0x23
#define CORRUPTIONDARKGRASS 0x24
#define CORRUPTIONSTONE 0x25
#define CORRUPTIONROCKYTRAIL 0x26

#define WATERSOIL1 0x40
#define WATERCOARSESOIL 0x41
#define WATERSOIL2 0x42
#define WATERGRASS 0x43
#define WATERDARKGRASS 0x44
#define WATERSTONE 0x45
#define WATERROCKYTRAIL 0x46

#define SLOPEWATERSOIL1 0x50
#define SLOPEWATERCOARSESOIL 0x51
#define SLOPEWATERSOIL2 0x52
#define SLOPEWATERGRASS 0x53
#define SLOPEWATERDARKGRASS 0x54
#define SLOPEWATERSTONE 0x55
#define SLOPEWATERROCKYTRAIL 0x56

#define SLOPECORRUPTIONSOIL1 0x70
#define SLOPECORRUPTIONCOARSESOIL 0x71
#define SLOPECORRUPTIONSOIL2 0x72
#define SLOPECORRUPTIONGRASS 0x73
#define SLOPECORRUPTIONDARKGRASS 0x74
#define SLOPECORRUPTIONSTONE 0x75
#define SLOPECORRUPTIONROCKYTRAIL 0x76

#define TERRAIN_TYPE_MAX 16
#define TERRAIN_LAYER_MAX 6
// Класс карты
class WorldMap : public CWar3Map
{
protected:
	bool bMapInit;						// инициализация карты
	int Regions;						// кол-во регионов карты
	struct RegionMap *pHeadRegion;		// первый регион карты в массиве
	struct RegionMap *pLastRegion;		// последний регион карты в массиве
	struct RegionMap *pСurrentRegion;	// текущий регион карты в массиве
	int BaseN;							// кол-во баз на карте
public:
	WorldMap();							// конструктор по умолчанию
	WorldMap(WorldMap &M, RECT _AllocationArea);		//
	void CopyMap(WorldMap &M, RECT _AllocationArea);
	const WorldMap &operator=(WorldMap &M);// перегрузка оператора присваивания
	virtual ~WorldMap();				// деструктор
	bool CheckMapInit();				// проверить инициализацию карты
	void MapInit(bool _MapInit);		// инициализация карты
	int GetRegions();					// забрать кол-во регионов карты
	int GetFreeId();					// Взять свободный ID (идентификационный номер)
	void GetListId(int *&pListId, int &_N);// взять лист ID регионов
	void AddRegion(RegionMap _Region);	// добавить регион карты в цепочку регионов
	void EditRegion(RegionMap _Region);	// редактировать регион карты в цепочке регионов
	void GetRegion(RegionMap &_Rect, int _Id);	// взять регион карты по ID
	void DelRegion(int _Id);			// удалить регион карты из цепочки регионов по ID
	void DelRegions(int _Type);			// удалить все регионы карты из цепочки регионов по типу региона
	void DelAllRegions();				// удалить все регионы карты из цепочки регионов
	void GoFirstRegion();				// перейти к первому региону карты в цепочке регионов
	RegionMap* GetNextRegion();			// взять следующий регион карты из цепочки регионов
	void SetBaseN(int _BaseN);			// установить кол-во баз на карте
	int GetBaseN();						// забрать кол-во баз на карте
	
};
// Регион карты
struct RegionMap
{
	 int Id;			// идентификационный номер
	 int Type;			// тип региона
	 int NumBase;		// номер базы
	 RECT Rect;			// регион
	 COLORREF Color;	// цвет
	 RegionMap *pNext;	// указатель на следующий регион
};

void fWorldMapInitialization(int _Width, int _Height, int _Rects, int _NumMap);
void fCreateWorldMap(int vkW, int vkH);
int fChangeGroundMapCell(int _c, int _v, int _TerrainType, int _LevelUpland, int _NumMap);
int fSaveMapEditor(int _NumMap, RECT _AllocationArea);
int fLoadMapEditor(int _NumMap, int &_Width, int &_Height);
void fClearMapEditable();
//int fChangeDoodadCells(int _c, int _v, int _Object, int _NumMap);
//int fDetermineSizeDooObj(int _Object, int &_Width, int &_Height);
//int fDeleteDoodadObject(int _Id, int _NumMap);
int fSelectMap(int _NumMap, WorldMap *&pMap);
void fClearMap(WorldMap *pMap);

int fGetTileIndex(char *strTileID, const char *strTilelist);
int fChangeLandscape(CTilePoint &Tilepoint, int _Layer, int _Water);
//int fLoadDefaultMap();
int fToPlaceDoodad(int x, int y, WorldMap *pMap, int _Object);
int fCheckRamp(int x, int y, WorldMap *pMap);
int fWhetherToCheckFreeCell(int x, int y, WorldMap *pMap);
int fCheckForBias(int x, int y, WorldMap *pMap);

void fLoadFileArchive(char *pFileName, int _NumMap);
void fSaveFileArchive(char *pFileName);
//int fDeleteDoodad(int x, int y, WorldMap *pMap);

int fCreateNewDoodad(CDoodad &newdoodad, float x, float y, WorldMap *pMap, int _Object);
int fDefineObjectRadius(float &_R, char *pTypeDoodad);
int fSelectDoodad(CDoodad &newdoodad, float x0, float y0, WorldMap *pMap, int _Object);
int fCreateNewTilePoint(int _TerrainType, int _LevelUpland, WorldMap *pMap, CTilePoint &Tilepoint);
int fCheckDoodadThisCell(int x, int y, WorldMap *pMap, int _Object);
