/// <summary> /// Makes the decision. /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override bool MakeDecision(IBehaviorContext context) { PlayerBehaviorContext playerContext = context as PlayerBehaviorContext; if (playerContext == null) { return(false); } Planet planet = playerContext.BehaviorTarget as Planet; if (planet == null) { return(false); } PlanetBehaviorContext planetContext = planet.BehaviorContext as PlanetBehaviorContext; if (planetContext == null) { return(false); } planetContext.ItemToBuild = playerContext.Player.AvailFactoryItems.FirstOrDefault(i => i.FactoryTypeName.EndsWith(UnitTypeName)); if (planetContext.ItemToBuild == null) { return(false); } planetContext.ItemBehaviorName = BehaviorName; context.AddLogMessage($"Player Unit Decision - {UnitTypeName}"); return(true); }
/// <summary> /// Gets the value. /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override float GetValue(IBehaviorContext context) { context.AddLogMessage("ExplorationRatioValue"); PlayerBehaviorContext playerContext = context as PlayerBehaviorContext; PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (playerContext == null && planetContext == null) { Debug.Assert(false, "Wrong Behavior Context"); return(0); } Player player = null; if (playerContext != null) { player = playerContext.Player; } else if (planetContext != null) { player = planetContext.Planet.Owner; } if (player == null) { return(0); } float scoutUnits = player.Units.Count(u => u is Scout); float value = scoutUnits / ((player.GameSession.Galaxy.TotalSystems - player.TotalExploredStarSystems) / Ratio); return(value); }
/// <summary> /// Makes the decision. /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override bool MakeDecision(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { return(false); } List <FactoryItem> possibleUpgrades = planetContext.Planet.Owner.GetPossiblePlanetUpgrades(planetContext.Planet, UpgradeModifier); if (possibleUpgrades.Count == 0) { return(false); } FactoryItem upgrade = possibleUpgrades.OrderBy(u => u.ProductionCost).First(); if (upgrade != null) { context.AddLogMessage($"Upgrade found - {upgrade.Name}"); planetContext.ItemToBuild = upgrade; return(true); } return(false); }
/// <summary> /// Gets the value. /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override float GetValue(IBehaviorContext context) { context.AddLogMessage($"PlanetValue - {Property}"); PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { Debug.Assert(false, "Wrong Behavior Context"); return(0); } if (string.IsNullOrEmpty(Property)) { Debug.Assert(false, "Property null or empty"); return(0); } if (info == null || info.Name != Property) { info = planetType.GetRuntimeProperty(Property); if (info == null) { Debug.Assert(false, "Wrong Property Name"); return(0); } } return(Convert.ToSingle(info.GetValue(planetContext.Planet))); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } Behavior behavior = null; if (!string.IsNullOrEmpty(BehaviorName)) { behavior = BehaviorsManager.Instance.GetBehavior(BehaviorName); if (behavior == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } } planetContext.Planet.Behavior = behavior; returnCode = BehaviorReturnCode.Success; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } ObservableCollection <MoveableUnit> playersUnitsOnOrbit = null; if (!planetContext.Planet.Orbit.Units.TryGetValue(planetContext.Planet.Owner, out playersUnitsOnOrbit)) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (playersUnitsOnOrbit.Count > 0) { returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } FactoryItem item = null; if (!string.IsNullOrEmpty(ItemTypeName)) { item = planetContext.Planet.Owner.AvailFactoryItems.FirstOrDefault(i => i.FactoryTypeName.EndsWith(ItemTypeName)); } else if (planetContext.ItemToBuild != null) { item = planetContext.ItemToBuild; } if (item == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } bool canAcquire = item.Acquire(planetContext.Planet.Owner, planetContext.Planet); if (!canAcquire) { planetContext.ItemToBuild = null; returnCode = BehaviorReturnCode.Failure; return(returnCode); } FactoryTask task = new BuildFactoryTask(item, planetContext.Planet); if (string.IsNullOrEmpty(BehaviorName)) { task.ItemBehaviorName = planetContext.ItemBehaviorName; planetContext.ItemBehaviorName = string.Empty; } else { task.ItemBehaviorName = BehaviorName; } planetContext.Planet.AddFactoryTask(task); planetContext.ItemToBuild = null; returnCode = BehaviorReturnCode.Success; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlayerBehaviorContext playerContext = context as PlayerBehaviorContext; if (playerContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } float maxProduction = float.MinValue; Planet bestPlanet = null; foreach (var body in playerContext.Player.StarSystemBodies) { Planet planet = body as Planet; if (planet == null) { continue; } if (DoPlanetBuildingCheck) { PlanetBehaviorContext planetContext = planet.BehaviorContext as PlanetBehaviorContext; if (planetContext != null && planetContext.ItemToBuild != null) { continue; } } if (maxProduction > planet.AvailProduction || (!string.IsNullOrEmpty(IgnoreBehaviorName) && planet.Behavior != null && planet.Behavior.Name == IgnoreBehaviorName)) { continue; } int activeTradeRoutesCount = planet.Owner.TradeRoutes.Count(tr => tr.From == planet); if (PlanetWithTradeRoute && (activeTradeRoutesCount - planet.TradeRoutesCount) == 0) { continue; } maxProduction = planet.AvailProduction; bestPlanet = planet; } if (bestPlanet != null) { playerContext.BehaviorTarget = bestPlanet; returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (!planetContext.Planet.Orbit.Units.ContainsKey(planetContext.Planet.Owner)) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } // TODO MT issue here? List <MoveableUnit> units = planetContext.Planet.Orbit.Units[planetContext.Planet.Owner].ToList(); int defensiveUnitsCount = 0; int defensiveForce = 0; if (DefensiveRatio > 0) { defensiveForce = planetContext.Planet.Owner.MaxUnitsOnOrbit / DefensiveRatio; } foreach (var unit in units) { if (!string.IsNullOrEmpty(DefensiveBehaviorName) && unit.BehaviorName == DefensiveBehaviorName) { if (defensiveForce > defensiveUnitsCount) { defensiveUnitsCount++; continue; } } if (unit is ITradeUnit && ((ITradeUnit)unit).HasAssignedTradeRoute) { continue; } LeaveOrbitTask task = new LeaveOrbitTask(unit, planetContext.Planet); task.Execute(); if (task.IsTaskFinished) { returnCode = BehaviorReturnCode.Success; return(returnCode); } } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; PlayerBehaviorContext playerContext = context as PlayerBehaviorContext; if (planetContext == null && playerContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } Player owner = null; Planet planet = null; if (planetContext != null) { owner = planetContext.Planet.Owner; planet = planetContext.Planet; } else if (playerContext != null) { owner = playerContext.Player; planet = playerContext.BehaviorTarget as Planet; } if (owner == null || planet == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } List <FactoryItem> possibleUpgrades = owner.GetPossiblePlanetUpgrades(planet, UpgradeModifier); if (possibleUpgrades.Count == 0) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } FactoryItem upgrade = possibleUpgrades.OrderBy(u => u.ProductionCost).First(); if (upgrade != null) { context.AddLogMessage("Upgrade found - " + upgrade.Name); if (planetContext != null) { planetContext.ItemToBuild = upgrade; } returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Gets the value. /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override float GetValue(IBehaviorContext context) { context.AddLogMessage("PlanetUpgradesValue"); PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { Debug.Assert(false, "Wrong Behavior Context"); return(0); } float value = planetContext.Planet.Owner.GetPossiblePlanetUpgrades(planetContext.Planet, UpgradeModifier).Count; return(value); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } planetContext.Planet.BehaviorName = string.Empty; planetContext.Planet.Behavior = null; returnCode = BehaviorReturnCode.Success; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } List <BaseUnit> units = planetContext.Planet.Owner.Units.Where(u => u.Environment == planetContext.Planet.Environment).ToList(); foreach (var unit in units) { Builder builder = unit as Builder; if (builder == null) { continue; } returnCode = BehaviorReturnCode.Success; return(returnCode); } List <StarSystemBody> envBodies = planetContext.Planet.Owner.StarSystemBodies.Where(u => u.Environment == planetContext.Planet.Environment).ToList(); foreach (var body in envBodies) { Planet planet = body as Planet; if (planet == null) { continue; } var builder = planet.FactoryQueue.FirstOrDefault(i => i.Item.FactoryTypeName.Equals("Builder")); if (builder == null) { continue; } returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (!planetContext.Planet.Orbit.Units.ContainsKey(planetContext.Planet.Owner)) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } // TODO MT issue here? List <MoveableUnit> units = planetContext.Planet.Orbit.Units[planetContext.Planet.Owner].ToList(); foreach (var unit in units) { if (unit.Hull == unit.HullMax || unit.Hull > unit.HullMax * HullPercentage || unit.IsDead || unit.Owner == null) { continue; } if (unit.Owner.Energy < unit.RepairCost) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } RepairOnOrbitTask task = new RepairOnOrbitTask(unit); task.Execute(); if (!task.IsTaskFinished) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } } returnCode = BehaviorReturnCode.Success; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (planetContext.Planet.Population < planetContext.Planet.PlanetConfiguration.ColonyShipPopulationMin) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } returnCode = BehaviorReturnCode.Success; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (planetContext.Planet.Orbit.CanEnterMoreUnits(planetContext.Planet.Owner)) { returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (planetContext.Planet.ConstructionSlotsCount > 0) { returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (planetContext.Planet.IsUnderSiege) { returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } FactoryTask task = planetContext.Planet.FactoryQueue.FirstOrDefault(t => t is BuildFactoryTask); if (task != null) { returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } BaseEnvironment planetEnvironment = planetContext.Planet.Environment; BaseUnit unit = planetContext.Planet.Owner.Units.FirstOrDefault(u => u.Environment == planetEnvironment && u is MoveableUnit && !((MoveableUnit)u).IsOnOrbit && u.BehaviorName == DefensiveBehaviorName); if (unit != null) { returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlayerBehaviorContext playerContext = context as PlayerBehaviorContext; PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (playerContext == null && planetContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } Player player = null; if (playerContext != null) { player = playerContext.Player; } else if (planetContext != null) { player = planetContext.Planet.Owner; } if (player == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } BaseUnit existingUnit = player.Units.FirstOrDefault(u => u.GetType().Name == UnitTypeName); if (existingUnit != null) { returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Calculates the value. /// </summary> /// <param name="context">The context.</param> public override void CalculateValue(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { Value = 0; IsNodeValid = false; return; } var itemToBuild = planetContext.Planet.Owner.AvailFactoryItems.FirstOrDefault(i => i.FactoryTypeName.EndsWith(UnitTypeName)); if (itemToBuild == null) { Value = 0; IsNodeValid = false; return; } IsNodeValid = true; Value = planetContext.Planet.Owner.Units.Count(u => u.GetType().Name == UnitTypeName && u.Behavior != null && u.Behavior.Name == BehaviorName); }
/// <summary> /// Calculates the value. /// </summary> /// <param name="context">The context.</param> public override void CalculateValue(IBehaviorContext context) { PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; if (planetContext == null) { Value = 0; IsNodeValid = false; return; } List <FactoryItem> possibleUpgrades = planetContext.Planet.Owner.GetPossiblePlanetUpgrades(planetContext.Planet, UpgradeModifier); if (possibleUpgrades.Count == 0) { Value = 0; IsNodeValid = false; return; } IsNodeValid = true; Value = planetContext.Planet.Upgrades.Where(u => u.ModifierType == UpgradeModifier).Count(); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlayerBehaviorContext playerContext = context as PlayerBehaviorContext; PlanetBehaviorContext planetContext = context as PlanetBehaviorContext; UnitBehaviorContext unitContext = context as UnitBehaviorContext; if (playerContext == null && planetContext == null && unitContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } Player player = null; FactoryItem item = null; if (playerContext != null) { player = playerContext.Player; item = player.AvailFactoryItems.FirstOrDefault(i => i.FactoryTypeName.EndsWith(ItemTypeName)); } else if (planetContext != null) { player = planetContext.Planet.Owner; if (planetContext.ItemToBuild != null) { item = planetContext.ItemToBuild; } else if (!string.IsNullOrEmpty(ItemTypeName)) { item = player.AvailFactoryItems.FirstOrDefault(i => i.FactoryTypeName.EndsWith(ItemTypeName)); } } else if (unitContext != null) { player = unitContext.Unit.Owner; item = player.AvailFactoryItems.FirstOrDefault(i => i.FactoryTypeName.EndsWith(ItemTypeName)); } if (player == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (item == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } float maintenance = item.UnitConfig.MaintenanceCost; if (player.EnergyIncome > maintenance && player.Energy > maintenance) { returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }