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; } }