Beispiel #1
0
    //------------------------------------------Protected Functions------------------------------------------

    protected BlockPuzzleTileInfo[] GetTilePositions()
    {
        BlockPuzzleTileInfo[] tiles = new BlockPuzzleTileInfo[TileCountX * TileCountY];

        Vector3 startPoint = transform.position - (new Vector3(GridDims.x, 0f, GridDims.y) / 2f) + (new Vector3(pTileDims.x, 0f, pTileDims.y) / 2f);

        for (int i = 0; i < TileCountX; i++)
        {
            for (int j = 0; j < TileCountY; j++)
            {
                var tilePos = startPoint + new Vector3(pTileDims.x * i, 0f, pTileDims.y * j);
                tiles[i * TileCountY + j].Pos       = tilePos;
                tiles[i * TileCountY + j].TileState = BlockPuzzleTileState.Valid;

                RaycastHit hit;
                if (Physics.BoxCast(tilePos + Vector3.up * 10f, new Vector3(pTileDims.x, 1f, pTileDims.y) * 0.4f, Vector3.down, out hit, Quaternion.identity, 9.5f))
                {
                    tiles[i * TileCountY + j].TileState = BlockPuzzleTileState.Invalid;
                    if (hit.collider.tag == "Player")
                    {
                        tiles[i * TileCountY + j].TileState = BlockPuzzleTileState.Player;
                    }
                }
            }
        }

        return(tiles);
    }
Beispiel #2
0
    public bool BlockMoveIsValid(Vector3 blockPos, BlockDirection dir, out BlockPuzzleTileInfo tileInfo)
    {
        tileInfo = new BlockPuzzleTileInfo();
        var tiles = GetTilePositions();

        BlockPuzzleTileInfo newTile = new BlockPuzzleTileInfo();

        newTile.Pos       = Vector3.one * float.PositiveInfinity;
        newTile.TileState = BlockPuzzleTileState.Invalid;

        float alignThreshold = 0.1f;

        foreach (var tile in tiles)
        {
            bool tileAlignsCorrectly = false;

            switch (dir)
            {
            case BlockDirection.Forward:
                if (tile.Pos.z > blockPos.z && Mathf.Abs(tile.Pos.x - blockPos.x) < alignThreshold)
                {
                    tileAlignsCorrectly = true;
                }
                break;

            case BlockDirection.Right:
                if (tile.Pos.x > blockPos.x && Mathf.Abs(tile.Pos.z - blockPos.z) < alignThreshold)
                {
                    tileAlignsCorrectly = true;
                }
                break;

            case BlockDirection.Backward:
                if (tile.Pos.z < blockPos.z && Mathf.Abs(tile.Pos.x - blockPos.x) < alignThreshold)
                {
                    tileAlignsCorrectly = true;
                }
                break;

            case BlockDirection.Left:
                if (tile.Pos.x < blockPos.x && Mathf.Abs(tile.Pos.z - blockPos.z) < alignThreshold)
                {
                    tileAlignsCorrectly = true;
                }
                break;

            case BlockDirection.Null:
                return(false);
            }

            if (tileAlignsCorrectly && Vector3.Distance(blockPos, tile.Pos) < Vector3.Distance(blockPos, newTile.Pos))
            {
                newTile = tile;
            }
        }

        tileInfo = newTile;

        // Checking that if Tia is pushed back she wont be forced into an invalid tile.
        if (tileInfo.TileState == BlockPuzzleTileState.Player)
        {
            BlockPuzzleTileInfo tempTile;
            bool validMove = BlockMoveIsValid(newTile.Pos, dir, out tempTile);
            bool onGrid    = GridContainsPoint(tileInfo.Pos + new Vector3(DirectionToVector(dir).x *pTileDims.x, 0f, DirectionToVector(dir).z *pTileDims.y));
            return(validMove || !onGrid);
        }

        if (tileInfo.TileState == BlockPuzzleTileState.Valid)
        {
            return(true);
        }
        return(false);
    }