Ejemplo n.º 1
0
    public static bool IsRegionValidForExploration(global::Empire empire, int regionIndex)
    {
        Diagnostics.Assert(AIScheduler.Services != null);
        IWorldAtlasAIHelper service = AIScheduler.Services.GetService <IWorldAtlasAIHelper>();

        Diagnostics.Assert(service != null);
        if (empire != null)
        {
            DepartmentOfForeignAffairs agency = empire.GetAgency <DepartmentOfForeignAffairs>();
            if (agency != null && !agency.CanMoveOn(regionIndex, false))
            {
                return(false);
            }
        }
        DepartmentOfTheInterior agency2 = empire.GetAgency <DepartmentOfTheInterior>();

        if (agency2 != null)
        {
            bool flag = false;
            for (int i = 0; i < agency2.Cities.Count; i++)
            {
                if (agency2.Cities[i].Region.ContinentID == service.Regions[regionIndex].ContinentID)
                {
                    flag = true;
                    break;
                }
            }
            if (agency2.Cities.Count == 0)
            {
                flag = true;
            }
            if (!flag)
            {
                DepartmentOfCreepingNodes agency3 = empire.GetAgency <DepartmentOfCreepingNodes>();
                if (agency3 != null)
                {
                    using (List <CreepingNode> .Enumerator enumerator = agency3.Nodes.GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            if (!enumerator.Current.IsUnderConstruction && AILayer_Exploration.IsTravelAllowedInNode(empire, enumerator.Current) && enumerator.Current.Region.ContinentID == service.Regions[regionIndex].ContinentID)
                            {
                                flag = true;
                                break;
                            }
                        }
                    }
                }
            }
            if (!flag)
            {
                return(false);
            }
        }
        return(!service.IsRegionExplored(empire.Index, regionIndex, 0.95f));
    }
Ejemplo n.º 2
0
    private float ComputeHeuristicBaseValue()
    {
        Diagnostics.Assert(base.AttitudeScore != null);
        Diagnostics.Assert(base.DiplomaticRelation != null && base.DiplomaticRelation.State != null);
        if (base.DiplomaticRelation.State.Name == DiplomaticRelationState.Names.Unknown)
        {
            return(0f);
        }
        float num = base.GetValueFromAttitude();
        IWorldAtlasAIHelper service  = AIScheduler.Services.GetService <IWorldAtlasAIHelper>();
        float worldExplorationRatio  = service.GetWorldExplorationRatio(base.Empire);
        float worldExplorationRatio2 = service.GetWorldExplorationRatio(base.EmpireWhichReceives);

        if (Mathf.Abs(worldExplorationRatio - worldExplorationRatio2) < 0.1f)
        {
            return(0f);
        }
        float value = Mathf.Max(0.1f, worldExplorationRatio2) / Mathf.Max(0.1f, worldExplorationRatio) - 1f;

        num += this.explorationLeadBonus * Mathf.Clamp(value, -1f, 1f);
        num *= this.multiplier;
        return(num / 100f);
    }
Ejemplo n.º 3
0
    private void CalculateRegroupPositionForWaitToAttack()
    {
        if (this.RegionTarget == null || this.RegionTarget.City == null || this.RegionTarget.City.Empire == base.Commander.Empire || !base.AIDataArmyGUID.IsValid)
        {
            return;
        }
        AIData_Army aidata = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID);

        if (aidata == null)
        {
            return;
        }
        PathfindingContext pathfindingContext = aidata.Army.GenerateContext();

        pathfindingContext.Greedy = true;
        PathfindingResult pathfindingResult;

        if (this.targetFrontierPosition.IsValid)
        {
            Army armyAtPosition = this.worldPositionningService.GetArmyAtPosition(this.targetFrontierPosition);
            if (armyAtPosition == null)
            {
                pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, aidata.Army.WorldPosition, this.targetFrontierPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreFogOfWar, null);
                if (pathfindingResult != null)
                {
                    return;
                }
            }
            else if (armyAtPosition.GUID == base.AIDataArmyGUID)
            {
                return;
            }
        }
        if (this.worldPositionningService.GetRegion(aidata.Army.WorldPosition) == this.RegionTarget)
        {
            this.targetFrontierPosition = aidata.Army.WorldPosition;
            return;
        }
        IWorldAtlasAIHelper service = AIScheduler.Services.GetService <IWorldAtlasAIHelper>();
        List <Region>       list    = new List <Region>();

        service.ComputeNeighbourRegions(this.RegionTarget, ref list);
        list.RemoveAll((Region match) => match.Owner != base.Commander.Empire || !match.IsLand);
        int  num  = int.MaxValue;
        bool flag = false;

        foreach (Region region in list)
        {
            foreach (WorldPosition worldPosition in region.WorldPositions)
            {
                if (!this.worldPositionningService.IsWaterTile(worldPosition) && this.pathfindingService.IsTileStopableAndPassable(worldPosition, aidata.Army, PathfindingFlags.IgnoreFogOfWar, null))
                {
                    int distance = this.worldPositionningService.GetDistance(worldPosition, this.RegionTarget.City.WorldPosition);
                    if (distance < num)
                    {
                        num = distance;
                        this.targetFrontierPosition = worldPosition;
                        flag = true;
                    }
                }
            }
        }
        if (flag)
        {
            return;
        }
        pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, aidata.Army.WorldPosition, this.RegionTarget.City.WorldPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreFogOfWar, null);
        if (pathfindingResult == null)
        {
            this.targetFrontierPosition = aidata.Army.WorldPosition;
            return;
        }
        WorldPosition worldPosition2 = aidata.Army.WorldPosition;

        foreach (WorldPosition worldPosition3 in pathfindingResult.GetCompletePath())
        {
            if (!(worldPosition3 == pathfindingResult.Start) && !(worldPosition3 == pathfindingResult.Goal) && this.pathfindingService.IsTileStopableAndPassable(worldPosition3, aidata.Army, PathfindingFlags.IgnoreFogOfWar, null))
            {
                if ((int)this.worldPositionningService.GetRegionIndex(worldPosition3) == this.RegionTarget.Index)
                {
                    break;
                }
                worldPosition2 = worldPosition3;
            }
        }
        this.targetFrontierPosition = worldPosition2;
    }
