private void ComputeOpportunityScore_Orbs(BaseNavyArmy army) { NavyArmy navyArmy = army as NavyArmy; if (navyArmy == null) { return; } IOrbAIHelper service = AIScheduler.Services.GetService <IOrbAIHelper>(); for (int i = 0; i < service.OrbSpawns.Count; i++) { OrbSpawnInfo orbSpawnInfo = service.OrbSpawns[i]; if (orbSpawnInfo != null && orbSpawnInfo.CurrentOrbCount != 0f) { HeuristicValue heuristicValue = orbSpawnInfo.EmpireNeedModifier[army.Garrison.Empire.Index]; if (heuristicValue > 0f) { float num = this.ComputeOpportunityTurnOverhead(army, orbSpawnInfo.WorldPosition); if ((army.CurrentMainTask == null || this.IsDetourWorthChecking(army, num)) && this.worldPositionService.IsOceanTile(orbSpawnInfo.WorldPosition) && this.IsCloseEnoughToOrigin(army, orbSpawnInfo.WorldPosition, 1f)) { HeuristicValue heuristicValue2 = new HeuristicValue(0f); heuristicValue2.Add(heuristicValue, "Orb position eval", new object[0]); float orbDistanceExponent = service.GetOrbDistanceExponent(army.Garrison.Empire); HeuristicValue heuristicValue3 = new HeuristicValue(0f); heuristicValue3.Add(num, "Nb turn added by opportunity", new object[0]); heuristicValue3.Power(orbDistanceExponent, "From xml registry", new object[0]); heuristicValue3.Add(1f, "avoid divide by 0", new object[0]); heuristicValue2.Divide(heuristicValue3, "DistanceFactor", new object[0]); navyArmy.Opportunities.Add(new BehaviorOpportunity { OpportunityPosition = orbSpawnInfo.WorldPosition, Score = heuristicValue2, Type = BehaviorOpportunity.OpportunityType.Orbs }); } } } } }