예제 #1
0
        public string DisplayMaterial(string name, double percent, MaterialCommoditiesList historicmatlist = null, MaterialCommoditiesList currentmatlist = null)
        {
            StringBuilder scanText = new StringBuilder();

            MaterialCommodityDB mc = MaterialCommodityDB.GetCachedMaterial(name);

            if (mc != null)
            {
                MaterialCommodities historic = historicmatlist?.Find(mc.name);
                MaterialCommodities current  = Object.ReferenceEquals(historicmatlist, currentmatlist) ? null : currentmatlist?.Find(mc.name);
                int?limit = MaterialCommodityDB.MaterialLimit(mc);

                string matinfo = historic?.count.ToString() ?? "0";
                if (limit != null)
                {
                    matinfo += "/" + limit.Value.ToString();
                }

                if (current != null && (historic == null || historic.count != current.count))
                {
                    matinfo += " Cur " + current.count.ToString();
                }

                scanText.AppendFormat("{0} ({1}) {2} {3}% {4}\n", mc.name, mc.shortname, mc.type, percent.ToString("N1"), matinfo);
            }
            else
            {
                scanText.AppendFormat("{0} {1}%\n", System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(name.ToLower()),
                                      percent.ToString("N1"));
            }

            return(scanText.ToNullSafeString());
        }
예제 #2
0
        public string DisplayMaterials(int indent = 0)
        {
            StringBuilder scanText = new StringBuilder();
            string        indents  = new string(' ', indent);

            scanText.Append("Materials:\n");
            foreach (KeyValuePair <string, double> mat in Materials)
            {
                MaterialCommodityDB mc = MaterialCommodityDB.GetCachedMaterial(mat.Key);
                if (mc != null)
                {
                    scanText.AppendFormat(indents + "{0} ({1}) {2} {3}%\n", mc.name, mc.shortname, mc.type, mat.Value.ToString("N1"));
                }
                else
                {
                    scanText.AppendFormat(indents + "{0} {1}%\n", System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(mat.Key.ToLower()),
                                          mat.Value.ToString("N1"));
                }
            }

            if (scanText.Length > 0 && scanText[scanText.Length - 1] == '\n')
            {
                scanText.Remove(scanText.Length - 1, 1);
            }

            return(scanText.ToNullSafeString());
        }
예제 #3
0
        public override void Init()
        {
            dataGridViewSynthesis.MakeDoubleBuffered();
            dataGridViewSynthesis.DefaultCellStyle.WrapMode = DataGridViewTriState.False;
            dataGridViewSynthesis.RowTemplate.Height        = 26;

            Order = SQLiteDBClass.GetSettingString(DbOSave, "").RestoreArrayFromString(0, SynthesisRecipes.Count);
            if (Order.Distinct().Count() != Order.Length)       // if not distinct..
            {
                for (int i = 0; i < Order.Length; i++)          // reset
                {
                    Order[i] = i;
                }
            }

            Wanted = SQLiteDBClass.GetSettingString(DbWSave, "").RestoreArrayFromString(0, SynthesisRecipes.Count);

            var rcpes = SynthesisRecipes.Select(r => r.name).Distinct().ToList();

            rcpes.Sort();
            rfs          = new RecipeFilterSelector(rcpes);
            rfs.Changed += FilterChanged;

            var lvls = SynthesisRecipes.Select(r => r.level).Distinct().ToList();

            lvls.Sort();
            lfs          = new RecipeFilterSelector(lvls);
            lfs.Changed += FilterChanged;

            List <string> matShortNames = SynthesisRecipes.SelectMany(r => r.ingredients).Distinct().ToList();

            matLookUp = matShortNames.Select(sn => Tuple.Create <string, string>(sn, MaterialCommodityDB.GetCachedMaterialByShortName(sn).name)).ToList();
            List <string> matLongNames = matLookUp.Select(lu => lu.Item2).ToList();

            matLongNames.Sort();
            mfs          = new RecipeFilterSelector(matLongNames);
            mfs.Changed += FilterChanged;

            for (int i = 0; i < SynthesisRecipes.Count; i++)         // pre-fill array.. preventing the crash on cell edit when you
            {
                int rno = Order[i];
                MaterialCommoditiesList.SynthesisRecipe r = SynthesisRecipes[rno];

                int rown = dataGridViewSynthesis.Rows.Add();

                using (DataGridViewRow row = dataGridViewSynthesis.Rows[rown])
                {
                    row.Cells[0].Value = r.name; // debug rno + ":" + r.name;
                    row.Cells[1].Value = r.level;
                    row.Cells[6].Value = r.ingredientsstring;
                    row.Tag            = rno;
                    row.Visible        = false;
                }
            }

            discoveryform.OnNewEntry      += Discoveryform_OnNewEntry;
            uctg.OnTravelSelectionChanged += Display;
        }
