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(); } }
public virtual bool Produce(Actor self, ActorInfo producee, string productionType, TypeDictionary inits, int refundableValue) { if (IsTraitDisabled || IsTraitPaused || Reservable.IsReserved(self)) { return(false); } // Pick a spawn/exit point pair var exit = SelectExit(self, producee, productionType); if (exit != null || self.OccupiesSpace == null || !producee.HasTraitInfo <IOccupySpaceInfo>()) { DoProduction(self, producee, exit?.Info, productionType, inits); return(true); } return(false); }
public virtual bool Produce(Actor self, ActorInfo producee, string factionVariant) { if (Reservable.IsReserved(self) || (building != null && building.Locked)) { return(false); } // Pick a spawn/exit point pair var exit = self.Info.TraitInfos <ExitInfo>().Shuffle(self.World.SharedRandom) .FirstOrDefault(e => CanUseExit(self, producee, e)); if (exit != null || self.OccupiesSpace == null) { DoProduction(self, producee, exit, factionVariant); return(true); } return(false); }
public virtual bool Produce(Actor self, ActorInfo producee, string raceVariant) { if (Reservable.IsReserved(self)) { return(false); } // pick a spawn/exit point pair var exit = self.Info.Traits.WithInterface <ExitInfo>().Shuffle(self.World.SharedRandom) .FirstOrDefault(e => CanUseExit(self, producee, e)); if (exit != null) { DoProduction(self, producee, exit, raceVariant); return(true); } return(false); }
public virtual bool Produce(Actor self, ActorInfo producee, string productionType, TypeDictionary inits) { if (IsTraitDisabled || IsTraitPaused || Reservable.IsReserved(self) || (building != null && building.Locked)) { return(false); } // Pick a spawn/exit point pair var exit = SelectExit(self, producee, productionType); if (exit != null || self.OccupiesSpace == null) { DoProduction(self, producee, exit, productionType, inits); return(true); } return(false); }
public void ResolveOrder(Actor self, Order order) { if (order.OrderString == "Move") { var cell = self.World.Map.Clamp(order.TargetLocation); if (!Info.MoveIntoShroud && !self.Owner.Shroud.IsExplored(cell)) { return; } if (!order.Queued) { UnReserve(); } var target = Target.FromCell(self.World, cell); self.SetTargetLine(target, Color.Green); if (IsPlane) { self.QueueActivity(order.Queued, new FlyAndContinueWithCirclesWhenIdle(self, target)); } else { self.QueueActivity(order.Queued, new HeliFlyAndLandWhenIdle(self, target, Info)); } } else if (order.OrderString == "Enter") { if (!order.Queued) { UnReserve(); } if (Reservable.IsReserved(order.TargetActor)) { if (IsPlane) { self.QueueActivity(new ReturnToBase(self)); } else { self.QueueActivity(new HeliReturnToBase(self)); } } else { self.SetTargetLine(Target.FromActor(order.TargetActor), Color.Green); if (IsPlane) { self.QueueActivity(order.Queued, Util.SequenceActivities( new ReturnToBase(self, order.TargetActor), new ResupplyAircraft(self))); } else { var res = order.TargetActor.TraitOrDefault <Reservable>(); if (res != null) { Reservation = res.Reserve(order.TargetActor, self, this); } Action enter = () => { var exit = order.TargetActor.Info.TraitInfos <ExitInfo>().FirstOrDefault(); var offset = (exit != null) ? exit.SpawnOffset : WVec.Zero; self.QueueActivity(new HeliFly(self, Target.FromPos(order.TargetActor.CenterPosition + offset))); self.QueueActivity(new Turn(self, Info.InitialFacing)); self.QueueActivity(new HeliLand(self, false)); self.QueueActivity(new ResupplyAircraft(self)); self.QueueActivity(new TakeOff(self)); }; self.QueueActivity(order.Queued, new CallFunc(enter)); } } } else if (order.OrderString == "Stop") { self.CancelActivity(); if (GetActorBelow() != null) { self.QueueActivity(new ResupplyAircraft(self)); return; } UnReserve(); // TODO: Implement INotifyBecomingIdle instead if (!IsPlane && Info.LandWhenIdle) { if (Info.TurnToLand) { self.QueueActivity(new Turn(self, Info.InitialFacing)); } self.QueueActivity(new HeliLand(self, true)); } } else if (order.OrderString == "ReturnToBase") { UnReserve(); self.CancelActivity(); if (IsPlane) { self.QueueActivity(new ReturnToBase(self)); } else { self.QueueActivity(new HeliReturnToBase(self)); } self.QueueActivity(new ResupplyAircraft(self)); } else { UnReserve(); } }
public void ResolveOrder(Actor self, Order order) { if (order.OrderString == "Move") { var cell = self.World.Map.Clamp(order.TargetLocation); if (!Info.MoveIntoShroud && !self.Owner.Shroud.IsExplored(cell)) { return; } if (!order.Queued) { UnReserve(); } var target = Target.FromCell(self.World, cell); self.SetTargetLine(target, Color.Green); if (!Info.CanHover) { self.QueueActivity(order.Queued, new FlyAndContinueWithCirclesWhenIdle(self, target)); } else { self.QueueActivity(order.Queued, new HeliFlyAndLandWhenIdle(self, target, Info)); } } else if (order.OrderString == "Enter") { // Enter orders are only valid for own/allied actors, // which are guaranteed to never be frozen. if (order.Target.Type != TargetType.Actor) { return; } if (!order.Queued) { UnReserve(); } var targetActor = order.Target.Actor; if (Reservable.IsReserved(targetActor)) { if (!Info.CanHover) { self.QueueActivity(new ReturnToBase(self, Info.AbortOnResupply)); } else { self.QueueActivity(new HeliReturnToBase(self, Info.AbortOnResupply)); } } else { self.SetTargetLine(Target.FromActor(targetActor), Color.Green); if (!Info.CanHover && !Info.VTOL) { self.QueueActivity(order.Queued, ActivityUtils.SequenceActivities( new ReturnToBase(self, Info.AbortOnResupply, targetActor), new ResupplyAircraft(self))); } else { MakeReservation(targetActor); Action enter = () => { var exit = targetActor.FirstExitOrDefault(null); var offset = exit != null ? exit.Info.SpawnOffset : WVec.Zero; self.QueueActivity(new HeliFly(self, Target.FromPos(targetActor.CenterPosition + offset))); if (Info.TurnToDock) { self.QueueActivity(new Turn(self, Info.InitialFacing)); } self.QueueActivity(new HeliLand(self, false)); self.QueueActivity(new ResupplyAircraft(self)); }; self.QueueActivity(order.Queued, new CallFunc(enter)); } } } else if (order.OrderString == "Stop") { self.CancelActivity(); if (GetActorBelow() != null) { self.QueueActivity(new ResupplyAircraft(self)); return; } UnReserve(); // TODO: Implement INotifyBecomingIdle instead if (Info.VTOL && Info.LandWhenIdle) { if (Info.TurnToLand) { self.QueueActivity(new Turn(self, Info.InitialFacing)); } self.QueueActivity(new HeliLand(self, true)); } } else if (order.OrderString == "ReturnToBase" && rearmableInfo != null && rearmableInfo.RearmActors.Any()) { UnReserve(); self.CancelActivity(); if (!Info.CanHover) { self.QueueActivity(new ReturnToBase(self, Info.AbortOnResupply, null, false)); } else { self.QueueActivity(new HeliReturnToBase(self, Info.AbortOnResupply, null, false)); } } }
public void ResolveOrder(Actor self, Order order) { if (Reservation != null) { Reservation.Dispose(); Reservation = null; } if (order.OrderString == "Move") { var cell = self.World.Map.Clamp(order.TargetLocation); var explored = self.Owner.Shroud.IsExplored(cell); if (!explored && !Info.MoveIntoShroud) { return; } var target = Target.FromCell(self.World, cell); self.SetTargetLine(target, Color.Green); self.CancelActivity(); self.QueueActivity(new HeliFly(self, target)); if (Info.LandWhenIdle) { if (Info.TurnToLand) { self.QueueActivity(new Turn(self, Info.InitialFacing)); } self.QueueActivity(new HeliLand(self, true)); } } if (order.OrderString == "Enter") { if (Reservable.IsReserved(order.TargetActor)) { self.CancelActivity(); self.QueueActivity(new HeliReturn(self)); } else { var res = order.TargetActor.TraitOrDefault <Reservable>(); if (res != null) { Reservation = res.Reserve(order.TargetActor, self, this); } var exit = order.TargetActor.Info.Traits.WithInterface <ExitInfo>().FirstOrDefault(); var offset = (exit != null) ? exit.SpawnOffset : WVec.Zero; self.SetTargetLine(Target.FromActor(order.TargetActor), Color.Green); self.CancelActivity(); self.QueueActivity(new HeliFly(self, Target.FromPos(order.TargetActor.CenterPosition + offset))); self.QueueActivity(new Turn(self, Info.InitialFacing)); self.QueueActivity(new HeliLand(self, false)); self.QueueActivity(new ResupplyAircraft(self)); self.QueueActivity(new TakeOff(self)); } } if (order.OrderString == "ReturnToBase") { self.CancelActivity(); self.QueueActivity(new HeliReturn(self)); } if (order.OrderString == "Stop") { self.CancelActivity(); if (Info.LandWhenIdle) { if (Info.TurnToLand) { self.QueueActivity(new Turn(self, Info.InitialFacing)); } self.QueueActivity(new HeliLand(self, true)); } } }