private bool IsKaijuValidForTame(Army army, Kaiju kaiju, ref List <StaticString> failureFlags, bool checkNearbyKaijus = true) { if (army == null || kaiju == null) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } if (checkNearbyKaijus && !this.IsKaijuNearby(kaiju, army)) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } if (kaiju.IsTamed()) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } if (kaiju.IsStunned()) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } if (ELCPUtilities.UseELCPSymbiosisBuffs && !ELCPUtilities.CanELCPTameKaiju(kaiju, this.TameCost, army.Empire)) { failureFlags.Add(ArmyAction.NoCanDoWhileCannotAffordCosts); return(false); } return(true); }
public void FillTargets(Army army, List <IGameEntity> gameEntities, ref List <StaticString> failureFlags) { if (army == null) { throw new ArgumentNullException("army"); } IGameService service = Services.GetService <IGameService>(); if (service == null) { return; } global::Game x = service.Game as global::Game; if (x == null) { return; } IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); Diagnostics.Assert(service2 != null); for (int i = 0; i < 6; i++) { WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)i, 1); Region region = service2.GetRegion(neighbourTile); if (region != null && region.Kaiju != null) { Kaiju kaiju = region.Kaiju; if (this.IsKaijuValidForTame(army, kaiju, ref failureFlags, true) && !gameEntities.Contains(kaiju)) { gameEntities.Add(kaiju); } } Army armyAtPosition = service2.GetArmyAtPosition(neighbourTile); if (armyAtPosition != null && armyAtPosition is KaijuArmy) { KaijuArmy kaijuArmy = armyAtPosition as KaijuArmy; if (kaijuArmy != null) { Kaiju kaiju2 = kaijuArmy.Kaiju; if (kaiju2 != null && kaiju2.OnArmyMode() && !kaiju2.IsStunned() && !gameEntities.Contains(kaiju2)) { gameEntities.Add(kaijuArmy.Kaiju); } } } } }
protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters) { if (this.ticket != null) { if (!this.orderExecuted) { return(State.Running); } if (this.ticket.PostOrderResponse == PostOrderResponse.PreprocessHasFailed) { this.orderExecuted = false; this.ticket = null; aiBehaviorTree.ErrorCode = 1; return(State.Failure); } this.orderExecuted = false; this.ticket = null; return(State.Success); } else { Army army; if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) != AIArmyMission.AIArmyMissionErrorCode.None) { return(State.Failure); } float propertyValue = army.GetPropertyValue(SimulationProperties.MaximumNumberOfActionPoints); float propertyValue2 = army.GetPropertyValue(SimulationProperties.ActionPointsSpent); if (propertyValue <= propertyValue2) { aiBehaviorTree.ErrorCode = 33; return(State.Failure); } if (!aiBehaviorTree.Variables.ContainsKey(this.TargetVarName)) { aiBehaviorTree.LogError("${0} not set", new object[] { this.TargetVarName }); return(State.Failure); } IGameEntity target = aiBehaviorTree.Variables[this.TargetVarName] as IGameEntity; if (!(target is IWorldPositionable)) { return(State.Failure); } IGameService service = Services.GetService <IGameService>(); Diagnostics.Assert(service != null); if (!service.Game.Services.GetService <IGameEntityRepositoryService>().Contains(target.GUID)) { return(State.Success); } IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); IEnumerable <Encounter> service3 = service.Game.Services.GetService <IEncounterRepositoryService>(); if (service3 != null && service3.Any((Encounter encounter) => encounter.IsGarrisonInEncounter(army.GUID, false) || encounter.IsGarrisonInEncounter(target.GUID, false))) { return(State.Running); } IGarrison garrison; if (target is Kaiju) { Kaiju kaiju = target as Kaiju; garrison = kaiju.GetActiveTroops(); if (kaiju.IsStunned()) { return(State.Failure); } } else { if (target is KaijuArmy) { KaijuArmy kaijuArmy = target as KaijuArmy; if (kaijuArmy != null && kaijuArmy.Kaiju.IsStunned()) { return(State.Failure); } } else if (target is KaijuGarrison) { KaijuGarrison kaijuGarrison = target as KaijuGarrison; if (kaijuGarrison != null && kaijuGarrison.Kaiju.IsStunned()) { return(State.Failure); } } garrison = (target as IGarrison); if (garrison == null) { return(State.Failure); } } if ((army.Empire is MinorEmpire || army.Empire is NavalEmpire) && garrison.Hero != null && garrison.Hero.IsSkillUnlocked("HeroSkillLeaderMap07")) { return(State.Failure); } if (garrison.Empire.Index == aiBehaviorTree.AICommander.Empire.Index) { return(State.Failure); } this.orderExecuted = false; GameEntityGUID guid = target.GUID; if (target is City) { Diagnostics.Assert(AIScheduler.Services != null); IEntityInfoAIHelper service4 = AIScheduler.Services.GetService <IEntityInfoAIHelper>(); Diagnostics.Assert(service4 != null); City city = target as City; if (city.BesiegingEmpire != null && city.BesiegingEmpire != aiBehaviorTree.AICommander.Empire) { return(State.Failure); } District districtToAttackFrom = service4.GetDistrictToAttackFrom(army, city); if (districtToAttackFrom == null) { aiBehaviorTree.ErrorCode = 12; return(State.Failure); } guid = districtToAttackFrom.GUID; } else if (target is Camp) { Camp camp = target as Camp; IWorldPositionable worldPositionable = target as IWorldPositionable; if (worldPositionable == null) { return(State.Failure); } if (service2.GetDistance(army.WorldPosition, worldPositionable.WorldPosition) != 1) { aiBehaviorTree.ErrorCode = 12; return(State.Failure); } guid = camp.GUID; } else if (target is Fortress) { guid = target.GUID; } else { Village village = target as Village; if (village != null && (village.HasBeenPacified || (village.HasBeenConverted && village.Converter == aiBehaviorTree.AICommander.Empire) || village.HasBeenInfected)) { return(State.Failure); } Diagnostics.Assert(AIScheduler.Services != null); IWorldPositionable worldPositionable2 = target as IWorldPositionable; if (worldPositionable2 == null) { return(State.Failure); } District district = service2.GetDistrict(worldPositionable2.WorldPosition); if (district != null && District.IsACityTile(district) && district.City.Empire == garrison.Empire) { worldPositionable2 = district; guid = district.GUID; } if (service2.GetDistance(army.WorldPosition, worldPositionable2.WorldPosition) != 1) { aiBehaviorTree.ErrorCode = 12; return(State.Failure); } } OrderAttack order = new OrderAttack(army.Empire.Index, army.GUID, guid); aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order, out this.ticket, new EventHandler <TicketRaisedEventArgs>(this.Order_TicketRaised)); return(State.Running); } }
private List <IWorldPositionable> Execute_GetKaijus(AIBehaviorTree aiBehaviorTree, Army army, IGameService gameService, List <IWorldPositionable> unfilteredTargetList) { List <IWorldPositionable> list = new List <IWorldPositionable>(); for (int i = 0; i < unfilteredTargetList.Count; i++) { Kaiju kaiju = null; if (unfilteredTargetList[i] is Kaiju) { kaiju = (unfilteredTargetList[i] as Kaiju); } else if (unfilteredTargetList[i] is KaijuArmy) { kaiju = (unfilteredTargetList[i] as KaijuArmy).Kaiju; } else if (unfilteredTargetList[i] is KaijuGarrison) { kaiju = (unfilteredTargetList[i] as KaijuGarrison).Kaiju; } if (kaiju != null) { if (this.TypeOfTarget == AIBehaviorTreeNode_Decorator_SelectTarget.TargetType.StunnedKaiju && !kaiju.IsTamed() && kaiju.IsStunned()) { list.Add(kaiju); } if (this.TypeOfTarget == AIBehaviorTreeNode_Decorator_SelectTarget.TargetType.WildKaiju && !kaiju.IsTamed() && kaiju.IsWild()) { list.Add(kaiju); } if (this.TypeOfTarget == AIBehaviorTreeNode_Decorator_SelectTarget.TargetType.TamedKaiju && kaiju.IsTamed()) { list.Add(kaiju); } } } return(list); }
protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters) { if (this.ticket != null) { if (!this.ticket.Raised) { return(State.Running); } if (this.ticket.PostOrderResponse == PostOrderResponse.PreprocessHasFailed) { this.ticket = null; aiBehaviorTree.ErrorCode = 1; return(State.Failure); } this.ticket = null; return(State.Success); } else { Army army; if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) != AIArmyMission.AIArmyMissionErrorCode.None) { return(State.Failure); } float propertyValue = army.GetPropertyValue(SimulationProperties.MaximumNumberOfActionPoints); float propertyValue2 = army.GetPropertyValue(SimulationProperties.ActionPointsSpent); if (propertyValue <= propertyValue2) { aiBehaviorTree.ErrorCode = 33; return(State.Failure); } if (!aiBehaviorTree.Variables.ContainsKey(this.TargetVarName)) { aiBehaviorTree.LogError("${0} not set", new object[] { this.TargetVarName }); return(State.Failure); } IGameEntity gameEntity = aiBehaviorTree.Variables[this.TargetVarName] as IGameEntity; if (!(gameEntity is IWorldPositionable)) { return(State.Failure); } IGameService service = Services.GetService <IGameService>(); Diagnostics.Assert(service != null); if (!service.Game.Services.GetService <IGameEntityRepositoryService>().Contains(gameEntity.GUID)) { return(State.Success); } IEncounterRepositoryService service2 = service.Game.Services.GetService <IEncounterRepositoryService>(); if (service2 != null) { IEnumerable <Encounter> enumerable = service2; if (enumerable != null && enumerable.Any((Encounter encounter) => encounter.IsGarrisonInEncounter(army.GUID, false))) { return(State.Running); } } IGarrison garrison; if (gameEntity is Kaiju) { Kaiju kaiju = gameEntity as Kaiju; garrison = kaiju.GetActiveTroops(); if (kaiju.IsStunned()) { return(State.Failure); } } else { if (gameEntity is KaijuArmy) { KaijuArmy kaijuArmy = gameEntity as KaijuArmy; if (kaijuArmy != null && kaijuArmy.Kaiju.IsStunned()) { return(State.Failure); } } else if (gameEntity is KaijuGarrison) { KaijuGarrison kaijuGarrison = gameEntity as KaijuGarrison; if (kaijuGarrison != null && kaijuGarrison.Kaiju.IsStunned()) { return(State.Failure); } } garrison = (gameEntity as IGarrison); } if (garrison == null) { return(State.Failure); } if ((army.Empire is MinorEmpire || army.Empire is NavalEmpire) && garrison.Hero != null && garrison.Hero.IsSkillUnlocked("HeroSkillLeaderMap07")) { return(State.Failure); } if (garrison.Empire.Index == aiBehaviorTree.AICommander.Empire.Index) { return(State.Failure); } GameEntityGUID guid = gameEntity.GUID; if (!aiBehaviorTree.Variables.ContainsKey(this.PathVarName)) { aiBehaviorTree.LogError("{0} not set", new object[] { this.PathVarName }); return(State.Failure); } WorldPath worldPath = aiBehaviorTree.Variables[this.PathVarName] as WorldPath; if (worldPath == null || worldPath.Length < 2) { aiBehaviorTree.LogError("Path is null.", new object[0]); aiBehaviorTree.ErrorCode = 3; return(State.Failure); } if (!worldPath.IsValid) { aiBehaviorTree.ErrorCode = 3; return(State.Failure); } OrderGoToAndAttack orderGoToAndAttack = new OrderGoToAndAttack(army.Empire.Index, army.GUID, guid, worldPath); orderGoToAndAttack.Flags = PathfindingFlags.IgnoreFogOfWar; aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(orderGoToAndAttack, out this.ticket, null); return(State.Running); } }