Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 8
0
        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);
        }
Esempio n. 11
0
 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);
        }