#pragma once
#include <windows.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <cstring>
#pragma comment (lib, "Winmm.lib")
#define SIZE_ARRAY 1000
#define TPoint POINT
#define OUTSIDE 1
#define INSIDE 2
#define BORDER 3
#define BASEHUMAN 4
#define BASEVAMPIRE 5
#define DANCEPOOL 6
#define SLAYERPLACE 7
#define LANDSCAPE 8
#define TELEPORT 9
#define DANCEPOOLTELEPORT 10
#define DEFAULTTELEPORT 11
#define RUNE2 12
#define BLOOD2 13
#define SHOAL 14
#define BASE_FILL 1
#define WALL_FILL 2
#define TELEPORT_FILL 3
#define TEMPORARY_FILL 4
#define CHECK_FILL 5
#define PERIMETER_FILL 6
#define DEADLOCK_FILL 7
#define PLANE_FILL 8
#define DOUBLEHILL_FILL 9
#define PERIMETER2_FILL 10
#define PLANE2_FILL 11
#define PERIMETER3_FILL 12
#define SHOAL_FILL 13
#define POS_CENTER 0
#define POS_LEFT 1
#define POS_UP 2
#define POS_RIGHT 4
#define POS_DOWN 8
#define POS_LEFTUP 16
#define POS_RIGHTUP 32
#define POS_LEFTDOWN 64
#define POS_RIGHTDOWN 128
// База
struct Base1
{
	int Id;				// идентификатор базы
	bool Open;			// открытая или закрытая база
	int Type;			// тип базы
	RECT Location;		// расположение базы на карте
	int Size;			// размер базы
	int Allowance;		// припуск к разеру базы
	int PosDistr;		// позиция распростронения
	int _c2;			// вторая точка пути, для тропинки к базе
	int _v2;			//
	double Tree;		// процентное соотношение кол-ва деревьев на базе
	double FelledTrees;	// вероятность создания срубленных деревьев
	double LvlСhange;	// вероятность изменения уровня возвышенности
	double IncLvl;		// вероятность увеличения уровня возвышенности
	double WidePass;	// вероятность создания широкого перехода между возвышеностями
	double Blood;		// вероятность выпадения крови на базе
	int NumBase;		// номер базы
};
// Клетака карты лабиринта
struct MapCell
{
	 bool PeakAttr; // показатель вершины
	 int Attribute; // показатель посещаемости клетки
	 int NumBase;	// номер базы
	 COLORREF Color;// цвет базы
	 bool Left, Up, Right, Down; // направления выхода из вершины
	 int NumPeak; // индекс в массиве вершин

	 bool Deadlock;		// тупик
	 bool Wall;

	 int Fill;		// заливка
	 
	 bool Tele;		// телепорт
	 RECT Teleport;	// регион телепорта
	 int NumTeleport;	// номер телепорта 

	 int LeftT, UpT, RightT, DownT; // стороны деревьев
	 int LevelUpland;// уровни возвышенности
	 int CellCountPass;		// количество клеток в переходе между уровнями возвышенности

	 bool Blood;	// кровь
};
/*
// Массив вершин
struct Peak
 { TPoint Coordinates;
 };

// Массив вершин найденного пути
struct TracePeak
 { TPoint  Coords;
   int Dest; // направления для визуализации
 };*/

void fGeneratePrim(MapCell **Massive, int Wm, int Hm);
void fDefinedStubs(MapCell **Massive, int Wm, int Hm);
void fCountСells(MapCell **Massive, int Wm, int Hm, int Fill, int &CountСells);
void fFiendFullDeadlock(MapCell **Massive, int Wm, int Hm, int SizeСellsWay, int CountWay, int &Way);
void fReplaceCells(MapCell **Massive, int Wm, int Hm, int Way, int Fill);
int fCountFreeCells(MapCell **Massive, int Wm, int Hm, int _c, int _v);
void fCreateBase2(MapCell **Massive, int Wm, int Hm);
void fUpdateCell(MapCell **Massive, int Wm, int Hm, int _c, int _v, int Attribute);
void fCreateBase3(MapCell **Massive, int Wm, int Hm);
void fCreateBase4(MapCell **Massive, int Wm, int Hm);
void fAddNotDatausaBorder(MapCell **Massive, int Wm, int Hm);
void fRetouchingMap(MapCell **Massive, int Wm, int Hm);
void fDelTails(MapCell **Massive, int Wm, int Hm);
void fCarvePassagesFrom(MapCell **Massive, int Wm, int Hm, int _c, int _v);
void fRecursiveBacktracking(MapCell **Massive, int Wm, int Hm);
int fFiendBase(MapCell **Massive, int Wm, int Hm, int _cn, int _vn, int SizeBase, int Allowance,
			   bool Open);
