Example #1
0
    private void MatchingProcess()
    {
        Block moveBlock   = startHexaBlockUnit.GetBlock();
        Block targetBlock = targetHexaBlockUnit.GetBlock();

        mapModel.SwapBlocks(moveBlock, targetBlock);

        SwapDirectionType swapDirectionType = GetSwapBlockType();
        bool isBoom = matchingModel.CheckUFOBlocks(moveBlock, targetBlock);

        isBoom |= matchingModel.CheckNormalMatching(moveBlock, swapDirectionType);
        isBoom |= matchingModel.CheckNormalMatching(targetBlock, swapDirectionType);

        if (isBoom)
        {
            moveCount++;
            stageTopMenuUnit.RefreshMoveCount(mapModel.MaxMoveCount - moveCount);

            StartCoroutine(BoomBlockProcess());
        }
        else
        {
            mapModel.SwapBlocks(moveBlock, targetBlock);
            PlaySwapBlockProcess(isRevert: true);
        }
    }
Example #2
0
    private void SetFirecrackerBoom(int y, int x, int directionK, SwapDirectionType swapDirectionType)
    {
        if (mapModel.CheckRangeOver(y, x))
        {
            return;
        }
        if (mapModel.CheckFixedBlock(y, x))
        {
            return;
        }
        if (!mapModel.CheckShowBlock(y, x))
        {
            return;
        }
        if (mapModel.CheckEmptyBlock(y, x))
        {
            return;
        }
        if (!mapModel.CompareBlockType(y, x, BlockType.UFO) &&
            !mapModel.CheckQuestBlock(y, x))
        {
            mapModel.SetBoomFlag(y, x, isBoom: true);
        }

        int        directionIndex = (x % 2);
        Vector2Int direction      = mapModel.GetDirection(directionIndex, (int)swapDirectionType, directionK);
        int        nextY          = y + direction.y;
        int        nextX          = x + direction.x;

        SetFirecrackerBoom(nextY, nextX, directionK, swapDirectionType);
    }
Example #3
0
    public bool CheckFirecrackerBoom()
    {
        bool isBoom = false;

        for (int y = (mapModel.LengthY - 1); y >= 0; --y)
        {
            for (int x = 0; x < mapModel.LengthX; ++x)
            {
                Block             block             = mapModel.GetBlock(y, x);
                SwapDirectionType swapDirectionType = SwapDirectionType.None;
                if (block.ItemType == ItemType.Firecracker_Diagonal_Left)
                {
                    swapDirectionType = SwapDirectionType.Left;
                }
                else if (block.ItemType == ItemType.Firecracker_Diagonal_Right)
                {
                    swapDirectionType = SwapDirectionType.Right;
                }
                else if (block.ItemType == ItemType.Firecracker_UpDown)
                {
                    swapDirectionType = SwapDirectionType.UpDown;
                }
                if (swapDirectionType == SwapDirectionType.None)
                {
                    continue;
                }

                if (!block.IsBoom)
                {
                    continue;
                }

                for (int directionK = 0; directionK < mapModel.DirectionLengthX; ++directionK)
                {
                    SetFirecrackerBoom(block.Y, block.X, directionK, swapDirectionType);
                }

                isBoom = true;
            }
        }

        return(isBoom);
    }
Example #4
0
    public bool CheckNormalMatching(Block moveBlock, SwapDirectionType swapDirectionType)
    {
        bool isBoom = false;

        if (moveBlock.BlockType > BlockType.Red)
        {
            return(false);
        }

        if (!moveBlock.IsShow)
        {
            return(false);
        }

        if (moveBlock.IsBoom)
        {
            return(false);
        }

        int directionIndex = (moveBlock.X % 2);

        for (int j = 0; j < mapModel.DirectionLengthY; ++j)
        {
            Queue <Block> blocks = new Queue <Block>();
            blocks.Enqueue(moveBlock);

            for (int k = 0; k < mapModel.DirectionLengthX; ++k)
            {
                Vector2Int direction = mapModel.GetDirection(directionIndex, j, k);
                int        nextY     = moveBlock.Y + direction.y;
                int        nextX     = moveBlock.X + direction.x;
                DFSMatchingBlock(nextY, nextX, j, k, blocks);
            }

            if (blocks.Count >= MATCH_COUNT_MIN)
            {
                if (blocks.Count >= MATCH_COUNT_UFO)
                {
                    blocks.Dequeue();
                    moveBlock.SetBlockType(BlockType.UFO);
                    moveBlock.SetBoomFlag(false);
                }
                else if (blocks.Count >= MATCH_COUNT_FIRECRACKER)
                {
                    blocks.Dequeue();
                    Block nextBlock = blocks.Peek();

                    if (swapDirectionType == SwapDirectionType.None)
                    {
                        swapDirectionType = GetSwapDirectionType(moveBlock, nextBlock);
                    }

                    if (swapDirectionType == SwapDirectionType.Left)
                    {
                        moveBlock.SetItemType(ItemType.Firecracker_Diagonal_Right);
                    }
                    else if (swapDirectionType == SwapDirectionType.Right)
                    {
                        moveBlock.SetItemType(ItemType.Firecracker_Diagonal_Left);
                    }
                    else
                    {
                        moveBlock.SetItemType(ItemType.Firecracker_UpDown);
                    }
                    moveBlock.SetBoomFlag(false);
                }

                while (blocks.Count > 0)
                {
                    Block boomBlock = blocks.Dequeue();
                    boomBlock.SetBoomFlag(true);
                }

                isBoom = true;
            }
        }

        return(isBoom);
    }