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);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
        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);
                }
            }
        }