/// <summary> /// Gets the reason why this queue cannot construct an item, or null if it can be constructed. /// </summary> /// <param name="item"></param> /// <returns></returns> public string GetReasonForBeingUnableToConstruct(IConstructionTemplate item) { if (item == null) { return("Construction template does not exist."); } if (!item.HasBeenUnlockedBy(Owner)) { return(Owner + " has not yet unlocked " + item + "."); } if (!IsSpaceYardQueue && item.RequiresSpaceYardQueue) { return(item + " requires a space yard queue."); } if (!IsColonyQueue && item.RequiresColonyQueue) { return(item + " requires a colony queue."); } return(null); }
/// <summary> /// Finds the number of orders directly above this order that have the same template as the item directly above. /// </summary> /// <param name="o"></param> /// <returns></returns> public int FindSameItemsCountAbove(IConstructionOrder o) { var pos = ConstructionQueue.Orders.IndexOf(o); int num = 0; IConstructionTemplate t = null; for (var i = pos - 1; i >= 0; i--) { if (t == null) { t = ConstructionQueue.Orders[i].Template; } if (ConstructionQueue.Orders[i].Template == t) { num++; } else { break; } } return(num); }
/// <summary> /// Are we building this thingy anywhere? /// </summary> /// <param name="t"></param> /// <returns></returns> private bool BuildingAnywhere(IConstructionTemplate t) { return(Galaxy.Current.FindSpaceObjects <IConstructor>().OwnedBy(Empire.Current).Any(o => o.ConstructionQueue != null && o.ConstructionQueue.Orders.Any(o2 => o2.Template == t))); }
/// <summary> /// Can this queue construct something? /// </summary> /// <param name="item"></param> /// <returns></returns> public bool CanConstruct(IConstructionTemplate item) { return(GetReasonForBeingUnableToConstruct(item) == null); }
private void BindQueueListView(IEnumerable <IConstructionOrder> selected = null) { lstQueue.Items.Clear(); var il = new ImageList(); il.ImageSize = new Size(32, 32); lstQueue.SmallImageList = il; lstQueue.LargeImageList = il; int i = 0; var prevCost = new ResourceQuantity(); IConstructionTemplate lastTemplate = null; var firstEta = 0d; int count = 0; double totalMin = 0d, totalOrg = 0d, totalRad = 0d; var orders = new List <IConstructionOrder>(); var rate = ConstructionQueue.Rate; ListViewItem item; foreach (var order in ConstructionQueue.Orders) { var cost = order.Cost; var duration = Math.Ceiling(cost.Keys.MaxOrDefault(res => (double)cost[res] / (double)rate[res])); var remainingCost = order.Cost - (order.Item == null ? new ResourceQuantity() : order.Item.ConstructionProgress); var minprogress = order.Item == null ? 0d : (double)order.Item.ConstructionProgress[Resource.Minerals] / (double)order.Cost[Resource.Minerals]; var orgprogress = order.Item == null ? 0d : (double)order.Item.ConstructionProgress[Resource.Organics] / (double)order.Cost[Resource.Organics]; var radprogress = order.Item == null ? 0d : (double)order.Item.ConstructionProgress[Resource.Radioactives] / (double)order.Cost[Resource.Radioactives]; var eta = remainingCost.Keys.MaxOrDefault(res => (double)(remainingCost[res] + prevCost[res]) / (double)rate[res]); if (!chkExpanded.Checked && order.Template == lastTemplate) { // building same as previous item, and using condensed view count++; orders.Add(order); totalMin += minprogress; totalOrg += orgprogress; totalRad += radprogress; if (lstQueue.Items.Count > 0) { lstQueue.Items.RemoveAt(lstQueue.Items.Count - 1); } item = new ListViewItem(count + "x " + order.Name); item.Tag = orders; item.UseItemStyleForSubItems = false; item.SubItems.Add(new ListViewItem.ListViewSubItem(item, double.IsNaN(totalMin) ? "-" : totalMin >= 1 ? totalMin.ToString("f1") + "x" : (int)Math.Round(totalMin * 100) + "%", Resource.Minerals.Color, lstQueue.BackColor, lstQueue.Font)); item.SubItems.Add(new ListViewItem.ListViewSubItem(item, double.IsNaN(totalOrg) ? "-" : totalOrg >= 1 ? totalOrg.ToString("f1") + "x" : (int)Math.Round(totalOrg * 100) + "%", Resource.Organics.Color, lstQueue.BackColor, lstQueue.Font)); item.SubItems.Add(new ListViewItem.ListViewSubItem(item, double.IsNaN(totalRad) ? "-" : totalRad >= 1 ? totalRad.ToString("f1") + "x" : (int)Math.Round(totalRad * 100) + "%", Resource.Radioactives.Color, lstQueue.BackColor, lstQueue.Font)); var firstFinishesThisTurn = firstEta <= 1.0; var idle = eta < 1.0; var allFinishThisTurn = eta <= 1.0; Color fore = lstQueue.ForeColor, back = lstQueue.BackColor; if (i == ConstructionQueue.Orders.Count - 1) { if (idle) { back = Color.DarkOrange; } else if (firstFinishesThisTurn) { fore = Color.LightGreen; } } else { fore = firstFinishesThisTurn ? (allFinishThisTurn ? Color.Cyan : Color.LightGreen) : lstQueue.ForeColor; } if (back != lstQueue.BackColor) { fore = lstQueue.BackColor; } item.SubItems.Add(new ListViewItem.ListViewSubItem(item, firstEta.CeilingString(1) + "(" + eta.CeilingString(1) + ")", fore, back, lstQueue.Font)); item.ImageIndex = i; il.Images.Add(order.Template.Icon); lstQueue.Items.Add(item); i++; } else { // building something different, or using expanded view count = 1; orders = new List <IConstructionOrder>(); orders.Add(order); totalMin = minprogress; totalOrg = orgprogress; totalRad = radprogress; item = new ListViewItem(order.Name); item.Tag = orders; item.UseItemStyleForSubItems = false; item.SubItems.Add(new ListViewItem.ListViewSubItem(item, double.IsNaN(minprogress) ? "-" : (int)Math.Round(minprogress * 100) + "%", Resource.Minerals.Color, lstQueue.BackColor, lstQueue.Font)); item.SubItems.Add(new ListViewItem.ListViewSubItem(item, double.IsNaN(orgprogress) ? "-" : (int)Math.Round(orgprogress * 100) + "%", Resource.Organics.Color, lstQueue.BackColor, lstQueue.Font)); item.SubItems.Add(new ListViewItem.ListViewSubItem(item, double.IsNaN(radprogress) ? "-" : (int)Math.Round(radprogress * 100) + "%", Resource.Radioactives.Color, lstQueue.BackColor, lstQueue.Font)); Color fore = lstQueue.ForeColor, back = lstQueue.BackColor; var idle = eta < 1.0; var finishesThisTurn = eta <= 1.0; if (i == ConstructionQueue.Orders.Count - 1) { back = idle ? Color.DarkOrange : lstQueue.BackColor; } else { fore = finishesThisTurn ? Color.Cyan : lstQueue.ForeColor; } if (back != lstQueue.BackColor) { fore = lstQueue.BackColor; } item.SubItems.Add(new ListViewItem.ListViewSubItem(item, eta.CeilingString(1) + "(" + eta.CeilingString(1) + ")", fore, back, lstQueue.Font)); item.ImageIndex = i; il.Images.Add(order.Template.Icon); lstQueue.Items.Add(item); i++; firstEta = eta; } if (selected != null && selected.Intersect(orders).Any()) { item.Selected = true; } prevCost += remainingCost; lastTemplate = order.Template; } txtCargoStorageFree.Text = string.Format("Cargo Storage Free: {0} ({1} total in sector)", ConstructionQueue.CargoStorageFree.Kilotons(), ConstructionQueue.CargoStorageFreeInSector.Kilotons()); txtFacilitySlotsFree.Text = string.Format("Facility Slots Free: {0}", ConstructionQueue.FacilitySlotsFree); }