Example #1
0
 public override float GetPriority()
 {
     if (!IsAllowed)
     {
         Priority = 0;
         return(Priority);
     }
     if (Leak.Removed || Leak.Open <= 0)
     {
         Priority = 0;
     }
     else
     {
         float xDist = Math.Abs(character.WorldPosition.X - Leak.WorldPosition.X);
         float yDist = Math.Abs(character.WorldPosition.Y - Leak.WorldPosition.Y);
         // Vertical distance matters more than horizontal (climbing up/down is harder than moving horizontally).
         // If the target is close, ignore the distance factor alltogether so that we keep fixing the leaks that are nearby.
         float distanceFactor = IgnoreSeverityAndDistance || xDist < 200 && yDist < 100 ? 1 : MathHelper.Lerp(1, 0.1f, MathUtils.InverseLerp(0, 5000, xDist + yDist * 3.0f));
         float severity       = IgnoreSeverityAndDistance ? 1 : AIObjectiveFixLeaks.GetLeakSeverity(Leak) / 100;
         float max            = Math.Min((AIObjectiveManager.OrderPriority - 1), 90);
         float devotion       = CumulatedDevotion / 100;
         Priority = MathHelper.Lerp(0, max, MathHelper.Clamp(devotion + (severity * distanceFactor * PriorityModifier), 0, 1));
     }
     return(Priority);
 }
Example #2
0
 public override float GetPriority()
 {
     if (!IsAllowed)
     {
         Priority = 0;
         Abandon  = true;
     }
     else if (HumanAIController.IsTrueForAnyCrewMember(other => other != HumanAIController && other.Character.IsBot && other.ObjectiveManager.GetActiveObjective <AIObjectiveFixLeak>()?.Leak == Leak))
     {
         Priority = 0;
         Abandon  = true;
     }
     else
     {
         float xDist = Math.Abs(character.WorldPosition.X - Leak.WorldPosition.X);
         float yDist = Math.Abs(character.WorldPosition.Y - Leak.WorldPosition.Y);
         // Vertical distance matters more than horizontal (climbing up/down is harder than moving horizontally).
         // If the target is close, ignore the distance factor alltogether so that we keep fixing the leaks that are nearby.
         float distanceFactor = isPriority || xDist < 200 && yDist < 100 ? 1 : MathHelper.Lerp(1, 0.1f, MathUtils.InverseLerp(0, 3000, xDist + yDist * 3.0f));
         float severity       = isPriority ? 1 : AIObjectiveFixLeaks.GetLeakSeverity(Leak) / 100;
         float reduction      = isPriority ? 1 : 2;
         float max            = AIObjectiveManager.LowestOrderPriority - reduction;
         float devotion       = CumulatedDevotion / 100;
         Priority = MathHelper.Lerp(0, max, MathHelper.Clamp(devotion + (severity * distanceFactor * PriorityModifier), 0, 1));
     }
     return(Priority);
 }
Example #3
0
        public override float GetPriority()
        {
            if (Leak.Open == 0.0f)
            {
                return(0.0f);
            }
            // Vertical distance matters more than horizontal (climbing up/down is harder than moving horizontally)
            float dist           = Math.Abs(character.WorldPosition.X - Leak.WorldPosition.X) + Math.Abs(character.WorldPosition.Y - Leak.WorldPosition.Y) * 2.0f;
            float distanceFactor = MathHelper.Lerp(1, 0.25f, MathUtils.InverseLerp(0, 10000, dist));
            float severity       = AIObjectiveFixLeaks.GetLeakSeverity(Leak);
            float max            = Math.Min((AIObjectiveManager.OrderPriority - 1), 90);
            float devotion       = Math.Min(Priority, 10) / 100;

            return(MathHelper.Lerp(0, max, MathHelper.Clamp(devotion + severity * distanceFactor * PriorityModifier, 0, 1)));
        }
Example #4
0
        public override void CalculateGlobalIssue()
        {
            hullSeverities.Clear();

            foreach (Gap gap in Gap.GapList)
            {
                if (AIObjectiveFixLeaks.IsValidTarget(gap, shipCommandManager.character))
                {
                    hullSeverities.Add(AIObjectiveFixLeaks.GetLeakSeverity(gap));
                }
            }

            float averagePercentage = 0f;

            if (hullSeverities.Any())
            {
                hullSeverities.Sort();
                averagePercentage = hullSeverities.TakeLast(3).Average(); // get the 3 most damaged items on the ship and get their average
            }
            GlobalImportance = averagePercentage;
        }