// 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; }
//------------------------------------------ #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)); } } }