private bool ShouldBeDead() { if (Dead) { return(true); } for (int i = 0; i < hediffSet.hediffs.Count; i++) { if (hediffSet.hediffs[i].CauseDeathNow()) { return(true); } } if (ShouldBeDeadFromRequiredCapacity() != null) { return(true); } float num = PawnCapacityUtility.CalculatePartEfficiency(hediffSet, pawn.RaceProps.body.corePart); if (num <= 0.0001f) { return(true); } if (ShouldBeDeadFromLethalDamageThreshold()) { return(true); } return(false); }
private bool ShouldBeDead() { bool result; if (this.Dead) { result = true; } else { for (int i = 0; i < this.hediffSet.hediffs.Count; i++) { if (this.hediffSet.hediffs[i].CauseDeathNow()) { return(true); } } if (this.ShouldBeDeadFromRequiredCapacity() != null) { result = true; } else { float num = PawnCapacityUtility.CalculatePartEfficiency(this.hediffSet, this.pawn.RaceProps.body.corePart, false, null); result = (num <= 0.0001f || this.ShouldBeDeadFromLethalDamageThreshold()); } } return(result); }
public float GetDamageFactorFor(Tool tool, Pawn attacker, HediffComp_VerbGiver hediffCompSource) { float num = 1f; if (attacker != null) { if (hediffCompSource != null) { num *= PawnCapacityUtility.CalculatePartEfficiency(hediffCompSource.Pawn.health.hediffSet, hediffCompSource.parent.Part, ignoreAddedParts: true); } else if (attacker != null && AdjustedLinkedBodyPartsGroup(tool) != null) { float num2 = PawnCapacityUtility.CalculateNaturalPartsAverageEfficiency(attacker.health.hediffSet, AdjustedLinkedBodyPartsGroup(tool)); if (AdjustedEnsureLinkedBodyPartsGroupAlwaysUsable(tool)) { num2 = Mathf.Max(num2, 0.4f); } num *= num2; } if (attacker != null && IsMeleeAttack) { num *= attacker.ageTracker.CurLifeStage.meleeDamageFactor; } } return(num); }
private bool ShouldBeDead() { if (this.Dead) { return(true); } for (int i = 0; i < this.hediffSet.hediffs.Count; i++) { if (this.hediffSet.hediffs[i].CauseDeathNow()) { return(true); } } if (this.ShouldBeDeadFromRequiredCapacity() != null) { return(true); } float num = PawnCapacityUtility.CalculatePartEfficiency(this.hediffSet, this.pawn.RaceProps.body.corePart, false, null); if (num <= 9.9999997473787516E-05) { return(true); } return(false); }
private bool ShouldBeDead() { if (Dead) { return(true); } for (int i = 0; i < hediffSet.hediffs.Count; i++) { if (hediffSet.hediffs[i].CauseDeathNow()) { return(true); } } if (ShouldBeDeadFromRequiredCapacity() != null) { return(true); } if (PawnCapacityUtility.CalculatePartEfficiency(hediffSet, pawn.RaceProps.body.corePart) <= 0.0001f) { if (DebugViewSettings.logCauseOfDeath) { Log.Message("CauseOfDeath: zero efficiency of " + pawn.RaceProps.body.corePart.Label); } return(true); } if (ShouldBeDeadFromLethalDamageThreshold()) { return(true); } return(false); }
public static float CalculateTagEfficiency(HediffSet diffSet, string tag, float maximum = 3.40282347E+38f, List <CapacityImpactor> impactors = null) { BodyDef body = diffSet.pawn.RaceProps.body; float num = 0f; int num2 = 0; List <CapacityImpactor> list = null; foreach (BodyPartRecord item in body.GetPartsWithTag(tag)) { BodyPartRecord part = item; List <CapacityImpactor> impactors2 = list; float num3 = PawnCapacityUtility.CalculatePartEfficiency(diffSet, part, false, impactors2); if (impactors != null && num3 != 1.0 && list == null) { list = new List <CapacityImpactor>(); part = item; impactors2 = list; PawnCapacityUtility.CalculatePartEfficiency(diffSet, part, false, impactors2); } num += num3; num2++; } if (num2 == 0) { return(1f); } float num4 = num / (float)num2; float num5 = Mathf.Min(num4, maximum); if (impactors != null && list != null && (maximum != 1.0 || num4 <= 1.0 || num5 == 1.0)) { impactors.AddRange(list); } return(num5); }
public static float CalculateNaturalPartsAverageEfficiency(HediffSet diffSet, BodyPartGroupDef bodyPartGroup) { float num = 0f; int num2 = 0; IEnumerable <BodyPartRecord> enumerable = from x in diffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined, null) where x.groups.Contains(bodyPartGroup) select x; foreach (BodyPartRecord part in enumerable) { if (!diffSet.PartOrAnyAncestorHasDirectlyAddedParts(part)) { num += PawnCapacityUtility.CalculatePartEfficiency(diffSet, part, false, null); } num2++; } float result; if (num2 == 0 || num < 0f) { result = 0f; } else { result = num / (float)num2; } return(result); }
public float GetDamageFactorFor(Pawn pawn) { float num = 1f; if (pawn != null) { if (this.ownerHediffComp != null) { num *= PawnCapacityUtility.CalculatePartEfficiency(this.ownerHediffComp.Pawn.health.hediffSet, this.ownerHediffComp.parent.Part, true, null); } else if (this.LinkedBodyPartsGroup != null) { float num2 = PawnCapacityUtility.CalculateNaturalPartsAverageEfficiency(pawn.health.hediffSet, this.LinkedBodyPartsGroup); if (this.EnsureLinkedBodyPartsGroupAlwaysUsable) { num2 = Mathf.Max(num2, 0.4f); } num *= num2; } if (this.IsMeleeAttack) { num *= pawn.ageTracker.CurLifeStage.meleeDamageFactor; } } return(num); }
public static float CalculateImmediatePartEfficiencyAndRecord(HediffSet diffSet, BodyPartRecord part, List <PawnCapacityUtility.CapacityImpactor> impactors = null) { if (diffSet.AncestorHasDirectlyAddedParts(part)) { return(1f); } return(PawnCapacityUtility.CalculatePartEfficiency(diffSet, part, false, impactors)); }
public static float CalculateTagEfficiency(HediffSet diffSet, BodyPartTagDef tag, float maximum = 3.40282347E+38f, FloatRange lerp = default(FloatRange), List <PawnCapacityUtility.CapacityImpactor> impactors = null, float bestPartEfficiencySpecialWeight = -1f) { BodyDef body = diffSet.pawn.RaceProps.body; float num = 0f; int num2 = 0; float num3 = 0f; List <PawnCapacityUtility.CapacityImpactor> list = null; foreach (BodyPartRecord current in body.GetPartsWithTag(tag)) { BodyPartRecord part = current; List <PawnCapacityUtility.CapacityImpactor> impactors2 = list; float num4 = PawnCapacityUtility.CalculatePartEfficiency(diffSet, part, false, impactors2); if (impactors != null && num4 != 1f && list == null) { list = new List <PawnCapacityUtility.CapacityImpactor>(); part = current; impactors2 = list; PawnCapacityUtility.CalculatePartEfficiency(diffSet, part, false, impactors2); } num += num4; num3 = Mathf.Max(num3, num4); num2++; } if (num2 == 0) { return(1f); } float num5; if (bestPartEfficiencySpecialWeight >= 0f && num2 >= 2) { num5 = num3 * bestPartEfficiencySpecialWeight + (num - num3) / (float)(num2 - 1) * (1f - bestPartEfficiencySpecialWeight); } else { num5 = num / (float)num2; } float num6 = num5; if (lerp != default(FloatRange)) { num6 = lerp.LerpThroughRange(num6); } num6 = Mathf.Min(num6, maximum); if (impactors != null && list != null && (maximum != 1f || num5 <= 1f || num6 == 1f)) { impactors.AddRange(list); } return(num6); }
public float GetDamageFactorFor(Pawn pawn) { if (pawn != null) { if (this.ownerHediffComp != null) { return(PawnCapacityUtility.CalculatePartEfficiency(this.ownerHediffComp.Pawn.health.hediffSet, this.ownerHediffComp.parent.Part, true, null)); } if (this.LinkedBodyPartsGroup != null) { return(PawnCapacityUtility.CalculateNaturalPartsAverageEfficiency(pawn.health.hediffSet, this.LinkedBodyPartsGroup)); } } return(1f); }
public static float CalculateTagEfficiency(HediffSet diffSet, BodyPartTagDef tag, float maximum = 3.40282347E+38f, FloatRange lerp = default(FloatRange), List <PawnCapacityUtility.CapacityImpactor> impactors = null) { BodyDef body = diffSet.pawn.RaceProps.body; float num = 0f; int num2 = 0; List <PawnCapacityUtility.CapacityImpactor> list = null; foreach (BodyPartRecord bodyPartRecord in body.GetPartsWithTag(tag)) { BodyPartRecord part = bodyPartRecord; List <PawnCapacityUtility.CapacityImpactor> impactors2 = list; float num3 = PawnCapacityUtility.CalculatePartEfficiency(diffSet, part, false, impactors2); if (impactors != null && num3 != 1f && list == null) { list = new List <PawnCapacityUtility.CapacityImpactor>(); part = bodyPartRecord; impactors2 = list; PawnCapacityUtility.CalculatePartEfficiency(diffSet, part, false, impactors2); } num += num3; num2++; } float result; if (num2 == 0) { result = 1f; } else { float num4 = num / (float)num2; float num5 = num4; if (lerp != default(FloatRange)) { num5 = lerp.LerpThroughRange(num5); } num5 = Mathf.Min(num5, maximum); if (impactors != null && list != null && (maximum != 1f || num4 <= 1f || num5 == 1f)) { impactors.AddRange(list); } result = num5; } return(result); }
public static float CalculateNaturalPartsAverageEfficiency(HediffSet diffSet, BodyPartGroupDef bodyPartGroup) { float num = 0f; int num2 = 0; IEnumerable <BodyPartRecord> enumerable = from x in diffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined) where x.groups.Contains(bodyPartGroup) select x; foreach (BodyPartRecord item in enumerable) { if (!diffSet.PartOrAnyAncestorHasDirectlyAddedParts(item)) { num += PawnCapacityUtility.CalculatePartEfficiency(diffSet, item, false, null); } num2++; } if (num2 != 0 && !(num < 0.0)) { return(num / (float)num2); } return(0f); }