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