Example #1
0
    public void Kill()
    {
        Highlight(false);
        GetTile().setStatus(Tile.Status.empty);

        if (tribox != null)
        {
            int boxIndex = System.Array.FindIndex(tribox.GetBoxes(), x => x == this);
            if (boxIndex > 0 && boxIndex < tribox.GetBoxes().Length)
            {
                tribox.GetBoxes()[boxIndex] = null;
            }
            tribox = null;
        }
        transform.parent = null;

        // Grab a free Sequence to use
        killSequence = DOTween.Sequence();

        killSequence.Append(transform.DOPunchScale(transform.localScale, TheGrid.boxKillAnimationTime / 2));
        killSequence.Append(transform.DOScale(Vector3.zero, TheGrid.boxKillAnimationTime / 2));

        killSequence.OnComplete(() =>
        {
            Destroy(this.gameObject);
        });
    }
Example #2
0
    public void spawnTriBox(Box.Element[] elements, bool _isVertical = true, Tile center = null)
    {
        if (center != null)
        {
            if (center.AreMeAndNeighbours(Tile.Kind.spawn, Tile.Status.empty, _isVertical, !_isVertical))
            {
                print("center tile provided not valid");
                return;
            }
        }

        if (center == null)
        {
            List <Tile>   spawnableTiles     = GetCenterTiles(_isVertical, !_isVertical, Tile.Kind.spawn).FindAll(x => x.GetStatus() == Tile.Status.empty);
            List <TriBox> triboxesInsideSafe = GetAllTriBoxes();
            triboxesInsideSafe.RemoveAll(x => x.isOutsideSafeArea() == true);

            if (!spawnableTiles.Any() || triboxesInsideSafe.Any())
            {
                // print("no free spawn position available");
                return;
            }
            center = spawnableTiles[Random.Range(0, spawnableTiles.Count)];
        }

        TriBox tri = Instantiate(tribox_prefab, Vector3.zero, Quaternion.identity).GetComponent <TriBox>();

        tri.Init(center, elements, this, _isVertical);

        previewBoxes.generateNextPreview();
    }
Example #3
0
    public List <TriBox> GetAllTriBoxes()
    {
        List <TriBox> result = new List <TriBox>();

        foreach (GameObject go in GameObject.FindGameObjectsWithTag("TriBox"))
        {
            TriBox tri = go.GetComponent <TriBox>();
            if (tri == null)
            {
                continue;
            }

            result.Add(tri);
        }
        return(result);
    }
Example #4
0
    public void Kill(float delayTime)
    {
        this.AttachTimer(delayTime, Kill);

        if (tribox != null)
        {
            int boxIndex = System.Array.FindIndex(tribox.GetBoxes(), x => x == this);
            if (boxIndex > 0 && boxIndex < tribox.GetBoxes().Length)
            {
                tribox.GetBoxes()[boxIndex] = null;
            }
            tribox = null;
        }

        Highlight(false);
        transform.parent = null;
    }
Example #5
0
    public bool isTriboxMyNeighbour(TriBox tri)
    {
        if (tri == null)
        {
            return(false);
        }

        if (tri.GetBoxes().ToList().Any(x => x == null))
        {
            return(false);
        }

        foreach (Box b in tri.GetBoxes())
        {
            if (isMyNeighbour(b, true) == false)
            {
                return(false);
            }
        }

        return(true);
    }
Example #6
0
    private bool checkDestination(UtilityTools.Directions dir)
    {
        Tile destination = grid_ref.GetTile(index.getNeighbourPoint(dir));

        if (dir == UtilityTools.Directions.upLeft || dir == UtilityTools.Directions.upRight ||
            dir == UtilityTools.Directions.downRight || dir == UtilityTools.Directions.downLeft ||
            destination == null)
        {
            return(false);
        }
        else
        {
            if (destination.isEmpty())
            {
                //print("destination is empty: " + index.getNeighbourPoint (dir).print());
                return(true);
            }
            else if (destination.GetStatus() == Tile.Status.box && destination.GetBox().isInTribox()) //if destination has a box part of tribox is eligible to Move or Rotate
            {
                TriBox tri = destination.GetBox().GetTriBox();

                /*
                 * if (destination.GetBox ().isCenterBox ())
                 * {
                 *  print("tried to move center");
                 *  //need to check if can move, then move
                 *
                 *  return false;
                 * }
                 */

                //check if can rotate, then rotate (check already inside rotate)
                //or if can move from below edges

                bool clockw = true;
                switch (dir)
                {
                case UtilityTools.Directions.up:
                    if (tri.IsVertical())
                    {
                        //if moving from the lowest box, need to move up
                        if (destination.GetBox().isDirectionMost(UtilityTools.OppositeDirection(dir)))
                        {
                            return(tri.canMove(dir));
                        }
                        else
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        if (destination.GetBox().isCenterBox())
                        {
                            return(tri.canMove(dir));
                        }
                        else
                        {
                            //try to rotate
                            //print("trying to UP, colliding box " + destination.GetBox() + " vs actual First" + tri.GetBoxes ().First ());
                            clockw = (destination.GetBox().isDirectionMost(UtilityTools.Directions.left));
                            return(tri.canRotate(clockw));
                        }
                    }

                    break;

                case UtilityTools.Directions.upRight:

                    break;

                case UtilityTools.Directions.right:

                    if (!tri.IsVertical())
                    {
                        if (destination.GetBox().isDirectionMost(UtilityTools.OppositeDirection(dir)))
                        {
                            return(tri.canMove(dir));
                        }
                        else
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        if (destination.GetBox().isCenterBox())
                        {
                            return(tri.canMove(dir));
                        }
                        else
                        {
                            //try to rotate
                            //print("trying to Right, colliding box " + destination.GetBox() + " vs actual First" + tri.GetBoxes ().First ());
                            clockw = (destination.GetBox().isDirectionMost(UtilityTools.Directions.up));
                            return(tri.canRotate(clockw));
                        }
                    }

                    break;

                case UtilityTools.Directions.downRight:

                    break;

                case UtilityTools.Directions.down:
                    if (tri.IsVertical())
                    {
                        //need to move down
                        if (destination.GetBox().isDirectionMost(UtilityTools.OppositeDirection(dir)))
                        {
                            return(tri.canMove(dir));
                        }
                        else
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        if (destination.GetBox().isCenterBox())
                        {
                            return(tri.canMove(dir));
                        }
                        else
                        {
                            //try to rotate
                            //print("trying to DOWN, colliding box " + destination.GetBox() + " vs actual last" + tri.GetBoxes ().Last ());
                            clockw = (destination.GetBox().isDirectionMost(UtilityTools.Directions.right));
                            return(tri.canRotate(clockw));
                        }
                    }

                    break;

                case UtilityTools.Directions.downLeft:
                    break;

                case UtilityTools.Directions.left:

                    if (!tri.IsVertical())
                    {
                        //need to move left
                        if (destination.GetBox().isDirectionMost(UtilityTools.OppositeDirection(dir)))
                        {
                            return(tri.canMove(dir));
                        }
                        else
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        if (destination.GetBox().isCenterBox())
                        {
                            return(tri.canMove(dir));
                        }
                        else
                        {
                            //try to rotate
                            //print("trying to LEFT, colliding box " + destination.GetBox() + " vs actual last" + tri.GetBoxes ().Last ());
                            clockw = (destination.GetBox().isDirectionMost(UtilityTools.Directions.down));
                            return(tri.canRotate(clockw));
                        }
                    }

                    break;

                case UtilityTools.Directions.upLeft:
                    break;

                default:
                    return(false);
                }

                return(false);
            }
            else
            {
                return(false);
            }
        }
    }
