Ejemplo n.º 1
0
        protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageWorker.DamageResult result)
        {
            totalDamage = base.ReduceDamageToPreserveOutsideParts(totalDamage, dinfo, pawn);
            List <BodyPartRecord> list = new List <BodyPartRecord>();

            for (BodyPartRecord bodyPartRecord = dinfo.HitPart; bodyPartRecord != null; bodyPartRecord = bodyPartRecord.parent)
            {
                list.Add(bodyPartRecord);
                if (bodyPartRecord.depth == BodyPartDepth.Outside)
                {
                    break;
                }
            }
            for (int i = 0; i < list.Count; i++)
            {
                BodyPartRecord bodyPartRecord2 = list[i];
                float          totalDamage2;
                if (list.Count == 1)
                {
                    totalDamage2 = totalDamage;
                }
                else
                {
                    totalDamage2 = ((bodyPartRecord2.depth != BodyPartDepth.Outside) ? (totalDamage * 0.4f) : (totalDamage * 0.75f));
                }
                DamageInfo dinfo2 = dinfo;
                dinfo2.SetHitPart(bodyPartRecord2);
                base.FinalizeAndAddInjury(pawn, totalDamage2, dinfo2, result);
            }
        }
        protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, ref DamageResult result)
        {
            totalDamage = base.ReduceDamageToPreserveOutsideParts(totalDamage, dinfo, pawn);
            List <BodyPartRecord> list           = new List <BodyPartRecord>();
            BodyPartRecord        bodyPartRecord = dinfo.HitPart;

            while (bodyPartRecord != null)
            {
                list.Add(bodyPartRecord);
                if (bodyPartRecord.depth != BodyPartDepth.Outside)
                {
                    bodyPartRecord = bodyPartRecord.parent;
                    continue;
                }
                break;
            }
            float totalDamage2 = (float)(totalDamage * (1.0 + base.def.stabPierceBonus) / ((float)list.Count + base.def.stabPierceBonus));

            for (int i = 0; i < list.Count; i++)
            {
                DamageInfo dinfo2 = dinfo;
                dinfo2.SetHitPart(list[i]);
                base.FinalizeAndAddInjury(pawn, totalDamage2, dinfo2, ref result);
            }
        }
Ejemplo n.º 3
0
        protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, ref DamageResult result)
        {
            bool  flag = Rand.Chance(base.def.bluntInnerHitFrequency);
            float num  = (float)((!flag) ? 0.0 : base.def.bluntInnerHitConverted.RandomInRange);
            float num2 = (float)(totalDamage * (1.0 - num));

            while (true)
            {
                num2 -= base.FinalizeAndAddInjury(pawn, num2, dinfo, ref result);
                if (pawn.health.hediffSet.PartIsMissing(dinfo.HitPart) && !(num2 <= 1.0))
                {
                    BodyPartRecord parent = dinfo.HitPart.parent;
                    if (parent != null)
                    {
                        dinfo.SetHitPart(parent);
                        continue;
                    }
                }
                break;
            }
            if (flag && !dinfo.HitPart.def.IsSolid(dinfo.HitPart, pawn.health.hediffSet.hediffs) && dinfo.HitPart.depth == BodyPartDepth.Outside)
            {
                IEnumerable <BodyPartRecord> source = from x in pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined)
                                                      where x.parent == dinfo.HitPart && x.def.IsSolid(x, pawn.health.hediffSet.hediffs) && x.depth == BodyPartDepth.Inside
                                                      select x;
                BodyPartRecord hitPart = default(BodyPartRecord);
                if (source.TryRandomElementByWeight <BodyPartRecord>((Func <BodyPartRecord, float>)((BodyPartRecord x) => x.coverageAbs), out hitPart))
                {
                    DamageInfo dinfo2 = dinfo;
                    dinfo2.SetHitPart(hitPart);
                    base.FinalizeAndAddInjury(pawn, totalDamage * num + totalDamage * base.def.bluntInnerHitAdded.RandomInRange, dinfo2, ref result);
                }
            }
        }
