public bool Test(IActor actor, ILogicState currentState, ILogicStrategyData strategyData)
        {
            if (actor is null)
            {
                throw new System.ArgumentNullException(nameof(actor));
            }

            if (currentState is null)
            {
                throw new System.ArgumentNullException(nameof(currentState));
            }

            if (strategyData is null)
            {
                throw new System.ArgumentNullException(nameof(strategyData));
            }

            var hpStat      = actor.Person.GetModule <ISurvivalModule>().Stats.SingleOrDefault(x => x.Type == SurvivalStatType.Health);
            var hpStatCoeff = (float)hpStat.Value / (hpStat.Range.Max - hpStat.Range.Min);
            var isLowHp     = hpStatCoeff <= 0.5f;

            if (!isLowHp)
            {
                return(false);
            }

            //

            var props        = actor.Person.GetModule <IInventoryModule>().CalcActualItems();
            var resources    = props.OfType <Resource>();
            var bestResource = ResourceFinder.FindBestConsumableResourceByRule(resources,
                                                                               ConsumeCommonRuleType.Health);

            if (bestResource == null)
            {
                return(false);
            }

            return(true);
        }
Пример #2
0
        public bool Test(IActor actor, ILogicState currentState, ILogicStrategyData strategyData)
        {
            if (actor is null)
            {
                throw new System.ArgumentNullException(nameof(actor));
            }

            if (currentState is null)
            {
                throw new System.ArgumentNullException(nameof(currentState));
            }

            if (strategyData is null)
            {
                throw new System.ArgumentNullException(nameof(strategyData));
            }

            var hazardEffect = actor.Person.GetModule <IEffectsModule>().Items.OfType <SurvivalStatHazardEffect>()
                               .SingleOrDefault(x => x.Type == SurvivalStatType.Hydration);

            if (hazardEffect == null)
            {
                return(false);
            }

            //

            var props        = actor.Person.GetModule <IInventoryModule>().CalcActualItems();
            var resources    = props.OfType <Resource>();
            var bestResource = ResourceFinder.FindBestConsumableResourceByRule(resources,
                                                                               ConsumeCommonRuleType.Thirst);

            if (bestResource == null)
            {
                return(false);
            }

            return(true);
        }
        public bool Test(IActor actor, ILogicState currentState, ILogicStrategyData strategyData)
        {
            var currentInventoryEquipments = actor.Person.Inventory.CalcActualItems().OfType <Equipment>();

            for (int i = 0; i < actor.Person.EquipmentCarrier.Slots.Length; i++)
            {
                var slot    = actor.Person.EquipmentCarrier.Slots[i];
                var equiped = actor.Person.EquipmentCarrier[i];
                if (equiped == null)
                {
                    var availableEquipments = currentInventoryEquipments
                                              .Where(x => (x.Scheme.Equip.SlotTypes[0] & slot.Types) > 0);

                    if (availableEquipments.Any())
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Пример #4
0
        public bool Test(IActor actor, ISectorTaskSourceContext context, ILogicState currentState,
                         ILogicStrategyData strategyData)
        {
            if (actor is null)
            {
                throw new System.ArgumentNullException(nameof(actor));
            }

            if (currentState is null)
            {
                throw new System.ArgumentNullException(nameof(currentState));
            }

            if (strategyData is null)
            {
                throw new System.ArgumentNullException(nameof(strategyData));
            }

            var currentInventoryEquipments =
                actor.Person.GetModule <IInventoryModule>().CalcActualItems().OfType <Equipment>();

            for (int i = 0; i < actor.Person.GetModule <IEquipmentModule>().Slots.Length; i++)
            {
                var slot    = actor.Person.GetModule <IEquipmentModule>().Slots[i];
                var equiped = actor.Person.GetModule <IEquipmentModule>()[i];
                if (equiped == null)
                {
                    var availableEquipments = currentInventoryEquipments
                                              .Where(x => (x.Scheme.Equip.SlotTypes[0] & slot.Types) > 0);

                    if (availableEquipments.Any())
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
        public bool Test(IActor actor, ISectorTaskSourceContext context, ILogicState currentState,
                         ILogicStrategyData strategyData)
        {
            if (actor is null)
            {
                throw new ArgumentNullException(nameof(actor));
            }

            if (context is null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (currentState is null)
            {
                throw new ArgumentNullException(nameof(currentState));
            }

            if (strategyData is null)
            {
                throw new ArgumentNullException(nameof(strategyData));
            }

            var map          = context.Sector.Map;
            var actorManager = context.Sector.ActorManager;

            var nearbyIntruder = IntruderDetectionHelper.GetIntruder(actor, map, actorManager);

            // Remember last intruder for logic with will handle reaction.
            strategyData.TriggerIntuder = nearbyIntruder;

            if (nearbyIntruder is null)
            {
                return(false);
            }

            return(true);
        }
Пример #6
0
        private bool SelectCurrentState(ILogicState currentState, out ILogicState newState)
        {
            var transitionWasPerformed = false;

            newState = null;

            var currentStateTransitions = _stateTree.Transitions[CurrentState];

            foreach (var transition in currentStateTransitions)
            {
                var trigger = transition.Trigger;

                var isFired = trigger.Test(Actor, currentState, _strategyData);
                if (isFired)
                {
                    newState = transition.NextState;
                    transitionWasPerformed = true;
                    break;
                }
            }

            return(transitionWasPerformed);
        }
Пример #7
0
        public IActorTask GetActorTask()
        {
            // Для текущего состояния проверяем каждый из переходов.
            // Если переход выстреливает, то генерируем задачу актёру.
            // Алгоритм делится на два этапа:
            // 1. Для текущей логики проверяются все триггеры по порядку. Если какой-то триггер выстреливает, то связанная
            // через переход логика фиксируется, как текущая. За одну итерацию может быть только один переход.
            // 2. Получаем задачу из текущей логики. Если текущая логика возвращает пустую задачу - значит
            // переводим её в соответствующее состояние и ждём перехода из неё с помощью триггеров (этап 1).
            // Второй пункт означает, что каждая логика обязана выдавать хотя бы пустую задачу, если она
            // не может выполниться. И выставлять себе статус выполненной. В дереве состояний нужно следить за тем, чтобы
            // все логики имели триггер на окончание с переходом на какую-либо задачу.

            // После окончания всех проверок триггеров выполняется обновление состояния триггеров. Некоторые триггеры
            // могут иметь счётчики или логику, которая выполняется при каждой итерации (считай, каждый ход).

            var transitionWasPerformed = SelectCurrentState(CurrentState, out var newState);

            if (transitionWasPerformed)
            {
                if (WriteStateChanges)
                {
                    Console.WriteLine(newState);
                }

                CurrentState = newState;
                ResetLogicStates(_stateTree);
            }

            var actorTask       = CurrentState.GetTask(Actor, _strategyData);
            var currentTriggers = _stateTree.Transitions[CurrentState].Select(x => x.Trigger);

            UpdateCurrentTriggers(currentTriggers);

            return(actorTask);
        }
        public bool Test(IActor actor, ILogicState currentState, ILogicStrategyData strategyData)
        {
            var hazardEffect = actor.Person.Effects.Items.OfType <SurvivalStatHazardEffect>()
                               .SingleOrDefault(x => x.Type == SurvivalStatType.Water);

            if (hazardEffect == null)
            {
                return(false);
            }

            //

            var props        = actor.Person.Inventory.CalcActualItems();
            var resources    = props.OfType <Resource>();
            var bestResource = ResourceFinder.FindBestConsumableResourceByRule(resources,
                                                                               ConsumeCommonRuleType.Thirst);

            if (bestResource == null)
            {
                return(false);
            }

            return(true);
        }
Пример #9
0
        public bool Test(IActor actor, ILogicState currentState, ILogicStrategyData strategyData)
        {
            if (actor is null)
            {
                throw new System.ArgumentNullException(nameof(actor));
            }

            if (currentState is null)
            {
                throw new System.ArgumentNullException(nameof(currentState));
            }

            if (strategyData is null)
            {
                throw new System.ArgumentNullException(nameof(strategyData));
            }

            var containers      = _sectorManager.CurrentSector.StaticObjectManager.Items.Where(x => x.HasModule <IPropContainer>());
            var foundContainers = LootHelper.FindAvailableContainers(containers,
                                                                     actor.Node,
                                                                     _map);

            return(foundContainers.Any());
        }
 protected abstract bool TestInner(
     IActor actor,
     ISectorTaskSourceContext context,
     ILogicState currentState,
     ILogicStrategyData strategyData);
Пример #11
0
 public LogicTransition(ILogicStateTrigger trigger, ILogicState nextState)
 {
     Trigger   = trigger ?? throw new ArgumentNullException(nameof(trigger));
     NextState = nextState ?? throw new ArgumentNullException(nameof(nextState));
 }
Пример #12
0
 public bool Test(IActor actor, ISectorTaskSourceContext context, ILogicState currentState,
                  ILogicStrategyData strategyData)
 {
     return(CounterIsOver);
 }
Пример #13
0
 public bool Test(IActor actor, ILogicState currentState, ILogicStrategyData strategyData)
 {
     return(CounterIsOver);
 }
Пример #14
0
 protected abstract bool TestInner(
     [NotNull] IActor actor,
     [NotNull] ISectorTaskSourceContext context,
     [NotNull] ILogicState currentState,
     [NotNull] ILogicStrategyData strategyData);
Пример #15
0
        protected override bool TestInner(IActor actor, ISectorTaskSourceContext context, ILogicState currentState,
                                          ILogicStrategyData strategyData)
        {
            var taskContext = new ActorTaskContext(context.Sector);

            return(SurvivalHazardTriggerHelper.TestHazardAndResource(
                       actor,
                       taskContext,
                       strategyData,
                       SurvivalStatType.Satiety,
                       ConsumeCommonRuleType.Satiety));
        }
Пример #16
0
        public bool Test(IActor actor, ILogicState currentState, ILogicStrategyData strategyData)
        {
            var allNodesObserved = _map.Nodes.All(x => strategyData.ObserverdNodes.Contains(x));

            return(allNodesObserved);
        }
 protected override bool TestInner(IActor actor, ISectorTaskSourceContext context, ILogicState currentState,
                                   ILogicStrategyData strategyData)
 {
     return(SurvivalHazardTriggerHelper.TestHazardAndResource(actor, strategyData, SurvivalStatType.Hydration,
                                                              ConsumeCommonRuleType.Thirst));
 }
Пример #18
0
 public LogicStateTrack(ILogicState logic, ILogicStateTrigger firedTrigger)
 {
     Logic        = logic ?? throw new ArgumentNullException(nameof(logic));
     FiredTrigger = firedTrigger;
 }
Пример #19
0
 public bool Test(IActor actor, ILogicState currentState, ILogicStrategyData strategyData)
 {
     return(currentState.Complete);
 }