IEnumerator ProcessRestoreToPrevState(BoardSnapshot snapshot)
    {
        transition = Transition.Restore;

        _nextBlockNumbers.Push(_block.numbers);

        float halfRestoreBoardTime = _restoreBoardTime * 0.5f;

        _board.highestNumber = snapshot.highestNumber;

        for (int i = 0, max = _board.tiles.Length; i < max; ++i)
        {
            NumberedHexaTile tile = _board.tiles[i] as NumberedHexaTile;
            if (tile != null && tile.cell != null)
            {
                tile.cell.LeanCancel();
                tile.cell.LeanScale(Vector3.zero, halfRestoreBoardTime).
                setEaseInBack().
                setOnComplete(() => tile.Reset());
            }
        }

        NumberedHexaCell[] cells = _block.PopCells();
        for (int i = 0, max = cells.Length; i < max; ++i)
        {
            NumberedHexaCell cell = cells[i];

            cell.LeanCancel();
            cell.LeanScale(Vector3.zero, halfRestoreBoardTime).
            setEaseInBack().
            setOnComplete(() => ReleaseHexaCell(cell));
        }

        yield return(new WaitForSeconds(halfRestoreBoardTime + 0.1f));

        for (int i = 0, max = snapshot.boardNumbers.Length; i < max; ++i)
        {
            if (snapshot.boardNumbers[i] > 0)
            {
                NumberedHexaCell cell = GenerateHexaCell() as NumberedHexaCell;
                cell.Setup(snapshot.boardNumbers[i]);

                _board.tiles[i].SetCell(cell);

                cell.LeanCancel();
                cell.LeanScale(Vector3.zero, Vector3.one, halfRestoreBoardTime).
                setEaseOutBack();
            }
        }

        _block.Setup(snapshot.blockNumbers);

        if (onUseItem != null)
        {
            onUseItem(ItemType.UNDO);
        }

        transition = Transition.None;
    }
    void OnDragging(Vector3 screenPosition)
    {
        if (!_interactable || !HasTouchState(State.TouchDrag))
        {
            return;
        }

        if (!_moving)
        {
            _moving            = true;
            _currentDragOffset = _dragOffset;

            HideRotateMarker();

            SoundManager.Instance.PlayUISoundInstance(GameConstants.FX_BLOCK_GRAP);
        }

        Vector3 position = _cachedMainCamera.ScreenToWorldPoint(screenPosition);

        position.y        += _currentDragOffset;
        position.z         = _cellRoot.position.z;
        _cellRoot.position = position;

        List <NumberedHexaTile> hoveredTiles = new List <NumberedHexaTile>();

        for (int i = 0, max = _cells.Count; i < max; ++i)
        {
            RaycastHit2D hit = Physics2D.Raycast(
                _cells[i].transform.position,
                Vector3.zero,
                Mathf.Infinity,
                1 << GameManager.TILE_LAYER
                );

            if (hit.collider != null)
            {
                NumberedHexaTile tile = hit.collider.GetComponent <NumberedHexaTile>();
                if (tile.cell == null)
                {
                    tile.Hovered(_cells[i].number);
                    hoveredTiles.Add(tile);
                }
            }
        }

        for (int i = 0, max = _hoveredTiles.Count; i < max; ++i)
        {
            if (!hoveredTiles.Contains(_hoveredTiles[i]))
            {
                _hoveredTiles[i].Unhovered();
            }
        }

        _hoveredTiles = hoveredTiles;
    }
    IEnumerator ProcessHammer()
    {
        transition = Transition.Hammer;

        _board.ActiveHammerIcons(true);

        yield return(new WaitForSeconds(0.1f));

        NumberedHexaTile targetTile   = null;
        Action <Vector3> onSelectTile = screenPosition => {
            RaycastHit2D hit = Physics2D.Raycast(
                _cachedMainCamera.ScreenToWorldPoint(screenPosition),
                Vector3.zero,
                Mathf.Infinity,
                1 << GameManager.TILE_LAYER
                );

            if (hit.collider != null)
            {
                HexaTile tile = hit.collider.GetComponent <HexaTile>();
                if (tile.cell != null)
                {
                    targetTile = tile as NumberedHexaTile;
                }
            }
        };

        SingleTouchManager.instance.onUntouched += onSelectTile;

        while (targetTile == null)
        {
            yield return(new WaitForEndOfFrame());
        }

        _board.ActiveHammerIcons(false);

        if (onUseItem != null)
        {
            onUseItem(ItemType.BREAK);
        }

        NumberedHexaCell cell = targetTile.cell as NumberedHexaCell;

        cell.gameObject.LeanScale(Vector3.zero, _destroyCellTime)
        .setEaseInBack();

        SoundManager.Instance.PlayUISoundInstance(GameConstants.FX_USE_HAMMER);

        yield return(new WaitForSeconds(_destroyCellTime));

        targetTile.Reset();

        transition = Transition.None;
    }
