Example #1
0
        public override void Activate(Actor self, Order order, SupportPowerManager manager)
        {
            base.Activate(self, order, manager);

            foreach (var target in UnitsInRange(order.ExtraLocation))
            {
                var cs         = target.Trait <Chronoshiftable>();
                var targetCell = target.Location + (order.TargetLocation - order.ExtraLocation);
                var cpi        = Info as ChronoshiftPowerInfo;

                if (self.Owner.Shroud.IsExplored(targetCell) && cs.CanChronoshiftTo(target, targetCell))
                {
                    cs.Teleport(target, targetCell, cpi.Duration * 25, cpi.KillCargo, self);
                }
            }
        }
Example #2
0
        public override void Activate(Actor self, Order order, SupportPowerManager manager)
        {
            base.Activate(self, order, manager);

            var info     = (ParatroopersPowerInfo)Info;
            var items    = info.DropItems;
            var startPos = self.World.ChooseRandomEdgeCell();

            self.World.AddFrameEndTask(w =>
            {
                var flare = info.FlareType != null ? w.CreateActor(info.FlareType, new TypeDictionary
                {
                    new LocationInit(order.TargetLocation),
                    new OwnerInit(self.Owner),
                }) : null;

                if (flare != null)
                {
                    flare.QueueActivity(new Wait(info.FlareTime));
                    flare.QueueActivity(new RemoveSelf());
                }

                var altitude = self.World.Map.Rules.Actors[info.UnitType].Traits.Get <PlaneInfo>().CruiseAltitude;
                var a        = w.CreateActor(info.UnitType, new TypeDictionary
                {
                    new CenterPositionInit(startPos.CenterPosition + new WVec(WRange.Zero, WRange.Zero, altitude)),
                    new OwnerInit(self.Owner),
                    new FacingInit(Util.GetFacing(order.TargetLocation - startPos, 0))
                });

                a.CancelActivity();
                a.QueueActivity(new FlyAttack(Target.FromOrder(order)));
                a.Trait <ParaDrop>().SetLZ(order.TargetLocation);

                var cargo = a.Trait <Cargo>();
                foreach (var i in items)
                {
                    cargo.Load(a, self.World.CreateActor(false, i.ToLowerInvariant(),
                                                         new TypeDictionary {
                        new OwnerInit(a.Owner)
                    }));
                }
            });
        }
Example #3
0
 public override IOrderGenerator OrderGenerator(string order, SupportPowerManager manager)
 {
     Sound.PlayToPlayer(manager.self.Owner, Info.SelectTargetSound);
     return(new SelectTarget(order, manager, this));
 }
Example #4
0
        public override void Activate(Actor self, Order order, SupportPowerManager manager)
        {
            base.Activate(self, order, manager);

            if (self.Owner.IsAlliedWith(self.World.RenderPlayer))
            {
                Sound.Play(Info.LaunchSound);
            }
            else
            {
                Sound.Play(Info.IncomingSound);
            }

            var npi = Info as NukePowerInfo;
            var rb  = self.Trait <RenderSimple>();

            rb.PlayCustomAnim(self, "active");

            var targetPosition = self.World.Map.CenterOfCell(order.TargetLocation);
            var missile        = new NukeLaunch(self.Owner, npi.MissileWeapon,
                                                self.CenterPosition + body.LocalToWorld(npi.SpawnOffset),
                                                targetPosition,
                                                npi.FlightVelocity, npi.FlightDelay, npi.SkipAscent);

            self.World.AddFrameEndTask(w => w.Add(missile));

            if (npi.CameraActor != null)
            {
                var camera = self.World.CreateActor(false, npi.CameraActor, new TypeDictionary
                {
                    new LocationInit(order.TargetLocation),
                    new OwnerInit(self.Owner),
                });

                camera.QueueActivity(new Wait(npi.CameraSpawnAdvance + npi.CameraRemoveDelay));
                camera.QueueActivity(new RemoveSelf());

                Action addCamera = () => self.World.AddFrameEndTask(w => w.Add(camera));
                self.World.AddFrameEndTask(w => w.Add(new DelayedAction(npi.FlightDelay - npi.CameraSpawnAdvance, addCamera)));
            }

            if (Info.DisplayBeacon)
            {
                var beacon = new Beacon(
                    order.Player,
                    targetPosition,
                    Info.BeaconPalettePrefix,
                    Info.BeaconPoster,
                    Info.BeaconPosterPalette,
                    () => missile.FractionComplete
                    );


                Action removeBeacon = () => self.World.AddFrameEndTask(w =>
                {
                    w.Remove(beacon);
                    beacon = null;
                });

                self.World.AddFrameEndTask(w =>
                {
                    w.Add(beacon);
                    w.Add(new DelayedAction(npi.FlightDelay - npi.BeaconRemoveAdvance, removeBeacon));
                });
            }
        }
