コード例 #1
0
    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);
    }
コード例 #2
0
ファイル: ArmyBehavior.cs プロジェクト: LeaderEnemyBoss/ELCP
    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);
    }
コード例 #3
0
ファイル: ArmyBehavior.cs プロジェクト: LeaderEnemyBoss/ELCP
    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);
    }
コード例 #4
0
ファイル: NavyBehavior.cs プロジェクト: LeaderEnemyBoss/ELCP
    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);
    }
コード例 #5
0
ファイル: ArmyBehavior.cs プロジェクト: LeaderEnemyBoss/ELCP
    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);
    }