예제 #4
0
        private void BackgroundInit()
        {
            StarScan.LoadBodyDesignationMap();
            MaterialCommodityDB.SetUpInitialTable();

            if (!EDDOptions.Instance.NoSystemsLoad)
            {
                downloadMapsTask = FGEImage.DownloadMaps(this, () => PendingClose, LogLine, LogLineHighlight);
                CheckSystems(() => PendingClose, (p, s) => ReportProgress(p, s));
            }

            SystemNoteClass.GetAllSystemNotes();                                // fill up memory with notes, bookmarks, galactic mapping
            BookmarkClass.GetAllBookmarks();

            ReportProgress(-1, "");
            InvokeAsyncOnUiThread(() => OnInitialSyncComplete?.Invoke());

            if (PendingClose)
            {
                return;
            }

            if (EliteDangerousCore.EDDN.EDDNClass.CheckforEDMC()) // EDMC is running
            {
                if (EDCommander.Current.SyncToEddn)               // Both EDD and EDMC should not sync to EDDN.
                {
                    LogLineHighlight("EDDiscovery and EDMarketConnector should not both sync to EDDN. Stop EDMC or uncheck 'send to EDDN' in settings tab!");
                }
            }

            if (PendingClose)
            {
                return;
            }
            LogLine("Reading travel history");

            if (!EDDOptions.Instance.NoLoad)
            {
                DoRefreshHistory(new RefreshWorkerArgs {
                    CurrentCommander = EDCommander.CurrentCmdrID
                });
            }

            if (PendingClose)
            {
                return;
            }

            if (syncstate.performeddbsync || syncstate.performedsmsync)
            {
                string databases = (syncstate.performedsmsync && syncstate.performeddbsync) ? "EDSM and EDDB" : ((syncstate.performedsmsync) ? "EDSM" : "EDDB");

                LogLine("ED Discovery will now synchronise to the " + databases + " databases to obtain star information." + Environment.NewLine +
                        "This will take a while, up to 15 minutes, please be patient." + Environment.NewLine +
                        "Please continue running ED Discovery until refresh is complete.");
            }
            InvokeAsyncOnUiThread(() => OnInitialisationComplete?.Invoke());
        }
예제 #5
0
        public static string RMat(string fdname)            // fix up fdname into a nicer name
        {
            MaterialCommodityDB mc = MaterialCommodityDB.GetCachedMaterial(fdname);

            if (mc != null)
            {
                return(mc.name);
            }
            else
            {
                return(fdname.SplitCapsWordFull());
            }
        }
예제 #6
0
        static public List <MaterialCommodities> GetShoppingList(List <Tuple <Recipe, int> > target, List <MaterialCommodities> list)
        {
            List <MaterialCommodities> shoppingList = new List <MaterialCommodities>();

            foreach (Tuple <Recipe, int> want in target)
            {
                Recipe r      = want.Item1;
                int    wanted = want.Item2;
                for (int i = 0; i < r.ingredients.Length; i++)
                {
                    string ingredient = r.ingredients[i];
                    int    mi         = list.FindIndex(x => x.shortname.Equals(ingredient));
                    int    got        = (mi >= 0) ? list[mi].scratchpad : 0;
                    int    need       = r.count[i] * wanted;

                    if (got < need)
                    {
                        int shopentry = shoppingList.FindIndex(x => x.shortname.Equals(ingredient));
                        if (shopentry >= 0)
                        {
                            shoppingList[shopentry].scratchpad += (need - got);
                        }
                        else
                        {
                            MaterialCommodityDB db = MaterialCommodityDB.GetCachedMaterialByShortName(ingredient);
                            if (db != null)                                           // MUST be there, its well know, but will check..
                            {
                                MaterialCommodities mc = new MaterialCommodities(db); // make a new entry
                                mc.scratchpad = (need - got);
                                shoppingList.Add(mc);
                            }
                        }
                        if (mi >= 0)
                        {
                            list[mi].scratchpad = 0;
                        }
                    }
                    else
                    {
                        if (mi >= 0)
                        {
                            list[mi].scratchpad -= need;
                        }
                    }
                }
            }
            return(shoppingList);
        }
예제 #7
0
        // ifnorecatonsearch is used if you don't know if its a material or commodity.. for future use.

        private MaterialCommodities GetNewCopyOf(string cat, string fdname, SQLiteConnectionUser conn, bool ignorecatonsearch = false)
        {
            int index = list.FindIndex(x => x.fdname.Equals(fdname, StringComparison.InvariantCultureIgnoreCase) && (ignorecatonsearch || x.category.Equals(cat, StringComparison.InvariantCultureIgnoreCase)));

            if (index >= 0)
            {
                list[index] = new MaterialCommodities(list[index]);    // fresh copy..
                return(list[index]);
            }
            else
            {
                MaterialCommodityDB mcdb = MaterialCommodityDB.EnsurePresent(cat, fdname, conn); // get a MCDB of this
                MaterialCommodities mc   = new MaterialCommodities(mcdb);                        // make a new entry
                list.Add(mc);
                return(mc);
            }
        }
