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()); }
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()); }
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; }
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()); }
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()); } }
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); }
// 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); } }
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); }
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); } }
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; } }
public MaterialCommodities(MaterialCommodities c) { count = c.count; // clone these price = c.price; this.Details = c.Details; // can copy this, its fixed }
//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())); }
// 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()); }
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 } } }
static public string FDNameTranslation(string old) { return(MaterialCommodityDB.FDNameTranslation(old)); }
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)); } }