private void renderSkeletonChunk(int i, int j, bool mustHaveTrap) { DungeonSkeletonChunk skeletonChunk = skeleton[i, j]; MapChunk current; MapChunk[] chunks; switch (skeletonChunk.getSkeletonType()) { case ChunkType.FourDoors: chunks = fourDoorsChunks; break; case ChunkType.ThreeDoors: chunks = threeDoorsChunks; break; case ChunkType.OneDoor: chunks = oneDoorChunks; break; case ChunkType.OppositeDoors: chunks = oppositeDoorChunks; break; default: chunks = sideDoorChunks; break; } if (mustHaveTrap) { current = getRandomChunkWithTrap(chunks); } else { current = getRandomChunk(chunks); } MapChunk newGO = Instantiate(current); newGO.name = String.Format("dungeon-{0}-{1}", i, j); newGO.transform.parent = transform; newGO.transform.localPosition = new Vector3(i * 3, j * 3, 0); newGO.RotateToMatch(skeletonChunk.doors); map[i, j] = newGO; if (newGO.isTrap) { trapCount++; } itemsAvailable += newGO.itemsAvailable(); }
private DungeonSkeletonChunk createSkeletonChunk(int x, int y) { bool[] doorsNeeded = { false, false, false, false }; bool[] doorsNotAllowed = { false, false, false, false }; DungeonSkeletonChunk neighbour; if (x + 1 >= mapSize) { doorsNotAllowed[0] = true; } else { neighbour = skeleton[x + 1, y]; if (neighbour != null) { if (neighbour.doors[2]) { doorsNeeded[0] = true; } else { doorsNotAllowed[0] = true; } } } if (y + 1 >= mapSize) { doorsNotAllowed[1] = true; } else { neighbour = skeleton[x, y + 1]; if (neighbour != null) { if (neighbour.doors[3]) { doorsNeeded[1] = true; } else { doorsNotAllowed[1] = true; } } } if (x - 1 < 0) { doorsNotAllowed[2] = true; } else { neighbour = skeleton[x - 1, y]; if (neighbour != null) { if (neighbour.doors[0]) { doorsNeeded[2] = true; } else { doorsNotAllowed[2] = true; } } } if (y - 1 < 0) { doorsNotAllowed[3] = true; } else { neighbour = skeleton[x, y - 1]; if (neighbour != null) { if (neighbour.doors[1]) { doorsNeeded[3] = true; } else { doorsNotAllowed[3] = true; } } } skeleton[x, y] = new DungeonSkeletonChunk(doorsNeeded, doorsNotAllowed, x, y); return(skeleton[x, y]); }
private void buildDungeonSkeleton() { List <DungeonSkeletonChunk> frontier = new List <DungeonSkeletonChunk>(); int chunkCount = 0; while (chunkCount < mapSize * mapSize) { if (chunkCount == 0) { skeleton[0, 0] = new DungeonSkeletonChunk(new bool[] { false, false, false, false }, new bool[] { false, false, true, true }, 0, 0); frontier.Add(skeleton[0, 0]); chunkCount++; } else { for (int i = 0; i < mapSize; i++) { for (int j = 0; j < mapSize; j++) { if (skeleton[i, j] == null) { if (i - 1 >= 0 && skeleton[i - 1, j] != null) { skeleton[i - 1, j].doors[0] = true; } else if (j - 1 >= 0 && skeleton[i, j - 1] != null) { skeleton[i, j - 1].doors[1] = true; } else if (i + 1 < mapSize && skeleton[i + 1, j] != null) { skeleton[i + 1, j].doors[2] = true; } else if (j + 1 < mapSize && skeleton[i, j + 1] != null) { skeleton[i, j + 1].doors[3] = true; } frontier.Add(createSkeletonChunk(i, j)); chunkCount++; } } } } while (frontier.Count > 0) { DungeonSkeletonChunk chunk = frontier[0]; frontier.RemoveAt(0); int x, y; for (int i = 0; i < 4; i++) { if (chunk.doors[i]) { switch (i) { case 0: x = chunk.x + 1; y = chunk.y; break; case 1: x = chunk.x; y = chunk.y + 1; break; case 2: x = chunk.x - 1; y = chunk.y; break; default: x = chunk.x; y = chunk.y - 1; break; } if (skeleton[x, y] == null) { frontier.Add(createSkeletonChunk(x, y)); chunkCount++; } } } } } }