public MapChunkPrefab GetRandomRoomPrefab(Orientation requiredOri, SideType requiredType, Orientation[] blockedSides) { MapChunkPrefab[] validChunkPrefabs = new MapChunkPrefab[roomPrefabs.Length]; int count = 0; foreach (MapChunkPrefab chunkPrefab in roomPrefabs) { if (chunkPrefab.GetSideType(requiredOri) == requiredType) { bool leadsToBlocked = false; foreach (Orientation blocked in blockedSides) { if (chunkPrefab.GetSideType(blocked) != SideType.CLOSED) { leadsToBlocked = true; break; } } if (!leadsToBlocked) { validChunkPrefabs[count++] = chunkPrefab; } } } return(validChunkPrefabs[Random.Range(0, count)]); }
private void GenerateMainPath(int mainPathLength) { mainPath = new List <Vector2i>(); MapChunk curChunk = MapChunk.CreateMapChunk(startingRoom); Grid.SetChunk(new Vector2i(0, 0), curChunk, "Start"); mainPath.Add(curChunk.FakePos); Side nextSide = null; bool stuck = false; for (int i = 0; i < mainPathLength; i++) { List <Side> possibleSides = curChunk.GetAllOpenUnusedSides(); // Get All the possible sides (i.e: open and unused) nextSide = possibleSides[Random.Range(0, possibleSides.Count)]; // Pick a new possible side possibleSides.Remove(nextSide); Orientation requiredOri = nextSide.Orient.GetOposite(); MapChunkPrefab prefab = null; while (Grid.GetAdjacentSidesLeadingToTile(nextSide.GetAdjacentPos(), requiredOri).Length > 2) { if (possibleSides.Count == 0) { stuck = true; break; } nextSide = possibleSides[Random.Range(0, possibleSides.Count)]; // Pick a new possible side possibleSides.Remove(nextSide); requiredOri = nextSide.Orient.GetOposite(); } List <MapChunkPrefab> possiblePrefabs = GetAllRoomPrefabs(requiredOri, nextSide.Type, Grid.GetAdjacentSidesOccupied(nextSide.GetAdjacentPos(), requiredOri)); prefab = possiblePrefabs[Random.Range(0, possiblePrefabs.Count)]; // Pick a new possible side possiblePrefabs.Remove(prefab); while (prefab.OpenCount < 2) { if (possiblePrefabs.Count == 0) { stuck = true; break; } prefab = possiblePrefabs[Random.Range(0, possiblePrefabs.Count)]; // Pick a new possible side possiblePrefabs.Remove(prefab); } if (stuck) { Debug.Log("Path Stuck!"); break; } curChunk = MapChunk.CreateMapChunk(prefab); Grid.SetChunk(nextSide.GetAdjacentPos(), curChunk, "Main"); mainPath.Add(curChunk.FakePos); } nextSide = curChunk.GetRandomOpenUnusedSide(); curChunk = MapChunk.CreateMapChunk(endingRoom); Grid.SetChunk(nextSide.GetAdjacentPos(), curChunk, "End"); mainPath.Add(curChunk.FakePos); }
public static MapChunk CreateMapChunk(MapChunkPrefab prefab) { GameObject go = Instantiate <GameObject>(prefab.prefab, MapManager.I.mapRoot); MapChunk mapChunk = go.AddComponent <MapChunk>(); mapChunk.Top = new Side(mapChunk, Orientation.TOP, prefab.top); mapChunk.Left = new Side(mapChunk, Orientation.LEFT, prefab.left); mapChunk.Bottom = new Side(mapChunk, Orientation.BOTTOM, prefab.bottom); mapChunk.Right = new Side(mapChunk, Orientation.RIGHT, prefab.right); return(mapChunk); }
public MapChunkPrefab GetRandomRoomPrefab(Orientation requiredOri, SideType requiredType) { MapChunkPrefab[] validChunkPrefabs = new MapChunkPrefab[roomPrefabs.Length]; int count = 0; foreach (MapChunkPrefab chunkPrefab in roomPrefabs) { if (chunkPrefab.GetSideType(requiredOri) == requiredType) { validChunkPrefabs[count++] = chunkPrefab; } } return(validChunkPrefabs[Random.Range(0, count)]); }
public static MapChunkPrefab Get90ClockwiseRotatedVersion(MapChunkPrefab prefab) { GameObject go = GameObject.Instantiate(prefab.prefab); Vector3 eulerRot = go.transform.rotation.eulerAngles + new Vector3(0, 90, 0); go.transform.rotation = Quaternion.Euler(eulerRot); go.transform.SetParent(MapManager.I.rotatedRoot); MapChunkPrefab p = new MapChunkPrefab(); p.prefab = go; foreach (Orientation ori in prefab.sides.Keys) { p.sides[ori.GetNextClockwise()] = prefab.sides[ori]; } p.initTop = p.sides[Orientation.TOP]; p.initRight = p.sides[Orientation.RIGHT]; p.initBottom = p.sides[Orientation.BOTTOM]; p.initLeft = p.sides[Orientation.LEFT]; p.type = prefab.type; return(p); }
public List <MapChunkPrefab> GenerateRotatedVersions() { List <MapChunkPrefab> rotatedPrefabs = new List <MapChunkPrefab>(); switch (type) { case MapChunkPrefabType.DEAD_END: if (top != SideType.CLOSED) { MapChunkPrefab pr = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(pr); MapChunkPrefab pb = Get90ClockwiseRotatedVersion(pr); rotatedPrefabs.Add(pb); MapChunkPrefab pl = Get90ClockwiseRotatedVersion(pb); rotatedPrefabs.Add(pl); } else if (right != SideType.CLOSED) { MapChunkPrefab pb = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(pb); MapChunkPrefab pl = Get90ClockwiseRotatedVersion(pb); rotatedPrefabs.Add(pl); MapChunkPrefab pt = Get90ClockwiseRotatedVersion(pl); rotatedPrefabs.Add(pt); } else if (bottom != SideType.CLOSED) { MapChunkPrefab pl = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(pl); MapChunkPrefab pt = Get90ClockwiseRotatedVersion(pl); rotatedPrefabs.Add(pt); MapChunkPrefab pr = Get90ClockwiseRotatedVersion(pt); rotatedPrefabs.Add(pr); } else if (left != SideType.CLOSED) { MapChunkPrefab pt = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(pt); MapChunkPrefab pr = Get90ClockwiseRotatedVersion(pt); rotatedPrefabs.Add(pr); MapChunkPrefab pb = Get90ClockwiseRotatedVersion(pr); rotatedPrefabs.Add(pb); } break; case MapChunkPrefabType.CORNER: if (top != SideType.CLOSED && right != SideType.CLOSED) { MapChunkPrefab prb = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(prb); MapChunkPrefab pbl = Get90ClockwiseRotatedVersion(prb); rotatedPrefabs.Add(pbl); MapChunkPrefab plt = Get90ClockwiseRotatedVersion(pbl); rotatedPrefabs.Add(plt); } else if (right != SideType.CLOSED && bottom != SideType.CLOSED) { MapChunkPrefab pbl = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(pbl); MapChunkPrefab plt = Get90ClockwiseRotatedVersion(pbl); rotatedPrefabs.Add(plt); MapChunkPrefab ptr = Get90ClockwiseRotatedVersion(plt); rotatedPrefabs.Add(ptr); } else if (bottom != SideType.CLOSED && left != SideType.CLOSED) { MapChunkPrefab plt = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(plt); MapChunkPrefab ptr = Get90ClockwiseRotatedVersion(plt); rotatedPrefabs.Add(ptr); MapChunkPrefab prb = Get90ClockwiseRotatedVersion(ptr); rotatedPrefabs.Add(prb); } else if (left != SideType.CLOSED && top != SideType.CLOSED) { MapChunkPrefab ptr = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(ptr); MapChunkPrefab prb = Get90ClockwiseRotatedVersion(ptr); rotatedPrefabs.Add(prb); MapChunkPrefab pbl = Get90ClockwiseRotatedVersion(prb); rotatedPrefabs.Add(pbl); } break; case MapChunkPrefabType.LINE: if (top != SideType.CLOSED && bottom != SideType.CLOSED) { MapChunkPrefab prl = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(prl); } else if (right != SideType.CLOSED && left != SideType.CLOSED) { MapChunkPrefab ptb = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(ptb); } break; case MapChunkPrefabType.TJUNCTION: if (top == SideType.CLOSED) { MapChunkPrefab pblt = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(pblt); MapChunkPrefab pltr = Get90ClockwiseRotatedVersion(pblt); rotatedPrefabs.Add(pltr); MapChunkPrefab ptrb = Get90ClockwiseRotatedVersion(pltr); rotatedPrefabs.Add(ptrb); } else if (right == SideType.CLOSED) { MapChunkPrefab pltr = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(pltr); MapChunkPrefab ptrb = Get90ClockwiseRotatedVersion(pltr); rotatedPrefabs.Add(ptrb); MapChunkPrefab pblt = Get90ClockwiseRotatedVersion(ptrb); rotatedPrefabs.Add(pblt); } else if (bottom == SideType.CLOSED) { MapChunkPrefab ptrb = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(ptrb); MapChunkPrefab pblt = Get90ClockwiseRotatedVersion(ptrb); rotatedPrefabs.Add(pblt); MapChunkPrefab pltr = Get90ClockwiseRotatedVersion(pblt); rotatedPrefabs.Add(pltr); } else if (left == SideType.CLOSED) { MapChunkPrefab pblt = Get90ClockwiseRotatedVersion(this); rotatedPrefabs.Add(pblt); MapChunkPrefab pltr = Get90ClockwiseRotatedVersion(pblt); rotatedPrefabs.Add(pltr); MapChunkPrefab ptrb = Get90ClockwiseRotatedVersion(pltr); rotatedPrefabs.Add(ptrb); } break; case MapChunkPrefabType.CROSSROADS: break; } return(rotatedPrefabs); }