예제 #1
0
        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;
        }
예제 #2
0
        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();
            }
        }
예제 #3
0
        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);
                }
            }
        }