Example #5
0
 public override IOrderGenerator OrderGenerator(string order, SupportPowerManager manager)
 {
     Sound.PlayToPlayer(manager.self.Owner, Info.SelectTargetSound);
     return(new SelectGenericPowerTarget(order, manager, "nuke", MouseButton.Left));
 }
Example #6
0
 public SupportPowerInstance(string key, SupportPowerManager manager)
 {
     Manager = manager;
     Key     = key;
 }
        public override void Activate(Actor self, Order order, SupportPowerManager manager)
        {
            base.Activate(self, order, manager);

            var info           = Info as AirstrikePowerInfo;
            var attackFacing   = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings);
            var attackRotation = WRot.FromFacing(attackFacing);
            var delta          = new WVec(0, -1024, 0).Rotate(attackRotation);

            var altitude   = self.World.Map.Rules.Actors[info.UnitType].Traits.Get <PlaneInfo>().CruiseAltitude.Range;
            var target     = order.TargetLocation.CenterPosition + new WVec(0, 0, altitude);
            var startEdge  = target - (self.World.DistanceToMapEdge(target, -delta) + info.Cordon).Range * delta / 1024;
            var finishEdge = target + (self.World.DistanceToMapEdge(target, delta) + info.Cordon).Range * delta / 1024;

            Actor  flare  = null;
            Actor  camera = null;
            Beacon beacon = null;
            Dictionary <Actor, bool> aircraftInRange = new Dictionary <Actor, bool>();

            Action <Actor> onEnterRange = a =>
            {
                // Spawn a camera and remove the beacon when the first plane enters the target area
                if (info.CameraActor != null && !aircraftInRange.Any(kv => kv.Value))
                {
                    self.World.AddFrameEndTask(w =>
                    {
                        camera = w.CreateActor(info.CameraActor, new TypeDictionary
                        {
                            new LocationInit(order.TargetLocation),
                            new OwnerInit(self.Owner),
                        });
                    });
                }

                if (beacon != null)
                {
                    self.World.AddFrameEndTask(w =>
                    {
                        w.Remove(beacon);
                        beacon = null;
                    });
                }

                aircraftInRange[a] = true;
            };

            Action <Actor> onExitRange = a =>
            {
                aircraftInRange[a] = false;

                // Remove the camera and flare when the final plane leaves the target area
                if (!aircraftInRange.Any(kv => kv.Value))
                {
                    if (camera != null)
                    {
                        camera.QueueActivity(new Wait(info.CameraRemoveDelay));
                        camera.QueueActivity(new RemoveSelf());
                    }

                    if (flare != null)
                    {
                        flare.QueueActivity(new Wait(info.FlareRemoveDelay));
                        flare.QueueActivity(new RemoveSelf());
                    }

                    camera = flare = null;
                }
            };

            self.World.AddFrameEndTask(w =>
            {
                if (info.FlareActor != null)
                {
                    flare = w.CreateActor(info.FlareActor, new TypeDictionary
                    {
                        new LocationInit(order.TargetLocation),
                        new OwnerInit(self.Owner),
                    });
                }

                var notification = self.Owner.IsAlliedWith(self.World.RenderPlayer) ? Info.LaunchSound : Info.IncomingSound;
                Sound.Play(notification);

                Actor distanceTestActor = null;
                for (var i = -info.SquadSize / 2; i <= info.SquadSize / 2; i++)
                {
                    // Even-sized squads skip the lead plane
                    if (i == 0 && (info.SquadSize & 1) == 0)
                    {
                        continue;
                    }

                    // Includes the 90 degree rotation between body and world coordinates
                    var so           = info.SquadOffset;
                    var spawnOffset  = new WVec(i * so.Y, -Math.Abs(i) * so.X, 0).Rotate(attackRotation);
                    var targetOffset = new WVec(i * so.Y, 0, 0).Rotate(attackRotation);

                    var a = w.CreateActor(info.UnitType, new TypeDictionary
                    {
                        new CenterPositionInit(startEdge + spawnOffset),
                        new OwnerInit(self.Owner),
                        new FacingInit(attackFacing),
                    });

                    var attack = a.Trait <AttackBomber>();
                    attack.SetTarget(target + targetOffset);
                    attack.OnEnteredAttackRange += onEnterRange;
                    attack.OnExitedAttackRange  += onExitRange;
                    attack.OnRemovedFromWorld   += onExitRange;

                    a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset)));
                    a.QueueActivity(new RemoveSelf());
                    aircraftInRange.Add(a, false);
                    distanceTestActor = a;
                }

                if (Info.DisplayBeacon)
                {
                    var distance = (target - startEdge).HorizontalLength;

                    beacon = new Beacon(
                        order.Player,
                        order.TargetLocation.CenterPosition,
                        Info.BeaconPalettePrefix,
                        Info.BeaconPoster,
                        Info.BeaconPosterPalette,
                        () => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Range) * 1f / distance
                        );

                    w.Add(beacon);
                }
            });
        }
