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); }); }
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(); }
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); }
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; }
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); }
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); } } }
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; } }
public void SetTriBox(TriBox tri) { tribox = tri; }