예제 #1
0
        public override IConsideration CreateConsideration(IAgent agent, GameUnit otherUnit)
        {
            var distanceUtilityKey = new UtilityKey(UtilityVariableTypes.AllyDistance, otherUnit.Unit.Id);
            var distanceAccessor   = new ManualValueAccessor((context, _) => Vector2.Distance(otherUnit.Unit.Position, (context as Unit).Position));

            return(new ValueBasedConsideration(distanceUtilityKey, distanceAccessor, DistanceClamper, PresetCurves.QuadraticLowerLeft));
        }
        public override IConsideration CreateConsideration(IAgent agent)
        {
            var healthValueAccessor = new ManualValueAccessor((unit, _) => (unit as Unit).Stats.Health());
            var healthClamper       = new DynamicClamper(() => 0, () => agent.GetOwnerUnit().Stats.MaxHealth());

            return(new ValueBasedConsideration(new UtilityKey(UtilityVariableTypes.HasLowHealth), healthValueAccessor, healthClamper, PresetCurves.InverseLinear));
        }
예제 #3
0
        public override IConsideration CreateConsideration(IAgent agent, GameUnit otherUnit)
        {
            var enemyLowHealth     = new UtilityKey(UtilityVariableTypes.EnemyLowHealth, otherUnit.Unit.Id);
            var dependentUtilityId = new UtilityKey(UtilityVariableTypes.HasLowHealth);
            var healthAccessor     = new ManualValueAccessor((_, _) => otherUnit.Agent.UtilityVariables.GetVariable(dependentUtilityId));

            return(new ValueBasedConsideration(enemyLowHealth, healthAccessor, PresetClampers.Passthrough, PresetCurves.Linear.Alter(yShift: 0.1f)));
        }
예제 #4
0
        public override IConsideration CreateConsideration(IAgent agent, GameUnit otherUnit)
        {
            var isDangerUtilityKey      = new UtilityKey(UtilityVariableTypes.IsADanger, otherUnit.Unit.Id);
            var enemyDistanceUtilityKey = new UtilityKey(UtilityVariableTypes.EnemyDistance, otherUnit.Unit.Id);
            var isADangerAccessor       = new ManualValueAccessor((_, variables) =>
            {
                var distanceUtility = variables.GetVariable(enemyDistanceUtilityKey);
                var powerfulUtility = otherUnit.Agent.UtilityVariables.GetVariable(new UtilityKey(UtilityVariableTypes.IsPowerful));
                return(UtilityExtensions.CalculateScore(distanceUtility, powerfulUtility));
            });

            return(new ValueBasedConsideration(isDangerUtilityKey, isADangerAccessor, PresetClampers.Passthrough, PresetCurves.PassThrough));
        }
예제 #5
0
        public override IConsideration CreateConsideration(IAgent agent)
        {
            var dangerAccessor = new ManualValueAccessor((_, variables) =>
            {
                var maxDanger = variables
                                .GetRelatedUtilities(UtilityVariableTypes.IsADanger)
                                .Select(x => x.Value)
                                .DefaultIfEmpty(0)
                                .Max();

                var unitPower = variables.GetVariable(new UtilityKey(UtilityVariableTypes.IsPowerful));

                var actualDanger = maxDanger - unitPower;
                return(actualDanger.SanitizeAndClamp());
            });

            return(new ValueBasedConsideration(new UtilityKey(UtilityVariableTypes.IsInDanger), dangerAccessor, PresetClampers.Passthrough, PresetCurves.PassThrough));
        }
예제 #6
0
        public override IEnumerable <IConsideration> CreateConsiderations(IAgent agent)
        {
            foreach (var ability in agent.GetOwnerUnit().ActiveAbilities)
            {
                if (ability.IsPassive || ability.DamageType == DamageTypes.LightDamage)
                {
                    continue;
                }

                var abilityHandler       = AbilityHandlerRepository.Retrieve(ability.Id);
                var attackOutputAccessor = new ManualValueAccessor((context, _) =>
                {
                    var unit   = context as Unit;
                    var attack = abilityHandler.CalculateAttack(unit);
                    return(attack.Damages.Sum(x => x.Value));
                });

                var modifiers = !ability.Shape.Equals(ShapePresets.Empty) ?
                                new[] { new HasEnemiesInShapeModifier(Level, ability.Shape) } :
                Array.Empty <IValueModifier>();

                yield return(new ValueBasedConsideration(new UtilityKey(UtilityVariableTypes.IsAbilityDamaging, ability.Id), attackOutputAccessor, DamageClamper, PresetCurves.Linear, modifiers));
            }
        }
        public override IConsideration CreateConsideration(IAgent agent)
        {
            var defenseOutputAccessor = new ManualValueAccessor((context, _) => (context as Unit).Stats.GetDefenseReferences().Sum(x => x.StatValue));

            return(new ValueBasedConsideration(new UtilityKey(UtilityVariableTypes.IsDefensive), defenseOutputAccessor, DefenseClamper, PresetCurves.Linear));
        }