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; }
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); }
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; }
//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())); }