protected BehaviorNodeReturnCode ComputePathToSecondary(CatspawArmy army) { if (army.SecondaryAttackableTarget == null) { return(BehaviorNodeReturnCode.Failure); } IGameEntityWithWorldPosition gameEntityWithWorldPosition = army.SecondaryAttackableTarget as IGameEntityWithWorldPosition; if (gameEntityWithWorldPosition == null) { return(BehaviorNodeReturnCode.Failure); } WorldPosition validTileToAttack = base.GetValidTileToAttack(army, gameEntityWithWorldPosition); if (!validTileToAttack.IsValid) { return(BehaviorNodeReturnCode.Failure); } army.PathToSecondaryTarget = base.ComputePathToPosition(army, validTileToAttack, army.PathToSecondaryTarget); if (army.PathToSecondaryTarget == null) { return(BehaviorNodeReturnCode.Failure); } return(BehaviorNodeReturnCode.Success); }
protected BehaviorNodeReturnCode ComputePathToMain(ArmyWithTask army) { if (army.MainAttackableTarget == null) { return(BehaviorNodeReturnCode.Failure); } IGameEntityWithWorldPosition mainAttackableTarget = army.MainAttackableTarget; if (mainAttackableTarget == null) { return(BehaviorNodeReturnCode.Failure); } WorldPosition validTileToAttack = this.GetValidTileToAttack(army, mainAttackableTarget); if (!validTileToAttack.IsValid) { return(BehaviorNodeReturnCode.Failure); } army.PathToMainTarget = this.ComputePathToPosition(army, validTileToAttack, army.PathToMainTarget); if (army.PathToMainTarget == null) { return(BehaviorNodeReturnCode.Failure); } return(BehaviorNodeReturnCode.Success); }
protected bool IsCloseEnoughToAttack(Army army, IGarrison target) { City city = target as City; District district = target as District; if (district != null) { city = district.City; } if (city != null && army.IsNaval) { District district2 = this.worldPositionService.GetDistrict(army.WorldPosition); return(district2 != null && district2.City == city); } Fortress fortress = target as Fortress; if (fortress != null) { if (this.worldPositionService.GetDistance(army.WorldPosition, fortress.WorldPosition) == 1 && this.pathfindingService.IsTransitionPassable(army.WorldPosition, fortress.WorldPosition, army, OrderAttack.AttackFlags, null)) { return(true); } for (int i = 0; i < fortress.Facilities.Count; i++) { if (this.worldPositionService.GetDistance(army.WorldPosition, fortress.Facilities[i].WorldPosition) == 1 && this.pathfindingService.IsTransitionPassable(army.WorldPosition, fortress.Facilities[i].WorldPosition, army, OrderAttack.AttackFlags, null)) { return(true); } } } IGameEntityWithWorldPosition gameEntityWithWorldPosition = target as IGameEntityWithWorldPosition; if (gameEntityWithWorldPosition != null) { if (this.worldPositionService.GetDistance(army.WorldPosition, gameEntityWithWorldPosition.WorldPosition) > 1) { return(false); } if (army.IsSeafaring && !this.worldPositionService.IsOceanTile(gameEntityWithWorldPosition.WorldPosition)) { return(false); } if (this.worldPositionService.IsWaterTile(army.WorldPosition) != this.worldPositionService.IsWaterTile(gameEntityWithWorldPosition.WorldPosition)) { return(false); } if (this.pathfindingService.IsTransitionPassable(army.WorldPosition, gameEntityWithWorldPosition.WorldPosition, army, OrderAttack.AttackFlags, null)) { return(true); } } return(false); }
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 WorldPosition GetValidTileToAttack(ArmyWithTask navalArmy, IGameEntityWithWorldPosition entityWithPosition) { WorldPosition worldPosition = entityWithPosition.WorldPosition; Fortress fortress = entityWithPosition as Fortress; if (fortress != null) { worldPosition = this.GetBestFacilitiesToAttack(navalArmy, fortress); } City city = entityWithPosition as City; if (city != null) { return(this.GetBestDistrictToAttack(navalArmy, city)); } Army army = navalArmy.Garrison as Army; if (army == null) { return(WorldPosition.Invalid); } bool flag = this.worldPositionService.IsWaterTile(worldPosition); bool isSeafaring = army.IsSeafaring; WorldOrientation worldOrientation = this.worldPositionService.GetOrientation(worldPosition, army.WorldPosition); for (int i = 0; i < 6; i++) { WorldPosition neighbourTile = this.worldPositionService.GetNeighbourTile(worldPosition, worldOrientation, 1); bool flag2 = this.worldPositionService.IsWaterTile(neighbourTile); if ((isSeafaring || !army.IsNaval || flag == flag2) && neighbourTile.IsValid && ((!isSeafaring && flag == flag2) || this.worldPositionService.IsOceanTile(neighbourTile)) && this.pathfindingService.IsTransitionPassable(neighbourTile, worldPosition, army, OrderAttack.AttackFlags, null) && this.pathfindingService.IsTileStopableAndPassable(neighbourTile, army, PathfindingFlags.IgnoreFogOfWar, null)) { return(neighbourTile); } if (i % 2 == 0) { worldOrientation = worldOrientation.Rotate(-(i + 1)); } else { worldOrientation = worldOrientation.Rotate(i + 1); } } return(WorldPosition.Invalid); }