示例#1
0
    void Update()
    {
        pieceMovementScript.setIsGrounded(false);
        Vector3 down  = transform.TransformDirection(Vector3.down);
        Vector3 up    = transform.TransformDirection(Vector3.up);
        Vector3 left  = transform.TransformDirection(Vector3.left);
        Vector3 right = transform.TransformDirection(Vector3.right);

        if (oPieceTransformHandle.transform.rotation.eulerAngles.z == 0)
        {
            orientation = 1;
        }
        if (oPieceTransformHandle.transform.rotation.eulerAngles.z == 270)
        {
            orientation = 2;
        }
        if (oPieceTransformHandle.transform.rotation.eulerAngles.z == 180)
        {
            orientation = 3;
        }
        if (oPieceTransformHandle.transform.rotation.eulerAngles.z == 90)
        {
            orientation = 4;
        }

        PieceMovement.distanceDown = 90;

        // Collision Checks
        for (int i = 0; i < 4; i++)
        {
            bool[]     temporary   = new bool[4];
            GameObject currentCube = null;
            switch (i)
            {
            case 0:
                currentCube = oPieceTop;
                break;

            case 1:
                currentCube = oPieceBottom;
                break;

            case 2:
                currentCube = oPieceLeft;
                break;

            case 3:
                currentCube = oPieceRight;
                break;

            default:
                Debug.Log("Error with switch #1 of a CollisionScript!");
                break;
            }

            #region Shortest Distance Down

            RaycastHit hit;
            float      distance = 90;
            if (Physics.Raycast(currentCube.transform.position, down, out hit, layerMask))
            {
                distance = hit.distance;
            }
            PieceMovement.distanceDown = Mathf.Min(PieceMovement.distanceDown, distance);

            #endregion

            // Note!
            // All collisions won't take into account the cubes of the current piece. IE A T-Piece Top won't care about a T-Piece Bottom being below it.
            // Ground checking is taken care of in the Basic RS Raycast Methodology
            // The SRS Raycast Methodology only takes into account special cases for their respective orientations

            #region Basic RS Raycast Methodology

            if (Physics.Raycast(currentCube.transform.position, up, 1, layerMask))
            {
                temporary[0] = true;
                Debug.DrawRay(currentCube.transform.position, up * 1, Color.blue);
            }
            else
            {
                temporary[0] = false;
                Debug.DrawRay(currentCube.transform.position, up * 1, Color.white);
            }
            if (Physics.Raycast(currentCube.transform.position, down, 1, layerMask))
            {
                temporary[1] = true;
                Debug.DrawRay(currentCube.transform.position, down * 1, Color.blue);
                // Here's where ground checking is easily done!
                pieceMovementScript.setIsGrounded(true);
            }
            else
            {
                temporary[1] = false;
                Debug.DrawRay(currentCube.transform.position, down * 1, Color.white);
            }
            if (Physics.Raycast(currentCube.transform.position, left, 1, layerMask))
            {
                temporary[2] = true;
                Debug.DrawRay(currentCube.transform.position, left * 1, Color.blue);
            }
            else
            {
                temporary[2] = false;
                Debug.DrawRay(currentCube.transform.position, left * 1, Color.white);
            }
            if (Physics.Raycast(currentCube.transform.position, right, 1, layerMask))
            {
                temporary[3] = true;
                Debug.DrawRay(currentCube.transform.position, right * 1, Color.blue);
            }
            else
            {
                temporary[3] = false;
                Debug.DrawRay(currentCube.transform.position, right * 1, Color.white);
            }
            switch (i)
            {
            case 0:
                oPieceTopBools = temporary;
                break;

            case 1:
                oPieceBottomBools = temporary;
                break;

            case 2:
                oPieceLeftBools = temporary;
                break;

            case 3:
                oPieceRightBools = temporary;
                break;

            default:
                Debug.Log("Error with switch #2 of a CollisionScript!");
                break;
            }

            #endregion
        }

        // The OPiece sucks and is boring and trash and stupid and and AND AND!

        switch (orientation)
        {
        case 1:
            resetMovementBools();
            //// Movement test
            if (oPieceLeftBools[2] || oPieceTopBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (oPieceRightBools[3] || oPieceBottomBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }
            break;

        case 2:
            resetMovementBools();
            //// Movement test
            if (oPieceBottomBools[2] || oPieceLeftBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (oPieceRightBools[3] || oPieceTopBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }
            break;

        case 3:
            resetMovementBools();
            //// Movement tests
            if (oPieceRightBools[2] || oPieceBottomBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (oPieceLeftBools[3] || oPieceTopBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }

            break;

        case 4:
            resetMovementBools();
            //// Movement Tests
            if (oPieceRightBools[2] || oPieceTopBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (oPieceBottomBools[3] || oPieceLeftBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }
            break;

        default:
            resetMovementBools();
            break;
        }
    }
    void Update()
    {
        pieceMovementScript.setIsGrounded(false);
        Vector3 down  = transform.TransformDirection(Vector3.down);
        Vector3 up    = transform.TransformDirection(Vector3.up);
        Vector3 left  = transform.TransformDirection(Vector3.left);
        Vector3 right = transform.TransformDirection(Vector3.right);

        if (jPieceTransformHandle.transform.rotation.eulerAngles.z == 0)
        {
            orientation = 1;
        }
        if (jPieceTransformHandle.transform.rotation.eulerAngles.z == 270)
        {
            orientation = 2;
        }
        if (jPieceTransformHandle.transform.rotation.eulerAngles.z == 180)
        {
            orientation = 3;
        }
        if (jPieceTransformHandle.transform.rotation.eulerAngles.z == 90)
        {
            orientation = 4;
        }

        PieceMovement.distanceDown = 90;

        // Collision Checks
        for (int i = 0; i < 4; i++)
        {
            bool[]     temporary   = new bool[4];
            GameObject currentCube = null;
            switch (i)
            {
            case 0:
                currentCube = jPieceTop;
                break;

            case 1:
                currentCube = jPieceBottom;
                break;

            case 2:
                currentCube = jPieceLeft;
                break;

            case 3:
                currentCube = jPieceRight;
                break;

            default:
                Debug.Log("Error with switch #1 of a CollisionScript!");
                break;
            }

            #region Shortest Distance Down

            RaycastHit hit;
            float      distance = 90;
            if (Physics.Raycast(currentCube.transform.position, down, out hit, layerMask))
            {
                distance = hit.distance;
            }
            PieceMovement.distanceDown = Mathf.Min(PieceMovement.distanceDown, distance);

            #endregion

            // Note!
            // All collisions won't take into account the cubes of the current piece. IE A T-Piece Top won't care about a T-Piece Bottom being below it.
            // Ground checking is taken care of in the Basic RS Raycast Methodology
            // The SRS Raycast Methodology only takes into account special cases for their respective orientations

            #region Basic RS Raycast Methodology

            if (Physics.Raycast(currentCube.transform.position, up, 1, layerMask))
            {
                temporary[0] = true;
                Debug.DrawRay(currentCube.transform.position, up * 1, Color.blue);
            }
            else
            {
                temporary[0] = false;
                Debug.DrawRay(currentCube.transform.position, up * 1, Color.white);
            }
            if (Physics.Raycast(currentCube.transform.position, down, 1, layerMask))
            {
                temporary[1] = true;
                Debug.DrawRay(currentCube.transform.position, down * 1, Color.blue);
                // Here's where ground checking is easily done!
                pieceMovementScript.setIsGrounded(true);
            }
            else
            {
                temporary[1] = false;
                Debug.DrawRay(currentCube.transform.position, down * 1, Color.white);
            }
            if (Physics.Raycast(currentCube.transform.position, left, 1, layerMask))
            {
                temporary[2] = true;
                Debug.DrawRay(currentCube.transform.position, left * 1, Color.blue);
            }
            else
            {
                temporary[2] = false;
                Debug.DrawRay(currentCube.transform.position, left * 1, Color.white);
            }
            if (Physics.Raycast(currentCube.transform.position, right, 1, layerMask))
            {
                temporary[3] = true;
                Debug.DrawRay(currentCube.transform.position, right * 1, Color.blue);
            }
            else
            {
                temporary[3] = false;
                Debug.DrawRay(currentCube.transform.position, right * 1, Color.white);
            }
            switch (i)
            {
            case 0:
                jPieceTopBools = temporary;
                break;

            case 1:
                jPieceBottomBools = temporary;
                break;

            case 2:
                jPieceLeftBools = temporary;
                break;

            case 3:
                jPieceRightBools = temporary;
                break;

            default:
                Debug.Log("Error with switch #2 of a CollisionScript!");
                break;
            }

            #endregion
        }

        // Warning: This is SRS Raycast Methodoloy is extremely confusing if you're not Lucas
        #region SRS Raycast Methodology

        //// Orientation 1
        bool leftUp2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), up * 2, Color.green);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), up, 2, layerMask))
        {
            leftUp2 = true;
        }
        bool leftDown3 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), down * 3, Color.green);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), down, 3, layerMask))
        {
            leftDown3 = true;
        }
        bool leftDown2Right1 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y - 2, jPieceLeft.transform.position.z), right * 1, Color.green);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y - 2, jPieceLeft.transform.position.z), right, 1, layerMask))
        {
            leftDown2Right1 = true;
        }
        bool leftDown2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), down * 2, Color.green);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), down, 2, layerMask))
        {
            leftDown2 = true;
        }
        bool bottomDown1Down2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y - 1, jPieceBottom.transform.position.z), down * 2, Color.green);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y - 1, jPieceBottom.transform.position.z), down, 2, layerMask))
        {
            bottomDown1Down2 = true;
        }
        bool bottomDown2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y, jPieceBottom.transform.position.z), down * 2, Color.green);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y, jPieceBottom.transform.position.z), down, 2, layerMask))
        {
            bottomDown2 = true;
        }
        bool rightDown2Down2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y - 2, jPieceRight.transform.position.z), down * 2, Color.green);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y - 2, jPieceRight.transform.position.z), down, 2, layerMask))
        {
            rightDown2Down2 = true;
        }
        bool rightDown2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y, jPieceRight.transform.position.z), down * 2, Color.green);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y, jPieceRight.transform.position.z), down, 2, layerMask))
        {
            rightDown2 = true;
        }
        bool leftDown2Down2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y - 2, jPieceLeft.transform.position.z), down * 2, Color.green);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y - 2, jPieceLeft.transform.position.z), down, 2, layerMask))
        {
            leftDown2Down2 = true;
        }
        bool bottomDown3 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y, jPieceBottom.transform.position.z), down * 3, Color.green);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y, jPieceBottom.transform.position.z), down, 3, layerMask))
        {
            bottomDown3 = true;
        }
        bool topUp1Right2 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x - 1, jPieceTop.transform.position.y + 1, jPieceTop.transform.position.z), right * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x - 1, jPieceTop.transform.position.y + 1, jPieceTop.transform.position.z), right, 2, layerMask))
        {
            topUp1Right2 = true;
        }
        // Reverse Orientation 1
        bool rightUp2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y, jPieceRight.transform.position.z), up * 2, Color.green);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y, jPieceRight.transform.position.z), up, 2, layerMask))
        {
            rightUp2 = true;
        }
        bool rightDown3 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y, jPieceRight.transform.position.z), down * 3, Color.green);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y, jPieceRight.transform.position.z), down, 3, layerMask))
        {
            rightDown3 = true;
        }
        bool rightDown2Left1 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y - 2, jPieceRight.transform.position.z), left * 1, Color.green);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y - 2, jPieceRight.transform.position.z), left, 1, layerMask))
        {
            rightDown2Left1 = true;
        }
        bool rightDown3Left2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y - 3, jPieceRight.transform.position.z), left * 2, Color.green);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y - 3, jPieceRight.transform.position.z), left, 2, layerMask))
        {
            rightDown3Left2 = true;
        }
        bool bottomDown3Left2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x + 1, jPieceBottom.transform.position.y - 3, jPieceBottom.transform.position.z), left * 2, Color.green);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x + 1, jPieceBottom.transform.position.y - 3, jPieceBottom.transform.position.z), left, 2, layerMask))
        {
            bottomDown3Left2 = true;
        }
        //// Orientation 2
        bool rightRight2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y, jPieceRight.transform.position.z), right * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y, jPieceRight.transform.position.z), right, 2, layerMask))
        {
            rightRight2 = true;
        }
        bool topDown2 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x, jPieceTop.transform.position.y, jPieceTop.transform.position.z), down * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x, jPieceTop.transform.position.y, jPieceTop.transform.position.z), down, 2, layerMask))
        {
            topDown2 = true;
        }
        bool top3 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x - 2, jPieceLeft.transform.position.y + 1, jPieceLeft.transform.position.z), right * 3, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x - 2, jPieceLeft.transform.position.y + 1, jPieceLeft.transform.position.z), right, 3, layerMask))
        {
            top3 = true;
        }
        bool topRight13 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x - 1, jPieceLeft.transform.position.y + 1, jPieceLeft.transform.position.z), right * 3, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x - 1, jPieceLeft.transform.position.y + 1, jPieceLeft.transform.position.z), right, 3, layerMask))
        {
            topRight13 = true;
        }
        bool topUp2Right2 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x - 1, jPieceTop.transform.position.y + 2, jPieceTop.transform.position.z), right * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x - 1, jPieceTop.transform.position.y + 2, jPieceTop.transform.position.z), right, 2, layerMask))
        {
            topUp2Right2 = true;
        }
        bool leftUp1Right2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x - 1, jPieceLeft.transform.position.y + 1, jPieceLeft.transform.position.z), right * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x - 1, jPieceLeft.transform.position.y + 1, jPieceLeft.transform.position.z), right, 2, layerMask))
        {
            leftUp1Right2 = true;
        }
        bool rightDown1Left2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y - 1, jPieceRight.transform.position.z), left * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y - 1, jPieceRight.transform.position.z), left, 2, layerMask))
        {
            rightDown1Left2 = true;
        }
        bool topDown2Right2 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x - 1, jPieceTop.transform.position.y - 2, jPieceTop.transform.position.z), right * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x - 1, jPieceTop.transform.position.y - 2, jPieceTop.transform.position.z), right, 2, layerMask))
        {
            topDown2Right2 = true;
        }
        bool rightRight2Down2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x + 2, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), down * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x + 2, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), down, 2, layerMask))
        {
            rightRight2Down2 = true;
        }
        bool bottomRight2Down2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x + 2, jPieceBottom.transform.position.y + 1, jPieceBottom.transform.position.z), down * 2, Color.cyan);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x + 2, jPieceBottom.transform.position.y + 1, jPieceBottom.transform.position.z), down, 2, layerMask))
        {
            bottomRight2Down2 = true;
        }
        // Reverse Orientation 2
        bool leftRight2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), right * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), right, 2, layerMask))
        {
            leftRight2 = true;
        }
        bool topUp2 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x, jPieceTop.transform.position.y, jPieceTop.transform.position.z), up * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x, jPieceTop.transform.position.y, jPieceTop.transform.position.z), up, 2, layerMask))
        {
            topUp2 = true;
        }
        bool topUp2Up1 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x, jPieceTop.transform.position.y + 2, jPieceTop.transform.position.z), up * 1, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x, jPieceTop.transform.position.y + 2, jPieceTop.transform.position.z), up, 1, layerMask))
        {
            topUp2Up1 = true;
        }
        bool leftUp1Left2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x + 1, jPieceLeft.transform.position.y + 1, jPieceLeft.transform.position.z), left * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x + 1, jPieceLeft.transform.position.y + 1, jPieceLeft.transform.position.z), left, 2, layerMask))
        {
            leftUp1Left2 = true;
        }
        bool leftUp2Right2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x - 1, jPieceLeft.transform.position.y + 2, jPieceLeft.transform.position.z), right * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x - 1, jPieceLeft.transform.position.y + 2, jPieceLeft.transform.position.z), right, 2, layerMask))
        {
            leftUp2Right2 = true;
        }
        bool leftUp2Left2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x + 1, jPieceLeft.transform.position.y + 2, jPieceLeft.transform.position.z), left * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x + 1, jPieceLeft.transform.position.y + 2, jPieceLeft.transform.position.z), left, 2, layerMask))
        {
            leftUp2Left2 = true;
        }
        bool bottomUp3Left2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x + 1, jPieceBottom.transform.position.y + 3, jPieceBottom.transform.position.z), left * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x + 1, jPieceBottom.transform.position.y + 3, jPieceBottom.transform.position.z), left, 2, layerMask))
        {
            bottomUp3Left2 = true;
        }
        bool leftLeft1Up1Up2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x - 1, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), up * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x - 1, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), up, 2, layerMask))
        {
            leftLeft1Up1Up2 = true;
        }
        bool bottomRight2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y, jPieceBottom.transform.position.z), right * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y, jPieceBottom.transform.position.z), right, 2, layerMask))
        {
            bottomRight2 = true;
        }
        //// Orientation 3
        bool bottomDown2Right1 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y - 2, jPieceBottom.transform.position.z), right * 1, Color.cyan);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y - 2, jPieceBottom.transform.position.z), right, 1, layerMask))
        {
            bottomDown2Right1 = true;
        }
        bool leftDown1Down2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y - 1, jPieceLeft.transform.position.z), down * 2, Color.cyan);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y - 1, jPieceLeft.transform.position.z), down, 2, layerMask))
        {
            leftDown1Down2 = true;
        }
        bool bottomUp2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y, jPieceBottom.transform.position.z), up * 2, Color.cyan);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y, jPieceBottom.transform.position.z), up, 2, layerMask))
        {
            bottomUp2 = true;
        }
        bool rightDown1Down2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y - 1, jPieceRight.transform.position.z), down * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y - 1, jPieceRight.transform.position.z), down, 2, layerMask))
        {
            rightDown1Down2 = true;
        }
        bool leftUp1Up2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y + 1, jPieceLeft.transform.position.z), up * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y + 1, jPieceLeft.transform.position.z), up, 2, layerMask))
        {
            leftUp1Up2 = true;
        }
        bool leftDown3Left2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x + 1, jPieceLeft.transform.position.y - 3, jPieceLeft.transform.position.z), left * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x + 1, jPieceLeft.transform.position.y - 3, jPieceLeft.transform.position.z), left, 2, layerMask))
        {
            leftDown3Left2 = true;
        }
        // Reverse Orientation 3
        bool bottomDown2Left1 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y - 2, jPieceBottom.transform.position.z), left * 1, Color.cyan);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y - 2, jPieceBottom.transform.position.z), left, 1, layerMask))
        {
            bottomDown2Left1 = true;
        }
        bool rightUp2Up2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), up * 2, Color.magenta);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), up, 2, layerMask))
        {
            rightUp2Up2 = true;
        }
        //// Orientation 4
        bool leftLeft2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), left * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x, jPieceLeft.transform.position.y, jPieceLeft.transform.position.z), left, 2, layerMask))
        {
            leftLeft2 = true;
        }
        bool rightTop3 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x + 2, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), left * 3, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x + 2, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), left, 3, layerMask))
        {
            rightTop3 = true;
        }
        bool rightTopLeft13 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), left * 3, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), left, 3, layerMask))
        {
            rightTopLeft13 = true;
        }
        bool rightUp1Left2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), left * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), left, 2, layerMask))
        {
            rightUp1Left2 = true;
        }
        bool rightUp2Right2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x - 1, jPieceRight.transform.position.y + 2, jPieceRight.transform.position.z), right * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x - 1, jPieceRight.transform.position.y + 2, jPieceRight.transform.position.z), right, 2, layerMask))
        {
            rightUp2Right2 = true;
        }
        bool bottomUp2Left2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x + 1, jPieceBottom.transform.position.y + 2, jPieceBottom.transform.position.z), left * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x + 1, jPieceBottom.transform.position.y + 2, jPieceBottom.transform.position.z), left, 2, layerMask))
        {
            bottomUp2Left2 = true;
        }
        bool bottomUp3Right2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x - 1, jPieceBottom.transform.position.y + 3, jPieceBottom.transform.position.z), right * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x - 1, jPieceBottom.transform.position.y + 3, jPieceBottom.transform.position.z), right, 2, layerMask))
        {
            bottomUp3Right2 = true;
        }
        bool rightUp1Left3 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), left * 3, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), left, 3, layerMask))
        {
            rightUp1Left3 = true;
        }
        bool rightLeft2Up1Up2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x - 2, jPieceRight.transform.position.y, jPieceRight.transform.position.z), up * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x - 2, jPieceRight.transform.position.y, jPieceRight.transform.position.z), up, 2, layerMask))
        {
            rightLeft2Up1Up2 = true;
        }
        bool rightLeft1Up1Up2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x - 1, jPieceRight.transform.position.y, jPieceRight.transform.position.z), up * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x - 1, jPieceRight.transform.position.y, jPieceRight.transform.position.z), up, 2, layerMask))
        {
            rightLeft1Up1Up2 = true;
        }
        bool topLeft1Up2 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x - 1, jPieceTop.transform.position.y - 1, jPieceTop.transform.position.z), up * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x - 1, jPieceTop.transform.position.y - 1, jPieceTop.transform.position.z), up, 2, layerMask))
        {
            topLeft1Up2 = true;
        }
        bool topLeft1Up1Up2 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x - 1, jPieceTop.transform.position.y, jPieceTop.transform.position.z), up * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x - 1, jPieceTop.transform.position.y, jPieceTop.transform.position.z), up, 2, layerMask))
        {
            topLeft1Up1Up2 = true;
        }
        // Reverse Orientation 4
        bool rightLeft2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y, jPieceRight.transform.position.z), left * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x, jPieceRight.transform.position.y, jPieceRight.transform.position.z), left, 2, layerMask))
        {
            rightLeft2 = true;
        }
        bool rightUp1Right2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x - 1, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), right * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x - 1, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), right, 2, layerMask))
        {
            rightUp1Right2 = true;
        }
        bool bottomUp2Right2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x - 1, jPieceBottom.transform.position.y + 2, jPieceBottom.transform.position.z), right * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x - 1, jPieceBottom.transform.position.y + 2, jPieceBottom.transform.position.z), right, 2, layerMask))
        {
            bottomUp2Right2 = true;
        }
        bool topDown2Left2 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x + 1, jPieceTop.transform.position.y - 2, jPieceTop.transform.position.z), left * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x + 1, jPieceTop.transform.position.y - 2, jPieceTop.transform.position.z), left, 2, layerMask))
        {
            topDown2Left2 = true;
        }
        bool topUp3Left2 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x + 1, jPieceTop.transform.position.y + 3, jPieceTop.transform.position.z), left * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x + 1, jPieceTop.transform.position.y + 3, jPieceTop.transform.position.z), left, 2, layerMask))
        {
            topUp3Left2 = true;
        }
        bool rightUp2Left2 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y + 2, jPieceRight.transform.position.z), left * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x + 1, jPieceRight.transform.position.y + 2, jPieceRight.transform.position.z), left, 2, layerMask))
        {
            rightUp2Left2 = true;
        }
        bool topUp2Left2 = false;
        Debug.DrawRay(new Vector3(jPieceTop.transform.position.x + 1, jPieceTop.transform.position.y + 2, jPieceTop.transform.position.z), left * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceTop.transform.position.x + 1, jPieceTop.transform.position.y + 2, jPieceTop.transform.position.z), left, 2, layerMask))
        {
            topUp2Left2 = true;
        }
        bool leftDown1Right2 = false;
        Debug.DrawRay(new Vector3(jPieceLeft.transform.position.x - 1, jPieceLeft.transform.position.y - 1, jPieceLeft.transform.position.z), right * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceLeft.transform.position.x - 1, jPieceLeft.transform.position.y - 1, jPieceLeft.transform.position.z), right, 2, layerMask))
        {
            topUp2Left2 = true;
        }
        bool rightUp1Right1Left3 = false;
        Debug.DrawRay(new Vector3(jPieceRight.transform.position.x + 2, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), left * 3, Color.red);
        if (Physics.Raycast(new Vector3(jPieceRight.transform.position.x + 2, jPieceRight.transform.position.y + 1, jPieceRight.transform.position.z), left, 3, layerMask))
        {
            rightUp1Right1Left3 = true;
        }
        bool bottomLeft2 = false;
        Debug.DrawRay(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y, jPieceBottom.transform.position.z), left * 2, Color.red);
        if (Physics.Raycast(new Vector3(jPieceBottom.transform.position.x, jPieceBottom.transform.position.y, jPieceBottom.transform.position.z), left, 2, layerMask))
        {
            bottomLeft2 = true;
        }
        #endregion

        // This switch statement contains ALL of the checks necessary and sets values accordingly.
        // Most movement checks are if statements going from most complex to simple. Simplest maneuvers
        // MUST have highest priority, so they are checked last.
        switch (orientation)
        {
        case 1:
            resetMovementBools();
            pieceMovementScript.setCanRotateClockwise(false);
            pieceMovementScript.setCanRotateCounterClockwise(false);
            //// Clockwise Rotation tests
            // Kick test 0R 5
            if (!leftDown3 && !jPieceBottomBools[1])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-1, 2));
            }
            // Kick test 0R 4
            if (!bottomDown3 && !jPieceRightBools[1])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, -2));
            }
            // Kick test 0R 3
            if (!topUp1Right2)
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-1, 1));
            }
            // Kick test 0R 2
            if (!jPieceTopBools[3] && !jPieceLeftBools[1])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-1, 0));
            }
            // Kick test 0R 1
            if (!jPieceBottomBools[0] && !jPieceBottomBools[1] && !jPieceRightBools[0])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, 0));
            }
            //// CounterClockwise Rotation tests
            // Kick test L0 5 MIRRORED
            if (!rightDown3 && !rightDown3Left2)
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(1, -2));
            }
            // Kick test L0 4 MIRRORED
            if (!bottomDown3 && !bottomDown3Left2)
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, -2));
            }
            // Kick test L0 3 MIRRORED
            if (!rightUp2)
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(1, 1));
            }
            // Kick test L0 2 MIRRORED
            if (!jPieceBottomBools[1] && !jPieceRightBools[0] && !jPieceRightBools[1])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(1, 0));
            }
            // Kick test L0 1 MIRRORED
            if (!jPieceLeftBools[1] && !jPieceBottomBools[0] && !jPieceBottomBools[1])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, 0));
            }
            //// Movement test
            if (jPieceLeftBools[2] || jPieceTopBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (jPieceRightBools[3] || jPieceTopBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }
            break;

        case 2:
            resetMovementBools();
            pieceMovementScript.setCanRotateClockwise(false);
            pieceMovementScript.setCanRotateCounterClockwise(false);
            //// Clockwise Rotation tests
            // Kick test R2 5
            if (!jPieceLeftBools[0] && !topUp1Right2 && !jPieceTopBools[3])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(1, 2));
            }
            // Kick test R2 4
            if (!leftUp1Left2 && !jPieceTopBools[0])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, 2));
            }
            // Kick test R2 3
            if (!jPieceRightBools[3] && !rightRight2Down2)
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(1, -1));
            }
            // Kick test R2 2
            if (!jPieceBottomBools[3] && !bottomRight2Down2)
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(1, 0));
            }
            // Kick test R2 1
            if (!jPieceBottomBools[2] && !jPieceBottomBools[3] && !jPieceRightBools[3])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, 0));
            }
            //// CounterClockwise Rotation tests
            // Kick test 0R 5 MIRRORED
            if (!leftUp2 && !topUp1Right2)
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(1, 2));
            }
            // Kick test 0R 4 MIRRORED
            if (!leftLeft1Up1Up2 && !jPieceLeftBools[0] && !jPieceTopBools[0])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, 2));
            }
            // Kick test 0R 3 MIRRORED
            if (!rightRight2)
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(1, -1));
            }
            // Kick test 0R 2 MIRRORED
            if (!bottomRight2)
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(1, 0));
            }
            // Kick test 0R 1 MIRRORED
            if (!jPieceLeftBools[2] && !jPieceBottomBools[2] && !jPieceBottomBools[3])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, 0));
            }
            //// Movement test
            if (jPieceRightBools[2] || jPieceLeftBools[2] || jPieceBottomBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (jPieceTopBools[3] || jPieceRightBools[3] || jPieceBottomBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }
            break;

        case 3:
            resetMovementBools();
            pieceMovementScript.setCanRotateClockwise(false);
            pieceMovementScript.setCanRotateCounterClockwise(false);
            //// Clockwise Rotation tests
            // Kick test 2L 5
            if (!leftDown3Left2 && !topDown2)
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(1, -2));
            }
            // Kick test 2L 4
            if (!bottomDown3Left2 && !bottomDown2)
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, -2));
            }
            // Kick test 2L 3
            if (!leftUp2)
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(1, 1));
            }
            // Kick test 2L 2
            if (!jPieceBottomBools[1] && !jPieceLeftBools[0])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(1, 0));
            }
            // Kick test 2L 1
            if (!jPieceRightBools[1] && !jPieceBottomBools[1] && !jPieceBottomBools[0])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, 0));
            }
            //// CounterClockwise Rotation tests
            // Kick test R2 5 MIRRORED
            if (!rightDown3 && !jPieceBottomBools[1])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-1, -2));
            }
            // Kick test R2 4 MIRRORED
            if (!bottomDown3)
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, -2));
            }
            // Kick test R2 3 MIRRORED
            if (!rightUp2Right2 && !jPieceRightBools[0])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-1, 1));
            }
            // Kick test R2 2 MIRRORED
            if (!jPieceRightBools[0] && !jPieceRightBools[1] && !jPieceBottomBools[0])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-1, 0));
            }
            // Kick test R2 1 MIRRORED
            if (!jPieceBottomBools[1] && !jPieceBottomBools[0] && !jPieceLeftBools[0])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, 0));
            }
            //// Movement tests
            if (jPieceRightBools[2] || jPieceTopBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (jPieceLeftBools[3] || jPieceBottomBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }

            break;

        case 4:
            resetMovementBools();
            pieceMovementScript.setCanRotateClockwise(false);
            pieceMovementScript.setCanRotateCounterClockwise(false);
            //// Clockwise Rotation tests
            // Kick test L0 5
            if (!rightUp1Left3 && !rightLeft2Up1Up2)
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-1, 2));
            }
            // Kick test L0 4
            if (!rightLeft1Up1Up2 && !rightUp1Right2)
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, 2));
            }
            // Kick test L0 3
            if (!topLeft1Up2)
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-1, -1));
            }
            // Kick test L0 2
            if (!topLeft1Up1Up2 && !jPieceBottomBools[2])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-1, 0));
            }
            // Kick test L0 1
            if (!jPieceBottomBools[2] && !jPieceBottomBools[3] && !jPieceRightBools[2])
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, 0));
            }
            //// CounterClockwise Rotation tests
            // Kick test 2L 5 MIRRORED
            if (!rightUp1Left3)
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-1, 2));
            }
            // Kick test 2L 4 MIRRORED
            if (!rightUp1Right1Left3 && !jPieceRightBools[3])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, 2));
            }
            // Kick test 2L 3 MIRRORED
            if (!jPieceTopBools[2] && !jPieceLeftBools[1])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-1, -1));
            }
            // Kick test 2L 2 MIRRORED
            if (!bottomLeft2)
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-1, 0));
            }
            // Kick test 2L 1 MIRRORED
            if (!jPieceLeftBools[3] && !jPieceBottomBools[3] && !jPieceBottomBools[2])
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, 0));
            }
            //// Movement Tests
            if (jPieceBottomBools[2] || jPieceTopBools[2] || jPieceRightBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (jPieceLeftBools[3] || jPieceBottomBools[3] || jPieceRightBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }
            break;

        default:
            resetMovementBools();
            break;
        }
    }
    void Update()
    {
        pieceMovementScript.setIsGrounded(false);
        Vector3 down  = transform.TransformDirection(Vector3.down);
        Vector3 up    = transform.TransformDirection(Vector3.up);
        Vector3 left  = transform.TransformDirection(Vector3.left);
        Vector3 right = transform.TransformDirection(Vector3.right);

        if (iPieceTransformHandle.transform.rotation.eulerAngles.z == 0)
        {
            orientation = 1;
        }
        if (iPieceTransformHandle.transform.rotation.eulerAngles.z == 270)
        {
            orientation = 2;
        }
        if (iPieceTransformHandle.transform.rotation.eulerAngles.z == 180)
        {
            orientation = 3;
        }
        if (iPieceTransformHandle.transform.rotation.eulerAngles.z == 90)
        {
            orientation = 4;
        }

        PieceMovement.distanceDown = 90;

        // Collision Checks
        for (int i = 0; i < 4; i++)
        {
            bool[]     temporary   = new bool[4];
            GameObject currentCube = null;
            switch (i)
            {
            case 0:
                currentCube = iPieceTop;
                break;

            case 1:
                currentCube = iPieceBottom;
                break;

            case 2:
                currentCube = iPieceLeft;
                break;

            case 3:
                currentCube = iPieceRight;
                break;

            default:
                Debug.Log("Error with switch #1 of a CollisionScript!");
                break;
            }

            #region Shortest Distance Down

            RaycastHit hit;
            float      distance = 90;
            if (Physics.Raycast(currentCube.transform.position, down, out hit, layerMask))
            {
                distance = hit.distance;
            }
            PieceMovement.distanceDown = Mathf.Min(PieceMovement.distanceDown, distance);

            #endregion

            // Note!
            // All collisions won't take into account the cubes of the current piece. IE A T-Piece Top won't care about a T-Piece Bottom being below it.
            // Ground checking is taken care of in the Basic RS Raycast Methodology
            // The SRS Raycast Methodology only takes into account special cases for their respective orientations

            #region Basic RS Raycast Methodology

            if (Physics.Raycast(currentCube.transform.position, up, 1, layerMask))
            {
                temporary[0] = true;
                Debug.DrawRay(currentCube.transform.position, up * 1, Color.blue);
            }
            else
            {
                temporary[0] = false;
                Debug.DrawRay(currentCube.transform.position, up * 1, Color.white);
            }
            if (Physics.Raycast(currentCube.transform.position, down, 1, layerMask))
            {
                temporary[1] = true;
                Debug.DrawRay(currentCube.transform.position, down * 1, Color.blue);
                // Here's where ground checking is easily done!
                pieceMovementScript.setIsGrounded(true);
            }
            else
            {
                temporary[1] = false;
                Debug.DrawRay(currentCube.transform.position, down * 1, Color.white);
            }
            if (Physics.Raycast(currentCube.transform.position, left, 1, layerMask))
            {
                temporary[2] = true;
                Debug.DrawRay(currentCube.transform.position, left * 1, Color.blue);
            }
            else
            {
                temporary[2] = false;
                Debug.DrawRay(currentCube.transform.position, left * 1, Color.white);
            }
            if (Physics.Raycast(currentCube.transform.position, right, 1, layerMask))
            {
                temporary[3] = true;
                Debug.DrawRay(currentCube.transform.position, right * 1, Color.blue);
            }
            else
            {
                temporary[3] = false;
                Debug.DrawRay(currentCube.transform.position, right * 1, Color.white);
            }
            switch (i)
            {
            case 0:
                iPieceTopBools = temporary;
                break;

            case 1:
                iPieceBottomBools = temporary;
                break;

            case 2:
                iPieceLeftBools = temporary;
                break;

            case 3:
                iPieceRightBools = temporary;
                break;

            default:
                Debug.Log("Error with switch #2 of a CollisionScript!");
                break;
            }

            #endregion
        }

        // Warning: This is SRS Raycast Methodoloy is extremely confusing if you're not Lucas
        #region SRS Raycast Methodology

        // The IPiece uses a private cast() method to raycast instead of a ton of raycasts
        // with tons and tons of booleans. This is because the IPiece is a funny little
        // thing with no offsets in its SRS Kick Tests. Very cool!

        #endregion

        // This switch statement contains ALL of the checks necessary and sets values accordingly.
        // Most movement checks are if statements going from most complex to simple. Simplest maneuvers
        // MUST have highest priority, so they are checked last.
        switch (orientation)
        {
        case 1:
            resetMovementBools();
            pieceMovementScript.setCanRotateClockwise(false);
            pieceMovementScript.setCanRotateCounterClockwise(false);
            //// Clockwise Rotation tests
            // Kick test 0R 5
            if (!cast(iPieceRight, up, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(1, 2));
            }
            // Kick test 0R 4
            if (!cast(iPieceLeft, down, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-2, -1));
            }
            // Kick test 0R 3
            if (!cast(iPieceRight, down, 2) && !cast(iPieceRight, up, 1))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(1, 0));
            }
            // Kick test 0R 2
            if (!cast(iPieceLeft, down, 2) && !cast(iPieceLeft, up, 1))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-2, 0));
            }
            // Kick test 0R 1
            if (!cast(iPieceTop, down, 2) && !cast(iPieceTop, up, 1))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, 0));
            }
            //// CounterClockwise Rotation tests
            // Kick test L0 5 MIRRORED
            if (!cast(iPieceRight, down, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(2, -1));
            }
            // Kick test L0 4 MIRRORED
            if (!cast(iPieceLeft, up, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-1, 2));
            }
            // Kick test L0 3 MIRRORED
            if (!cast(iPieceRight, down, 2) && !cast(iPieceRight, up, 1))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(2, 0));
            }
            // Kick test L0 2 MIRRORED
            if (!cast(iPieceLeft, down, 2) && !cast(iPieceLeft, up, 1))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-1, 0));
            }
            // Kick test L0 1 MIRRORED
            if (!cast(iPieceBottom, down, 2) && !cast(iPieceBottom, up, 1))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, 0));
            }
            //// Movement test
            if (iPieceLeftBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (iPieceRightBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }
            break;

        case 2:
            resetMovementBools();
            pieceMovementScript.setCanRotateClockwise(false);
            pieceMovementScript.setCanRotateCounterClockwise(false);
            //// Clockwise Rotation tests
            // Kick test R2 5
            if (!cast(iPieceRight, right, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(2, -1));
            }
            // Kick test R2 4
            if (!cast(iPieceLeft, left, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-1, 2));
            }
            // Kick test R2 3
            if (!cast(iPieceTop, right, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(2, 0));
            }
            // Kick test R2 2
            if (!cast(iPieceTop, left, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-1, 0));
            }
            // Kick test R2 1
            if (!cast(iPieceTop, left, 2) && !cast(iPieceTop, right, 1))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, 0));
            }
            //// CounterClockwise Rotation tests
            // Kick test 0R 5 MIRRORED
            if (!cast(iPieceRight, left, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-1, -2));
            }
            // Kick test 0R 4 MIRRORED
            if (!cast(iPieceLeft, right, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(2, 1));
            }
            // Kick test 0R 3 MIRRORED
            if (!cast(iPieceBottom, left, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-1, 0));
            }
            // Kick test 0R 2 MIRRORED
            if (!cast(iPieceBottom, right, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(2, 0));
            }
            // Kick test 0R 1 MIRRORED
            if (!cast(iPieceBottom, left, 2) && !cast(iPieceBottom, right, 1))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, 0));
            }
            //// Movement test
            if (iPieceBottomBools[2] || iPieceLeftBools[2] || iPieceRightBools[2] || iPieceTopBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (iPieceBottomBools[3] || iPieceLeftBools[3] || iPieceRightBools[3] || iPieceTopBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }
            break;

        case 3:
            resetMovementBools();
            pieceMovementScript.setCanRotateClockwise(false);
            pieceMovementScript.setCanRotateCounterClockwise(false);
            //// Clockwise Rotation tests
            // Kick test 2L 5
            if (!cast(iPieceRight, down, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-1, -2));
            }
            // Kick test 2L 4
            if (!cast(iPieceLeft, up, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(2, 1));
            }
            // Kick test 2L 3
            if (!cast(iPieceRight, down, 1) && !cast(iPieceRight, up, 2))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-1, 0));
            }
            // Kick test 2L 2
            if (!cast(iPieceLeft, down, 1) && !cast(iPieceLeft, up, 2))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(2, 0));
            }
            // Kick test 2L 1
            if (!cast(iPieceTop, right, 2) && !cast(iPieceTop, down, 1))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, 0));
            }
            //// CounterClockwise Rotation tests
            // Kick test R2 5 MIRRORED
            if (!cast(iPieceRight, up, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-2, 1));
            }
            // Kick test R2 4 MIRRORED
            if (!cast(iPieceLeft, down, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(1, -2));
            }
            // Kick test R2 3 MIRRORED
            if (!cast(iPieceRight, down, 1) && !cast(iPieceRight, up, 2))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-2, 0));
            }
            // Kick test R2 2 MIRRORED
            if (!cast(iPieceLeft, down, 1) && !cast(iPieceLeft, up, 2))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(1, 0));
            }
            // Kick test R2 1 MIRRORED
            if (!cast(iPieceBottom, up, 2) && !cast(iPieceBottom, down, 1))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, 0));
            }
            //// Movement tests
            if (iPieceRightBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (iPieceLeftBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }

            break;

        case 4:
            resetMovementBools();
            pieceMovementScript.setCanRotateClockwise(false);
            pieceMovementScript.setCanRotateCounterClockwise(false);
            //// Clockwise Rotation tests
            // Kick test L0 5
            if (!cast(iPieceRight, left, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-2, 1));
            }
            // Kick test L0 4
            if (!cast(iPieceLeft, right, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(1, -2));
            }
            // Kick test L0 3
            if (!cast(iPieceTop, left, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(-2, 0));
            }
            // Kick test L0 2
            if (!cast(iPieceTop, right, 3))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(1, 0));
            }
            // Kick test L0 1
            if (!cast(iPieceTop, right, 2) && !cast(iPieceTop, left, 1))
            {
                pieceMovementScript.setTranslationVectorC(new Vector2(0, 0));
            }
            //// CounterClockwise Rotation tests
            // Kick test 2L 5 MIRRORED
            if (!cast(iPieceRight, right, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(1, 2));
            }
            // Kick test 2L 4 MIRRORED
            if (!cast(iPieceLeft, left, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-2, -1));
            }
            // Kick test 2L 3 MIRRORED
            if (!cast(iPieceBottom, right, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(1, 0));
            }
            // Kick test 2L 2 MIRRORED
            if (!cast(iPieceBottom, left, 3))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(-2, 0));
            }
            // Kick test 2L 1 MIRRORED
            if (!cast(iPieceBottom, right, 2) && !cast(iPieceBottom, left, 1))
            {
                pieceMovementScript.setTranslationVectorCC(new Vector2(0, 0));
            }
            //// Movement Tests
            if (iPieceBottomBools[2] || iPieceLeftBools[2] || iPieceRightBools[2] || iPieceTopBools[2])
            {
                pieceMovementScript.setCanMoveLeft(false);
            }
            if (iPieceBottomBools[3] || iPieceLeftBools[3] || iPieceRightBools[3] || iPieceTopBools[3])
            {
                pieceMovementScript.setCanMoveRight(false);
            }
            break;

        default:
            resetMovementBools();
            break;
        }
    }