int fCheckRegionBase(MapCell **Massive, int Wm, int Hm, int w1, int h1, int w2, int h2);
void fClearMap(MapCell **Massive, int Wm, int Hm);
void fNewMap(MapCell **Massive, int Wm, int Hm);
void fCreateStub(MapCell **Massive, int Wm, int Hm, int _c, int _v, int &_c1, int &_v1);
void fCreateMap();
int fCheckCorridors(MapCell **Massive, int Wm, int Hm, int w1, int h1, int w2, int h2);
void fUpdateWall(MapCell **Massive, int Wm, int Hm, int _c, int _v);
void fCreatePath(MapCell **Massive, int Wm, int Hm, int _c1, int _v1, int _c2, int _v2);
int fCreateBase1(MapCell **Massive, int Wm, int Hm, Base1 _Base, int _NumBase);
void fAddBase(Base1 &_Base);
void fIncreaseSizeArray(int _Size);
void fEditBase(Base1 _Base);
void fGetListIdOfBases(int *&pListId, int &_N);
void fGetBase(Base1 &_Base, int _Id);
void fDelBase(int _Id);
int fCloseBase(MapCell **Massive, int Wm, int Hm, int &_c, int &_v);
int fDefineCellsBase1(MapCell **Massive, int Wm, int Hm, int &_c1, int &_v1, int _NumBase, COLORREF _Color);
int fCreateTelportBase (MapCell **Massive, int Wm, int Hm);
int fCheckCellsAround (MapCell **Massive, int Wm, int Hm, int _c, int _v, int _Fill);
int fDefineTeleports(MapCell **Massive, int Wm, int Hm);
void fFillLevelsElevations(MapCell **Massive, int Wm, int Hm, int _c1, int _v1,
							double _LvlСhange, double _IncLvl, double _WidePass);
void fDetermineLevelUpland(MapCell **Massive, int Wm, int Hm, int _c1, int _v1, int _c2, int _v2,
							double _LvlСhange, double _IncLvl, double _WidePass);
void fCheckStubs(MapCell **Massive, int Wm, int Hm);
int fNumberOutputsInTheCell (MapCell **Massive, int Wm, int Hm, int _c, int _v);
void fCreateTrees(MapCell **Massive, int Wm, int Hm, int _c1, int _v1,
				  double _Tree, double _FelledTrees);
int fToLookForMegaDeadlocks(MapCell **Massive, int Wm, int Hm, int _c, int _v);
int fCheckOutputs(MapCell **Massive, int Wm, int Hm);
void fCreateTreesPerimeterMap(MapCell **Massive, int Wm, int Hm);
int fCheckLevelAroundThisCell(MapCell **Massive, int Wm, int Hm, int _c1, int _v1, int Num);
int fPourBase(MapCell **Massive, int Wm, int Hm, int _c1, int _v1, int &_Step);
void fCreateBloodBase(MapCell **Massive, int Wm, int Hm, int _c1, int _v1);
int fPourFollowingPlot (MapCell **Massive, int Wm, int Hm, int _Step,
						 int &_Flag2, int &_c2, int &_v2);
int fCheckBloodAroundCell(MapCell **Massive, int Wm, int Hm, int _c, int _v);
void fReplaceBase(Base1 &_Base);
void fMapInitialization(int _Wm, int _Hm);
//int fStartBugExterminator(MapCell **Massive, int Wm, int Hm, int _c1, int _v1);
void fCreateWaterOnMap(MapCell **Massive, int Wm, int Hm, int _N);
int fCheckWallAroundCell(MapCell **Massive, int Wm, int Hm, int _c, int _v);
int fCheckBaseLevelNearToShoal(MapCell **Massive, int Wm, int Hm, int _c1, int _v1);
int fCountFreeCellsAroundThisCell(MapCell **Massive, int Wm, int Hm, int _c, int _v);
int fCheckCellPass(MapCell **Massive, int Wm, int Hm, int _c, int _v);
int fCheckCellPass2(MapCell **Massive, int Wm, int Hm, int _c, int _v);
int fCheckLevelAroundThisCell2(MapCell **Massive, int Wm, int Hm, int _c1, int _v1, int Num);
int fEditBases(MapCell **Massive, int Wm, int Hm);
int fCheckMapOnTheClosedCells(MapCell **Massive, int Wm, int Hm, int _c1, int _v1);
int fLetIsPutBordersRoundWater(MapCell **Massive, int Wm, int Hm);
void fCreateCellPassInWater(MapCell **Massive, int Wm, int Hm, int _c1, int _v1);
int fDeleteBase1(MapCell **Massive, int Wm, int Hm, int _NumBase);
int fCheckCellPass3(MapCell **Massive, int Wm, int Hm, int _c, int _v);
int fFindWayOutFromBase (MapCell **Massive, int Wm, int Hm, int &_c1, int &_v1, int _NumBase);