Ejemplo n.º 4
0
        protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageResult result)
        {
            if (dinfo.HitPart.depth == BodyPartDepth.Inside)
            {
                List <BodyPartRecord> list = new List <BodyPartRecord>();
                for (BodyPartRecord bodyPartRecord = dinfo.HitPart; bodyPartRecord != null; bodyPartRecord = bodyPartRecord.parent)
                {
                    list.Add(bodyPartRecord);
                    if (bodyPartRecord.depth == BodyPartDepth.Outside)
                    {
                        break;
                    }
                }
                float num = (float)(list.Count - 1) + 0.5f;
                for (int i = 0; i < list.Count; i++)
                {
                    DamageInfo dinfo2 = dinfo;
                    dinfo2.SetHitPart(list[i]);
                    FinalizeAndAddInjury(pawn, totalDamage / num * ((i == 0) ? 0.5f : 1f), dinfo2, result);
                }
                return;
            }
            int num2 = (def.cutExtraTargetsCurve != null) ? GenMath.RoundRandom(def.cutExtraTargetsCurve.Evaluate(Rand.Value)) : 0;
            List <BodyPartRecord> list2 = null;

            if (num2 != 0)
            {
                IEnumerable <BodyPartRecord> enumerable = dinfo.HitPart.GetDirectChildParts();
                if (dinfo.HitPart.parent != null)
                {
                    enumerable = enumerable.Concat(dinfo.HitPart.parent);
                    if (dinfo.HitPart.parent.parent != null)
                    {
                        enumerable = enumerable.Concat(dinfo.HitPart.parent.GetDirectChildParts());
                    }
                }
                list2 = (from x in enumerable.Except(dinfo.HitPart).InRandomOrder().Take(num2)
                         where !x.def.conceptual
                         select x).ToList();
            }
            else
            {
                list2 = new List <BodyPartRecord>();
            }
            list2.Add(dinfo.HitPart);
            float num3 = totalDamage * (1f + def.cutCleaveBonus) / ((float)list2.Count + def.cutCleaveBonus);

            if (num2 == 0)
            {
                num3 = ReduceDamageToPreserveOutsideParts(num3, dinfo, pawn);
            }
            for (int j = 0; j < list2.Count; j++)
            {
                DamageInfo dinfo3 = dinfo;
                dinfo3.SetHitPart(list2[j]);
                FinalizeAndAddInjury(pawn, num3, dinfo3, result);
            }
        }
Ejemplo n.º 5
0
 private void CheckDuplicateSmallPawnDamageToPartParent(DamageInfo dinfo, Pawn pawn, ref DamageResult result)
 {
     if (dinfo.AllowDamagePropagation && result.LastHitPart != null && dinfo.Def.harmsHealth && result.LastHitPart != pawn.RaceProps.body.corePart && result.LastHitPart.parent != null && pawn.health.hediffSet.GetPartHealth(result.LastHitPart.parent) > 0.0 && dinfo.Amount >= 10 && pawn.HealthScale <= 0.50010001659393311)
     {
         DamageInfo dinfo2 = dinfo;
         dinfo2.SetHitPart(result.LastHitPart.parent);
         this.ApplyDamageToPart(dinfo2, pawn, ref result);
     }
 }
Ejemplo n.º 6
0
 private void ApplySmallPawnDamagePropagation(DamageInfo dinfo, Pawn pawn, DamageResult result)
 {
     if (dinfo.AllowDamagePropagation && result.LastHitPart != null && dinfo.Def.harmsHealth && result.LastHitPart != pawn.RaceProps.body.corePart && result.LastHitPart.parent != null && pawn.health.hediffSet.GetPartHealth(result.LastHitPart.parent) > 0f && result.LastHitPart.parent.coverageAbs > 0f && dinfo.Amount >= 10f && pawn.HealthScale <= 0.5001f)
     {
         DamageInfo dinfo2 = dinfo;
         dinfo2.SetHitPart(result.LastHitPart.parent);
         ApplyDamageToPart(dinfo2, pawn, result);
     }
 }
