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