public void GenerateMap()
    {
        Map = new DungeonMap();
        int roomCount = Random.Range(Constants.FT_RoomCountMax, Constants.FT_RoomCountMin);
        for(int i=0; i < roomCount; i++)
        {
            RoomClass room = new RoomClass();
            room.Background = RoomSprites[Random.Range(0, RoomSprites.Length - 1)];
            room.Type = RoomTypes[Random.Range(0, RoomTypes.Length - 1)];
            room.Furniture = SetRoomFurniture(room);
            if (room.Type == FloodedTempleRoomType.Shop)
            {
                for(int j=0; j < Constants.FT_ItemsPerShop; j++)
                {
                    room.ActiveItems.Add(ItemCollection.GetRandomItem());
                }
            }
            else if (room.Type == FloodedTempleRoomType.Rest)
            {
                room.ActiveItems.Add(new FakeAltar());
            }
            else if (room.Type == FloodedTempleRoomType.Training)
            {
                room.Enemy = FT_EnemyCollection.GetRandomEnemy();
            }
            Map.Compartments.Add(room);

            if (i < roomCount - 1)
            {
                PassageClass passage = new PassageClass();
                passage.Tiles = new PassageTile[Random.Range(Constants.FT_PassageTileLengthMin, Constants.FT_PassageTileLengthMax)];
                AbActiveItem[] activeItems = new AbActiveItem[passage.Tiles.Length * 4];

                //#todo generate doors
                activeItems[1] = new FakeAltar();
                //activeItems[1].Action = previous;
                activeItems[activeItems.Length-2] = new FakeAltar();
                //activeItems[activeItems.Length-2].Action = next;

                for (int j = 3; j < activeItems.Length-2; j++)
                {
                    if (Random.Range(1, 100) <= Constants.FT_AltarChance)
                    {
                        activeItems[j] = FT_AltarCollection.GetRandomAltar();
                        j += Constants.FT_SameEventsMinDistance - 1;
                    }
                }
                AbEnemy[] enemies = new AbEnemy[passage.Tiles.Length * 4];
                for (int j = 2; j < enemies.Length; j++)
                {
                    if (Random.Range(1, 100) <= Constants.FT_AltarChance)
                    {
                        if (activeItems[j]!=null)
                        {
                            enemies[j-1] = FT_EnemyCollection.GetRandomEnemy();
                        }
                        else
                        {
                            enemies[j] = FT_EnemyCollection.GetRandomEnemy();
                        }
                        j += Constants.FT_SameEventsMinDistance - 1;
                    }
                }
                for (int j = 0; j < passage.Tiles.Length; j++)
                {
                    PassageTile passageTile = new PassageTile();
                    passageTile.Background = PassageSprites[Random.Range(0, PassageSprites.Length - 1)];

                    for(int k = 0; k < Constants.FT_EventSlotsPerPassageTile; k++)
                    {
                        passageTile.ActiveItems[k] = activeItems[j * 4 + k];
                    }
                    for (int k = 0; k < Constants.FT_EventSlotsPerPassageTile; k++)
                    {
                        passageTile.Enemies[k] = enemies[j * 4 + k];
                    }

                    passage.Tiles[j] = passageTile;
                }

                Map.Compartments.Add(passage);
            }
        }
    }
    public void GenerateMap()
    {
        Map = new DungeonMap();
        int roomCount = Random.Range(Constants.FT_RoomCountMax, Constants.FT_RoomCountMin);
        bool isRestExists = false;
        bool isTrainingExists = false;
        bool isShopExists = false;
        for (int i=0; i < roomCount; i++)
        {
            RoomClass room = new RoomClass();
            if (Map.Compartments.Count == 0)
            {
                room.Type = FloodedTempleRoomTypes.Start;
                room.Background = StartRoomSprite;
                room.Furniture = SetRoomFurniture(room);
                Map.Compartments.Add(room);
            }
            else if (Map.Compartments.Count == (roomCount - 1) * 2)
            {
                room.Type = FloodedTempleRoomTypes.Final;
                room.Background = FinalRoomSprite;
                room.Furniture = SetRoomFurniture(room);
                room.ActiveItems.Add(FT_AltarCollection.TheRivenMaskAltar);
                room.Enemy = FT_EnemyCollection.DDTheRock;
                Map.Compartments.Add(room);
            }
            else
            {
                do
                {
                    room.Type = MinorRoomTypes[Random.Range(0, MinorRoomTypes.Length)];
                } while (!(room.Type == FloodedTempleRoomTypes.Training && !isTrainingExists || room.Type == FloodedTempleRoomTypes.Shop && !isShopExists
                || room.Type == FloodedTempleRoomTypes.Rest && !isRestExists || isTrainingExists && isShopExists && isRestExists));
                if (room.Type == FloodedTempleRoomTypes.Training)
                {
                    isTrainingExists = true;
                }
                else if(room.Type == FloodedTempleRoomTypes.Shop)
                {
                    isShopExists = true;
                }
                else if (room.Type == FloodedTempleRoomTypes.Rest)
                {
                    isRestExists = true;
                }
                room.Background = MinorRoomSprites[(int)room.Type-1];
                room.Furniture = SetRoomFurniture(room);
                if (room.Type == FloodedTempleRoomTypes.Shop)
                {
                    for (int j = 0; j < Random.Range(1, Constants.FT_ItemsPerShop); j++)
                    {
                        room.ActiveItems.Add(ItemCollection.GetRandomItem());
                    }
                }
                else if (room.Type == FloodedTempleRoomTypes.Rest)
                {
                    room.ActiveItems.Add(FT_AltarCollection.RestRoomAltar);
                }
                else if (room.Type == FloodedTempleRoomTypes.Training)
                {
                    room.Enemy = FT_EnemyCollection.GetRandomMinorBoss();
                }
                Map.Compartments.Add(room);
            }
            if (i < roomCount - 1)
            {
                PassageClass passage = new PassageClass();
                passage.Tiles = new PassageTile[Random.Range(Constants.FT_PassageMinTileLength, Constants.FT_PassageMaxTileLength+1)];
                AbActiveItem[] activeItems = new AbActiveItem[passage.Tiles.Length * 4];

                for (int j = 3; j < activeItems.Length-2; j++)
                {
                    if ((j%Constants.FT_EventSlotsPerPassageTile==2 || j % Constants.FT_EventSlotsPerPassageTile == 3) && Random.Range(1, 100) <= Constants.FT_AltarChance)
                    {
                        activeItems[j] = FT_AltarCollection.GetRandomAltar();
                        j += Constants.FT_SameEventsMinDistance - 1;
                    }
                }
                AbEnemy[] enemies = new AbEnemy[passage.Tiles.Length * 4];

                if (i == 0)
                {
                    enemies[2] = FT_EnemyCollection.TutorialTurtle;
                }
                for (int j = 2; j < enemies.Length; j++)
                {
                    if (i == 0)
                    {
                        j += Constants.FT_SameEventsMinDistance - 1;
                    }
                    else
                    {
                        if (j % Constants.FT_EventSlotsPerPassageTile != 0 && Random.Range(1, 100) <= Constants.FT_EnemyChance)
                        {
                            if (activeItems[j] != null)
                            {
                                enemies[j - 1] = FT_EnemyCollection.GetRandomTrashEnemy();
                            }
                            else
                            {
                                enemies[j] = FT_EnemyCollection.GetRandomTrashEnemy();
                            }
                            j += Constants.FT_SameEventsMinDistance - 1;
                        }
                    }
                }
                for (int j = 0; j < passage.Tiles.Length; j++)
                {
                    PassageTile passageTile = new PassageTile();
                    passageTile.Background = PassageSprites[Random.Range(0, PassageSprites.Length)];

                    for(int k = 0; k < Constants.FT_EventSlotsPerPassageTile; k++)
                    {
                        passageTile.ActiveItems[k] = activeItems[j * 4 + k];
                    }
                    for (int k = 0; k < Constants.FT_EventSlotsPerPassageTile; k++)
                    {
                        passageTile.Enemies[k] = enemies[j * 4 + k];
                    }

                    passage.Tiles[j] = passageTile;
                }

                Map.Compartments.Add(passage);
            }
        }
    }