protected override void Execute(List <GameEntity> entities)
        {
            var newBubble = entities.SingleEntity();

            newBubble.isNewBubble = false;

            List <GameEntity> neighboursWithSameNumber = new List <GameEntity>();

            neighboursWithSameNumber.Add(newBubble);
            newBubble.isMerge = true;

            var bubbleNumber = newBubble.bubbleNumber.Number;

            CollectNeighboursWithSameNumber(newBubble, bubbleNumber, neighboursWithSameNumber);

            if (neighboursWithSameNumber.Count > 1)
            {
                var mergeNumber         = BoardLogic.GetMergeNumber(bubbleNumber, neighboursWithSameNumber.Count);
                var mergeBubble         = GetMergeBubble(neighboursWithSameNumber, mergeNumber);
                var mergeBubblePosition = mergeBubble.position.value;
                MergeBubbles(neighboursWithSameNumber, mergeNumber, mergeBubblePosition);

                if (mergeNumber > 2048)
                {
                    ExplodeAtPosition(mergeBubblePosition);
                }
                else
                {
                    contexts.game.CreateBoardBubble(mergeNumber, mergeBubblePosition.x, mergeBubblePosition.y);
                }

                var mergeTime   = contexts.config.gameConfig.value.MergeTimeInSeconds;
                var timerEntity = contexts.timer.SetMergeProgress(mergeBubblePosition, mergeNumber, mergeTime);
                timerEntity.AddTimer(mergeTime);
                timerEntity.isTimerRunning = true;
                contexts.game.isBoardCleaningHangingClusters = true;
            }
            else
            {
                newBubble.isMerge            = false;
                contexts.game.isMoveComplete = true;
            }
        }