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)); }
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); } }); }