コード例 #1
0
    // Use this for initialization
    void Start()
    {
        if (instance != null)
        {
            Debug.Log("replace AI instance variable");
        }
        instance = this;


        gameStateManager   = new AIGameStateManager(startingData);
        AIBehaviors        = instance.SetupAIList();
        myQueue            = new AIQueue();
        decisionController = new AIAttackDecisionController();
        attackController   = new AIAttackController();
        defendController   = new AIDefendController();

        //assigned to events
        TowerController.TowerConverted   += UpdateAIList;
        TowerController.DeletingInstance += GameStateUnsubscribe;
    }
コード例 #2
0
        //------------------------------------------

        #endregion Properties

        #region Coroutines

        private IEnumerator <float> AICoroutine()
        {
            for (; ;)
            {
                if (AIEnabled)
                {
                    if (CurrentAITarget != null)
                    {
                        bool res = false;
                        try
                        {
                            res = CurrentAITarget.Check(this);
                        }
                        catch (Exception e)
                        {
                            Log.Warn($"AI Target check failure: {e}");
                        }
                        if (res)
                        {
                            float delay   = 0f;
                            bool  failure = false;
                            try
                            {
                                delay = CurrentAITarget.Process(this);
                                for (; SkippedTargets > 0; SkippedTargets--)
                                {
                                    AITarget target = AIQueue.First.Value;
                                    AIQueue.RemoveFirst();
                                    AIQueue.AddLast(target);
                                }
                            }
                            catch (Exception e)
                            {
                                failure = true;
                                Log.Warn($"Target processing failure: {e}");
                            }

                            yield return(Timing.WaitForSeconds(delay));

                            if (CurrentAITarget.IsFinished || failure)
                            {
                                CurrentAITarget.IsFinished = false;
                                CurrentAITarget            = null;
                            }
                        }
                        else
                        {
                            CurrentAITarget.IsFinished = false;
                            CurrentAITarget            = null;
                            yield return(Timing.WaitForSeconds(Plugin.Instance.Config.AIIdleUpdateFrequency));
                        }
                    }
                    else
                    {
                        try
                        {
                            if (!AIQueue.IsEmpty())
                            {
                                CurrentAITarget = AIQueue.First.Value;
                                AIQueue.RemoveFirst();
                                AIQueue.AddLast(CurrentAITarget);
                            }
                        }
                        catch (Exception e)
                        {
                            Log.Debug($"Error while scheduling AI target: {e}", Plugin.Instance.Config.VerboseOutput);
                        }
                        yield return(Timing.WaitForSeconds(Plugin.Instance.Config.AIIdleUpdateFrequency));
                    }
                }
                else
                {
                    yield return(Timing.WaitForSeconds(Plugin.Instance.Config.AIIdleUpdateFrequency));
                }
            }
        }