Пример #1
0
    // 퍼즐 초기 세팅.
    private IEnumerator SetPuzzleProcess()
    {
        yield return(new WaitForEndOfFrame());

        float wait_second = 0;

        for (int i = 0; i < tile_lines.Count; i++)
        {
            TileLine      tile_line      = tile_lines[i];
            Vector3       first_tile_pos = tile_line.CreatePosition;
            List <Animal> list           = new List <Animal>();
            for (int j = 0; j < tile_line.TileCount; j++)
            {
                Animal animal = CreateAnimal();
                animal.SetData(i, j);
                animal.AnimalLocalPosition
                    = first_tile_pos + Vector3.up * (140f + 140 * (j + (IsEvneNumber(i) ? 0 : 1)));
                animal.MovePosition(tile_line.GetTilePosition(j));
                list.Add(animal);
            }
            arr_animals[i] = list;
            wait_second   += 0.15f;
        }

        yield return(new WaitForSeconds(wait_second));

        StartCoroutine(StartEventProcess());
    }
Пример #2
0
    // 빈곳에 퍼즐을 채워 넣음.
    private IEnumerator RegenerationAnimalProcess()
    {
        float wait_second = 0;

        for (int i = 0; i < tile_lines.Count; i++)
        {
            TileLine      tile_line    = tile_lines[i];
            List <Animal> list         = arr_animals[i];
            int           before_count = list.Count;
            for (int j = 0; j < tile_line.TileCount; j++)
            {
                if (before_count > j)
                {
                    Animal animal = list[j];
                    animal.SetData(i, j);
                    animal.MovePosition(tile_line.GetTilePosition(j));
                }
                else
                {
                    Animal create_animal = CreateAnimal();
                    create_animal.SetData(i, j);
                    create_animal.AnimalLocalPosition = tile_line.CreatePosition
                                                        + new Vector3(0, 140f + 140f * (j - before_count));
                    create_animal.MovePosition(tile_line.GetTilePosition(j));
                    list.Add(create_animal);
                    wait_second += 0.11f;
                }
            }
        }

        yield return(new WaitForSeconds(wait_second));

        destroy_count   = 0;
        is_click_puzzle = true;
    }
Пример #3
0
 private void SpawnLines()
 {
     while (tileLines[tileLines.Count - 1].transform.position.y < Mathf.Max(TilePlayer.Instance.transform.position.y, transform.position.y) + TileCamera.Instance.camera.orthographicSize)
     {
         GameObject newLineObj = Instantiate(possibleLines[0], tileLines[tileLines.Count - 1].transform.position + Vector3.up * lineOffset, Quaternion.identity);
         TileLine   newLine    = newLineObj.GetComponent <TileLine>();
         newLine.previousLine = tileLines[tileLines.Count - 1];
         if (TileLine.lineCount > 5)
         {
             List <string> tiles = currentWave.GetTiles(currentLine);
             if (tiles == null)
             {
                 FindWave();
                 tiles = currentWave.GetTiles(currentLine);
             }
             newLine.SpawnTiles(tiles);
             ++currentLine;
         }
         else
         {
             newLine.SpawnTiles(currentWave.GetWidth());
         }
         tileLines.Add(newLine);
     }
 }
Пример #4
0
    public void FindTile()
    {
        float    minDist     = float.MaxValue;
        TileBase closestTile = null;

        for (int lineIdx = 0; lineIdx < TileManager.Instance.tileLines.Count; ++lineIdx)
        {
            TileLine currentLine = TileManager.Instance.tileLines[lineIdx];
            for (int tileIdx = 0; tileIdx < currentLine.tiles.Count; ++tileIdx)
            {
                TileBase loopTile = currentLine.tiles[tileIdx];

                float dist = Vector3.Distance(loopTile.transform.position, transform.position);
                // ReSharper disable once InvertIf
                if (dist < minDist)
                {
                    minDist     = dist;
                    closestTile = loopTile;
                }
            }
        }

        tileHistory.Add(closestTile);
    }
    private void SpawnGrid()
    {
        DestroyGrid();

        tileLines = new TileLine[gridSize.x];

        for (int x = 0; x < gridSize.x; x++)
        {
            tileLines[x] = new TileLine(gridSize.y);

            for (int z = 0; z < gridSize.y; z++)
            {
                tileLines[x].tiles[z]      = Instantiate(tilePrefab_a, new Vector3Int(x, defaultY, z), Quaternion.identity, transform);
                tileLines[x].tiles[z].name = $"Tile[{x}][{z}]";

                if ((x + z) % 2 == 0)
                {
                    tileLines[x].tiles[z].name = tileLines[x].tiles[z].name + "_b";
                    // Debug.Log(tileLines[x].tiles[z].gameObject.transform.GetChild(1).name);
                    // tileLines[x].tiles[z].transform.GetChild(0).GetComponent<Renderer>().material = alternative_tile_material;
                }
            }
        }
    }