Ejemplo n.º 7
0
 protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, ref DamageResult result)
 {
     if (dinfo.HitPart.depth == BodyPartDepth.Inside)
     {
         List <BodyPartRecord> list           = new List <BodyPartRecord>();
         BodyPartRecord        bodyPartRecord = dinfo.HitPart;
         while (bodyPartRecord != null)
         {
             list.Add(bodyPartRecord);
             if (bodyPartRecord.depth != BodyPartDepth.Outside)
             {
                 bodyPartRecord = bodyPartRecord.parent;
                 continue;
             }
             break;
         }
         float num = (float)((float)(list.Count - 1) + 0.5);
         for (int i = 0; i < list.Count; i++)
         {
             DamageInfo dinfo2 = dinfo;
             dinfo2.SetHitPart(list[i]);
             base.FinalizeAndAddInjury(pawn, (float)(totalDamage / num * ((i != 0) ? 1.0 : 0.5)), dinfo2, ref result);
         }
     }
     else
     {
         int num2 = (base.def.cutExtraTargetsCurve != null) ? GenMath.RoundRandom(base.def.cutExtraTargetsCurve.Evaluate(Rand.Value)) : 0;
         List <BodyPartRecord> list2 = null;
         if (num2 != 0)
         {
             IEnumerable <BodyPartRecord> lhs = dinfo.HitPart.GetDirectChildParts();
             if (dinfo.HitPart.parent != null)
             {
                 lhs = lhs.Concat(dinfo.HitPart.parent);
                 lhs = lhs.Concat(dinfo.HitPart.parent.GetDirectChildParts());
             }
             list2 = lhs.Except(dinfo.HitPart).InRandomOrder(null).Take(num2)
                     .ToList();
         }
         else
         {
             list2 = new List <BodyPartRecord>();
         }
         list2.Add(dinfo.HitPart);
         float num3 = (float)(totalDamage * (1.0 + base.def.cutCleaveBonus) / ((float)list2.Count + base.def.cutCleaveBonus));
         if (num2 == 0)
         {
             num3 = base.ReduceDamageToPreserveOutsideParts(num3, dinfo, pawn);
         }
         for (int j = 0; j < list2.Count; j++)
         {
             DamageInfo dinfo3 = dinfo;
             dinfo3.SetHitPart(list2[j]);
             base.FinalizeAndAddInjury(pawn, num3, dinfo3, ref result);
         }
     }
 }
Ejemplo n.º 8
0
        private void ApplyDamageToPart(DamageInfo dinfo, Pawn pawn, ref DamageResult result)
        {
            BodyPartRecord exactPartFromDamageInfo = this.GetExactPartFromDamageInfo(dinfo, pawn);

            if (exactPartFromDamageInfo != null)
            {
                dinfo.SetHitPart(exactPartFromDamageInfo);
                int num = dinfo.Amount;
                if (!dinfo.InstantOldInjury)
                {
                    num = ArmorUtility.GetPostArmorDamage(pawn, dinfo.Amount, dinfo.HitPart, dinfo.Def);
                }
                if (num <= 0)
                {
                    result.deflected = true;
                }
                else
                {
                    if (DamageWorker_AddInjury.IsHeadshot(dinfo, pawn))
                    {
                        result.headshot = true;
                    }
                    if (dinfo.InstantOldInjury)
                    {
                        HediffDef hediffDefFromDamage = HealthUtility.GetHediffDefFromDamage(dinfo.Def, pawn, dinfo.HitPart);
                        if (hediffDefFromDamage.CompPropsFor(typeof(HediffComp_GetsOld)) == null)
                        {
                            return;
                        }
                        if (dinfo.HitPart.def.oldInjuryBaseChance == 0.0)
                        {
                            return;
                        }
                        if (dinfo.HitPart.def.IsSolid(dinfo.HitPart, pawn.health.hediffSet.hediffs))
                        {
                            return;
                        }
                        if (pawn.health.hediffSet.PartOrAnyAncestorHasDirectlyAddedParts(dinfo.HitPart))
                        {
                            return;
                        }
                    }
                    if (!dinfo.AllowDamagePropagation)
                    {
                        this.FinalizeAndAddInjury(pawn, (float)num, dinfo, ref result);
                    }
                    else
                    {
                        this.ApplySpecialEffectsToPart(pawn, (float)num, dinfo, ref result);
                    }
                }
            }
        }
