Example #1
0
        static bool CanUseExit(Actor self, ActorInfo producee, ExitInfo s)
        {
            var mobileInfo = producee.TraitInfoOrDefault <MobileInfo>();

            self.NotifyBlocker(self.Location + s.ExitCell);
            return(mobileInfo == null || mobileInfo.CanEnterCell(self.World, self, self.Location + s.ExitCell, self));
        }
Example #2
0
        public virtual void DoProduction(Actor self, ActorInfo producee, ExitInfo exitinfo, string productionType, TypeDictionary inits)
        {
            var exit         = CPos.Zero;
            var exitLocation = CPos.Zero;
            var target       = Target.Invalid;

            //Clone the initializer dictionary for the new actor.
            var td = new TypeDictionary();

            foreach (var init in inits)
            {
                td.Add(init);
            }

            if (self.OccupiesSpace != null)
            {
                exit = self.Location + exitinfo.ExitCell;

                var spawn = self.CenterPosition + exitinfo.SpawnOffset;
                var to    = self.World.Map.CenterOfCell(exit);

                var initialFacing = exitinfo.Facing;

                if (exitinfo.Facing < 0)
                {
                    var delta = to - spawn;

                    if (delta.HorizontalLengthSquared == 0)
                    {
                        var fi = producee.TraitInfoOrDefault <IFacingInfo>();
                        initialFacing = fi != null?fi.GetInitialFacing() : 0;
                    }
                    else
                    {
                        initialFacing = delta.Yaw.Facing;
                    }
                }

                exitLocation = rp.Value != null ? rp.Value.Location : exit;
                target       = Target.FromCell(self.World, exitLocation);

                td.Add(new LocationInit(exit));
                td.Add(new CenterPositionInit(spawn));
                td.Add(new FacingInit(initialFacing));
            }


            self.World.AddFrameEndTask(w => {
                var newUnit = self.World.CreateActor(producee.Name, td);

                var move = newUnit.TraitOrDefault <IMove>();

                if (move != null)
                {
                    if (exitinfo.MoveIntoWorld)
                    {
                        if (exitinfo.ExitDelay > 0)
                        {
                            newUnit.QueueActivity(new Wait(exitinfo.ExitDelay, false));
                        }

                        newUnit.QueueActivity(move.MoveIntoWorld(newUnit, exit));
                        newUnit.QueueActivity(new AttackMoveActivity(newUnit, move.MoveTo(exitLocation, 1)));
                    }
                }

                newUnit.SetTargetLine(target, rp.Value != null ?Color.Red:Color.Green, false);

                if (!self.IsDead)
                {
                    foreach (var t in self.TraitsImplementing <INotifyProduction>())
                    {
                        t.UnitProduced(self, newUnit, exit);
                    }
                }

                var notifyOthers = self.World.ActorsWithTrait <INotifyOtherProduction>();

                foreach (var notify in notifyOthers)
                {
                    notify.Trait.UnitProducedByOther(notify.Actor, self, newUnit, productionType);
                }

                foreach (var t in newUnit.TraitsImplementing <INotifyBuildComplete>())
                {
                    t.BuildingComplete(newUnit);
                }
            });
        }