예제 #8
0
        Point CreateMaterialNodes(List <PictureBoxHotspot.ImageElement> pc, JournalScan sn, Point matpos, Size matsize)
        {
            Point startpos  = matpos;
            Point maximum   = matpos;
            int   noperline = 0;

            bool noncommon = checkBoxMaterialsRare.Checked;

            string matclicktext = sn.DisplayMaterials(2);

            foreach (KeyValuePair <string, double> sd in sn.Materials)
            {
                string abv     = sd.Key.Substring(0, 1);
                string tooltip = sd.Key;
                Color  fillc   = Color.Yellow;

                MaterialCommodityDB mc = MaterialCommodityDB.GetCachedMaterial(sd.Key);
                if (mc != null)
                {
                    abv     = mc.shortname;
                    fillc   = mc.colour;
                    tooltip = mc.name + " (" + mc.shortname + ") " + mc.type + " " + sd.Value.ToString("0.0") + "%";

                    if (noncommon && mc.type.IndexOf("common", StringComparison.InvariantCultureIgnoreCase) >= 0)
                    {
                        continue;
                    }
                }

                CreateMaterialImage(pc, matpos, matsize, abv, tooltip + "\n\n" + "All " + matclicktext, tooltip, fillc, Color.Black);

                maximum = new Point(Math.Max(maximum.X, matpos.X + matsize.Width), Math.Max(maximum.Y, matpos.Y + matsize.Height));

                if (++noperline == 4)
                {
                    matpos    = new Point(startpos.X, matpos.Y + matsize.Height + materialspacer);
                    noperline = 0;
                }
                else
                {
                    matpos.X += matsize.Width + materialspacer;
                }
            }

            return(maximum);
        }
예제 #9
0
        public bool FromJsonMarket(JObject jo)
        {
            try
            {
                id   = jo["id"].Int();
                name = jo["Name"].Str();
                MaterialCommodityDB mc = MaterialCommodityDB.GetCachedMaterial(name);
                locName = mc != null ? mc.name : name.SplitCapsWordFull();
                type    = mc != null ? mc.type : "Commodity";

                buyPrice      = jo["BuyPrice"].Int();
                sellPrice     = jo["SellPrice"].Int();
                meanPrice     = jo["MeanPrice"].Int();
                demandBracket = jo["DemandBracket"].Int();
                stockBracket  = jo["StockBracket"].Int();
                stock         = jo["Stock"].Int();
                demand        = jo["Demand"].Int();

                List <string> StatusFlags = new List <string>();

                if (jo["Consumer"].Bool())
                {
                    StatusFlags.Add("Consumer");
                }

                if (jo["Producer"].Bool())
                {
                    StatusFlags.Add("Producer");
                }

                if (jo["Rare"].Bool())
                {
                    StatusFlags.Add("Rare");
                }

                this.StatusFlags = StatusFlags;

                ComparisionLR = ComparisionRL = "";
                return(true);
            }
            catch
            {
                return(false);
            }
        }
예제 #10
0
        public override void Init()
        {
            dataGridViewEngineering.MakeDoubleBuffered();
            dataGridViewEngineering.DefaultCellStyle.WrapMode = DataGridViewTriState.False;
            dataGridViewEngineering.RowTemplate.Height        = 26;

            Order = SQLiteDBClass.GetSettingString(DbOSave, "").RestoreArrayFromString(0, EngineeringRecipes.Count);
            if (Order.Distinct().Count() != Order.Length)       // if not distinct..
            {
                for (int i = 0; i < Order.Length; i++)          // reset
                {
                    Order[i] = i;
                }
            }

            Wanted = SQLiteDBClass.GetSettingString(DbWSave, "").RestoreArrayFromString(0, EngineeringRecipes.Count);

            List <string> engineers = EngineeringRecipes.SelectMany(r => r.engineers).Distinct().ToList();

            engineers.Sort();
            efs          = new RecipeFilterSelector(engineers);
            efs.Changed += FilterChanged;

            lfs          = new RecipeFilterSelector(levels);
            lfs.Changed += FilterChanged;

            List <string> modules = EngineeringRecipes.Select(r => r.module).Distinct().ToList();

            modules.Sort();
            mfs          = new RecipeFilterSelector(modules);
            mfs.Changed += FilterChanged;

            var upgrades = EngineeringRecipes.Select(r => r.name).Distinct().ToList();

            upgrades.Sort();
            ufs          = new RecipeFilterSelector(upgrades);
            ufs.Changed += FilterChanged;

            List <string> matShortNames = EngineeringRecipes.SelectMany(r => r.ingredients).Distinct().ToList();

            matLookUp = matShortNames.Select(sn => Tuple.Create <string, string>(sn, MaterialCommodityDB.GetCachedMaterialByShortName(sn).name)).ToList();
            List <string> matLongNames = matLookUp.Select(lu => lu.Item2).ToList();

            matLongNames.Sort();
            matfs          = new RecipeFilterSelector(matLongNames);
            matfs.Changed += FilterChanged;

            for (int i = 0; i < EngineeringRecipes.Count; i++)         // pre-fill array.. preventing the crash on cell edit when you
            {
                int rno = Order[i];
                MaterialCommoditiesList.EngineeringRecipe r = EngineeringRecipes[rno];

                int             rown = dataGridViewEngineering.Rows.Add();
                DataGridViewRow row  = dataGridViewEngineering.Rows[rown];
                row.Cells[UpgradeCol.Index].Value = r.name; // debug rno + ":" + r.name;
                row.Cells[Module.Index].Value     = r.module;
                row.Cells[Level.Index].Value      = r.level;
                row.Cells[Recipe.Index].Value     = r.ingredientsstring;
                row.Cells[Engineers.Index].Value  = r.engineersstring;
                row.Tag     = rno;
                row.Visible = false;
            }

            isHistoric          = SQLiteDBClass.GetSettingBool(DbHistoricMatsSave, false);
            chkHistoric.Checked = isHistoric;
            chkHistoric.Visible = !isEmbedded;

            discoveryform.OnNewEntry      += Discoveryform_OnNewEntry;
            uctg.OnTravelSelectionChanged += Display;
        }
        private void Display(MaterialCommoditiesList mcl)
        {
            dataGridViewMC.Rows.Clear();
            textBoxItems1.Text = textBoxItems2.Text = "";

            if (mcl == null)
            {
                return;
            }

            List <MaterialCommodities> mc = mcl.Sort(!materials);

            if (mc.Count > 0)
            {
                labelNoItems.Visible = false;

                foreach (MaterialCommodities m in mc)
                {
                    object[] rowobj;

                    if (materials)
                    {
                        rowobj = new[] { m.name, m.shortname, m.category, m.type, $"{m.count.ToString()}/{(MaterialCommodityDB.MaterialLimit(m.type)??0).ToString()}" };
                    }
                    else
                    {
                        rowobj = new[] { m.name, m.type, m.count.ToString(), m.price.ToString("0.#") };
                    }

                    int idx = dataGridViewMC.Rows.Add(rowobj);
                    //dataGridViewMC.Rows[idx].Tag = m;
                }

                if (dataGridViewMC.SortedColumn != null && dataGridViewMC.SortOrder != SortOrder.None)
                {
                    dataGridViewMC.Sort(dataGridViewMC.SortedColumn, dataGridViewMC.SortOrder == SortOrder.Descending ? ListSortDirection.Descending : ListSortDirection.Ascending);
                }

                if (materials)
                {
                    textBoxItems1.Text = mcl.DataCount.ToStringInvariant();
                    textBoxItems2.Text = mcl.MaterialsCount.ToStringInvariant();
                }
                else
                {
                    textBoxItems1.Text = mcl.CargoCount.ToStringInvariant();
                }
            }
            else
            {
                labelNoItems.Visible = true;
            }
        }