Пример #6
0
    // 모든 타일에 대해 매칭 판별하는 함수
    // 매칭에 해당하는 모든 리스트를 반환한다.
    public List <TileLine> CheckAllMatch()
    {
        List <TileLine> matchLines = new List <TileLine>();

        for (int i = 0; i < Constants.HEIGHT; i++)
        {
            int beforeTile = -1;
            int count      = 0;
            int startIndex = -1;
            for (int j = 0; j < Constants.WIDTH; j++)
            {
                if (beforeTile == tileGrid[i, j].index)
                {
                    if (count == 0)
                    {
                        startIndex = j - 1;
                    }
                    count++;
                }
                else
                {
                    if (count >= 2)
                    {
                        TileLine line = new TileLine(false, i, startIndex, j - 1);

                        matchLines.Add(line);
                    }
                    count      = 0;
                    startIndex = -1;
                }
                beforeTile = tileGrid[i, j].index;
            }
            // 맨 마지막 타일을 위한 예외처리.
            if (count >= 2)
            {
                TileLine line = new TileLine(false, i, startIndex, WIDTH - 1);
                matchLines.Add(line);
            }
        }

        for (int i = 0; i < Constants.WIDTH; i++)
        {
            int beforeTile = -1;
            int count      = 0;
            int startIndex = -1;
            for (int j = 0; j < Constants.HEIGHT; j++)
            {
                if (beforeTile == tileGrid[j, i].index)
                {
                    if (count == 0)
                    {
                        startIndex = j - 1;
                    }

                    count++;
                }
                else
                {
                    if (count >= 2)
                    {
                        TileLine line = new TileLine(true, i, startIndex, j - 1);

                        matchLines.Add(line);
                    }
                    count      = 0;
                    startIndex = -1;
                }


                beforeTile = tileGrid[j, i].index;
            }
            if (count >= 2)
            {
                TileLine line = new TileLine(true, i, startIndex, Constants.HEIGHT - 1);

                matchLines.Add(line);
            }
        }
        return(matchLines);
    }
