示例#1
0
        /// <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);
            }

            BaseEnvironment envi = unitContext.Unit.Environment;

            if (envi is Galaxy || envi == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            BaseUnit warpMagnetUnit = BaseEnvironment.GetActiveWarpMagnet(envi);

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

            unitContext.EnvironmentTarget = warpMagnetUnit;
            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)
        {
            UnitBehaviorContext unitContext = context as UnitBehaviorContext;

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

            BaseEnvironment envi = unitContext.Unit.Environment;

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

            bool       foundPosition  = false;
            HexElement position       = new HexElement();
            StaticUnit warpMagnetUnit = BaseEnvironment.GetActiveWarpMagnet(envi) as StaticUnit;

            if (warpMagnetUnit == null)
            {
                Builder unit = unitContext.Unit as Builder;
                position.Q    = unit.Q;
                position.R    = unit.R;
                foundPosition = true;
            }
            else
            {
                float distance = warpMagnetUnit.TotalSensorsEnergy + 1;
                foreach (var coord in HexMap.Neighbors)
                {
                    position.Q = (short)(warpMagnetUnit.Q + distance * coord.x);
                    position.R = (short)(warpMagnetUnit.R + distance * coord.y);
                    if (envi.UnitsMap.ContainsKey(position.HexMapKey) || !envi.PathFindingGraph.VertexHexCache.ContainsKey(position.HexMapKey))
                    {
                        continue;
                    }

                    foundPosition = true;
                    break;
                }
            }

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

            unitContext.EnvironmentTarget = position;
            returnCode = BehaviorReturnCode.Success;
            return(returnCode);
        }