예제 #1
0
        void INotifyIdle.TickIdle(Actor self)
        {
            if (self.World.Map.DistanceAboveTerrain(self.CenterPosition).Length < aircraftInfo.MinAirborneAltitude)
            {
                return;
            }

            var airfield = ReturnToBase.ChooseAirfield(self, true);

            if (airfield != null)
            {
                self.QueueActivity(new ReturnToBase(self, aircraftInfo.AbortOnResupply, airfield));
                self.QueueActivity(new ResupplyAircraft(self));
            }
            else
            {
                //nowhere to land,pick something friendly and circle over it.
                var someBuilding = self.World.ActorsHavingTrait <Building>().FirstOrDefault(a => a.Owner == self.Owner);

                if (someBuilding == null)
                {
                    someBuilding = self.World.ActorsHavingTrait <Building>().FirstOrDefault(a => self.Owner.Stances[a.Owner] == Stance.Ally);
                }

                if (someBuilding == null)
                {
                    self.QueueActivity(new FlyOffMap(self));
                    self.QueueActivity(new RemoveSelf());
                    return;
                }

                self.QueueActivity(new Fly(self, Target.FromActor(someBuilding)));
                self.QueueActivity(new FlyCircle(self));
            }
        }
예제 #2
0
파일: Plane.cs 프로젝트: wenzeslaus/OpenRA
        public void ResolveOrder(Actor self, Order order)
        {
            if (order.OrderString == "Move")
            {
                var cell     = self.World.Map.Clamp(order.TargetLocation);
                var explored = self.Owner.Shroud.IsExplored(cell);

                if (!explored && !Info.MoveIntoShroud)
                {
                    return;
                }

                UnReserve();

                var target = Target.FromCell(self.World, cell);
                self.SetTargetLine(target, Color.Green);
                self.CancelActivity();
                self.QueueActivity(new Fly(self, target));
                self.QueueActivity(new FlyCircle(self));
            }
            else if (order.OrderString == "Enter")
            {
                if (Reservable.IsReserved(order.TargetActor))
                {
                    return;
                }

                UnReserve();

                self.SetTargetLine(Target.FromOrder(self.World, order), Color.Green);

                self.CancelActivity();
                self.QueueActivity(new ReturnToBase(self, order.TargetActor));
                self.QueueActivity(new ResupplyAircraft(self));
            }
            else if (order.OrderString == "Stop")
            {
                UnReserve();
                self.CancelActivity();
            }
            else if (order.OrderString == "ReturnToBase")
            {
                var airfield = ReturnToBase.ChooseAirfield(self, true);
                if (airfield == null)
                {
                    return;
                }

                UnReserve();
                self.CancelActivity();
                self.SetTargetLine(Target.FromActor(airfield), Color.Green);
                self.QueueActivity(new ReturnToBase(self, airfield));
                self.QueueActivity(new ResupplyAircraft(self));
            }
            else
            {
                // Game.Debug("Unreserve due to unhandled order: {0}".F(order.OrderString));
                UnReserve();
            }
        }
예제 #3
0
        public void TickIdle(Actor self)
        {
            // We're on the ground, let's stay there.
            if (self.CenterPosition.Z == 0)
            {
                return;
            }

            var airfield = ReturnToBase.ChooseAirfield(self, true);

            if (airfield != null)
            {
                self.QueueActivity(new ReturnToBase(self, airfield));
                self.QueueActivity(new ResupplyAircraft(self));
            }
            else
            {
                // nowhere to land, pick something friendly and circle over it.

                // i'd prefer something we own
                var someBuilding = self.World.ActorsWithTrait <Building>()
                                   .Select(a => a.Actor)
                                   .FirstOrDefault(a => a.Owner == self.Owner);

                // failing that, something unlikely to shoot at us
                if (someBuilding == null)
                {
                    someBuilding = self.World.ActorsWithTrait <Building>()
                                   .Select(a => a.Actor)
                                   .FirstOrDefault(a => self.Owner.Stances[a.Owner] == Stance.Ally);
                }

                if (someBuilding == null)
                {
                    // ... going down the garden to eat worms ...
                    self.QueueActivity(new FlyOffMap(self));
                    self.QueueActivity(new RemoveSelf());
                    return;
                }

                self.QueueActivity(new Fly(self, Target.FromActor(someBuilding)));
                self.QueueActivity(new FlyCircle(self));
            }
        }
예제 #4
0
        void INotifyIdle.TickIdle(Actor self)
        {
            // We're on the ground, let's stay there.
            if (self.World.Map.DistanceAboveTerrain(self.CenterPosition).Length < aircraftInfo.MinAirborneAltitude)
            {
                return;
            }

            var airfield = ReturnToBase.ChooseAirfield(self, true);

            if (airfield != null)
            {
                self.QueueActivity(new ReturnToBase(self, aircraftInfo.AbortOnResupply, airfield));
                self.QueueActivity(new ResupplyAircraft(self));
            }
            else
            {
                // nowhere to land, pick something friendly and circle over it.

                // I'd prefer something we own
                var someBuilding = self.World.ActorsHavingTrait <Building>()
                                   .FirstOrDefault(a => a.Owner == self.Owner);

                // failing that, something unlikely to shoot at us
                if (someBuilding == null)
                {
                    someBuilding = self.World.ActorsHavingTrait <Building>()
                                   .FirstOrDefault(a => self.Owner.Stances[a.Owner] == Stance.Ally);
                }

                if (someBuilding == null)
                {
                    // ... going down the garden to eat worms ...
                    self.QueueActivity(new FlyOffMap(self));
                    self.QueueActivity(new RemoveSelf());
                    return;
                }

                self.QueueActivity(new Fly(self, Target.FromActor(someBuilding)));
                self.QueueActivity(new FlyCircle(self));
            }
        }