protected override void Start() { base.Start(); Debug.Assert(_config is AgentConfig); _agentConfig = _config as AgentConfig; gameObject.name = _agentConfig.name; for (int traitType = 0; traitType < (int)DesireType.COUNT; traitType++) { _desires[traitType] = new Desire((DesireType)traitType); } foreach (Trait trait in _agentConfig.Traits) { foreach (Desire.Modifier modifier in trait.DesireModifiers) { _desires[(int)modifier.ToModify].ApplyModifier(modifier); } AvailableBehaviours |= trait.SpecialBehaviours; } PushState(StateFactory.GetDefaultState(_agentConfig.DefaultState, this)); _debugUI = HUD.Instance.CreateMenu <AgentDebugUI>(); _debugUI.Setup(this); _conversation = GetComponent <Conversation>(); Health.OnDamaged += OnTakeDamage; Inventory.OnGetCurrency += OnAcquireCurrency; Inventory.OnLoseCurrency += OnLoseCurrency; }
public void PushState(StateConfig config) { Debug.Assert(config != null); State previousActiveState = Current; State state = StateFactory.GetState(config); switch (config.Priority) { case StatePriority.Immediate: _immediate.Push(state); break; case StatePriority.Normal: _normal.Push(state); break; case StatePriority.LongTerm: _longTerm.Push(state); break; default: Debug.LogError("Invalid priority on state " + config.StateType); break; } //If we've swapped what state is active, notify the states if (Current == state) { previousActiveState?.OnDisable(); state.OnEnable(); } }
private void CheckSpecialistStates() { for (int state = 0; state < StateFactory.NumSpecialistStates - 1; state++) { SpecialistStates specialistState = (SpecialistStates)(1 << state); if (specialistState != SpecialistStates.INVALID && AvailableBehaviours.HasFlag(specialistState) && StateFactory.ShouldEnterState(this, specialistState, out StateConfig config)) { PushState(config); } } }