public override NavyTaskEvaluation ComputeFitness(BaseNavyArmy navyGarrison)
    {
        NavyTaskEvaluation navyTaskEvaluation = new NavyTaskEvaluation();

        navyTaskEvaluation.Fitness = new HeuristicValue(0f);
        navyTaskEvaluation.Task    = this;
        if (navyGarrison.Garrison.GetPropertyValue(SimulationProperties.CityDefensePointLossPerTurn) <= 0f)
        {
            navyTaskEvaluation.Fitness.Value = -1f;
            navyTaskEvaluation.Fitness.Log("Avoid using army without fortification damage.", new object[0]);
        }
        else
        {
            navyTaskEvaluation.Fitness.Add(1f, "(constant)", new object[0]);
            float propertyValue  = this.Target.GetPropertyValue(SimulationProperties.DefensivePower);
            float propertyValue2 = this.Target.GetPropertyValue(SimulationProperties.CoastalDefensivePower);
            if (propertyValue + propertyValue2 > 0f)
            {
                float num = (propertyValue + propertyValue2) / (float)navyGarrison.Garrison.UnitsCount;
                using (IEnumerator <Unit> enumerator = navyGarrison.Garrison.Units.GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        if (enumerator.Current.GetPropertyValue(SimulationProperties.Health) - num < num * 2f)
                        {
                            navyTaskEvaluation.Fitness.Subtract(0.2f, "(constant) Retaliation will kill units.", new object[0]);
                        }
                    }
                }
            }
            float numberOfTurnToReach = (float)this.worldPositionService.GetDistance(navyGarrison.Garrison.WorldPosition, this.Target.WorldPosition) / navyGarrison.GetMaximumMovement();
            navyTaskEvaluation.Fitness.Multiply(base.ComputeDistanceFitness(numberOfTurnToReach, navyGarrison.Role), "Distance", new object[0]);
        }
        return(navyTaskEvaluation);
    }
Beispiel #2
0
 protected override void FilterTasks()
 {
     base.TaskEvaluations.Clear();
     if (base.Garrison.CurrentUnitSlot > 0 && base.Commander != null)
     {
         for (int i = 0; i < this.navyLayer.NavyTasks.Count; i++)
         {
             if (this.navyLayer.NavyTasks[i].CheckValidity())
             {
                 NavyTaskEvaluation navyTaskEvaluation = this.navyLayer.NavyTasks[i].ComputeFitness(this);
                 if (base.CurrentMainTask == this.navyLayer.NavyTasks[i] || this.navyLayer.NavyTasks[i].AssignedArmy == this)
                 {
                     navyTaskEvaluation.Fitness.Boost(0.2f, "Already assigned", new object[0]);
                 }
                 base.TaskEvaluations.Add(navyTaskEvaluation);
             }
         }
     }
 }