/// <summary> /// This function return true if this hexagon can be take desired color id from near neighbours. /// </summary> /// <param name="targetColorId"></param> /// <param name="extractHexagonCoordinates"></param> /// <returns></returns> public bool CanBeColor(int targetColorId, Coordinate[] extractHexagonCoordinates) { Coordinate[] nearNeighboursAdditiveCoordinates = GameUtils.NearNeighbours(GetCoordinate().x % 2 != 0); BoardController boardController = GameManager.Instance.GetBoardController(); List <HexagonController> nearNeighboursHexagonControllers = new List <HexagonController>(); foreach (Coordinate additiveCoordinate in nearNeighboursAdditiveCoordinates) { HexagonController neighboursHexagonController = boardController.GetHexagonControllerByCoordinate(GetCoordinate() + additiveCoordinate, true); if (neighboursHexagonController == null) { continue; } if (extractHexagonCoordinates.Contains(neighboursHexagonController.GetCoordinate())) { continue; } nearNeighboursHexagonControllers.Add(neighboursHexagonController); } return(nearNeighboursHexagonControllers.Any(x => x.GetColorId() == targetColorId)); }
/// <summary> /// This function returns true if there are any moves left. /// </summary> /// <returns></returns> public async UniTask CheckGameOver() { await UniTask.Yield(); foreach (HexagonController hexagonController in hexagonControllers) { bool isAnyColorMatch = false; HexagonController otherHexagonController = null; foreach (Direction direction in (Direction[])Enum.GetValues(typeof(Direction))) { List <HexagonController> neighboursHexagonControllers = hexagonController.GetNeighboursHexagonControllers(direction); foreach (HexagonController neighboursHexagonController in neighboursHexagonControllers) { if (hexagonController.GetColorId() == neighboursHexagonController.GetColorId()) { otherHexagonController = neighboursHexagonController; isAnyColorMatch = true; break; } } if (isAnyColorMatch) { break; } } if (!isAnyColorMatch) { continue; } if (otherHexagonController == null) { continue; } Coordinate[] extractHexagonCoordinates = { hexagonController.GetCoordinate(), otherHexagonController.GetCoordinate() }; List <HexagonController> possibleHexagonControllers = new List <HexagonController>(); Coordinate currentHexagonCoordinate = hexagonController.GetCoordinate(); Coordinate otherHexagonCoordinate = otherHexagonController.GetCoordinate(); if (currentHexagonCoordinate.x == otherHexagonCoordinate.x) { if (currentHexagonCoordinate.x % 2 == 0) { HexagonController targetHexagonController = currentHexagonCoordinate.y < otherHexagonCoordinate.y ? hexagonController : otherHexagonController; possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(targetHexagonController.GetCoordinate() + new Coordinate(1, 0), true)); possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(targetHexagonController.GetCoordinate() + new Coordinate(-1, 0), true)); } else { HexagonController targetHexagonController = currentHexagonCoordinate.y > otherHexagonCoordinate.y ? hexagonController : otherHexagonController; possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(targetHexagonController.GetCoordinate() + new Coordinate(1, 0), true)); possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(targetHexagonController.GetCoordinate() + new Coordinate(-1, 0), true)); } } else { if (currentHexagonCoordinate.y == otherHexagonCoordinate.y) { HexagonController evenHexagonController = currentHexagonCoordinate.x % 2 == 0 ? hexagonController : otherHexagonController; HexagonController oddHexagonController = currentHexagonCoordinate.x % 2 != 0 ? hexagonController : otherHexagonController; possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(oddHexagonController.GetCoordinate() + new Coordinate(0, -1), true)); possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(evenHexagonController.GetCoordinate() + new Coordinate(0, 1), true)); } else { HexagonController smallerYAxisHexagonController = currentHexagonCoordinate.y < otherHexagonCoordinate.y ? hexagonController : otherHexagonController; HexagonController greaterYAxisHexagonController = currentHexagonCoordinate.y > otherHexagonCoordinate.y ? hexagonController : otherHexagonController; possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(greaterYAxisHexagonController.GetCoordinate() + new Coordinate(0, -1), true)); possibleHexagonControllers.Add(GetHexagonControllerByCoordinate(smallerYAxisHexagonController.GetCoordinate() + new Coordinate(0, 1), true)); } } possibleHexagonControllers.RemoveAll(x => x == null); foreach (HexagonController possibleHexagonController in possibleHexagonControllers) { if (possibleHexagonController.CanBeColor(hexagonController.GetColorId(), extractHexagonCoordinates)) { Debug.Log($"Move Caught. Coordinate : {possibleHexagonController.GetCoordinate()}"); return; } } } Debug.Log("Player Has No More Moves to Play!"); GameManager.Instance.GameOver(1); }
/// <summary> /// This function helper for shift some hexagons like gravity.. /// </summary> /// <returns></returns> public async UniTask Gravity() { isGravity = true; Debug.Log("Gravity Progress Started."); foreach (List <SlotController> verticalSlots in seperateSlotControllers) { int emptyCount = 0; int interactedCount = 1; foreach (SlotController slotController in verticalSlots.AsEnumerable().Reverse().ToList()) { if (slotController.GetHexagonController() == null) { emptyCount++; continue; } if (emptyCount == 0) { continue; } HexagonController hexagonController = slotController.GetHexagonController(); SlotController oldSlotController = hexagonController.GetSlotController(); SlotController targetSlotController = GetSlotControllerByCoordinate(new Coordinate(hexagonController.GetCoordinate().x, hexagonController.GetCoordinate().y + emptyCount)); if (targetSlotController == null) { continue; } oldSlotController.SetHexagonController(null); hexagonController.SetSlotController(targetSlotController); ((HexagonView)hexagonController.GetView()).DrawDefaultLayer(true, (float)interactedCount / 10); interactedCount++; } } await UniTask.WaitUntil(() => !DOTween.IsTweening(CommonTypes.HEXAGON_GRAVITY_TWEEN_KEY)); FillEmptySlots(); await UniTask.WaitUntil(() => !DOTween.IsTweening(CommonTypes.HEXAGON_GRAVITY_TWEEN_KEY)); await CheckHexagons(hexagonControllers); await CheckGameOver(); isGravity = false; Debug.Log("Gravity Progress Completed."); }
/// <summary> /// This function helper for create random Hexagon. /// </summary> private HexagonController CreateHexagon(Hexagon hexagon, SlotController slotController, bool isOut = false) { if (hexagon == null) { bool isBonus = Random.Range(0, 10) == 5; int colorId = Random.Range(0, gameSettings.Colors.Length); hexagon = new Hexagon(colorId, gameSettings.Colors[colorId], isBonus); } HexagonController hexagonController = Instantiate(gameSettings.HexagonPrefab, slotController.transform, false); if (isOut) { hexagonController.transform.position = slotController.transform.TransformVector(new Vector3(slotController.transform.localPosition.x, InterfaceManager.Instance.GetOutScreenYAxis(CommonTypes.HEXAGON_HEIGHT), 0)); } hexagonController.Initialize(hexagon, slotController); hexagonControllers.Add(hexagonController); Debug.Log($"Hexagon is Created. ColorId : {hexagonController.GetColorId()} Coordinate : {hexagonController.GetCoordinate()}"); return(hexagonController); }