コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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)));
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
        /// <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);
        }
コード例 #8
0
        /// <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);
        }
コード例 #9
0
        /// <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);
        }
コード例 #10
0
        /// <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);
        }
コード例 #11
0
        /// <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);
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
        /// <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);
        }
コード例 #14
0
        /// <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);
        }
コード例 #15
0
        /// <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);
        }
コード例 #16
0
        /// <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);
        }
コード例 #17
0
        /// <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);
        }
コード例 #18
0
        /// <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);
        }
コード例 #19
0
        /// <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);
        }
コード例 #20
0
        /// <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);
        }
コード例 #21
0
        /// <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);
        }
コード例 #22
0
        /// <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);
        }
コード例 #23
0
        /// <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();
        }
コード例 #24
0
        /// <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);
        }