Example #1
0
        // Turret offset in world-space
        public WVec Position(Actor self)
        {
            var bodyOrientation = body.QuantizeOrientation(self, self.Orientation);

            return(body.LocalToWorld(Offset.Rotate(bodyOrientation)));
        }
Example #2
0
        public void Tick(Actor self)
        {
            var local = info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation));

            trail.Update(self.CenterPosition + body.LocalToWorld(local));
        }
Example #3
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));
                });
            }
        }