private List <ThingStuffPairWithQuality> GeneratePossibleDefs(ThingSetMakerParams parms, out float totalMarketValue) { IEnumerable <ThingDef> enumerable = AllowedThingDefs(parms); if (!enumerable.Any()) { totalMarketValue = 0f; return(new List <ThingStuffPairWithQuality>()); } TechLevel? techLevel = parms.techLevel; TechLevel techLevel2 = techLevel.HasValue ? techLevel.Value : TechLevel.Undefined; IntRange? countRange = parms.countRange; IntRange intRange = (!countRange.HasValue) ? new IntRange(1, 2147483647) : countRange.Value; FloatRange? totalMarketValueRange = parms.totalMarketValueRange; FloatRange floatRange = (!totalMarketValueRange.HasValue) ? FloatRange.Zero : totalMarketValueRange.Value; float? maxTotalMass = parms.maxTotalMass; float num = (!maxTotalMass.HasValue) ? 3.40282347E+38f : maxTotalMass.Value; QualityGenerator?qualityGenerator = parms.qualityGenerator; QualityGenerator qualityGenerator2 = qualityGenerator.HasValue ? qualityGenerator.Value : QualityGenerator.BaseGen; totalMarketValue = floatRange.RandomInRange; IntRange countRange2 = intRange; float totalValue = totalMarketValue; IEnumerable <ThingDef> allowed = enumerable; TechLevel techLevel3 = techLevel2; QualityGenerator qualityGenerator3 = qualityGenerator2; Func <ThingStuffPairWithQuality, float> getMinValue = GetMinValue; Func <ThingStuffPairWithQuality, float> getMaxValue = GetMaxValue; float maxMass = num; return(ThingSetMakerByTotalStatUtility.GenerateDefsWithPossibleTotalValue(countRange2, totalValue, allowed, techLevel3, qualityGenerator3, getMinValue, getMaxValue, null, 100, maxMass)); }
public static void IncreaseStackCountsToTotalValue(List <Thing> things, float totalValue, Func <Thing, float> getValue, float maxMass = 3.40282347E+38f) { float num = 0f; float num2 = 0f; for (int i = 0; i < things.Count; i++) { num += getValue(things[i]) * (float)things[i].stackCount; if (!(things[i] is Pawn)) { num2 += things[i].GetStatValue(StatDefOf.Mass, true) * (float)things[i].stackCount; } } if (num >= totalValue || num2 >= maxMass) { return; } things.SortByDescending((Thing x) => getValue(x) / x.GetStatValue(StatDefOf.Mass, true)); ThingSetMakerByTotalStatUtility.DistributeEvenly(things, num + (totalValue - num) * 0.1f, ref num, ref num2, getValue, (maxMass != float.MaxValue) ? (num2 + (maxMass - num2) * 0.1f) : float.MaxValue, false); if (num >= totalValue || num2 >= maxMass) { return; } ThingSetMakerByTotalStatUtility.DistributeEvenly(things, totalValue, ref num, ref num2, getValue, maxMass, true); if (num >= totalValue || num2 >= maxMass) { return; } ThingSetMakerByTotalStatUtility.GiveRemainingValueToAnything(things, totalValue, ref num, ref num2, getValue, maxMass); }
private List <ThingStuffPairWithQuality> GeneratePossibleDefs(ThingSetMakerParams parms, out float totalMarketValue) { IEnumerable <ThingDef> enumerable = this.AllowedThingDefs(parms); if (!enumerable.Any <ThingDef>()) { totalMarketValue = 0f; return(new List <ThingStuffPairWithQuality>()); } TechLevel? techLevel = parms.techLevel; TechLevel techLevel2 = (techLevel == null) ? TechLevel.Undefined : techLevel.Value; IntRange? countRange = parms.countRange; IntRange intRange = (countRange == null) ? new IntRange(1, int.MaxValue) : countRange.Value; FloatRange? totalMarketValueRange = parms.totalMarketValueRange; FloatRange floatRange = (totalMarketValueRange == null) ? FloatRange.Zero : totalMarketValueRange.Value; float? maxTotalMass = parms.maxTotalMass; float num = (maxTotalMass == null) ? float.MaxValue : maxTotalMass.Value; QualityGenerator?qualityGenerator = parms.qualityGenerator; QualityGenerator qualityGenerator2 = (qualityGenerator == null) ? QualityGenerator.BaseGen : qualityGenerator.Value; totalMarketValue = floatRange.RandomInRange; IntRange countRange2 = intRange; float totalValue = totalMarketValue; IEnumerable <ThingDef> allowed = enumerable; TechLevel techLevel3 = techLevel2; QualityGenerator qualityGenerator3 = qualityGenerator2; Func <ThingStuffPairWithQuality, float> getMinValue = new Func <ThingStuffPairWithQuality, float>(this.GetMinValue); Func <ThingStuffPairWithQuality, float> getMaxValue = new Func <ThingStuffPairWithQuality, float>(this.GetMaxValue); float maxMass = num; return(ThingSetMakerByTotalStatUtility.GenerateDefsWithPossibleTotalValue(countRange2, totalValue, allowed, techLevel3, qualityGenerator3, getMinValue, getMaxValue, null, 100, maxMass)); }
protected override void Generate(ThingSetMakerParams parms, List <Thing> outThings) { float maxMass = parms.maxTotalMass ?? float.MaxValue; float totalNutrition; List <ThingStuffPairWithQuality> list = GeneratePossibleDefs(parms, out totalNutrition, nextSeed); for (int i = 0; i < list.Count; i++) { outThings.Add(list[i].MakeThing()); } ThingSetMakerByTotalStatUtility.IncreaseStackCountsToTotalValue_NewTemp(outThings, totalNutrition, (Thing x) => x.GetStatValue(StatDefOf.Nutrition), maxMass); nextSeed++; }
protected override void Generate(ThingSetMakerParams parms, List <Thing> outThings) { float maxMass = parms.maxTotalMass ?? float.MaxValue; float totalMarketValue; List <ThingStuffPairWithQuality> list = GeneratePossibleDefs(parms, out totalMarketValue, nextSeed); for (int i = 0; i < list.Count; i++) { outThings.Add(list[i].MakeThing()); } ThingSetMakerByTotalStatUtility.IncreaseStackCountsToTotalValue_NewTemp(outThings, totalMarketValue, (Thing x) => x.MarketValue, maxMass, satisfyMinRewardCount: true); nextSeed++; }
protected override void Generate(ThingSetMakerParams parms, List <Thing> outThings) { float?maxTotalMass = parms.maxTotalMass; float maxMass = (maxTotalMass == null) ? float.MaxValue : maxTotalMass.Value; float totalValue; List <ThingStuffPairWithQuality> list = this.GeneratePossibleDefs(parms, out totalValue, this.nextSeed); for (int i = 0; i < list.Count; i++) { outThings.Add(list[i].MakeThing()); } ThingSetMakerByTotalStatUtility.IncreaseStackCountsToTotalValue(outThings, totalValue, (Thing x) => x.MarketValue, maxMass); this.nextSeed++; }
protected override void Generate(ThingSetMakerParams parms, List <Thing> outThings) { float?maxTotalMass = parms.maxTotalMass; float maxMass = (!maxTotalMass.HasValue) ? 3.40282347E+38f : maxTotalMass.Value; float totalValue; List <ThingStuffPairWithQuality> list = this.GeneratePossibleDefs(parms, out totalValue, this.nextSeed); for (int i = 0; i < list.Count; i++) { outThings.Add(list[i].MakeThing()); } ThingSetMakerByTotalStatUtility.IncreaseStackCountsToTotalValue(outThings, totalValue, (Thing x) => x.GetStatValue(StatDefOf.Nutrition, true), maxMass); this.nextSeed++; }
private List <ThingStuffPairWithQuality> GeneratePossibleDefs(ThingSetMakerParams parms, out float totalMarketValue) { IEnumerable <ThingDef> enumerable = AllowedThingDefs(parms); if (!enumerable.Any()) { totalMarketValue = 0f; return(new List <ThingStuffPairWithQuality>()); } TechLevel techLevel = parms.techLevel ?? TechLevel.Undefined; IntRange countRange = parms.countRange ?? new IntRange(1, int.MaxValue); FloatRange floatRange = parms.totalMarketValueRange ?? FloatRange.Zero; float maxMass = parms.maxTotalMass ?? float.MaxValue; QualityGenerator qualityGenerator = parms.qualityGenerator ?? QualityGenerator.BaseGen; totalMarketValue = floatRange.RandomInRange; return(ThingSetMakerByTotalStatUtility.GenerateDefsWithPossibleTotalValue_NewTmp3(countRange, totalMarketValue, enumerable, techLevel, qualityGenerator, GetMinValue, GetMaxValue, GetSingleThingValue, null, 100, maxMass, parms.allowNonStackableDuplicates.GetValueOrDefault(true), totalMarketValue * (parms.minSingleItemMarketValuePct ?? 0f))); }
private List <ThingStuffPairWithQuality> GeneratePossibleDefs(ThingSetMakerParams parms, out float totalNutrition) { IEnumerable <ThingDef> enumerable = AllowedThingDefs(parms); if (!enumerable.Any()) { totalNutrition = 0f; return(new List <ThingStuffPairWithQuality>()); } IntRange countRange = parms.countRange ?? new IntRange(1, int.MaxValue); FloatRange floatRange = parms.totalNutritionRange ?? FloatRange.Zero; TechLevel techLevel = parms.techLevel ?? TechLevel.Undefined; float maxMass = parms.maxTotalMass ?? float.MaxValue; QualityGenerator qualityGenerator = parms.qualityGenerator ?? QualityGenerator.BaseGen; totalNutrition = floatRange.RandomInRange; int numMeats = enumerable.Count((ThingDef x) => x.IsMeat); int numLeathers = enumerable.Count((ThingDef x) => x.IsLeather); return(ThingSetMakerByTotalStatUtility.GenerateDefsWithPossibleTotalValue_NewTmp3(weightSelector: (ThingDef x) => ThingSetMakerUtility.AdjustedBigCategoriesSelectionWeight(x, numMeats, numLeathers), countRange: countRange, totalValue: totalNutrition, allowed: enumerable, techLevel: techLevel, qualityGenerator: qualityGenerator, getMinValue: (ThingStuffPairWithQuality x) => x.GetStatValue(StatDefOf.Nutrition), getMaxValue: (ThingStuffPairWithQuality x) => x.GetStatValue(StatDefOf.Nutrition) * (float)x.thing.stackLimit, getSingleThingValue: (ThingStuffPairWithQuality x) => x.GetStatValue(StatDefOf.Nutrition), tries: 100, maxMass: maxMass)); }
private List<ThingStuffPairWithQuality> GeneratePossibleDefs(ThingSetMakerParams parms, out float totalNutrition) { IEnumerable<ThingDef> enumerable = this.AllowedThingDefs(parms); List<ThingStuffPairWithQuality> result; if (!enumerable.Any<ThingDef>()) { totalNutrition = 0f; result = new List<ThingStuffPairWithQuality>(); } else { IntRange? countRange = parms.countRange; IntRange intRange = (countRange == null) ? new IntRange(1, int.MaxValue) : countRange.Value; FloatRange? totalNutritionRange = parms.totalNutritionRange; FloatRange floatRange = (totalNutritionRange == null) ? FloatRange.Zero : totalNutritionRange.Value; TechLevel? techLevel = parms.techLevel; TechLevel techLevel2 = (techLevel == null) ? TechLevel.Undefined : techLevel.Value; float? maxTotalMass = parms.maxTotalMass; float num = (maxTotalMass == null) ? float.MaxValue : maxTotalMass.Value; QualityGenerator? qualityGenerator = parms.qualityGenerator; QualityGenerator qualityGenerator2 = (qualityGenerator == null) ? QualityGenerator.BaseGen : qualityGenerator.Value; totalNutrition = floatRange.RandomInRange; int numMeats = enumerable.Count((ThingDef x) => x.IsMeat); int numLeathers = enumerable.Count((ThingDef x) => x.IsLeather); Func<ThingDef, float> func = (ThingDef x) => ThingSetMakerUtility.AdjustedBigCategoriesSelectionWeight(x, numMeats, numLeathers); IntRange countRange2 = intRange; float totalValue = totalNutrition; IEnumerable<ThingDef> allowed = enumerable; TechLevel techLevel3 = techLevel2; QualityGenerator qualityGenerator3 = qualityGenerator2; Func<ThingStuffPairWithQuality, float> getMinValue = (ThingStuffPairWithQuality x) => x.GetStatValue(StatDefOf.Nutrition); Func<ThingStuffPairWithQuality, float> getMaxValue = (ThingStuffPairWithQuality x) => x.GetStatValue(StatDefOf.Nutrition) * (float)x.thing.stackLimit; Func<ThingDef, float> weightSelector = func; float maxMass = num; result = ThingSetMakerByTotalStatUtility.GenerateDefsWithPossibleTotalValue(countRange2, totalValue, allowed, techLevel3, qualityGenerator3, getMinValue, getMaxValue, weightSelector, 100, maxMass); } return result; }
public static List <ThingStuffPairWithQuality> GenerateDefsWithPossibleTotalValue(IntRange countRange, float totalValue, IEnumerable <ThingDef> allowed, TechLevel techLevel, QualityGenerator qualityGenerator, Func <ThingStuffPairWithQuality, float> getMinValue, Func <ThingStuffPairWithQuality, float> getMaxValue, Func <ThingDef, float> weightSelector = null, int tries = 100, float maxMass = 3.40282347E+38f) { List <ThingStuffPairWithQuality> chosen = new List <ThingStuffPairWithQuality>(); if (countRange.max <= 0) { return(chosen); } if (countRange.min < 1) { countRange.min = 1; } ThingSetMakerByTotalStatUtility.CalculateAllowedThingStuffPairs(allowed, techLevel, qualityGenerator); float trashThreshold = ThingSetMakerByTotalStatUtility.GetTrashThreshold(countRange, totalValue, getMaxValue); ThingSetMakerByTotalStatUtility.allowedThingStuffPairs.RemoveAll((ThingStuffPairWithQuality x) => getMaxValue(x) < trashThreshold); if (!ThingSetMakerByTotalStatUtility.allowedThingStuffPairs.Any <ThingStuffPairWithQuality>()) { return(chosen); } float minCandidateValueEver = float.MaxValue; float maxCandidateValueEver = float.MinValue; float minMassEver = float.MaxValue; foreach (ThingStuffPairWithQuality thingStuffPairWithQuality in ThingSetMakerByTotalStatUtility.allowedThingStuffPairs) { minCandidateValueEver = Mathf.Min(minCandidateValueEver, getMinValue(thingStuffPairWithQuality)); maxCandidateValueEver = Mathf.Max(maxCandidateValueEver, getMaxValue(thingStuffPairWithQuality)); if (thingStuffPairWithQuality.thing.category != ThingCategory.Pawn) { minMassEver = Mathf.Min(minMassEver, ThingSetMakerByTotalStatUtility.GetNonTrashMass(thingStuffPairWithQuality, trashThreshold, getMinValue)); } } minCandidateValueEver = Mathf.Max(minCandidateValueEver, trashThreshold); float totalMinValueSoFar = 0f; float totalMaxValueSoFar = 0f; float minMassSoFar = 0f; int num = 0; for (;;) { num++; if (num > 10000) { break; } IEnumerable <ThingStuffPairWithQuality> enumerable = ThingSetMakerByTotalStatUtility.allowedThingStuffPairs.Where(delegate(ThingStuffPairWithQuality x) { if (maxMass != 3.40282347E+38f && x.thing.category != ThingCategory.Pawn) { float nonTrashMass = ThingSetMakerByTotalStatUtility.GetNonTrashMass(x, trashThreshold, getMinValue); if (minMassSoFar + nonTrashMass > maxMass) { return(false); } if (chosen.Count < countRange.min && minMassSoFar + minMassEver * (float)(countRange.min - chosen.Count - 1) + nonTrashMass > maxMass) { return(false); } } return(totalMinValueSoFar + Mathf.Max(getMinValue(x), trashThreshold) <= totalValue && (chosen.Count >= countRange.min || totalMinValueSoFar + minCandidateValueEver * (float)(countRange.min - chosen.Count - 1) + Mathf.Max(getMinValue(x), trashThreshold) <= totalValue)); }); if (countRange.max != 2147483647 && totalMaxValueSoFar < totalValue * 0.5f) { IEnumerable <ThingStuffPairWithQuality> enumerable2 = enumerable; enumerable = from x in enumerable where totalMaxValueSoFar + maxCandidateValueEver * (float)(countRange.max - chosen.Count - 1) + getMaxValue(x) >= totalValue * 0.5f select x; if (!enumerable.Any <ThingStuffPairWithQuality>()) { enumerable = enumerable2; } } float maxCandidateMinValue = float.MinValue; foreach (ThingStuffPairWithQuality arg in enumerable) { maxCandidateMinValue = Mathf.Max(maxCandidateMinValue, Mathf.Max(getMinValue(arg), trashThreshold)); } ThingStuffPairWithQuality thingStuffPairWithQuality2; if (!enumerable.TryRandomElementByWeight(delegate(ThingStuffPairWithQuality x) { float a = 1f; if (countRange.max != 2147483647 && chosen.Count < countRange.max && totalValue >= totalMaxValueSoFar) { int num2 = countRange.max - chosen.Count; float b = (totalValue - totalMaxValueSoFar) / (float)num2; a = Mathf.InverseLerp(0f, b, getMaxValue(x)); } float b2 = 1f; if (chosen.Count < countRange.min && totalValue >= totalMinValueSoFar) { int num3 = countRange.min - chosen.Count; float num4 = (totalValue - totalMinValueSoFar) / (float)num3; float num5 = Mathf.Max(getMinValue(x), trashThreshold); if (num5 > num4) { b2 = num4 / num5; } } float num6 = Mathf.Max(Mathf.Min(a, b2), 1E-05f); if (weightSelector != null) { num6 *= weightSelector(x.thing); } if (totalValue > totalMaxValueSoFar) { int num7 = Mathf.Max(countRange.min - chosen.Count, 1); float num8 = Mathf.InverseLerp(0f, maxCandidateMinValue * 0.85f, ThingSetMakerByTotalStatUtility.GetMaxValueWithMaxMass(x, minMassSoFar, maxMass, getMinValue, getMaxValue) * (float)num7); num6 *= num8 * num8; } if (PawnWeaponGenerator.IsDerpWeapon(x.thing, x.stuff)) { num6 *= 0.1f; } if (techLevel != TechLevel.Undefined) { TechLevel techLevel2 = x.thing.techLevel; if (techLevel2 < techLevel && techLevel2 <= TechLevel.Neolithic && (x.thing.IsApparel || x.thing.IsWeapon)) { num6 *= 0.1f; } } return(num6); }, out thingStuffPairWithQuality2)) { goto Block_10; } chosen.Add(thingStuffPairWithQuality2); totalMinValueSoFar += Mathf.Max(getMinValue(thingStuffPairWithQuality2), trashThreshold); totalMaxValueSoFar += getMaxValue(thingStuffPairWithQuality2); if (thingStuffPairWithQuality2.thing.category != ThingCategory.Pawn) { minMassSoFar += ThingSetMakerByTotalStatUtility.GetNonTrashMass(thingStuffPairWithQuality2, trashThreshold, getMinValue); } if (chosen.Count >= countRange.max) { goto Block_12; } if (chosen.Count >= countRange.min && totalMaxValueSoFar >= totalValue * 0.9f) { goto Block_14; } } Log.Error("Too many iterations.", false); Block_10: Block_12: Block_14: return(chosen); }