Ejemplo n.º 9
0
        private void ApplyDamageToPart(DamageInfo dinfo, Pawn pawn, DamageWorker.DamageResult result)
        {
            BodyPartRecord exactPartFromDamageInfo = this.GetExactPartFromDamageInfo(dinfo, pawn);

            if (exactPartFromDamageInfo != null)
            {
                dinfo.SetHitPart(exactPartFromDamageInfo);
                float num  = dinfo.Amount;
                bool  flag = !dinfo.InstantPermanentInjury;
                bool  deflectedByMetalArmor = false;
                if (flag)
                {
                    DamageDef def = dinfo.Def;
                    bool      diminishedByMetalArmor;
                    num       = ArmorUtility.GetPostArmorDamage(pawn, num, dinfo.ArmorPenetrationInt, dinfo.HitPart, ref def, out deflectedByMetalArmor, out diminishedByMetalArmor);
                    dinfo.Def = def;
                    if (num < dinfo.Amount)
                    {
                        result.diminished             = true;
                        result.diminishedByMetalArmor = diminishedByMetalArmor;
                    }
                }
                if (num <= 0f)
                {
                    result.AddPart(pawn, dinfo.HitPart);
                    result.deflected             = true;
                    result.deflectedByMetalArmor = deflectedByMetalArmor;
                }
                else
                {
                    if (DamageWorker_AddInjury.IsHeadshot(dinfo, pawn))
                    {
                        result.headshot = true;
                    }
                    if (dinfo.InstantPermanentInjury)
                    {
                        HediffDef hediffDefFromDamage = HealthUtility.GetHediffDefFromDamage(dinfo.Def, pawn, dinfo.HitPart);
                        if (hediffDefFromDamage.CompPropsFor(typeof(HediffComp_GetsPermanent)) == null || dinfo.HitPart.def.permanentInjuryBaseChance == 0f || dinfo.HitPart.def.IsSolid(dinfo.HitPart, pawn.health.hediffSet.hediffs) || pawn.health.hediffSet.PartOrAnyAncestorHasDirectlyAddedParts(dinfo.HitPart))
                        {
                            return;
                        }
                    }
                    if (!dinfo.AllowDamagePropagation)
                    {
                        this.FinalizeAndAddInjury(pawn, num, dinfo, result);
                    }
                    else
                    {
                        this.ApplySpecialEffectsToPart(pawn, num, dinfo, result);
                    }
                }
            }
        }
Ejemplo n.º 10
0
        private void ApplyDamageToPart(DamageInfo dinfo, Pawn pawn, DamageResult result)
        {
            BodyPartRecord exactPartFromDamageInfo = GetExactPartFromDamageInfo(dinfo, pawn);

            if (exactPartFromDamageInfo == null)
            {
                return;
            }
            dinfo.SetHitPart(exactPartFromDamageInfo);
            float num  = dinfo.Amount;
            bool  num2 = !dinfo.InstantPermanentInjury && !dinfo.IgnoreArmor;
            bool  deflectedByMetalArmor = false;

            if (num2)
            {
                DamageDef damageDef = dinfo.Def;
                num       = ArmorUtility.GetPostArmorDamage(pawn, num, dinfo.ArmorPenetrationInt, dinfo.HitPart, ref damageDef, out deflectedByMetalArmor, out bool diminishedByMetalArmor);
                dinfo.Def = damageDef;
                if (num < dinfo.Amount)
                {
                    result.diminished             = true;
                    result.diminishedByMetalArmor = diminishedByMetalArmor;
                }
            }
            if (dinfo.Def.ExternalViolenceFor(pawn))
            {
                num *= pawn.GetStatValue(StatDefOf.IncomingDamageFactor);
            }
            if (num <= 0f)
            {
                result.AddPart(pawn, dinfo.HitPart);
                result.deflected             = true;
                result.deflectedByMetalArmor = deflectedByMetalArmor;
                return;
            }
            if (IsHeadshot(dinfo, pawn))
            {
                result.headshot = true;
            }
            if (!dinfo.InstantPermanentInjury || (HealthUtility.GetHediffDefFromDamage(dinfo.Def, pawn, dinfo.HitPart).CompPropsFor(typeof(HediffComp_GetsPermanent)) != null && dinfo.HitPart.def.permanentInjuryChanceFactor != 0f && !pawn.health.hediffSet.PartOrAnyAncestorHasDirectlyAddedParts(dinfo.HitPart)))
            {
                if (!dinfo.AllowDamagePropagation)
                {
                    FinalizeAndAddInjury(pawn, num, dinfo, result);
                }
                else
                {
                    ApplySpecialEffectsToPart(pawn, num, dinfo, result);
                }
            }
        }
 protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageWorker.DamageResult result)
 {
     if (dinfo.HitPart.depth == BodyPartDepth.Inside)
     {
         List <BodyPartRecord> list = new List <BodyPartRecord>();
         for (BodyPartRecord bodyPartRecord = dinfo.HitPart; bodyPartRecord != null; bodyPartRecord = bodyPartRecord.parent)
         {
             list.Add(bodyPartRecord);
             if (bodyPartRecord.depth == BodyPartDepth.Outside)
             {
                 break;
             }
         }
         float num = (float)list.Count;
         for (int i = 0; i < list.Count; i++)
         {
             DamageInfo dinfo2 = dinfo;
             dinfo2.SetHitPart(list[i]);
             base.FinalizeAndAddInjury(pawn, totalDamage / num, dinfo2, result);
         }
     }
     else
     {
         IEnumerable <BodyPartRecord> enumerable = dinfo.HitPart.GetDirectChildParts();
         if (dinfo.HitPart.parent != null)
         {
             enumerable = enumerable.Concat(dinfo.HitPart.parent);
             if (dinfo.HitPart.parent.parent != null)
             {
                 enumerable = enumerable.Concat(dinfo.HitPart.parent.GetDirectChildParts());
             }
         }
         enumerable = from target in enumerable
                      where target != dinfo.HitPart && !target.def.conceptual && target.depth == BodyPartDepth.Outside && !pawn.health.hediffSet.PartIsMissing(target)
                      select target;
         BodyPartRecord bodyPartRecord2 = enumerable.RandomElementWithFallback(null);
         if (bodyPartRecord2 == null)
         {
             base.FinalizeAndAddInjury(pawn, base.ReduceDamageToPreserveOutsideParts(totalDamage, dinfo, pawn), dinfo, result);
         }
         else
         {
             base.FinalizeAndAddInjury(pawn, base.ReduceDamageToPreserveOutsideParts(totalDamage * this.def.scratchSplitPercentage, dinfo, pawn), dinfo, result);
             DamageInfo dinfo3 = dinfo;
             dinfo3.SetHitPart(bodyPartRecord2);
             base.FinalizeAndAddInjury(pawn, base.ReduceDamageToPreserveOutsideParts(totalDamage * this.def.scratchSplitPercentage, dinfo3, pawn), dinfo3, result);
         }
     }
 }