Пример #7
0
        private void UpdateFov()
        {
            //Center view to Hero
            TextSurface.RenderArea = new Rectangle(hero.Position.X - (TextSurface.RenderArea.Width / 2), hero.Position.Y - (TextSurface.RenderArea.Height / 2), TextSurface.RenderArea.Width, TextSurface.RenderArea.Height);
            //Move ActorLayer with "parent"
            ActorLayer.TextSurface.RenderArea = TextSurface.RenderArea;

            //Tiles in previous version of FOV gets cleared
            foreach (Point tile in VisibleTiles)
            {
                Map[tile].Info.IsInFOV    = false;
                Map[tile].Info.IsExplored = true;
                Map[tile].RenderToCell(this[tile.X, tile.Y]);
            }

            VisibleTiles.Clear();
            //Generate new FOV
            #region CastRays

            Rectangle sightRect = new Rectangle(hero.Position.X - 50, hero.Position.Y - 50, 100, 100);

            for (int x = sightRect.X; x < sightRect.Right; x++)
            {
                int y = sightRect.Y;                  // TOP OF SIGHT RECT

                VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange));

                y = sightRect.Bottom;                 // BOTTOM OF SIGHT RECT

                VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange));
            }

            for (int y = sightRect.Y; y < sightRect.Bottom; y++)
            {
                int x = sightRect.X;                 // LEFT OF SIGHT RECT

                VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange));

                x = sightRect.Right;                  // RIGHT OF SIGHT RECT

                VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange));
            }

            //to the right
            int distance            = 0;
            int hideOpeningDistance = 3;
            for (int x = hero.Position.X; x < hero.Position.X + hero.SightRange; x++)
            {
                //check horizontal +-1 tiles
                Point tileUp   = new Point(x, hero.Position.Y + 1);
                Point tileDown = new Point(x, hero.Position.Y - 1);
                if (!Map.ContainsKey(new Point(x, hero.Position.Y)) || !Map[new Point(x, hero.Position.Y)].Info.IsTransparent)
                {
                    if (Map.ContainsKey(tileUp) && !Map[tileUp].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileUp);
                    }
                    if (Map.ContainsKey(tileDown) && !Map[tileDown].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileDown);
                    }
                    break;
                }
                else
                {
                    if (Map.ContainsKey(tileUp))
                    {
                        if (distance >= hideOpeningDistance && Map[tileUp].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileUp);
                        }
                        else
                        {
                            VisibleTiles.Add(tileUp);
                        }
                    }
                    if (Map.ContainsKey(tileDown))
                    {
                        if (distance >= hideOpeningDistance && Map[tileDown].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileDown);
                        }
                        else
                        {
                            VisibleTiles.Add(tileDown);
                        }
                    }
                }
                distance++;
            }
            distance = 0;
            for (int x = hero.Position.X; x > hero.Position.X - hero.SightRange; x--)
            {
                //check horizontal +-1 tiles
                Point tileUp   = new Point(x, hero.Position.Y + 1);
                Point tileDown = new Point(x, hero.Position.Y - 1);
                if (!Map.ContainsKey(new Point(x, hero.Position.Y)) || !Map[new Point(x, hero.Position.Y)].Info.IsTransparent)
                {
                    if (Map.ContainsKey(tileUp) && !Map[tileUp].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileUp);
                    }
                    if (Map.ContainsKey(tileDown) && !Map[tileDown].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileDown);
                    }
                    break;
                }
                else
                {
                    if (Map.ContainsKey(tileUp))
                    {
                        if (distance >= hideOpeningDistance && Map[tileUp].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileUp);
                        }
                        else
                        {
                            VisibleTiles.Add(tileUp);
                        }
                    }
                    if (Map.ContainsKey(tileDown))
                    {
                        if (distance >= hideOpeningDistance && Map[tileDown].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileDown);
                        }
                        else
                        {
                            VisibleTiles.Add(tileDown);
                        }
                    }
                }
                distance++;
            }
            //to the up
            distance = 0;
            for (int y = hero.Position.Y; y > hero.Position.Y - hero.SightRange; y--)
            {
                //check horizontal +-1 tiles
                Point tileRight = new Point(hero.Position.X + 1, y);
                Point tileLeft  = new Point(hero.Position.X - 1, y);
                if (!Map.ContainsKey(new Point(hero.Position.X, y)) || !Map[new Point(hero.Position.X, y)].Info.IsTransparent)
                {
                    if (Map.ContainsKey(tileRight) && !Map[tileRight].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileRight);
                    }
                    if (Map.ContainsKey(tileLeft) && !Map[tileLeft].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileLeft);
                    }
                    break;
                }
                else
                {
                    if (Map.ContainsKey(tileRight))
                    {
                        if (distance >= hideOpeningDistance && Map[tileRight].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileRight);
                        }
                        else
                        {
                            VisibleTiles.Add(tileRight);
                        }
                    }
                    if (Map.ContainsKey(tileLeft))
                    {
                        if (distance >= hideOpeningDistance && Map[tileLeft].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileLeft);
                        }
                        else
                        {
                            VisibleTiles.Add(tileLeft);
                        }
                    }
                }
                distance++;
            }
            //to the Down
            distance = 0;
            for (int y = hero.Position.Y; y < hero.Position.Y + hero.SightRange; y++)
            {
                //check horizontal +-1 tiles
                Point tileRight = new Point(hero.Position.X + 1, y);
                Point tileLeft  = new Point(hero.Position.X - 1, y);
                if (!Map.ContainsKey(new Point(hero.Position.X, y)) || !Map[new Point(hero.Position.X, y)].Info.IsTransparent)
                {
                    if (Map.ContainsKey(tileRight) && !Map[tileRight].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileRight);
                    }
                    if (Map.ContainsKey(tileLeft) && !Map[tileLeft].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileLeft);
                    }
                    break;
                }
                else
                {
                    if (Map.ContainsKey(tileRight))
                    {
                        if (distance >= hideOpeningDistance && Map[tileRight].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileRight);
                        }
                        else
                        {
                            VisibleTiles.Add(tileRight);
                        }
                    }
                    if (Map.ContainsKey(tileLeft))
                    {
                        if (distance >= hideOpeningDistance && Map[tileLeft].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileLeft);
                        }
                        else
                        {
                            VisibleTiles.Add(tileLeft);
                        }
                    }
                }
                distance++;
            }

            #endregion

            //Remove duplicate entries from FOV
            //List<Point> uniq = VisibleTiles.Distinct().ToList();
            //VisibleTiles.Clear();
            //VisibleTiles = uniq;

            //Tiles in new FOV set
            foreach (Point tile in VisibleTiles)
            {
                Map[tile].Info.IsInFOV = true;
                Map[tile].RenderToCell(this[tile.X, tile.Y]);
            }

            //Render "Monsters" in FOV
            foreach (Monster m in actors)
            {
                if (!Map[m.Position].Info.IsInFOV)
                {
                    m.InFov = false;
                    m.UnRenderFromCell(ActorLayer[m.Position.X, m.Position.Y]);
                }
                else
                {
                    m.InFov = true;
                    m.RenderToCell(ActorLayer[m.Position.X, m.Position.Y]);
                }
            }
        }
