Beispiel #1
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);
        }
        /// <summary>
        /// Executes behavior with given context
        /// </summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        public override BehaviorReturnCode Behave(IBehaviorContext context)
        {
            UnitBehaviorContext unitContext = context as UnitBehaviorContext;

            if (unitContext == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            MoveableUnit unit = unitContext.Unit as MoveableUnit;

            if (unit == null || unit.IsDead)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            Planet planet = unitContext.Unit.GetOrbitingPlanet();

            if (planet == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            LeaveOrbitTask task = new LeaveOrbitTask(unit, planet);

            task.Execute();

            if (task.IsTaskFinished)
            {
                returnCode = BehaviorReturnCode.Success;
                return(returnCode);
            }

            returnCode = BehaviorReturnCode.Failure;
            return(returnCode);
        }