예제 #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, 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));
        }
예제 #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));
        }
 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);
             }
         }
     }
 }