Exemple #4
0
 public void ActiveHammerIcons(bool active)
 {
     for (int i = 0, max = tiles.Length; i < max; ++i)
     {
         NumberedHexaTile tile = tiles[i] as NumberedHexaTile;
         if (tile != null)
         {
             tile.ActivateHammer(active);
         }
     }
 }
Exemple #5
0
    Stack <CombineInfo> GetCombineTree(NumberedHexaTile seed, NumberedHexaTile[] ignoreTiles)
    {
        Stack <CombineInfo> linkedTiles = new Stack <CombineInfo>();

        if (seed != null && seed.hasCell)
        {
            CombineInfo seedInfo = new CombineInfo(seed, 0);
            linkedTiles.Push(seedInfo);

            BuildCombineTree(seedInfo, ignoreTiles, ref linkedTiles);
        }

        return(linkedTiles);
    }
Exemple #6
0
    int GetCurrentHighestNumberOnBoard()
    {
        int highestNumber = GameConstants.LOWEST_CELL_NUMBER;

        for (int i = 0, max = tiles.Length; i < max; ++i)
        {
            NumberedHexaTile tile = tiles[i] as NumberedHexaTile;
            if (tile != null && tile.number > highestNumber)
            {
                highestNumber = tile.number;
            }
        }

        return(highestNumber);
    }
Exemple #7
0
    public void Clear()
    {
        Debug.Assert(tiles != null);

        for (int i = 0, max = tiles.Length; i < max; ++i)
        {
            NumberedHexaTile tile = tiles[i] as NumberedHexaTile;
            if (tile != null)
            {
                tile.Reset();
            }
        }

        _highestNumber = GameConstants.LOWEST_CELL_NUMBER;

        _combineEffectBuffer.Withdraw();
        _explodeEffectBuffer.Withdraw();
    }
Exemple #8
0
    IEnumerator CombineTypeA(Stack <CombineInfo> linkedTileInfos)
    {
        HexaTile seed = linkedTileInfos.ToArray()[linkedTileInfos.Count - 1].tile;
        Vector3  to   = seed.transform.position + CELL_MOVE_OFFSET;

        while (linkedTileInfos.Count > 1)
        {
            NumberedHexaTile linkedTile = linkedTileInfos.Pop().tile;
            HexaCell         cell       = linkedTile.cell;
            Vector3          from       = cell.transform.position + CELL_MOVE_OFFSET;
            cell.LeanMove(from, to, _cellCombineDuration).
            setEaseInBack().
            setOnComplete(() => linkedTile.Reset());
        }

        SoundManager.Instance.PlayUISoundInstance(GameConstants.FX_CELL_COMBINING);

        yield return(new WaitForSeconds(_cellCombineDuration));
    }
Exemple #9
0
    void BuildCombineTree(CombineInfo seedInfo, NumberedHexaTile[] ignoreTiles, ref Stack <CombineInfo> stack)
    {
        HexaTile[] neighbors = seedInfo.tile.neighbors;
        for (int i = 0, max = neighbors.Length; i < max; ++i)
        {
            NumberedHexaTile neighbor = neighbors[i] as NumberedHexaTile;
            if (neighbor != null &&
                neighbor.hasCell &&
                neighbor.number == seedInfo.tile.number &&
                Array.TrueForAll(stack.ToArray(), st => st.tile != neighbor) &&
                Array.TrueForAll(ignoreTiles, it => it.number != neighbor.number))
            {
                CombineInfo neighborInfo = new CombineInfo(neighbor, seedInfo.depth + 1);

                stack.Push(neighborInfo);

                BuildCombineTree(neighborInfo, ignoreTiles, ref stack);
            }
        }
    }