예제 #12
0
 public MaterialCommodities(MaterialCommodities c)
 {
     count        = c.count;   // clone these
     price        = c.price;
     this.Details = c.Details; // can copy this, its fixed
 }
예제 #13
0
        //return maximum can make, how many made, needed string.
        static public Tuple <int, int, string> HowManyLeft(List <MaterialCommodities> list, Recipe r, int tomake = 0)
        {
            int           max    = int.MaxValue;
            StringBuilder needed = new StringBuilder(64);

            for (int i = 0; i < r.ingredients.Length; i++)
            {
                string ingredient = r.ingredients[i];

                int mi   = list.FindIndex(x => x.shortname.Equals(ingredient));
                int got  = (mi >= 0) ? list[mi].scratchpad : 0;
                int sets = got / r.count[i];

                max = Math.Min(max, sets);

                int need = r.count[i] * tomake;

                if (got < need)
                {
                    string dispName;
                    if (mi > 0)
                    {
                        dispName = (list[mi].category == MaterialCommodityDB.MaterialEncodedCategory || list[mi].category == MaterialCommodityDB.MaterialManufacturedCategory) ? " " + list[mi].name : list[mi].shortname;
                    }
                    else
                    {
                        MaterialCommodityDB db = MaterialCommodityDB.GetCachedMaterialByShortName(ingredient);
                        dispName = (db.category == MaterialCommodityDB.MaterialEncodedCategory || db.category == MaterialCommodityDB.MaterialManufacturedCategory) ? " " + db.name : db.shortname;
                    }
                    string s = (need - got).ToStringInvariant() + dispName;
                    if (needed.Length == 0)
                    {
                        needed.Append("Need:" + s);
                    }
                    else
                    {
                        needed.Append("," + s);
                    }
                }
            }

            int made = 0;

            if (max > 0 && tomake > 0)             // if we have a set, and use it up
            {
                made = Math.Min(max, tomake);      // can only make this much
                StringBuilder usedstr = new StringBuilder(64);

                for (int i = 0; i < r.ingredients.Length; i++)
                {
                    int mi = list.FindIndex(x => x.shortname.Equals(r.ingredients[i]));
                    System.Diagnostics.Debug.Assert(mi != -1);
                    int used = r.count[i] * made;
                    list[mi].scratchpad -= used;
                    string dispName = (list[mi].category == MaterialCommodityDB.MaterialEncodedCategory || list[mi].category == MaterialCommodityDB.MaterialManufacturedCategory) ? " " + list[mi].name : list[mi].shortname;
                    usedstr.AppendPrePad(used.ToStringInvariant() + dispName, ",");
                }

                needed.AppendPrePad("Used: " + usedstr.ToString(), ", ");
            }

            return(new Tuple <int, int, string>(max, made, needed.ToNullSafeString()));
        }
