private Node DFSSearch(System.Func <int, bool> predicate, List <int> foundNodes, Node currentNode, int depth) { foundNodes.Add(currentNode.id); if (predicate(depth)) { return(currentNode); } if (depth > 400) { Debug.Log("There is a problem"); return(null); } for (int i = 0; i < currentNode.connectedNodes.Length; i++) { bool isOnFire = (currentNode.connectedNodes[i].payload as RoomInformation).IsOnFire; NavMeshEntrance entranceToConnectedRoom = (currentNode.connectedNodes[i].payload as RoomInformation).GetDoorForRoom(currentNode.payload as RoomInformation); bool isPassable = true;//entranceToConnectedRoom != null ? entranceToConnectedRoom.IsPassable : true; if (!foundNodes.Contains(currentNode.connectedNodes[i].id) && !isOnFire && isPassable) { return(DFSSearch(predicate, foundNodes, currentNode.connectedNodes[i], ++depth)); } } // Found nothing if ((currentNode.payload as RoomInformation).IsOnFire) { return(null); } else { return(currentNode); } }
public void AddConnectedRoom(RoomInformation containedRoom, NavMeshEntrance randomEntrance) { try { connectedRooms.Add(randomEntrance.ID, containedRoom); } catch (Exception ex) { Debug.Log("Connected Room Failed " + this.name + " to " + containedRoom.name + " from entrance " + randomEntrance.ID); Debug.Log("Error: " + ex.Message); } }
private Vertex FindThirdPointInTriangle(NavMeshEntrance entrance) { for (int j = 0; j < entrance.entrance1.Adjacent.Count; j++) { int adjID = entrance.entrance1.Adjacent[j].ID; for (int k = 0; k < entrance.entrance2.Adjacent.Count; k++) { if (adjID == entrance.entrance2.Adjacent[k].ID) { return(entrance.entrance2.Adjacent[k]); } } } return(null); }
private void Update() { if (afterBurnTimer > 0) { afterBurnTimer -= Time.deltaTime; } if (!isOnFire) { return; } if (fireLifeTimer > 0) { fireLifeTimer -= Time.deltaTime; StepFireForwards(); } else if (burningTris.Count > 0) { for (int i = 0; i < 3; i++) { tris[removedTriangles * 3 + i] = 0; } removedTriangles++; availableDoorTriangles.Remove(burningTris[0]); burningTris.RemoveAt(0); if (burningTris.Count == 0) { particleSystem.Stop(); smokeParticleSystem.Stop(); mesh.triangles = tris; var sh = particleSystem.shape; sh.shapeType = ParticleSystemShapeType.Sphere; sh = smokeParticleSystem.shape; sh.shapeType = ParticleSystemShapeType.Sphere; burningTris.Clear(); removedTriangles = 0; isOnFire = false; afterBurnTimer = afterBurnTime; } else { mesh.triangles = tris; var sh = particleSystem.shape; sh.mesh = mesh; sh = smokeParticleSystem.shape; sh.mesh = mesh; } } if (availableDoorTriangles.Count > 0) { for (int i = 0; i < availableDoorTriangles.Count; i++) { for (int j = 0; j < availableDoorTriangles[i].connectedEntranceIDs.Length; j++) { NavMeshEntrance selectedEntrance = room.GetEntrance(availableDoorTriangles[i].connectedEntranceIDs[j]); if (selectedEntrance.connectedEntrance != null && selectedEntrance.IsPassable) { RoomInformation nextRoom = room.GetConnectedRoomFromEntranceWithID(selectedEntrance.ID); if (nextRoom) { nextRoom.StartFire(selectedEntrance.connectedEntrance.connectedTriangle.ID); } } } } } }
private void Update() { if (availableEntrances.Count == 0) { return; } if (roomCounter < numberOfRooms && stopCounter++ > 0) { // Pick a random entrance point int randomEntranceIndex = Random.Range(0, availableEntrances.Count); NavMeshEntrance randomEntrance = availableEntrances[randomEntranceIndex]; // Choose a random generator RoomInformation randomRoomPrefab = GetRandomRoom(); int randomRoomEntranceIndex = Random.Range(0, randomRoomPrefab.GetEntrances.Length); NavMeshEntrance randomRoomEntrance = randomRoomPrefab.GetEntrance(randomRoomEntranceIndex); float angle = Vector3.SignedAngle(randomEntrance.GetRotatedAwayFromDoorDirection(), randomRoomEntrance.GetRotatedAwayFromDoorDirection(), Vector3.up); float amountToRotate = 180 - angle; // Init the random generator RoomInformation room2 = Instantiate <RoomInformation>(randomRoomPrefab, this.transform); List <NavMeshEntrance> newRoomEntrances = new List <NavMeshEntrance>(room2.GetEntrances); NavMeshEntrance room2Entrance = newRoomEntrances[randomRoomEntranceIndex]; room2.transform.RotateAround(room2Entrance.entranceMidPoint.transform.position, Vector3.up, amountToRotate); Vector3 directionToMove = randomEntrance.entranceMidPoint.transform.position - room2Entrance.entranceMidPoint.transform.position; room2.transform.Translate(directionToMove, Space.World); room2.GetRotatedCenter(out cen, out ext); cen += room2.transform.position; if (generationMap.IsRoomSpaceFree(cen, ext)) { generationMap.AddRectangle(cen, ext); generatedRooms.Add(room2); room2.SetID(roomCounter + 1); roomGraph.AddRoom(room2, randomEntrance.generator.containedRoom); newRoomEntrances.RemoveAt(randomRoomEntranceIndex); AddEntrancesToAvailableEntrances(newRoomEntrances, amountToRotate); TraversalEntrance traversalEntranceRoom2 = room2.TraversalGenerator.GetEntrance(room2Entrance.ID); TraversalEntrance traversalEntranceRandomRoom = randomEntrance.generator.containedRoom.TraversalGenerator.GetEntrance(randomEntrance.ID); if (traversalEntranceRoom2 != null) { room2.roomGrid.AddGrid(randomEntrance.generator.containedRoom.roomGrid, traversalEntranceRoom2.ID, traversalEntranceRandomRoom.ID); randomEntrance.generator.containedRoom.roomGrid.AddGrid(room2.GetComponent <Pieter.Grid.RoomGrid>(), traversalEntranceRandomRoom.ID, traversalEntranceRoom2.ID); room2.TraversalGenerator.AddAdjacentNodes(traversalEntranceRoom2.vertex, traversalEntranceRandomRoom.vertex); randomEntrance.generator.containedRoom.TraversalGenerator.AddAdjacentNodes(traversalEntranceRandomRoom.vertex, traversalEntranceRoom2.vertex); room2.AddConnectedRoom(randomEntrance.generator.containedRoom, room2Entrance); randomEntrance.generator.containedRoom.AddConnectedRoom(room2, randomEntrance); room2Entrance.connectedEntrance = randomEntrance; randomEntrance.connectedEntrance = room2Entrance; } else { print("Could not find the door with ID " + room2Entrance.ID + " on the door " + room2.name); } traversalGraphHolder.AddTraversalLines(room2.TraversalGenerator); availableEntrances.RemoveAt(randomEntranceIndex); Physics.SyncTransforms(); roomCounter++; } else { Destroy(room2.gameObject); } } else { if (!didNotify) { didNotify = true; OnDoneLevelGeneration?.Invoke(); traversalGraphHolder.Notify(); } } }