コード例 #1
0
        public static float CalculateCapacityLevel(HediffSet diffSet, PawnCapacityDef capacity, List <PawnCapacityUtility.CapacityImpactor> impactors = null)
        {
            float result;

            if (capacity.zeroIfCannotBeAwake && !diffSet.pawn.health.capacities.CanBeAwake)
            {
                if (impactors != null)
                {
                    impactors.Add(new PawnCapacityUtility.CapacityImpactorCapacity
                    {
                        capacity = PawnCapacityDefOf.Consciousness
                    });
                }
                result = 0f;
            }
            else
            {
                float num = capacity.Worker.CalculateCapacityLevel(diffSet, impactors);
                if (num > 0f && capacity.minValue <= 0f)
                {
                    float num2 = 99999f;
                    float num3 = 1f;
                    for (int i = 0; i < diffSet.hediffs.Count; i++)
                    {
                        Hediff hediff = diffSet.hediffs[i];
                        List <PawnCapacityModifier> capMods = hediff.CapMods;
                        if (capMods != null)
                        {
                            for (int j = 0; j < capMods.Count; j++)
                            {
                                PawnCapacityModifier pawnCapacityModifier = capMods[j];
                                if (pawnCapacityModifier.capacity == capacity)
                                {
                                    num  += pawnCapacityModifier.offset;
                                    num3 *= pawnCapacityModifier.postFactor;
                                    if (pawnCapacityModifier.setMax < num2)
                                    {
                                        num2 = pawnCapacityModifier.setMax;
                                    }
                                    if (impactors != null)
                                    {
                                        impactors.Add(new PawnCapacityUtility.CapacityImpactorHediff
                                        {
                                            hediff = hediff
                                        });
                                    }
                                }
                            }
                        }
                    }
                    num *= num3;
                    num  = Mathf.Min(num, num2);
                }
                num    = Mathf.Max(num, capacity.minValue);
                num    = GenMath.RoundedHundredth(num);
                result = num;
            }
            return(result);
        }
コード例 #2
0
        public static float CalculateCapacityLevel(HediffSet diffSet, PawnCapacityDef capacity, List <CapacityImpactor> impactors = null, bool forTradePrice = false)
        {
            if (capacity.zeroIfCannotBeAwake && !diffSet.pawn.health.capacities.CanBeAwake)
            {
                impactors?.Add(new CapacityImpactorCapacity
                {
                    capacity = PawnCapacityDefOf.Consciousness
                });
                return(0f);
            }
            float num = capacity.Worker.CalculateCapacityLevel(diffSet, impactors);

            if (num > 0f)
            {
                float num2 = 99999f;
                float num3 = 1f;
                for (int i = 0; i < diffSet.hediffs.Count; i++)
                {
                    Hediff hediff = diffSet.hediffs[i];
                    if (forTradePrice && !hediff.def.priceImpact)
                    {
                        continue;
                    }
                    List <PawnCapacityModifier> capMods = hediff.CapMods;
                    if (capMods == null)
                    {
                        continue;
                    }
                    for (int j = 0; j < capMods.Count; j++)
                    {
                        PawnCapacityModifier pawnCapacityModifier = capMods[j];
                        if (pawnCapacityModifier.capacity == capacity)
                        {
                            num += pawnCapacityModifier.offset;
                            float num4 = pawnCapacityModifier.postFactor;
                            if (hediff.CurStage != null && hediff.CurStage.capacityFactorEffectMultiplier != null)
                            {
                                num4 = StatWorker.ScaleFactor(num4, hediff.pawn.GetStatValue(hediff.CurStage.capacityFactorEffectMultiplier));
                            }
                            num3 *= num4;
                            float num5 = pawnCapacityModifier.EvaluateSetMax(diffSet.pawn);
                            if (num5 < num2)
                            {
                                num2 = num5;
                            }
                            impactors?.Add(new CapacityImpactorHediff
                            {
                                hediff = hediff
                            });
                        }
                    }
                }
                num *= num3;
                num  = Mathf.Min(num, num2);
            }
            num = Mathf.Max(num, capacity.minValue);
            return(GenMath.RoundedHundredth(num));
        }
コード例 #3
0
        public virtual bool Allows(Thing t)
        {
            t = t.GetInnerIfMinified();
            bool result;

            if (!this.Allows(t.def))
            {
                result = false;
            }
            else
            {
                if (t.def.useHitPoints)
                {
                    float num = (float)t.HitPoints / (float)t.MaxHitPoints;
                    num = GenMath.RoundedHundredth(num);
                    if (!this.allowedHitPointsPercents.IncludesEpsilon(Mathf.Clamp01(num)))
                    {
                        return(false);
                    }
                }
                if (this.allowedQualities != QualityRange.All && t.def.FollowQualityThingFilter())
                {
                    QualityCategory p;
                    if (!t.TryGetQuality(out p))
                    {
                        p = QualityCategory.Normal;
                    }
                    if (!this.allowedQualities.Includes(p))
                    {
                        return(false);
                    }
                }
                for (int i = 0; i < this.disallowedSpecialFilters.Count; i++)
                {
                    if (this.disallowedSpecialFilters[i].Worker.Matches(t))
                    {
                        return(false);
                    }
                }
                result = true;
            }
            return(result);
        }
コード例 #4
0
 public virtual bool Allows(Thing t)
 {
     if (!this.Allows(t.def))
     {
         return(false);
     }
     if (t.def.useHitPoints)
     {
         float f = (float)t.HitPoints / (float)t.MaxHitPoints;
         f = GenMath.RoundedHundredth(f);
         if (!this.allowedHitPointsPercents.IncludesEpsilon(Mathf.Clamp01(f)))
         {
             return(false);
         }
     }
     if (this.allowedQualities != QualityRange.All && t.def.FollowQualityThingFilter())
     {
         QualityCategory p = default(QualityCategory);
         if (!t.TryGetQuality(out p))
         {
             p = QualityCategory.Normal;
         }
         if (!this.allowedQualities.Includes(p))
         {
             return(false);
         }
     }
     for (int i = 0; i < this.disallowedSpecialFilters.Count; i++)
     {
         if (this.disallowedSpecialFilters[i].Worker.Matches(t))
         {
             return(false);
         }
     }
     return(true);
 }
コード例 #5
0
 public virtual bool Allows(Thing t)
 {
     t = t.GetInnerIfMinified();
     if (!Allows(t.def))
     {
         return(false);
     }
     if (t.def.useHitPoints)
     {
         float f = (float)t.HitPoints / (float)t.MaxHitPoints;
         f = GenMath.RoundedHundredth(f);
         if (!allowedHitPointsPercents.IncludesEpsilon(Mathf.Clamp01(f)))
         {
             return(false);
         }
     }
     if (allowedQualities != QualityRange.All && t.def.FollowQualityThingFilter())
     {
         if (!t.TryGetQuality(out QualityCategory qc))
         {
             qc = QualityCategory.Normal;
         }
         if (!allowedQualities.Includes(qc))
         {
             return(false);
         }
     }
     for (int i = 0; i < disallowedSpecialFilters.Count; i++)
     {
         if (disallowedSpecialFilters[i].Worker.Matches(t) && t.def.IsWithinCategory(disallowedSpecialFilters[i].parentCategory))
         {
             return(false);
         }
     }
     return(true);
 }