コード例 #1
0
        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));
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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++;
        }
コード例 #5
0
        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++;
        }
コード例 #6
0
        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++;
        }
コード例 #7
0
        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++;
        }
コード例 #8
0
        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)));
        }
コード例 #9
0
        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));
        }
コード例 #10
0
		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;
		}
コード例 #11
0
        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);
        }