Пример #8
0
        //public class Fov(  )

        private void Calculate()
        {
            //Tiles in previous version of FOV gets cleared
            foreach (Point tile in VisibleTiles)
            {
                Map[tile].Info.IsInFOV    = false;
                Map[tile].Info.IsExplored = true;
                Map[tile].RenderToCell(this[tile.X, tile.Y]);
            }

            VisibleTiles.Clear();
            //Generate new FOV
            #region CastRays

            Rectangle sightRect = new Rectangle(hero.Position.X - 50, hero.Position.Y - 50, 100, 100);

            for (int x = sightRect.X; x < sightRect.Right; x++)
            {
                int y = sightRect.Y;                  // TOP OF SIGHT RECT

                VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange));

                y = sightRect.Bottom;                 // BOTTOM OF SIGHT RECT

                VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange));
            }

            for (int y = sightRect.Y; y < sightRect.Bottom; y++)
            {
                int x = sightRect.X;                 // LEFT OF SIGHT RECT

                VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange));

                x = sightRect.Right;                  // RIGHT OF SIGHT RECT

                VisibleTiles.AddRange(TileLine.GetLosLine(Map, hero.Position, new Point(x, y), hero.SightRange));
            }

            //to the right
            int distance            = 0;
            int hideOpeningDistance = 3;
            for (int x = hero.Position.X; x < hero.Position.X + hero.SightRange; x++)
            {
                //check horizontal +-1 tiles
                Point tileUp   = new Point(x, hero.Position.Y + 1);
                Point tileDown = new Point(x, hero.Position.Y - 1);
                if (!Map.ContainsKey(new Point(x, hero.Position.Y)) || !Map[new Point(x, hero.Position.Y)].Info.IsTransparent)
                {
                    if (Map.ContainsKey(tileUp) && !Map[tileUp].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileUp);
                    }
                    if (Map.ContainsKey(tileDown) && !Map[tileDown].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileDown);
                    }
                    break;
                }
                else
                {
                    if (Map.ContainsKey(tileUp))
                    {
                        if (distance >= hideOpeningDistance && Map[tileUp].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileUp);
                        }
                        else
                        {
                            VisibleTiles.Add(tileUp);
                        }
                    }
                    if (Map.ContainsKey(tileDown))
                    {
                        if (distance >= hideOpeningDistance && Map[tileDown].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileDown);
                        }
                        else
                        {
                            VisibleTiles.Add(tileDown);
                        }
                    }
                }
                distance++;
            }
            distance = 0;
            for (int x = hero.Position.X; x > hero.Position.X - hero.SightRange; x--)
            {
                //check horizontal +-1 tiles
                Point tileUp   = new Point(x, hero.Position.Y + 1);
                Point tileDown = new Point(x, hero.Position.Y - 1);
                if (!Map.ContainsKey(new Point(x, hero.Position.Y)) || !Map[new Point(x, hero.Position.Y)].Info.IsTransparent)
                {
                    if (Map.ContainsKey(tileUp) && !Map[tileUp].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileUp);
                    }
                    if (Map.ContainsKey(tileDown) && !Map[tileDown].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileDown);
                    }
                    break;
                }
                else
                {
                    if (Map.ContainsKey(tileUp))
                    {
                        if (distance >= hideOpeningDistance && Map[tileUp].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileUp);
                        }
                        else
                        {
                            VisibleTiles.Add(tileUp);
                        }
                    }
                    if (Map.ContainsKey(tileDown))
                    {
                        if (distance >= hideOpeningDistance && Map[tileDown].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileDown);
                        }
                        else
                        {
                            VisibleTiles.Add(tileDown);
                        }
                    }
                }
                distance++;
            }
            //to the up
            distance = 0;
            for (int y = hero.Position.Y; y > hero.Position.Y - hero.SightRange; y--)
            {
                //check horizontal +-1 tiles
                Point tileRight = new Point(hero.Position.X + 1, y);
                Point tileLeft  = new Point(hero.Position.X - 1, y);
                if (!Map.ContainsKey(new Point(hero.Position.X, y)) || !Map[new Point(hero.Position.X, y)].Info.IsTransparent)
                {
                    if (Map.ContainsKey(tileRight) && !Map[tileRight].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileRight);
                    }
                    if (Map.ContainsKey(tileLeft) && !Map[tileLeft].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileLeft);
                    }
                    break;
                }
                else
                {
                    if (Map.ContainsKey(tileRight))
                    {
                        if (distance >= hideOpeningDistance && Map[tileRight].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileRight);
                        }
                        else
                        {
                            VisibleTiles.Add(tileRight);
                        }
                    }
                    if (Map.ContainsKey(tileLeft))
                    {
                        if (distance >= hideOpeningDistance && Map[tileLeft].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileLeft);
                        }
                        else
                        {
                            VisibleTiles.Add(tileLeft);
                        }
                    }
                }
                distance++;
            }
            //to the Down
            distance = 0;
            for (int y = hero.Position.Y; y < hero.Position.Y + hero.SightRange; y++)
            {
                //check horizontal +-1 tiles
                Point tileRight = new Point(hero.Position.X + 1, y);
                Point tileLeft  = new Point(hero.Position.X - 1, y);
                if (!Map.ContainsKey(new Point(hero.Position.X, y)) || !Map[new Point(hero.Position.X, y)].Info.IsTransparent)
                {
                    if (Map.ContainsKey(tileRight) && !Map[tileRight].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileRight);
                    }
                    if (Map.ContainsKey(tileLeft) && !Map[tileLeft].Info.IsTransparent)
                    {
                        VisibleTiles.Add(tileLeft);
                    }
                    break;
                }
                else
                {
                    if (Map.ContainsKey(tileRight))
                    {
                        if (distance >= hideOpeningDistance && Map[tileRight].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileRight);
                        }
                        else
                        {
                            VisibleTiles.Add(tileRight);
                        }
                    }
                    if (Map.ContainsKey(tileLeft))
                    {
                        if (distance >= hideOpeningDistance && Map[tileLeft].Info.IsTransparent)
                        {
                            VisibleTiles.Remove(tileLeft);
                        }
                        else
                        {
                            VisibleTiles.Add(tileLeft);
                        }
                    }
                }
                distance++;
            }

            #endregion

            //Remove duplicate entries from FOV
            //List<Point> uniq = VisibleTiles.Distinct().ToList();
            //VisibleTiles.Clear();
            //VisibleTiles = uniq;

            //Tiles in new FOV set
            //	foreach ( Point tile in VisibleTiles )
            //	{
            //		Map[tile].Info.IsInFOV = true;
            //		Map[tile].RenderToCell( this[tile.X, tile.Y] );
            //	}

            //	//Render "Monsters" in FOV
            //	foreach ( Monster m in actors )
            //	{
            //		if ( !Map[m.Position].Info.IsInFOV )
            //		{
            //			m.InFov = false;
            //			m.UnRenderFromCell( ActorLayer[m.Position.X, m.Position.Y] );
            //		}
            //		else
            //		{
            //			m.InFov = true;
            //			m.RenderToCell( ActorLayer[m.Position.X, m.Position.Y] );
            //		}
            //	}
            //}


            //internal void Walk( Point point )
            //{
            //	//Move Hero and open doors when bumped on
            //	Point destination = hero.Position + point;
            //	if ( Map.ContainsKey( destination ) )
            //	{
            //		if ( Map[destination].Info.BlocksMove == true )
            //		{
            //			if ( Map[destination] is IOpenable )
            //			{
            //				IOpenable d = Map[destination] as IOpenable;
            //				d.Open();

            //				Map[destination].RemoveCellFromView( this[destination.X, destination.Y] );
            //				Map[destination].RenderToCell( this[destination.X, destination.Y] );
            //				UpdateFov();
            //			}
            //			MessagesConsole.Instance.PrintMessage( "Blocked Move!" );
            //			return;
            //		}
            //		// Handle render to new pos and unrendering from previous pos
            //		if ( new Rectangle( 0, 0, Width - 1, Height - 1 ).Contains( destination ) )
            //		{
            //			hero.UnRenderFromCell( ActorLayer[hero.Position.X, hero.Position.Y] );
            //			hero.Position = destination;
            //			MessagesConsole.Instance.PrintMessage( "You see here: " + Map[destination].Info.Description );
            //			UpdateFov();
            //			hero.RenderToCell( ActorLayer[destination.X, destination.Y] );
            //			// Update Stats screen
            //			hero.OnChangedEvent();

            //		}
            //	}
        }