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)); }
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))); }
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)); }
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)); }
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)); }