void UpdateSwapResults(TileSwapType swapType, TileController firstTile = null, TileController secondTile = null)
    {
        swapResults.SwapType = swapType;
        List <TileController> tiles = swapResults.TilesInvolved;

        tiles.Clear();

        if (firstTile == null)
        {
            tiles.Add(firstTileClicked);
        }
        else
        {
            tiles.Add(firstTile);
        }

        if (secondTile == null)
        {
            tiles.Add(secondTileClicked);
        }
        else
        {
            tiles.Add(secondTile);
        }
    }
    void AlertSwapListeners(TileSwapType swapType)
    {
        // Whether it's Fungus blocks or custom code.
        AnyPhysicalSwapMade.Invoke(this, swapResults);

        if (swapType != TileSwapType.freeAdjacent &&
            swapType != TileSwapType.gravityControl) // Don't let the Fungus system count this as a swap
        {
            SwapMadeEvent.Invoke(swapResults);
        }
    }
    protected virtual void ConsiderSwappingTiles()
    {
        TileSwapType swapType = CanSwapTiles(firstTileClicked, secondTileClicked);

        if (swapType != TileSwapType.none) // We have a valid swap attempt here!
        {
            SwapEnabled = false;           // Will be reenabled once the swap is done
            SwapTask(firstTileClicked, secondTileClicked, swapType);
            //StartCoroutine(SwapCoroutine(firstTileClicked, secondTileClicked, swapType));
        }
        else
        {
            UnregisterTiles();
        }
    }
    protected virtual async SysTask SwapTask(TileController firstTile, TileController secondTile, TileSwapType swapType)
    {
        switch (swapType)
        {
        case TileSwapType.adjacent:
            await AdjacentSwapTask(firstTile, secondTile);

            break;

        case TileSwapType.freeAdjacent:
            await AdjacentSwapTask(firstTile, secondTile);

            break;

        case TileSwapType.gravityControl:
            await AdjacentSwapTask(firstTile, secondTile);

            break;

        case TileSwapType.knight:
            await KnightSwapTask(firstTile, secondTile);

            break;

        default:
            Debug.LogError("TileSwapType " + swapType + " not accounted for!");
            break;
        }

        UpdateSwapResults(swapType);
        UnregisterTiles();
        AlertSwapListeners(swapType);
        SwapEnabled = true;
    }