public override int RemainingTimeActual(ProductionItem item) { var parallelBuilds = Queue.FindAll(i => !i.Paused && !i.Done) .GroupBy(i => i.Item) .ToList() .Count; return(item.RemainingTimeActual * parallelBuilds); }
public override int RemainingTimeActual(ProductionItem item) { var parallelBuilds = Queue.FindAll(i => !i.Paused && !i.Done) .GroupBy(i => i.Item) .ToList() .Count; return(item.RemainingTimeActual * parallelBuilds * info.ParallelPenaltyBuildTimeMultipliers[Math.Min(parallelBuilds - 1, info.ParallelPenaltyBuildTimeMultipliers.Length - 1)] / 100); }
protected virtual void BeginProduction(ProductionItem item, bool hasPriority) { if (hasPriority && Queue.Count > 1) { Queue.Insert(1, item); } else { Queue.Add(item); } }
public void EndProduction(ProductionItem item) { Queue.Remove(item); if (item.Infinite) { Queue.Add(new ProductionItem(this, item.Item, item.TotalCost, playerPower, item.OnComplete) { Infinite = true }); } }
protected virtual void BeginProduction(ProductionItem item, bool hasPriority) { if (Queue.Any(i => i.Item == item.Item && i.Infinite)) { return; } if (hasPriority && Queue.Count > 1) { Queue.Insert(1, item); } else { Queue.Add(item); } if (Info.InfiniteBuildLimit < 0) { return; } var queued = Queue.FindAll(i => i.Item == item.Item); if (queued.Count <= Info.InfiniteBuildLimit) { return; } queued[0].Infinite = true; for (var i = 1; i < queued.Count; i++) { // Refund what has been paid playerResources.GiveCash(queued[i].TotalCost - queued[i].RemainingCost); EndProduction(queued[i]); } }
bool HandleMiddleClick(ProductionItem item, ProductionIcon icon, int handleCount) { if (item == null) return false; // Directly cancel, skipping "on-hold" Game.Sound.Play(TabClick); Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Speech", CurrentQueue.Info.CancelledAudio, World.LocalPlayer.Faction.InternalName); World.IssueOrder(Order.CancelProduction(CurrentQueue.Actor, icon.Name, handleCount)); return true; }
bool HandleRightClick(ProductionItem item, ProductionIcon icon, int handleCount) { if (item == null) return false; Game.Sound.Play(TabClick); if (item.Paused || item.Done || item.TotalCost == item.RemainingCost) { // Instant cancel of things we have not started yet and things that are finished Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Speech", CurrentQueue.Info.CancelledAudio, World.LocalPlayer.Faction.InternalName); World.IssueOrder(Order.CancelProduction(CurrentQueue.Actor, icon.Name, handleCount)); } else { // Pause an existing item Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Speech", CurrentQueue.Info.OnHoldAudio, World.LocalPlayer.Faction.InternalName); World.IssueOrder(Order.PauseProduction(CurrentQueue.Actor, icon.Name, true)); } return true; }
bool HandleLeftClick(ProductionItem item, ProductionIcon icon, int handleCount) { if (PickUpCompletedBuildingIcon(icon, item)) { Game.Sound.Play(TabClick); return true; } if (item != null && item.Paused) { // Resume a paused item Game.Sound.Play(TabClick); World.IssueOrder(Order.PauseProduction(CurrentQueue.Actor, icon.Name, false)); return true; } if (CurrentQueue.BuildableItems().Any(a => a.Name == icon.Name)) { // Queue a new item Game.Sound.Play(TabClick); Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Speech", CurrentQueue.Info.QueuedAudio, World.LocalPlayer.Faction.InternalName); World.IssueOrder(Order.StartProduction(CurrentQueue.Actor, icon.Name, handleCount)); return true; } return false; }
protected bool PickUpCompletedBuildingIcon(ProductionIcon icon, ProductionItem item) { var actor = World.Map.Rules.Actors[icon.Name]; if (item != null && item.Done && actor.HasTraitInfo<BuildingInfo>()) { World.OrderGenerator = new PlaceBuildingOrderGenerator(CurrentQueue, icon.Name); return true; } return false; }
public virtual int RemainingTimeActual(ProductionItem item) { return(item.RemainingTimeActual); }
public virtual bool IsProducing(ProductionItem item) { return(Queue.Count > 0 && Queue[0] == item); }
static string GetOverlayForItem(ProductionItem item, int timestep) { if (item.Paused) return "ON HOLD"; if (item.Done) return "READY"; return WidgetUtils.FormatTime(item.RemainingTimeActual, timestep); }
protected override void BeginProduction(ProductionItem item, bool hasPriority) { // Ignore `hasPriority` as it's not relevant in parallel production context. base.BeginProduction(item, false); }
public override bool IsProducing(ProductionItem item) { return(Queue.Contains(item)); }
protected void BeginProduction(ProductionItem item) { queue.Add(item); }
public void EndProduction(ProductionItem item) { Queue.Remove(item); }