Esempio n. 1
0
    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);
 }
Esempio n. 4
0
    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);
                        }
                    }
                }
            }
        }
    }
Esempio n. 5
0
    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();
            }
        }
    }