예제 #1
0
    protected BehaviorNodeReturnCode CollectOpportunityArmies(BaseNavyArmy army)
    {
        Army     navy     = army.Garrison as Army;
        NavyArmy navyArmy = army as NavyArmy;

        if (navyArmy == null || navy == null || !(navy.Empire is MajorEmpire))
        {
            return(BehaviorNodeReturnCode.Failure);
        }
        float num = navy.GetPropertyValue(SimulationProperties.Movement);

        if (num < 0.01f)
        {
            num = 1f;
        }
        List <IGarrison>           list   = new List <IGarrison>();
        DepartmentOfForeignAffairs agency = navy.Empire.GetAgency <DepartmentOfForeignAffairs>();

        AILayer_Military.HasSaveAttackableTargetsNearby(navy, Mathf.CeilToInt(num), agency, out list, true);
        if (list.Count == 0)
        {
            return(BehaviorNodeReturnCode.Failure);
        }
        list.Sort((IGarrison left, IGarrison right) => this.worldPositionService.GetDistance((left as IWorldPositionable).WorldPosition, navy.WorldPosition).CompareTo(this.worldPositionService.GetDistance((right as IWorldPositionable).WorldPosition, navy.WorldPosition)));
        foreach (IGarrison garrison in list)
        {
            IGameEntityWithWorldPosition gameEntityWithWorldPosition = garrison as IGameEntityWithWorldPosition;
            IGarrisonWithPosition        garrisonWithPosition        = garrison as IGarrisonWithPosition;
            if (gameEntityWithWorldPosition != null && garrisonWithPosition != null)
            {
                WorldPosition validTileToAttack = base.GetValidTileToAttack(army, gameEntityWithWorldPosition);
                navyArmy.PathToSecondaryTarget = base.ComputePathToPosition(army, validTileToAttack, navyArmy.PathToSecondaryTarget);
                if (navyArmy.PathToSecondaryTarget != null)
                {
                    if (navyArmy.PathToSecondaryTarget.ControlPoints != null && navyArmy.PathToSecondaryTarget.ControlPoints.Length != 0)
                    {
                        return(BehaviorNodeReturnCode.Failure);
                    }
                    Diagnostics.Log("ELCP {0}/{1} found opportunitytarget {2} with path {3}", new object[]
                    {
                        navy.Empire,
                        navy.LocalizedName,
                        garrison.LocalizedName,
                        navyArmy.PathToSecondaryTarget
                    });
                    navyArmy.OpportunityAttackableTarget = garrisonWithPosition;
                    return(BehaviorNodeReturnCode.Success);
                }
            }
        }
        return(BehaviorNodeReturnCode.Failure);
    }
예제 #2
0
    protected void FillVisibleArmiesAround(IGarrisonWithPosition garrison, List <Army> targetArmies)
    {
        DepartmentOfForeignAffairs agency = garrison.Empire.GetAgency <DepartmentOfForeignAffairs>();
        IGameService service = Services.GetService <IGameService>();

        Diagnostics.Assert(service != null);
        global::Game game = service.Game as global::Game;
        int          num  = Mathf.RoundToInt(garrison.GetPropertyValue(SimulationProperties.VisionRange));

        for (int i = 0; i < game.Empires.Length; i++)
        {
            global::Empire empire = game.Empires[i];
            if (garrison.Empire != empire)
            {
                if (!(empire is MajorEmpire) || !agency.IsFriend(empire))
                {
                    DepartmentOfDefense agency2 = empire.GetAgency <DepartmentOfDefense>();
                    if (agency2 != null)
                    {
                        for (int j = 0; j < agency2.Armies.Count; j++)
                        {
                            Army army = agency2.Armies[j];
                            if (army.UnitsCount != 0)
                            {
                                if (!army.IsCamouflaged || this.visibilityService.IsWorldPositionDetectedFor(army.WorldPosition, garrison.Empire))
                                {
                                    if (this.worldPositionService.GetDistance(army.WorldPosition, garrison.WorldPosition) <= num)
                                    {
                                        targetArmies.Add(army);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }