public override void OnIntervalPassed(Pawn pawn, Hediff cause) { float ambientTemperature = pawn.AmbientTemperature; FloatRange floatRange = pawn.ComfortableTemperatureRange(); FloatRange floatRange2 = pawn.SafeTemperatureRange(); HediffSet hediffSet = pawn.health.hediffSet; HediffDef hediffDef = (pawn.RaceProps.FleshType != FleshTypeDefOf.Insectoid) ? this.hediff : this.hediffInsectoid; Hediff firstHediffOfDef = hediffSet.GetFirstHediffOfDef(hediffDef, false); if (ambientTemperature < floatRange2.min) { float num = Mathf.Abs(ambientTemperature - floatRange2.min); float num2 = num * 6.45E-05f; num2 = Mathf.Max(num2, 0.00075f); HealthUtility.AdjustSeverity(pawn, hediffDef, num2); if (pawn.Dead) { return; } } if (firstHediffOfDef != null) { if (ambientTemperature > floatRange.min) { float num3 = firstHediffOfDef.Severity * 0.027f; num3 = Mathf.Clamp(num3, 0.0015f, 0.015f); firstHediffOfDef.Severity -= num3; } else if (pawn.RaceProps.FleshType != FleshTypeDefOf.Insectoid) { if (ambientTemperature < 0f && firstHediffOfDef.Severity > 0.37f) { float num4 = 0.025f * firstHediffOfDef.Severity; if (Rand.Value < num4) { BodyPartRecord bodyPartRecord; if ((from x in pawn.RaceProps.body.AllPartsVulnerableToFrostbite where !hediffSet.PartIsMissing(x) select x).TryRandomElementByWeight((BodyPartRecord x) => x.def.frostbiteVulnerability, out bodyPartRecord)) { int num5 = Mathf.CeilToInt((float)bodyPartRecord.def.hitPoints * 0.5f); DamageDef frostbite = DamageDefOf.Frostbite; float amount = (float)num5; BodyPartRecord hitPart = bodyPartRecord; DamageInfo dinfo = new DamageInfo(frostbite, amount, 0f, -1f, null, hitPart, null, DamageInfo.SourceCategory.ThingOrUnknown, null); pawn.TakeDamage(dinfo); } } } } } }
public override void OnIntervalPassed(Pawn pawn, Hediff cause) { float ambientTemperature = pawn.AmbientTemperature; FloatRange floatRange = pawn.ComfortableTemperatureRange(); FloatRange floatRange2 = pawn.SafeTemperatureRange(); HediffSet hediffSet = pawn.health.hediffSet; Hediff firstHediffOfDef = hediffSet.GetFirstHediffOfDef(base.hediff, false); if (ambientTemperature < floatRange2.min) { float num = Mathf.Abs(ambientTemperature - floatRange2.min); float a = (float)(num * 6.44999963697046E-05); a = Mathf.Max(a, 0.00075f); HealthUtility.AdjustSeverity(pawn, base.hediff, a); if (pawn.Dead) { return; } } if (firstHediffOfDef != null) { if (ambientTemperature > floatRange.min) { float value = (float)(firstHediffOfDef.Severity * 0.027000000700354576); value = Mathf.Clamp(value, 0.0015f, 0.015f); firstHediffOfDef.Severity -= value; } else if (ambientTemperature < 0.0 && firstHediffOfDef.Severity > 0.37000000476837158) { float num2 = (float)(0.02500000037252903 * firstHediffOfDef.Severity); BodyPartRecord bodyPartRecord = default(BodyPartRecord); if (Rand.Value < num2 && (from x in pawn.RaceProps.body.AllPartsVulnerableToFrostbite where !hediffSet.PartIsMissing(x) select x).TryRandomElementByWeight <BodyPartRecord>((Func <BodyPartRecord, float>)((BodyPartRecord x) => x.def.frostbiteVulnerability), out bodyPartRecord)) { int num3 = Mathf.CeilToInt((float)((float)bodyPartRecord.def.hitPoints * 0.5)); DamageDef frostbite = DamageDefOf.Frostbite; int amount = num3; BodyPartRecord hitPart = bodyPartRecord; DamageInfo dinfo = new DamageInfo(frostbite, amount, -1f, null, hitPart, null, DamageInfo.SourceCategory.ThingOrUnknown); pawn.TakeDamage(dinfo); } } } }
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)); }
public override void OnIntervalPassed(Pawn pawn, Hediff cause) { float ambientTemperature = pawn.AmbientTemperature; FloatRange floatRange = pawn.ComfortableTemperatureRange(); FloatRange floatRange2 = pawn.SafeTemperatureRange(); HediffSet hediffSet = pawn.health.hediffSet; HediffDef hediffDef = ((pawn.RaceProps.FleshType == FleshTypeDefOf.Insectoid) ? hediffInsectoid : hediff); Hediff firstHediffOfDef = hediffSet.GetFirstHediffOfDef(hediffDef); if (ambientTemperature < floatRange2.min) { float a = Mathf.Abs(ambientTemperature - floatRange2.min) * 6.45E-05f; a = Mathf.Max(a, 0.00075f); HealthUtility.AdjustSeverity(pawn, hediffDef, a); if (pawn.Dead) { return; } } if (firstHediffOfDef == null) { return; } if (ambientTemperature > floatRange.min) { float value = firstHediffOfDef.Severity * 0.027f; value = Mathf.Clamp(value, 0.0015f, 0.015f); firstHediffOfDef.Severity -= value; } else if (pawn.RaceProps.FleshType != FleshTypeDefOf.Insectoid && ambientTemperature < 0f && firstHediffOfDef.Severity > 0.37f) { float num = 0.025f * firstHediffOfDef.Severity; if (Rand.Value < num && pawn.RaceProps.body.AllPartsVulnerableToFrostbite.Where((BodyPartRecord x) => !hediffSet.PartIsMissing(x)).TryRandomElementByWeight((BodyPartRecord x) => x.def.frostbiteVulnerability, out var result)) { int num2 = Mathf.CeilToInt((float)result.def.hitPoints * 0.5f); DamageInfo dinfo = new DamageInfo(DamageDefOf.Frostbite, num2, 0f, -1f, null, result); pawn.TakeDamage(dinfo); } } }