private float ComputeOrbCollectingScore(OrbSpawnInfo orbSpawn, Army army)
 {
     if (orbSpawn.CurrentOrbCount == 0f)
     {
         return(-1f);
     }
     return(orbSpawn.EmpireNeedModifier[army.Empire.Index]);
 }
Example #2
0
 private float ComputeOrbCollectingScore(OrbSpawnInfo orbSpawn, AIEntity_Empire entityEmpire, Army army)
 {
     if (this.DiplomacyLayer != null)
     {
         Region region = this.worldPositionningService.GetRegion(orbSpawn.WorldPosition);
         if (region.Owner != null && region.Owner is MajorEmpire && this.DiplomacyLayer.GetPeaceWish(region.Owner.Index))
         {
             return(-1f);
         }
     }
     return(orbSpawn.EmpireNeedModifier[entityEmpire.Empire.Index]);
 }
Example #3
0
    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
                        });
                    }
                }
            }
        }
    }
Example #4
0
    protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters)
    {
        if (!this.downloadableContentService.IsShared(DownloadableContent13.ReadOnlyName))
        {
            return(State.Failure);
        }
        Army army;

        if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) != AIArmyMission.AIArmyMissionErrorCode.None)
        {
            return(State.Failure);
        }
        if (!(army.Empire is MajorEmpire))
        {
            return(State.Failure);
        }
        if (!string.IsNullOrEmpty(this.OpportunityMaximumTurnName) && aiBehaviorTree.Variables.ContainsKey(this.OpportunityMaximumTurnName))
        {
            this.OpportunityMaximumTurn = (float)aiBehaviorTree.Variables[this.OpportunityMaximumTurnName];
        }
        AIEntity_Empire entity = aiBehaviorTree.AICommander.AIPlayer.GetEntity <AIEntity_Empire>();

        if (this.DiplomacyLayer == null && aiBehaviorTree.AICommander.Empire is MajorEmpire)
        {
            this.DiplomacyLayer = entity.GetLayer <AILayer_Diplomacy>();
        }
        Region      region = this.worldPositionningService.GetRegion(army.WorldPosition);
        bool        flag   = false;
        AIData_Army aidata_Army;

        if (this.aiDataRepositoryHelper.TryGetAIData <AIData_Army>(army.GUID, out aidata_Army))
        {
            flag = aidata_Army.IsManta;
        }
        float        num           = flag ? -1000f : 0.1f;
        float        propertyValue = army.GetPropertyValue(SimulationProperties.MaximumMovement);
        OrbSpawnInfo orbSpawnInfo  = null;

        for (int i = 0; i < this.orbAIHelper.OrbSpawns.Count; i++)
        {
            OrbSpawnInfo orbSpawnInfo2 = this.orbAIHelper.OrbSpawns[i];
            if (orbSpawnInfo2 != null && orbSpawnInfo2.CurrentOrbCount != 0f)
            {
                bool flag2 = this.worldPositionningService.IsWaterTile(orbSpawnInfo2.WorldPosition);
                if (flag || flag2 != !army.IsSeafaring)
                {
                    float num2 = 0.5f;
                    if (entity != null)
                    {
                        num2 = this.ComputeOrbCollectingScore(orbSpawnInfo2, entity, army);
                    }
                    if (num2 > 0f)
                    {
                        Region region2 = this.worldPositionningService.GetRegion(orbSpawnInfo2.WorldPosition);
                        if (flag || region2.ContinentID == region.ContinentID)
                        {
                            float num3 = (float)this.worldPositionningService.GetDistance(army.WorldPosition, orbSpawnInfo2.WorldPosition) / propertyValue;
                            if (num3 <= this.MaximumTurnDistance)
                            {
                                if (flag)
                                {
                                    num2 = -num3 + num2 * 1E-09f;
                                }
                                else
                                {
                                    float orbDistanceExponent = this.orbAIHelper.GetOrbDistanceExponent(entity.Empire);
                                    float num4 = 1f + Mathf.Pow(num3, orbDistanceExponent);
                                    num2 /= num4;
                                }
                                if (num2 > num)
                                {
                                    num          = num2;
                                    orbSpawnInfo = orbSpawnInfo2;
                                }
                            }
                        }
                    }
                }
            }
        }
        if (orbSpawnInfo == null)
        {
            return(State.Failure);
        }
        if (num < this.orbAIHelper.EmpireOrbNeedThreshold[army.Empire.Index] && !flag)
        {
            return(State.Failure);
        }
        if (this.OpportunityMaximumTurn >= 0f)
        {
            int num5 = 0;
            int num6 = 0;
            if (aiBehaviorTree.Variables.ContainsKey(this.OpportunityMainTargetPosition))
            {
                WorldPosition mainTargetPosition = (WorldPosition)aiBehaviorTree.Variables[this.OpportunityMainTargetPosition];
                if (!AIBehaviorTreeNode_Decorator_EvaluateOpportunity.IsDetourWorthCheckingFast(this.worldPositionningService, army, orbSpawnInfo.WorldPosition, mainTargetPosition, out num6, out num5))
                {
                    return(State.Failure);
                }
            }
            if ((float)(num5 - num6) > this.OpportunityMaximumTurn)
            {
                return(State.Failure);
            }
        }
        if (aiBehaviorTree.Variables.ContainsKey(this.Output_TargetVarName))
        {
            aiBehaviorTree.Variables[this.Output_TargetVarName] = orbSpawnInfo;
        }
        else
        {
            aiBehaviorTree.Variables.Add(this.Output_TargetVarName, orbSpawnInfo);
        }
        return(State.Success);
    }