protected float ReduceDamageToPreserveOutsideParts(float postArmorDamage, DamageInfo dinfo, Pawn pawn) { float result; if (!DamageWorker_AddInjury.ShouldReduceDamageToPreservePart(dinfo.HitPart)) { result = postArmorDamage; } else { float partHealth = pawn.health.hediffSet.GetPartHealth(dinfo.HitPart); if (postArmorDamage < partHealth) { result = postArmorDamage; } else { float maxHealth = dinfo.HitPart.def.GetMaxHealth(pawn); float num = postArmorDamage - partHealth; float x = num / maxHealth; float num2 = DamageWorker_AddInjury.PartBlowOffChancePerOverkillDamagePercent.Evaluate(x); if (Rand.Value < num2) { result = postArmorDamage; } else { postArmorDamage = (result = partHealth - 1f); } } } return(result); }
protected float ReduceDamageToPreserveOutsideParts(float postArmorDamage, DamageInfo dinfo, Pawn pawn) { if (DamageWorker_AddInjury.ShouldReduceDamageToPreservePart(dinfo.HitPart)) { int num = Mathf.FloorToInt(pawn.health.hediffSet.GetPartHealth(dinfo.HitPart)); if ((float)num >= 6.0 && postArmorDamage >= (float)num && postArmorDamage < (float)num * 1.8999999761581421) { postArmorDamage = (float)(num - 1); } } return(postArmorDamage); }
protected float ReduceDamageToPreserveOutsideParts(float postArmorDamage, DamageInfo dinfo, Pawn pawn) { if (!DamageWorker_AddInjury.ShouldReduceDamageToPreservePart(dinfo.HitPart)) { return(postArmorDamage); } float partHealth = pawn.health.hediffSet.GetPartHealth(dinfo.HitPart); if (postArmorDamage < partHealth) { return(postArmorDamage); } float maxHealth = dinfo.HitPart.def.GetMaxHealth(pawn); float num = postArmorDamage - partHealth; float f = num / maxHealth; float chance = this.def.overkillPctToDestroyPart.InverseLerpThroughRange(f); if (Rand.Chance(chance)) { return(postArmorDamage); } return(postArmorDamage = partHealth - 1f); }
public static float CalculatePartEfficiency(HediffSet diffSet, BodyPartRecord part, bool ignoreAddedParts = false, List <CapacityImpactor> impactors = null) { BodyPartRecord rec; for (rec = part.parent; rec != null; rec = rec.parent) { if (diffSet.HasDirectlyAddedPartFor(rec)) { Hediff_AddedPart hediff_AddedPart = (from x in diffSet.GetHediffs <Hediff_AddedPart>() where x.Part == rec select x).First(); impactors?.Add(new CapacityImpactorHediff { hediff = hediff_AddedPart }); return(hediff_AddedPart.def.addedPartProps.partEfficiency); } } if (part.parent != null && diffSet.PartIsMissing(part.parent)) { return(0f); } float num = 1f; if (!ignoreAddedParts) { for (int i = 0; i < diffSet.hediffs.Count; i++) { Hediff_AddedPart hediff_AddedPart2 = diffSet.hediffs[i] as Hediff_AddedPart; if (hediff_AddedPart2 != null && hediff_AddedPart2.Part == part) { num *= hediff_AddedPart2.def.addedPartProps.partEfficiency; if (hediff_AddedPart2.def.addedPartProps.partEfficiency != 1f) { impactors?.Add(new CapacityImpactorHediff { hediff = hediff_AddedPart2 }); } } } } float b = -1f; float num2 = 0f; bool flag = false; for (int j = 0; j < diffSet.hediffs.Count; j++) { if (diffSet.hediffs[j].Part == part && diffSet.hediffs[j].CurStage != null) { HediffStage curStage = diffSet.hediffs[j].CurStage; num2 += curStage.partEfficiencyOffset; flag |= curStage.partIgnoreMissingHP; if (curStage.partEfficiencyOffset != 0f && curStage.becomeVisible) { impactors?.Add(new CapacityImpactorHediff { hediff = diffSet.hediffs[j] }); } } } if (!flag) { float num3 = diffSet.GetPartHealth(part) / part.def.GetMaxHealth(diffSet.pawn); if (num3 != 1f) { if (DamageWorker_AddInjury.ShouldReduceDamageToPreservePart(part)) { num3 = Mathf.InverseLerp(0.1f, 1f, num3); } impactors?.Add(new CapacityImpactorBodyPartHealth { bodyPart = part }); num *= num3; } } num += num2; if (num > 0.0001f) { num = Mathf.Max(num, b); } return(Mathf.Max(num, 0f)); }