Beispiel #1
0
    void Update()
    {
#if UNITY_EDITOR
        if (Input.GetKeyDown(KeyCode.K))
        {
            playing = false;
            if (NodeEditorFramework.Standard.WinSiegeCondition.OnSiegeWin != null)
            {
                NodeEditorFramework.Standard.WinSiegeCondition.OnSiegeWin.Invoke(sectorName);
            }

            Debug.Log("Victory!");
            return;
        }
#endif

        if (playing && enabled)
        {
            timer += Time.deltaTime;
            entitiesToRemove.Clear();
            entitiesRemainingToRemove.Clear();

            if ((current == null || (current.entities.Count == 0 && entitiesRemaining.Count == 0)))
            {
                if (waves.Count > 0)
                {
                    entitiesRemaining.Clear();
                    current = waves.Dequeue();
                    waveCount++;
                    AlertPlayers($"WAVE {waveCount}/{(waves.Count + waveCount)}");
                    timer = 0;
                }
                else if ((current.entities.Count == 0 && entitiesRemaining.Count == 0))
                {
                    playing = false;
                    if (NodeEditorFramework.Standard.WinSiegeCondition.OnSiegeWin != null)
                    {
                        NodeEditorFramework.Standard.WinSiegeCondition.OnSiegeWin.Invoke(sectorName);
                    }

                    Debug.Log("Victory!");
                    return;
                }
            }

            // Debug.Log(current.entities.Count + " - " + entitiesRemaining.Count);

            foreach (var ent in current.entities)
            {
                if (timer >= ent.timeSinceWaveStartToSpawn)
                {
                    if (!AIData.flags.Exists((f) => f.name == ent.flagName))
                    {
                        Debug.LogError("<SiegeZoneManager> Invalid flag name.");
                        continue;
                    }

                    ent.entity.position = AIData.flags.Find((f) => f.name == ent.flagName).transform.position;
                    var sectorEntity = SectorManager.instance.SpawnEntity(SectorManager.GetBlueprintOfLevelEntity(ent.entity), ent.entity);
                    if (sectorEntity as Drone || sectorEntity as ShellCore)
                    {
                        Path path = ScriptableObject.CreateInstance <Path>();
                        path.waypoints = new List <Path.Node>();
                        Path.Node node           = new Path.Node();
                        var       currentTargets = targets.FindAll(targ => targ && !FactionManager.IsAllied(sectorEntity.faction, targ.faction));
                        if (currentTargets.Count > 0)
                        {
                            node.position = currentTargets[Random.Range(0, currentTargets.Count)].transform.position;
                        }
                        else if (players.Count > 0)
                        {
                            node.position = players[Random.Range(0, players.Count)].transform.position;
                        }

                        node.children = new List <int>();
                        path.waypoints.Add(node);

                        (sectorEntity as AirCraft).GetAI().setPath(path);
                    }

                    entitiesToRemove.Add(ent);
                    if (!FactionManager.IsAllied(sectorEntity.faction, players[0].faction))
                    {
                        entitiesRemaining.Add(sectorEntity);
                    }
                }
            }

            foreach (var ent in entitiesToRemove)
            {
                current.entities.Remove(ent);
            }


            foreach (var ent in entitiesRemaining)
            {
                if (ent.GetIsDead())
                {
                    entitiesRemainingToRemove.Add(ent);
                }
            }

            foreach (var ent in entitiesRemainingToRemove)
            {
                entitiesRemaining.Remove(ent);
            }
        }
    }