예제 #14
0
        // Called from Background Thread Worker at Init()

        private void BackgroundInit()
        {
            StarScan.LoadBodyDesignationMap();
            MaterialCommodityDB.SetUpInitialTable();

            SQLiteConnectionSystem.CreateSystemsTableIndexes();     // just make sure they are there..

            Debug.WriteLine(BaseUtils.AppTicks.TickCount100 + " Check systems");
            ReportProgress(-1, "");

            if (!EDDOptions.Instance.NoSystemsLoad)
            {
                // Async load of maps in another thread

                downloadMapsTask = DownloadMaps(this, () => PendingClose, LogLine, LogLineHighlight);

                // Former CheckSystems, reworked to accomodate new switches..
                // Check to see what sync refreshes we need

                // New Galmap load - it was not doing a refresh if EDSM sync kept on happening. Now has its own timer

                string   rwgalmaptime = SQLiteConnectionSystem.GetSettingString("EDSMGalMapLast", "2000-01-01 00:00:00"); // Latest time from RW file.
                DateTime galmaptime;
                if (!DateTime.TryParse(rwgalmaptime, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out galmaptime))
                {
                    galmaptime = new DateTime(2000, 1, 1);
                }

                if (DateTime.Now.Subtract(galmaptime).TotalDays > 14)  // Over 14 days do a sync from EDSM for galmap
                {
                    LogLine("Get galactic mapping from EDSM.");
                    galacticMapping.DownloadFromEDSM();
                    SQLiteConnectionSystem.PutSettingString("EDSMGalMapLast", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"));
                }

                Debug.WriteLine(BaseUtils.AppTicks.TickCount100 + " Check systems complete");
            }

            galacticMapping.ParseData();                            // at this point, gal map data has been uploaded - get it into memory
            SystemClassDB.AddToAutoComplete(galacticMapping.GetGMONames());
            SystemNoteClass.GetAllSystemNotes();
            BookmarkClass.LoadBookmarks();

            LogLine("Loaded Notes, Bookmarks and Galactic mapping.");

            ReportProgress(-1, "");
            InvokeAsyncOnUiThread(() => OnInitialSyncComplete?.Invoke());

            if (PendingClose)
            {
                return;
            }

            if (EliteDangerousCore.EDDN.EDDNClass.CheckforEDMC()) // EDMC is running
            {
                if (EDCommander.Current.SyncToEddn)               // Both EDD and EDMC should not sync to EDDN.
                {
                    LogLineHighlight("EDDiscovery and EDMarketConnector should not both sync to EDDN. Stop EDMC or uncheck 'send to EDDN' in settings tab!");
                }
            }

            if (!EDDOptions.Instance.NoLoad)        // here in this thread, we do a refresh of history.
            {
                LogLine("Reading travel history");
                DoRefreshHistory(new RefreshWorkerArgs {
                    CurrentCommander = EDCommander.CurrentCmdrID
                });                                                                                             // kick the background refresh worker thread into action
            }

            if (PendingClose)
            {
                return;
            }

            if (!EDDOptions.Instance.NoSystemsLoad && EDDConfig.Instance.EDSMEDDBDownload)        // if enabled
            {
                SystemClassEDSM.DetermineIfFullEDSMSyncRequired(syncstate);                       // ask EDSM and EDDB if they want to do a Full sync..
                EliteDangerousCore.EDDB.SystemClassEDDB.DetermineIfEDDBSyncRequired(syncstate);

                if (syncstate.perform_eddb_sync || syncstate.perform_edsm_fullsync)
                {
                    string databases = (syncstate.perform_edsm_fullsync && syncstate.perform_eddb_sync) ? "EDSM and EDDB" : ((syncstate.perform_edsm_fullsync) ? "EDSM" : "EDDB");

                    LogLine("Full synchronisation to the " + databases + " databases required." + Environment.NewLine +
                            "This will take a while, up to 15 minutes, please be patient." + Environment.NewLine +
                            "Please continue running ED Discovery until refresh is complete.");
                }
            }
            else
            {
                LogLine("Synchronisation to EDSM and EDDB disabled. Use Settings panel to reenable");
            }

            InvokeAsyncOnUiThread(() => OnInitialisationComplete?.Invoke());
        }
예제 #15
0
        private void Display()
        {
            HistoryEntry last_he = userControlSynthesis.CurrentHistoryEntry;             // sync with what its showing

            if (EngineeringWanted != null && SynthesisWanted != null && last_he != null) // if we have all the ingredients (get it!)
            {
                List <MaterialCommodities> mcl = last_he.MaterialCommodity.Sort(false);
                MaterialCommoditiesList.ResetUsed(mcl);
                Color textcolour = IsTransparent ? discoveryform.theme.SPanelColor : discoveryform.theme.LabelColor;
                Color backcolour = this.BackColor;
                List <Tuple <MaterialCommoditiesList.Recipe, int> > totalWanted = EngineeringWanted.Concat(SynthesisWanted).ToList();
                string techBrokers = SQLiteDBClass.GetSettingString(DBTechBrokerFilterSave, "None");
                if (techBrokers != "None")
                {
                    List <string> techBrokerList = techBrokers.Split(';').ToList <string>();
                    foreach (MaterialCommoditiesList.Recipe r in TechBrokerUnlocks)
                    {
                        if (techBrokers == "All" || techBrokerList.Contains(r.name))
                        {
                            totalWanted.Add(new Tuple <MaterialCommoditiesList.Recipe, int>(r, 1));
                        }
                    }
                }

                List <MaterialCommodities> shoppinglist = MaterialCommoditiesList.GetShoppingList(totalWanted, mcl);
                JournalScan         sd      = null;
                StarScan.SystemNode last_sn = null;

                if (last_he.IsLanded && (showListAvailability || showPlanetMats))
                {
                    sd = discoveryform.history.GetScans(last_he.System.Name).Where(sc => sc.BodyName == last_he.WhereAmI).FirstOrDefault();
                }
                if (!last_he.IsLanded && showSystemAvailability)
                {
                    last_sn = discoveryform.history.starscan.FindSystem(last_he.System, useEDSMForSystemAvailability);
                }

                StringBuilder wantedList = new StringBuilder();

                if (shoppinglist.Any())
                {
                    double available;
                    wantedList.Append("Needed Mats:\n");
                    List <string> capExceededMats = new List <string>();
                    foreach (MaterialCommodities c in shoppinglist.OrderBy(mat => mat.name))      // and add new..
                    {
                        string present = "";
                        if (showListAvailability)
                        {
                            if (sd != null)
                            {
                                if (sd.Materials.TryGetValue(c.fdname, out available))
                                {
                                    present = $" {available.ToString("N1")}%";
                                }
                                else
                                {
                                    present = " -";
                                }
                            }
                        }
                        wantedList.Append($"  {c.scratchpad} {c.name}{present}");
                        int?onHand   = mcl.Where(m => m.shortname == c.shortname).FirstOrDefault()?.count;
                        int totalReq = c.scratchpad + (onHand.HasValue ? onHand.Value : 0);
                        if ((c.type == MaterialCommodityDB.MaterialFreqVeryCommon && totalReq > VeryCommonCap) ||
                            (c.type == MaterialCommodityDB.MaterialFreqCommon && totalReq > CommonCap) ||
                            (c.type == MaterialCommodityDB.MaterialFreqStandard && totalReq > StandardCap) ||
                            (c.type == MaterialCommodityDB.MaterialFreqRare && totalReq > RareCap) ||
                            (c.type == MaterialCommodityDB.MaterialFreqVeryRare && totalReq > VeryRareCap))
                        {
                            capExceededMats.Add(c.name);
                        }
                        if (!last_he.IsLanded && last_sn != null)
                        {
                            var landables = last_sn.Bodies.Where(b => b.ScanData != null && (!b.ScanData.IsEDSMBody || useEDSMForSystemAvailability) &&
                                                                 b.ScanData.HasMaterials && b.ScanData.Materials.ContainsKey(c.fdname));
                            if (landables.Count() > 0)
                            {
                                wantedList.Append("\n    ");
                                List <Tuple <string, double> > allMats = new List <Tuple <string, double> >();
                                foreach (StarScan.ScanNode sn in landables)
                                {
                                    sn.ScanData.Materials.TryGetValue(c.fdname, out available);
                                    allMats.Add(new Tuple <string, double>(sn.fullname.Replace(last_he.System.Name, "", StringComparison.InvariantCultureIgnoreCase).Trim(), available));
                                }
                                allMats = allMats.OrderByDescending(m => m.Item2).ToList();
                                int n = 1;
                                foreach (Tuple <string, double> m in allMats)
                                {
                                    if (n % 6 == 0)
                                    {
                                        wantedList.Append("\n    ");
                                    }
                                    wantedList.Append($"{m.Item1.ToUpperInvariant()}: {m.Item2.ToString("N1")}% ");
                                    n++;
                                }
                            }
                        }
                        wantedList.Append("\n");
                    }

                    if (capExceededMats.Any())
                    {
                        wantedList.Append("\nFilling Shopping List would exceed capacity for:");
                        foreach (string mat in capExceededMats)
                        {
                            wantedList.Append($"\n  {mat}");
                        }
                    }
                }
                else
                {
                    wantedList.Append("No materials currently required.");
                }

                if (showMaxInjections)
                {
                    MaterialCommoditiesList.ResetUsed(mcl);
                    Tuple <int, int, string> basic    = MaterialCommoditiesList.HowManyLeft(mcl, SynthesisRecipes.First(r => r.name == "FSD" && r.level == "Basic"));
                    Tuple <int, int, string> standard = MaterialCommoditiesList.HowManyLeft(mcl, SynthesisRecipes.First(r => r.name == "FSD" && r.level == "Standard"));
                    Tuple <int, int, string> premium  = MaterialCommoditiesList.HowManyLeft(mcl, SynthesisRecipes.First(r => r.name == "FSD" && r.level == "Premium"));
                    wantedList.Append($"\nMax FSD Injections\n   {basic.Item1} Basic\n   {standard.Item1} Standard\n   {premium.Item1} Premium");
                }

                if (showPlanetMats && sd != null && sd.HasMaterials)
                {
                    wantedList.Append($"\n\nMaterials on {last_he.WhereAmI}\n");
                    foreach (KeyValuePair <string, double> mat in sd.Materials)
                    {
                        int?onHand             = mcl.Where(m => m.fdname == mat.Key).FirstOrDefault()?.count;
                        MaterialCommodityDB md = MaterialCommodityDB.GetCachedMaterial(mat.Key);
                        int max;
                        if (md.type == MaterialCommodityDB.MaterialFreqVeryCommon)
                        {
                            max = VeryCommonCap;
                        }
                        else if (md.type == MaterialCommodityDB.MaterialFreqCommon)
                        {
                            max = CommonCap;
                        }
                        else if (md.type == MaterialCommodityDB.MaterialFreqStandard)
                        {
                            max = StandardCap;
                        }
                        else if (md.type == MaterialCommodityDB.MaterialFreqRare)
                        {
                            max = RareCap;
                        }
                        else
                        {
                            max = VeryRareCap;
                        }
                        wantedList.AppendFormat("   {0} {1}% ({2}/{3})\n", System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(mat.Key.ToLower(System.Globalization.CultureInfo.InvariantCulture)),
                                                mat.Value.ToString("N1"), (onHand.HasValue ? onHand.Value : 0), max);
                    }
                }

                Font font = discoveryform.theme.GetFont;
                pictureBoxList.ClearImageList();
                PictureBoxHotspot.ImageElement displayList = pictureBoxList.AddTextAutoSize(new Point(0, 0), new Size(1000, 1000), wantedList.ToNullSafeString(), font, textcolour, backcolour, 1.0F);
                pictureBoxList.Render();
                font.Dispose();

                // if transparent, we don't show the eng/synth panels

                userControlEngineering.Visible = userControlSynthesis.Visible = !IsTransparent;
                userControlEngineering.Enabled = userControlSynthesis.Enabled = !IsTransparent;
                buttonTechBroker.Visible       = buttonTechBroker.Enabled = !IsTransparent;

                splitContainerVertical.Panel1MinSize = displayList.img.Width + 8;       // panel left has minimum width to accomodate the text

                if (IsTransparent)
                {
                    RevertToNormalSize();
                    int minWidth = Math.Max(((UserControlForm)FindForm()).TitleBarMinWidth(), displayList.img.Width) + 8;
                    RequestTemporaryResize(new Size(minWidth, displayList.img.Height + 4));
                }
                else
                {
                    RevertToNormalSize();       // eng/synth is on, normal size
                }
            }
        }
예제 #16
0
 static public string FDNameTranslation(string old)
 {
     return(MaterialCommodityDB.FDNameTranslation(old));
 }
예제 #17
0
 public MaterialCommodities(MaterialCommodityDB c)
 {
     count        = scratchpad = 0;
     price        = 0;
     this.Details = c;
 }
        void DrawSystem() // draw last_sn, last_he
        {
            dataGridViewScangrid.Rows.Clear();

            if (last_he == null)
            {
                SetControlText("No Scan");
                return;
            }

            StarScan.SystemNode last_sn = discoveryform.history.starscan.FindSystem(last_he.System, true);

            SetControlText("No Scan");

            if (last_sn != null)
            {
                List <StarScan.ScanNode> all_nodes = last_sn.Bodies.ToList();// flatten tree of scan nodes to prepare for listing

                foreach (StarScan.ScanNode sn in all_nodes)
                {
                    if (sn.ScanData != null && sn.ScanData.BodyName != null)
                    {
                        StringBuilder bdClass   = new StringBuilder();
                        StringBuilder bdDist    = new StringBuilder();
                        StringBuilder bdDetails = new StringBuilder();

                        if (sn.ScanData.PlanetClass != null)
                        {
                            bdClass.Append(sn.ScanData.PlanetClass);
                        }
                        if (sn.ScanData.StarTypeText != null)
                        {
                            bdClass.Append(sn.ScanData.StarTypeText);
                        }

                        if (sn.level >= 2 && sn.type == StarScan.ScanNodeType.body)
                        {
                            bdClass.Append(" Moon");
                        }

                        if (sn.ScanData.IsStar && sn.ScanData.BodyName.EndsWith(" A"))
                        {
                            bdDist.AppendFormat("Main Star");
                        }
                        else if (sn.ScanData.nSemiMajorAxis.HasValue)
                        {
                            if (sn.ScanData.IsStar || sn.ScanData.nSemiMajorAxis.Value > JournalScan.oneAU_m / 10)
                            {
                                bdDist.AppendFormat("{0:0.00}AU ({1:0.00}ls)", (sn.ScanData.nSemiMajorAxis.Value / JournalScan.oneAU_m), sn.ScanData.nSemiMajorAxis.Value / JournalScan.oneLS_m);
                            }
                            else
                            {
                                bdDist.AppendFormat("{0}km", (sn.ScanData.nSemiMajorAxis.Value / 1000).ToString("N1"));
                            }
                        }

                        // display stars and stellar bodies mass
                        if (sn.ScanData.IsStar && sn.ScanData.nStellarMass.HasValue)
                        {
                            bdDetails.Append("Mass: " + sn.ScanData.nStellarMass.Value.ToString("N2") + ", ");
                        }

                        // habitable zone for stars - do not display for black holes.
                        if (sn.ScanData.HabitableZoneInner != null && sn.ScanData.HabitableZoneOuter != null && sn.ScanData.StarTypeID != EDStar.H)
                        {
                            bdDetails.AppendFormat("Habitable Zone: {0}-{1}AU ({2}). ", (sn.ScanData.HabitableZoneInner.Value / JournalScan.oneAU_LS).ToString("N2"), (sn.ScanData.HabitableZoneOuter.Value / JournalScan.oneAU_LS).ToString("N2"), sn.ScanData.GetHabZoneStringLs());
                        }

                        // tell us that a bodie is landable, and shows its gravity
                        if (sn.ScanData.IsLandable == true)
                        {
                            string Gg = "";

                            if (sn.ScanData.nSurfaceGravity.HasValue)
                            {
                                double?g = sn.ScanData.nSurfaceGravity / JournalScan.oneGee_m_s2;
                                Gg = " (G: " + g.Value.ToString("N1") + ")";
                            }

                            bdDetails.Append("Landable" + Gg + ". ");
                        }

                        // append the terraformable state to the planet class
                        if (sn.ScanData.Terraformable == true)
                        {
                            bdDetails.Append("Terraformable. ");
                        }

                        // tell us that there is some volcanic activity
                        if (sn.ScanData.Volcanism != null)
                        {
                            bdDetails.Append("Volcanism. ");
                        }

                        // have some ring?
                        if (sn.ScanData.HasRings && sn.ScanData.IsStar == false)
                        {
                            if (sn.ScanData.Rings.Count() > 1)
                            {
                                bdDetails.Append("Has " + sn.ScanData.Rings.Count() + " rings: ");
                            }
                            else
                            {
                                bdDetails.Append("Has 1 ring: ");
                            }

                            for (int i = 0; i < sn.ScanData.Rings.Length; i++)
                            {
                                string RingName = sn.ScanData.Rings[i].Name;
                                bdDetails.Append(JournalScan.StarPlanetRing.DisplayStringFromRingClass(sn.ScanData.Rings[i].RingClass) + " ");
                                bdDetails.Append((sn.ScanData.Rings[i].InnerRad / JournalScan.oneLS_m).ToString("N2") + "ls to " + (sn.ScanData.Rings[i].OuterRad / JournalScan.oneLS_m).ToString("N2") + "ls. ");
                            }
                        }

                        // print the main atmospheric composition
                        if (sn.ScanData.Atmosphere != null && sn.ScanData.Atmosphere != "None")
                        {
                            bdDetails.Append(sn.ScanData.Atmosphere + ". ");
                        }

                        // materials
                        if (sn.ScanData.HasMaterials)
                        {
                            string ret = "";
                            foreach (KeyValuePair <string, double> mat in sn.ScanData.Materials)
                            {
                                MaterialCommodityDB mc = MaterialCommodityDB.GetCachedMaterial(mat.Key);
                                if (mc != null && MaterialCommodityDB.IsJumponium(mc.name))
                                {
                                    ret = ret.AppendPrePad(mc.name, ", ");
                                }
                            }

                            if (ret.Length > 0)
                            {
                                bdDetails.Append("\n" + "This body contains: " + ret);
                            }
                        }

                        int value = sn.ScanData.EstimatedValue;
                        bdDetails.Append("\nValue " + value.ToString("N0"));

                        //if ( sn.ScanData.EDSMDiscoveryCommander != null)      // not doing this, could be an option..
                        //    bdDetails.Append("\n" + "Discovered by: " + sn.ScanData.EDSMDiscoveryCommander + " on " + sn.ScanData.EDSMDiscoveryUTC.ToStringYearFirst());

                        Image img = null;

                        if (sn.ScanData.IsStar == true)
                        {
                            img = sn.ScanData.GetStarTypeImage(); // if is a star, use the Star image
                        }
                        else
                        {
                            img = sn.ScanData.GetPlanetClassImage(); // use the correct image in case of planets and moons
                        }

                        dataGridViewScangrid.Rows.Add(new object[] { null, sn.ScanData.BodyName, bdClass, bdDist, bdDetails });

                        DataGridViewRow cur = dataGridViewScangrid.Rows[dataGridViewScangrid.Rows.Count - 1];

                        cur.Tag          = img;
                        cur.Cells[4].Tag = cur.Cells[0].ToolTipText = cur.Cells[1].ToolTipText = cur.Cells[2].ToolTipText = cur.Cells[3].ToolTipText = cur.Cells[4].ToolTipText =
                            sn.ScanData.DisplayString(historicmatlist: last_he.MaterialCommodity, currentmatlist: discoveryform.history.GetLast?.MaterialCommodity);
                    }
                }

                // display total scan values
                SetControlText("Scan Summary for " + last_sn.system.Name + ". " + BuildScanValue(last_sn));
            }
        }