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