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