Ejemplo n.º 4
0
    public IEnumerable <IAIParameter <InterpreterContext> > GetAIParameters(Region regionElement)
    {
        IDatabase <AIParameterDatatableElement> aiParameterDatabase = Databases.GetDatabase <AIParameterDatatableElement>(false);

        Diagnostics.Assert(aiParameterDatabase != null);
        IWorldAtlasAIHelper worldAtlasHelper = AIScheduler.Services.GetService <IWorldAtlasAIHelper>();

        Diagnostics.Assert(worldAtlasHelper != null);
        StaticString biomeName = worldAtlasHelper.GetRegionBiome(regionElement);

        Diagnostics.Assert(!StaticString.IsNullOrEmpty(biomeName));
        IAIParameter <InterpreterContext>[] aiParameters;
        if (!this.aiParametersByBiomeName.TryGetValue(biomeName, out aiParameters))
        {
            AIParameterDatatableElement aiParameterDatatableElement;
            if (aiParameterDatabase.TryGetValue(biomeName, out aiParameterDatatableElement))
            {
                Diagnostics.Assert(aiParameterDatatableElement != null);
                if (aiParameterDatatableElement.AIParameters != null)
                {
                    aiParameters = new IAIParameter <InterpreterContext> [aiParameterDatatableElement.AIParameters.Length];
                    for (int index = 0; index < aiParameterDatatableElement.AIParameters.Length; index++)
                    {
                        AIParameterDatatableElement.AIParameter parameterDefinition = aiParameterDatatableElement.AIParameters[index];
                        Diagnostics.Assert(parameterDefinition != null);
                        aiParameters[index] = parameterDefinition.Instantiate();
                    }
                }
                else
                {
                    Diagnostics.LogWarning("Biome {0} has no AI Parameters.", new object[]
                    {
                        biomeName
                    });
                }
            }
            else
            {
                Diagnostics.LogWarning("Biome {0} has no AI Parameters.", new object[]
                {
                    biomeName
                });
            }
            this.aiParametersByBiomeName.Add(biomeName, aiParameters);
        }
        if (aiParameters != null)
        {
            for (int index2 = 0; index2 < aiParameters.Length; index2++)
            {
                yield return(aiParameters[index2]);
            }
        }
        if (this.regionEvaluationAiParameters == null)
        {
            AIParameterDatatableElement aiParameterDatatableElement2;
            if (aiParameterDatabase.TryGetValue("RegionEvaluation", out aiParameterDatatableElement2))
            {
                if (aiParameterDatatableElement2.AIParameters != null)
                {
                    this.regionEvaluationAiParameters = new IAIParameter <InterpreterContext> [aiParameterDatatableElement2.AIParameters.Length];
                    for (int index3 = 0; index3 < aiParameterDatatableElement2.AIParameters.Length; index3++)
                    {
                        AIParameterDatatableElement.AIParameter parameterDefinition2 = aiParameterDatatableElement2.AIParameters[index3];
                        Diagnostics.Assert(parameterDefinition2 != null);
                        this.regionEvaluationAiParameters[index3] = parameterDefinition2.Instantiate();
                    }
                }
                else
                {
                    Diagnostics.LogWarning("RegionEvaluation has no AI Parameters.");
                }
            }
            else
            {
                Diagnostics.LogWarning("RegionEvaluation has no AI Parameters.");
            }
        }
        for (int index4 = 0; index4 < this.regionEvaluationAiParameters.Length; index4++)
        {
            yield return(this.regionEvaluationAiParameters[index4]);
        }
        yield break;
    }