Exemple #10
0
    public IEnumerator Explode(HexaTile seed, int radius, params int[] ignoreNumbers)
    {
        NumberedHexaTile[] targetTiles = FindExplodeTiles(seed, Mathf.Max(0, radius - 1), ignoreNumbers);

        for (int i = 0, max = targetTiles.Length; i < max; ++i)
        {
            NumberedHexaTile targetTile = targetTiles[i];
            targetTile.Explode(0.5f);

            ParticleSystem explodeEffect = _explodeEffectBuffer.Pop();
            explodeEffect.transform.position =
                targetTile.transform.position + Vector3.back * 0.15f;
            explodeEffect.Play();
        }

        yield return(new WaitForSeconds(0.5f));

        SoundManager.Instance.PlayUISoundInstance(GameConstants.FX_CELL_EXPLODE);

        yield return(new WaitForSeconds(0.2f));
    }
Exemple #11
0
    NumberedHexaTile[] FindExplodeTiles(HexaTile seed, int depth, params int[] ignoreNumbers)
    {
        if (seed == null)
        {
            return(new NumberedHexaTile[0]);
        }

        HexaTile[] neighbors          = seed.neighbors;
        List <NumberedHexaTile> tiles = new List <NumberedHexaTile>();

        if (depth > 0)
        {
            for (int i = 0, max = neighbors.Length; i < max; ++i)
            {
                tiles.AddRange(FindExplodeTiles(neighbors[i], depth - 1, ignoreNumbers));
            }
        }

        NumberedHexaTile tile = seed as NumberedHexaTile;

        if (tile != null &&
            !tiles.Contains(tile) &&
            Array.TrueForAll(ignoreNumbers, n => n != tile.number))
        {
            tiles.Add(tile);
        }

        for (int i = 0, max = neighbors.Length; i < max; ++i)
        {
            NumberedHexaTile neighbor = neighbors[i] as NumberedHexaTile;
            if (neighbor != null &&
                !tiles.Contains(neighbor) &&
                Array.TrueForAll(ignoreNumbers, n => n != neighbor.number))
            {
                tiles.Add(neighbor);
            }
        }

        return(tiles.ToArray());
    }
Exemple #12
0
    IEnumerator CombineTypeC(Stack <CombineInfo> linkedTileInfos)
    {
        int maxDepth = 0;

        CombineInfo[] listInfos = linkedTileInfos.ToArray();
        for (int i = 0, max = listInfos.Length; i < max; ++i)
        {
            if (listInfos[i].depth > maxDepth)
            {
                maxDepth = listInfos[i].depth;
            }
        }

        float durationPerDepth = _cellCombineDuration / maxDepth;

        while (linkedTileInfos.Count > 1)
        {
            CombineInfo      info       = linkedTileInfos.Pop();
            NumberedHexaTile linkedTile = info.tile;
            NumberedHexaTile targetTile = Array.Find(
                linkedTileInfos.ToArray(),
                ci => ci.tile.IsNeighbor(linkedTile)).tile;

            HexaCell cell = linkedTile.cell;
            Vector3  from = cell.transform.position + CELL_MOVE_OFFSET;
            Vector3  to   = targetTile.transform.position + CELL_MOVE_OFFSET;
            cell.LeanMove(from, to, durationPerDepth).
            setEaseInBack().
            setDelay((maxDepth - info.depth) * durationPerDepth).
            setOnComplete(() => linkedTile.Reset());
        }

        for (int i = 0; i < maxDepth; ++i)
        {
            yield return(new WaitForSeconds(durationPerDepth));

            SoundManager.Instance.PlayUISoundInstance(GameConstants.FX_CELL_COMBINING);
        }
    }
