void BuildOutside(GameObject modul, int depth)
    {
        if (depth >= 3 && countOutside > minCountOutside)
        {
            return;
        }

        ModulManager script = modul.GetComponent <ModulManager>();

        GameObject left  = CreateModulOutside(script.posLeft, modulRate);
        GameObject right = CreateModulOutside(script.posRight, modulRate);
        GameObject up    = CreateModulOutside(script.posUp, modulRate);
        GameObject down  = CreateModulOutside(script.posDown, modulRate);

        if (left != null)
        {
            BuildOutside(left, depth + 1);
        }
        if (right != null)
        {
            BuildOutside(right, depth + 1);
        }
        if (up != null)
        {
            BuildOutside(up, depth + 1);
        }
        if (down != null)
        {
            BuildOutside(down, depth + 1);
        }
    }
    //Recursiv method that creates level by attaching a modul at each door
    void BuildLevel(GameObject modul, direction ignoreDirection)
    {
        GameObject[] selectModules = modules;
        ModulManager scriptModul   = modul.GetComponent <ModulManager>();

        //When maxDepth is reached only create corner modules
        if (modulCount >= maxModules)
        {
            selectModules = cornerModules;
        }

        LinkedList <direction> doors = modul.GetComponent <ModulManager>().GetDoors();

        if (doors.Contains(direction.Left) && ignoreDirection != direction.Left && !CheckForModul(scriptModul.posLeft))
        {
            CreateModul(RandomModul(selectModules), scriptModul.posLeft, direction.Right);
        }
        if (doors.Contains(direction.Right) && ignoreDirection != direction.Right && !CheckForModul(scriptModul.posRight))
        {
            CreateModul(RandomModul(selectModules), scriptModul.posRight, direction.Left);
        }
        if (doors.Contains(direction.Up) && ignoreDirection != direction.Up && !CheckForModul(scriptModul.posUp))
        {
            CreateModul(RandomModul(selectModules), scriptModul.posUp, direction.Down);
        }
        if (doors.Contains(direction.Down) && ignoreDirection != direction.Down && !CheckForModul(scriptModul.posDown))
        {
            CreateModul(RandomModul(selectModules), scriptModul.posDown, direction.Up);
        }
    }
    //Instantiate modul
    void CreateModul(GameObject modul, Vector3 pos, direction oppositDirection)
    {
        GameObject   newModul = Instantiate(modul, pos, Quaternion.identity);
        ModulManager script   = newModul.GetComponent <ModulManager>();

        script.RotateToDoor(oppositDirection);
        modulCount++;
        BuildLevel(newModul, oppositDirection);
    }
    void FixLevel()
    {
        GameObject[] modules = GetAllModules();
        foreach (GameObject modul in modules)
        {
            state        left, right, up, down;
            ModulManager script = modul.GetComponent <ModulManager>();

            //Left
            if (!CheckForModul(script.posLeft))
            {
                left = state.Empty;
            }
            else
            {
                left = GetModulAtPosition(script.posLeft).GetComponent <ModulManager>().GetRight();
            }

            //Right
            if (!CheckForModul(script.posRight))
            {
                right = state.Empty;
            }
            else
            {
                right = GetModulAtPosition(script.posRight).GetComponent <ModulManager>().GetLeft();
            }

            //Up
            if (!CheckForModul(script.posUp))
            {
                up = state.Empty;
            }
            else
            {
                up = GetModulAtPosition(script.posUp).GetComponent <ModulManager>().GetDown();
            }

            //Down
            if (!CheckForModul(script.posDown))
            {
                down = state.Empty;
            }
            else
            {
                down = GetModulAtPosition(script.posDown).GetComponent <ModulManager>().GetUp();
            }


            if (!CheckIfModulIsValid(modul, left, right, up, down))
            {
                print("ERROR!!");
                ReplaceModul(modul, left, right, up, down);
            }
        }
    }
    //Check for modul a if all doors have a partner from modul b
    bool CheckIfModulIsValid(GameObject modul, state left, state right, state up, state down)
    {
        ModulManager script = modul.GetComponent <ModulManager>();
        state        mLeft  = script.GetLeft();
        state        mRight = script.GetRight();
        state        mUp    = script.GetUp();
        state        mDown  = script.GetDown();

        if (CompareStates(mLeft, left) && CompareStates(mLeft, left) && CompareStates(mLeft, left) && CompareStates(mLeft, left))
        {
            return(true);
        }
        return(false);
    }
    void BuildInside(GameObject modul, int depth, direction ignoreDir)
    {
        GameObject[] useModules = modules;

        if (depth >= 3 && countInside > minCountInside)
        {
            useModules = cornerModules;
        }

        ModulManager script = modul.GetComponent <ModulManager>();

        direction[] doors = script.GetDoors().ToArray();
        GameObject  left = null, right = null, up = null, down = null;

        if (doors.Contains(direction.Left) && ignoreDir != direction.Left)
        {
            left = CreateModulInside(useModules, script.posLeft, direction.Right, modulRate);
        }
        if (doors.Contains(direction.Right) && ignoreDir != direction.Right)
        {
            right = CreateModulInside(useModules, script.posRight, direction.Left, modulRate);
        }
        if (doors.Contains(direction.Up) && ignoreDir != direction.Up)
        {
            up = CreateModulInside(useModules, script.posUp, direction.Down, modulRate);
        }
        if (doors.Contains(direction.Down) && ignoreDir != direction.Down)
        {
            down = CreateModulInside(useModules, script.posDown, direction.Up, modulRate);
        }

        if (left != null)
        {
            BuildInside(left, depth + 1, direction.Right);
        }
        if (right != null)
        {
            BuildInside(right, depth + 1, direction.Left);
        }
        if (up != null)
        {
            BuildInside(up, depth + 1, direction.Down);
        }
        if (down != null)
        {
            BuildInside(down, depth + 1, direction.Up);
        }
    }
    void EnableBordersForModul(GameObject modul)
    {
        ModulManager script = modul.GetComponent <ModulManager>();

        if (!CheckForModul(script.posLeft))
        {
            script.borderLeft.SetActive(true);
        }
        if (!CheckForModul(script.posRight))
        {
            script.borderRight.SetActive(true);
        }
        if (!CheckForModul(script.posUp))
        {
            script.borderUp.SetActive(true);
        }
        if (!CheckForModul(script.posDown))
        {
            script.borderDown.SetActive(true);
        }
    }
    GameObject CalculateTransition(GameObject modul)
    {
        ModulManager script   = modul.GetComponent <ModulManager>();
        Vector3      pos      = Vector3.zero;
        direction    rotateTo = direction.None;

        if (!CheckForModul(script.posLeft))
        {
            pos      = script.posLeft;
            rotateTo = direction.Right;
            script.borderLeft.SetActive(false);
        }
        else if (!CheckForModul(script.posRight))
        {
            pos      = script.posRight;
            rotateTo = direction.Left;
            script.borderRight.SetActive(false);
        }
        else if (!CheckForModul(script.posUp))
        {
            pos      = script.posUp;
            rotateTo = direction.Down;
            script.borderUp.SetActive(false);
        }
        else if (!CheckForModul(script.posDown))
        {
            pos      = script.posDown;
            rotateTo = direction.Up;
            script.borderDown.SetActive(false);
        }

        if (pos == Vector3.zero)
        {
            print("ERROR: At CalculateTransition()");
        }
        GameObject trans = Instantiate(transitionModul, pos, Quaternion.identity);

        trans.GetComponent <ModulManager>().RotateToDoor(rotateTo);
        return(trans);
    }