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; }
private static SpecialistState GetReferenceState(SpecialistStates state) { switch (state) { case SpecialistStates.Steal: return(new StealState()); case SpecialistStates.Justice: return(new ServeJusticeState()); case SpecialistStates.Flee: return(new FleeState()); case SpecialistStates.Defend: return(new DefendState()); case SpecialistStates.Mine: return(new MineCurrencyState()); case SpecialistStates.INVALID: default: Debug.Assert(false, "Can't get reference state for " + state); return(null); } }
public static bool ShouldEnterState(AgentController owner, SpecialistStates state, out StateConfig config) { Debug.Assert(state != SpecialistStates.INVALID); int idx = Array.FindIndex((SpecialistStates[])Enum.GetValues(typeof(SpecialistStates)), x => x == state) - 1; //-1 to account for SpecialistStates.INVALID return(_referenceSpecialistStates[idx].ShouldRunState(owner, out config)); }
static StateFactory() { for (int idx = 0; idx < NumSpecialistStates - 1; idx++) { SpecialistStates state = (SpecialistStates)(1 << idx); if (state != SpecialistStates.INVALID) { _referenceSpecialistStates[idx] = GetReferenceState(state); } } }
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); } } }