Ejemplo n.º 12
0
        protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, ref DamageWorker.DamageResult result)
        {
            bool  flag = Rand.Chance(this.def.bluntInnerHitFrequency);
            float num  = (!flag) ? 0f : this.def.bluntInnerHitConverted.RandomInRange;
            float num2 = totalDamage * (1f - num);

            while (true)
            {
                num2 -= base.FinalizeAndAddInjury(pawn, num2, dinfo, ref result);
                if (!pawn.health.hediffSet.PartIsMissing(dinfo.HitPart))
                {
                    break;
                }
                if (num2 <= 1f)
                {
                    break;
                }
                BodyPartRecord parent = dinfo.HitPart.parent;
                if (parent == null)
                {
                    break;
                }
                dinfo.SetHitPart(parent);
            }
            if (flag && !dinfo.HitPart.def.IsSolid(dinfo.HitPart, pawn.health.hediffSet.hediffs) && dinfo.HitPart.depth == BodyPartDepth.Outside)
            {
                IEnumerable <BodyPartRecord> source = from x in pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined)
                                                      where x.parent == dinfo.HitPart && x.def.IsSolid(x, pawn.health.hediffSet.hediffs) && x.depth == BodyPartDepth.Inside
                                                      select x;
                BodyPartRecord hitPart;
                if (source.TryRandomElementByWeight((BodyPartRecord x) => x.coverageAbs, out hitPart))
                {
                    DamageInfo lastInfo = dinfo;
                    lastInfo.SetHitPart(hitPart);
                    base.FinalizeAndAddInjury(pawn, totalDamage * num + totalDamage * this.def.bluntInnerHitAdded.RandomInRange, lastInfo, ref result);
                }
            }
        }
        protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageWorker.DamageResult result)
        {
            bool       flag     = Rand.Chance(this.def.bluntInnerHitChance);
            float      num      = (!flag) ? 0f : this.def.bluntInnerHitDamageFractionToConvert.RandomInRange;
            float      num2     = totalDamage * (1f - num);
            DamageInfo lastInfo = dinfo;

            for (;;)
            {
                num2 -= base.FinalizeAndAddInjury(pawn, num2, lastInfo, result);
                if (!pawn.health.hediffSet.PartIsMissing(lastInfo.HitPart))
                {
                    break;
                }
                if (num2 <= 1f)
                {
                    break;
                }
                BodyPartRecord parent = lastInfo.HitPart.parent;
                if (parent == null)
                {
                    break;
                }
                lastInfo.SetHitPart(parent);
            }
            if (flag && !lastInfo.HitPart.def.IsSolid(lastInfo.HitPart, pawn.health.hediffSet.hediffs) && lastInfo.HitPart.depth == BodyPartDepth.Outside)
            {
                IEnumerable <BodyPartRecord> source = from x in pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined, null)
                                                      where x.parent == lastInfo.HitPart && x.def.IsSolid(x, pawn.health.hediffSet.hediffs) && x.depth == BodyPartDepth.Inside
                                                      select x;
                BodyPartRecord hitPart;
                if (source.TryRandomElementByWeight((BodyPartRecord x) => x.coverageAbs, out hitPart))
                {
                    DamageInfo lastInfo2 = lastInfo;
                    lastInfo2.SetHitPart(hitPart);
                    float totalDamage2 = totalDamage * num + totalDamage * this.def.bluntInnerHitDamageFractionToAdd.RandomInRange;
                    base.FinalizeAndAddInjury(pawn, totalDamage2, lastInfo2, result);
                }
            }
            if (!pawn.Dead)
            {
                SimpleCurve simpleCurve = null;
                if (lastInfo.HitPart.parent == null)
                {
                    simpleCurve = this.def.bluntStunChancePerDamagePctOfCorePartToBodyCurve;
                }
                else
                {
                    foreach (BodyPartRecord lhs in pawn.RaceProps.body.GetPartsWithTag(BodyPartTagDefOf.ConsciousnessSource))
                    {
                        if (this.InSameBranch(lhs, lastInfo.HitPart))
                        {
                            simpleCurve = this.def.bluntStunChancePerDamagePctOfCorePartToHeadCurve;
                            break;
                        }
                    }
                }
                if (simpleCurve != null)
                {
                    float x2 = totalDamage / pawn.def.race.body.corePart.def.GetMaxHealth(pawn);
                    if (Rand.Chance(simpleCurve.Evaluate(x2)))
                    {
                        DamageInfo dinfo2 = dinfo;
                        dinfo2.Def = DamageDefOf.Stun;
                        dinfo2.SetAmount((float)3.5f.SecondsToTicks() / 30f);
                        pawn.TakeDamage(dinfo2);
                    }
                }
            }
        }
        protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageResult result)
        {
            bool       flag     = Rand.Chance(def.bluntInnerHitChance);
            float      num      = (flag ? def.bluntInnerHitDamageFractionToConvert.RandomInRange : 0f);
            float      num2     = totalDamage * (1f - num);
            DamageInfo lastInfo = dinfo;

            while (true)
            {
                num2 -= FinalizeAndAddInjury(pawn, num2, lastInfo, result);
                if (!pawn.health.hediffSet.PartIsMissing(lastInfo.HitPart) || num2 <= 1f)
                {
                    break;
                }
                BodyPartRecord parent = lastInfo.HitPart.parent;
                if (parent == null)
                {
                    break;
                }
                lastInfo.SetHitPart(parent);
            }
            if (flag && !lastInfo.HitPart.def.IsSolid(lastInfo.HitPart, pawn.health.hediffSet.hediffs) && lastInfo.HitPart.depth == BodyPartDepth.Outside && (from x in pawn.health.hediffSet.GetNotMissingParts()
                                                                                                                                                              where x.parent == lastInfo.HitPart && x.def.IsSolid(x, pawn.health.hediffSet.hediffs) && x.depth == BodyPartDepth.Inside
                                                                                                                                                              select x).TryRandomElementByWeight((BodyPartRecord x) => x.coverageAbs, out var result2))
            {
                DamageInfo dinfo2 = lastInfo;
                dinfo2.SetHitPart(result2);
                float totalDamage2 = totalDamage * num + totalDamage * def.bluntInnerHitDamageFractionToAdd.RandomInRange;
                FinalizeAndAddInjury(pawn, totalDamage2, dinfo2, result);
            }
            if (pawn.Dead)
            {
                return;
            }
            SimpleCurve simpleCurve = null;

            if (lastInfo.HitPart.parent == null)
            {
                simpleCurve = def.bluntStunChancePerDamagePctOfCorePartToBodyCurve;
            }
            else
            {
                foreach (BodyPartRecord item in pawn.RaceProps.body.GetPartsWithTag(BodyPartTagDefOf.ConsciousnessSource))
                {
                    if (InSameBranch(item, lastInfo.HitPart))
                    {
                        simpleCurve = def.bluntStunChancePerDamagePctOfCorePartToHeadCurve;
                        break;
                    }
                }
            }
            if (simpleCurve != null)
            {
                float x2 = totalDamage / pawn.def.race.body.corePart.def.GetMaxHealth(pawn);
                if (Rand.Chance(simpleCurve.Evaluate(x2)))
                {
                    DamageInfo dinfo3 = dinfo;
                    dinfo3.Def = DamageDefOf.Stun;
                    dinfo3.SetAmount((float)def.bluntStunDuration.SecondsToTicks() / 30f);
                    pawn.TakeDamage(dinfo3);
                }
            }
        }