Exemple #13
0
    IEnumerator CombineTypeB(Stack <CombineInfo> linkedTileInfos)
    {
        float durationPerCell = _cellCombineDuration / linkedTileInfos.Count;

        while (linkedTileInfos.Count > 1)
        {
            NumberedHexaTile linkedTile = linkedTileInfos.Pop().tile;
            NumberedHexaTile targetTile = Array.Find(
                linkedTileInfos.ToArray(),
                ci => ci.tile.IsNeighbor(linkedTile)).tile;

            HexaCell cell = linkedTile.cell;
            Vector3  from = cell.transform.position + CELL_MOVE_OFFSET;
            Vector3  to   = targetTile.transform.position + CELL_MOVE_OFFSET;
            cell.LeanMove(from, to, durationPerCell).
            setEaseInBack().
            setOnComplete(() => {
                SoundManager.Instance.PlayUISoundInstance(GameConstants.FX_CELL_COMBINING);
                linkedTile.Reset();
            });

            yield return(new WaitForSeconds(durationPerCell));
        }
    }
Exemple #14
0
    IEnumerator ProcessCombineCell(NumberedHexaTile seed, NumberedHexaTile[] ignoreTiles)
    {
        if (seed == null || !seed.hasCell)
        {
            yield break;
        }

        Stack <CombineInfo> linkedTiles = GetCombineTree(seed, ignoreTiles);

        if (linkedTiles.Count < _minCombineCellSize)
        {
            yield break;
        }

        _lastCombinedNumber   = seed.number;
        _lastCombinedPosition = seed.transform.position;

        _score += (int)Mathf.Pow(2, seed.number) * linkedTiles.Count;

        Combine combine = _combines[_combineType];

        yield return(combine(linkedTiles));

        if (onCombineCells != null)
        {
            onCombineCells(_lastCombinedNumber, linkedTiles.Count, _combineCount);
        }

        if (_combineCount > 0)
        {
            int index = Mathf.Min(_combineCount, GameConstants.FX_COMBO.Length) - 1;
            SoundManager.Instance.PlayUISoundInstance(GameConstants.FX_COMBO[index]);
        }

        seed.cell.LeanScale(Vector3.zero, _cellCombineInterval * 0.5f).
        setEaseInBack();

        yield return(new WaitForSeconds(_cellCombineInterval * 0.5f));

        CombineEffect combineEffect = _combineEffectBuffer.Pop();

        combineEffect.transform.position = seed.transform.position + Vector3.back * 0.1f;
        combineEffect.SetColor(GameManager.instance.theme.GetCellSprite(seed.number).color);

        seed.Increase();

        seed.cell.LeanScale(Vector3.one, _cellCombineInterval * 0.5f).
        setEaseOutBack();

        yield return(new WaitForSeconds(_cellCombineInterval * 0.5f));

        ++_combineCount;

        if (seed.number <= GameConstants.HIGHEST_CELL_NUMBER)
        {
            if (seed.number > _highestNumber)
            {
                _highestNumber = seed.number;
            }

            SoundManager.Instance.PlayUISoundInstance(
                (seed.number < GameConstants.HIGHEST_CELL_NUMBER) ?
                GameConstants.FX_CELL_COMBINED :
                GameConstants.FX_CELL_COMBINED_LAST_NUMBER
                );

            yield return(ProcessCombineCell(seed, ignoreTiles));
        }
        else
        {
            SoundManager.Instance.PlayUISoundInstance(
                GameConstants.FX_CELL_COMBINED_LAST_NUMBER
                );

            yield return(new WaitForSeconds(0.25f));

            yield return(Explode(seed, 1));

            if (onReachedLastNumber != null)
            {
                onReachedLastNumber();
            }

            if (_useRemoveHighestNumber)
            {
                _highestNumber = GetCurrentHighestNumberOnBoard();
            }
        }
    }
Exemple #15
0
 public CombineInfo(NumberedHexaTile tile, int depth)
 {
     this.tile  = tile;
     this.depth = depth;
 }