Example #8
0
        public override void Activate(Actor self, Order order, SupportPowerManager manager)
        {
            base.Activate(self, order, manager);

            var info         = Info as ParatroopersPowerInfo;
            var dropFacing   = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings);
            var dropRotation = WRot.FromFacing(dropFacing);
            var delta        = new WVec(0, -1024, 0).Rotate(dropRotation);

            var altitude   = self.World.Map.Rules.Actors[info.UnitType].Traits.Get <PlaneInfo>().CruiseAltitude.Range;
            var target     = self.World.Map.CenterOfCell(order.TargetLocation) + new WVec(0, 0, altitude);
            var startEdge  = target - (self.World.Map.DistanceToEdge(target, -delta) + info.Cordon).Range * delta / 1024;
            var finishEdge = target + (self.World.Map.DistanceToEdge(target, delta) + info.Cordon).Range * delta / 1024;

            Actor  camera          = null;
            Beacon beacon          = null;
            var    aircraftInRange = new Dictionary <Actor, bool>();

            Action <Actor> onEnterRange = a =>
            {
                // Spawn a camera and remove the beacon when the first plane enters the target area
                if (info.CameraActor != null && !aircraftInRange.Any(kv => kv.Value))
                {
                    self.World.AddFrameEndTask(w =>
                    {
                        camera = w.CreateActor(info.CameraActor, new TypeDictionary
                        {
                            new LocationInit(order.TargetLocation),
                            new OwnerInit(self.Owner),
                        });
                    });
                }

                if (beacon != null)
                {
                    self.World.AddFrameEndTask(w =>
                    {
                        w.Remove(beacon);
                        beacon = null;
                    });
                }

                aircraftInRange[a] = true;
            };

            Action <Actor> onExitRange = a =>
            {
                aircraftInRange[a] = false;

                // Remove the camera when the final plane leaves the target area
                if (!aircraftInRange.Any(kv => kv.Value))
                {
                    if (camera != null)
                    {
                        camera.QueueActivity(new Wait(info.CameraRemoveDelay));
                        camera.QueueActivity(new RemoveSelf());
                    }

                    camera = null;
                }
            };

            self.World.AddFrameEndTask(w =>
            {
                var notification = self.Owner.IsAlliedWith(self.World.RenderPlayer) ? Info.LaunchSound : Info.IncomingSound;
                Sound.Play(notification);

                Actor distanceTestActor = null;

                var passengersPerPlane = (info.DropItems.Length + info.SquadSize - 1) / info.SquadSize;
                var added = 0;
                for (var i = -info.SquadSize / 2; i <= info.SquadSize / 2; i++)
                {
                    // Even-sized squads skip the lead plane
                    if (i == 0 && (info.SquadSize & 1) == 0)
                    {
                        continue;
                    }

                    // Includes the 90 degree rotation between body and world coordinates
                    var so           = info.SquadOffset;
                    var spawnOffset  = new WVec(i * so.Y, -Math.Abs(i) * so.X, 0).Rotate(dropRotation);
                    var targetOffset = new WVec(i * so.Y, 0, 0).Rotate(dropRotation);

                    var a = w.CreateActor(info.UnitType, new TypeDictionary
                    {
                        new CenterPositionInit(startEdge + spawnOffset),
                        new OwnerInit(self.Owner),
                        new FacingInit(dropFacing),
                    });

                    var drop = a.Trait <ParaDrop>();
                    drop.SetLZ(w.Map.CellContaining(target + targetOffset), !info.AllowImpassableCells);
                    drop.OnEnteredDropRange += onEnterRange;
                    drop.OnExitedDropRange  += onExitRange;
                    drop.OnRemovedFromWorld += onExitRange;

                    var cargo      = a.Trait <Cargo>();
                    var passengers = info.DropItems.Skip(added).Take(passengersPerPlane);
                    added         += passengersPerPlane;

                    foreach (var p in passengers)
                    {
                        cargo.Load(a, self.World.CreateActor(false, p.ToLowerInvariant(),
                                                             new TypeDictionary {
                            new OwnerInit(a.Owner)
                        }));
                    }

                    a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset)));
                    a.QueueActivity(new RemoveSelf());
                    aircraftInRange.Add(a, false);
                    distanceTestActor = a;
                }

                if (Info.DisplayBeacon)
                {
                    var distance = (target - startEdge).HorizontalLength;

                    beacon = new Beacon(
                        order.Player,
                        self.World.Map.CenterOfCell(order.TargetLocation),
                        Info.BeaconPalettePrefix,
                        Info.BeaconPoster,
                        Info.BeaconPosterPalette,
                        () => 1 - ((distanceTestActor.CenterPosition - target).HorizontalLength - info.BeaconDistanceOffset.Range) * 1f / distance
                        );

                    w.Add(beacon);
                }
            });
        }