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); }
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); }
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); }
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); }
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); }
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);
public LogicTransition(ILogicStateTrigger trigger, ILogicState nextState) { Trigger = trigger ?? throw new ArgumentNullException(nameof(trigger)); NextState = nextState ?? throw new ArgumentNullException(nameof(nextState)); }
public bool Test(IActor actor, ISectorTaskSourceContext context, ILogicState currentState, ILogicStrategyData strategyData) { return(CounterIsOver); }
public bool Test(IActor actor, ILogicState currentState, ILogicStrategyData strategyData) { return(CounterIsOver); }
protected abstract bool TestInner( [NotNull] IActor actor, [NotNull] ISectorTaskSourceContext context, [NotNull] ILogicState currentState, [NotNull] ILogicStrategyData strategyData);
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)); }
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)); }
public LogicStateTrack(ILogicState logic, ILogicStateTrigger firedTrigger) { Logic = logic ?? throw new ArgumentNullException(nameof(logic)); FiredTrigger = firedTrigger; }
public bool Test(IActor actor, ILogicState currentState, ILogicStrategyData strategyData) { return(currentState.Complete); }