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, GameUnit otherUnit) { var partyNeedsHealingUtilityKey = new UtilityKey(UtilityVariableTypes.PartyLowHealth, otherUnit.Unit.Id); var dependentUtilityId = new UtilityKey(UtilityVariableTypes.HasLowHealth); return(new ExternalUtilityBasedConsideration(partyNeedsHealingUtilityKey, dependentUtilityId, () => otherUnit.Agent.UtilityVariables)); }
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 void RemoveUnitConsiderationsFor(int unitId) { foreach (var agent in Level.GameUnits.Select(x => x.Agent)) { foreach (var utilityId in AssociatedUnitUtilityIds) { var utilityKey = new UtilityKey(utilityId, unitId); if (agent.UtilityVariables.ContainsKey(utilityKey)) { agent.ConsiderationHandler.RemoveConsideration(utilityKey); } } } }