Пример #1
0
 /// <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);
 }
Пример #2
0
        /// <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);
        }
Пример #3
0
 /// <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)));
 }
Пример #4
0
 /// <summary>
 /// Can this queue construct something?
 /// </summary>
 /// <param name="item"></param>
 /// <returns></returns>
 public bool CanConstruct(IConstructionTemplate item)
 {
     return(GetReasonForBeingUnableToConstruct(item) == null);
 }
Пример #5
0
        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);
        }