Example #7
0
    public void Push(UtilityTools.Directions dir)
    {
        if (!isInTribox())
        {
            return;
        }

        bool   clockw = true;
        TriBox tri    = tribox;

        switch (dir)
        {
        case UtilityTools.Directions.up:
            if (tri.IsVertical())
            {
                //if im the lowest box
                if (isDirectionMost(UtilityTools.OppositeDirection(dir)))
                {
                    //if the upside is empty
                    if (tri.isSideEmpty(dir))
                    {
                        tribox.Move(dir);
                    }
                }
            }
            else
            {
                if (isCenterBox())
                {
                    //try to move
                    if (tri.isSideEmpty(dir))
                    {
                        tribox.Move(dir);
                    }
                }
                else
                {
                    //try to rotate
                    clockw = (isDirectionMost(UtilityTools.Directions.left));
                    tribox.Rotate(clockw);
                    return;
                }
            }

            break;

        case UtilityTools.Directions.upRight:

            break;

        case UtilityTools.Directions.right:

            if (!tri.IsVertical())
            {
                //if im the leftmost box
                if (isDirectionMost(UtilityTools.OppositeDirection(dir)))
                {
                    //if the side is empty
                    if (tri.isSideEmpty(dir))
                    {
                        tribox.Move(dir);
                    }
                }
            }
            else
            {
                if (isCenterBox())
                {
                    //try to move
                    if (tri.isSideEmpty(dir))
                    {
                        tribox.Move(dir);
                    }
                }
                else
                {
                    //try to rotate
                    clockw = (isDirectionMost(UtilityTools.Directions.up));
                    tribox.Rotate(clockw);
                    return;
                }
            }

            break;

        case UtilityTools.Directions.downRight:

            break;

        case UtilityTools.Directions.down:
            if (tri.IsVertical())
            {
                //need to move down
                //if im the toppest box
                if (isDirectionMost(UtilityTools.OppositeDirection(dir)))
                {
                    //if the downside is empty
                    if (tri.isSideEmpty(dir))
                    {
                        tribox.Move(dir);
                    }
                }
            }
            else
            {
                if (isCenterBox())
                {
                    //try to move
                    if (tri.isSideEmpty(dir))
                    {
                        tribox.Move(dir);
                    }
                }
                else
                {
                    //try to rotate
                    clockw = (isDirectionMost(UtilityTools.Directions.right));
                    tribox.Rotate(clockw);
                    return;
                }
            }

            break;

        case UtilityTools.Directions.downLeft:
            break;

        case UtilityTools.Directions.left:

            if (!tri.IsVertical())
            {
                //if im the leftmost box
                if (isDirectionMost(UtilityTools.OppositeDirection(dir)))
                {
                    //if the side is empty
                    if (tri.isSideEmpty(dir))
                    {
                        tribox.Move(dir);
                    }
                }
            }
            else
            {
                if (isCenterBox())
                {
                    //try to move
                    if (tri.isSideEmpty(dir))
                    {
                        tribox.Move(dir);
                    }
                }
                else
                {
                    //try to rotate
                    clockw = (isDirectionMost(UtilityTools.Directions.down));
                    tribox.Rotate(clockw);
                    return;
                }
            }

            break;

        case UtilityTools.Directions.upLeft:
            break;

        default:
            return;
        }
    }
Example #8
0
 public void SetTriBox(TriBox tri)
 {
     tribox = tri;
 }