/// <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); }