Пример #1
0
        public static IEnumerable <BodyPartRecord> GetPartsWithTag(this BodyDef def, List <BodyPartTagDef> tags)
        {
            int num;

            for (int i = 0; i < def.AllParts.Count; i = num + 1)
            {
                BodyPartRecord bodyPartRecord = def.AllParts[i];
                for (int ii = 0; ii < tags.Count; ii++)
                {
                    BodyPartTagDef tag = tags[ii];
                    if (bodyPartRecord.def.tags.Contains(tag))
                    {
                        yield return(bodyPartRecord);
                    }
                }
                num = i;
            }
            yield break;
        }
Пример #2
0
        public static bool ThisOrAnyChildHasTag(this BodyPartRecord part, BodyPartTagDef tag)
        {
            if (part?.def?.tags == null)
            {
                return(false);
            }

            if (part.def.tags.Contains(tag))
            {
                return(true);
            }

            if (part.parts.NullOrEmpty())
            {
                return(false);
            }

            return(part.parts.Any(p => p.ThisOrAnyChildHasTag(tag)));
        }
Пример #3
0
        private float CalculateForLimbs(HediffSet diffSet, BodyPartTagDef limbCore, List <PawnCapacityUtility.CapacityImpactor> impactors)
        {
            BodyDef body       = diffSet.pawn.RaceProps.body;
            float   totalValue = 0;
            int     partCount  = 0;

            foreach (BodyPartRecord limb in body.GetPartsWithTag(limbCore))
            {
                var conduitParts = limb.GetChildParts(GethCoolingTags.GethCoolantConduit);

                if (!conduitParts.Any())
                {
                    continue;
                }

                float value = 1;

                foreach (BodyPartRecord conduitPart in conduitParts)
                {
                    value *= PawnCapacityUtility.CalculateImmediatePartEfficiencyAndRecord(diffSet, conduitPart, impactors);
                }

                float heatExchangerValue = 0;
                int   heatExchangerCount = 0;

                foreach (BodyPartRecord heatExchangerPart in limb.GetChildParts(GethCoolingTags.GethHeatExchanger))
                {
                    heatExchangerValue += PawnCapacityUtility.CalculateImmediatePartEfficiencyAndRecord(diffSet, heatExchangerPart, impactors);
                    heatExchangerCount++;
                }

                totalValue += value * (heatExchangerValue / heatExchangerCount);
                partCount++;
            }

            if (partCount == 0)
            {
                return(0f);
            }

            return(totalValue / partCount);
        }
Пример #4
0
        public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null)
        {
            float functionalPercentage = 0f;
            float num = PawnCapacityUtility.CalculateLimbEfficiency(diffSet, BodyPartTagDefOf.MovingLimbCore, BodyPartTagDefOf.MovingLimbSegment, BodyPartTagDefOf.MovingLimbDigit, 0.4f, out functionalPercentage, impactors);

            if (functionalPercentage < 0.4999f)
            {
                return(0f);
            }
            float          num2   = num;
            BodyPartTagDef pelvis = BodyPartTagDefOf.Pelvis;

            num = num2 * PawnCapacityUtility.CalculateTagEfficiency(diffSet, pelvis, 3.40282347E+38f, default(FloatRange), impactors);
            float num3 = num;

            pelvis = BodyPartTagDefOf.Spine;
            num    = num3 * PawnCapacityUtility.CalculateTagEfficiency(diffSet, pelvis, 3.40282347E+38f, default(FloatRange), impactors);
            num    = Mathf.Lerp(num, num * CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.Breathing, impactors), 0.2f);
            num    = Mathf.Lerp(num, num * CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.BloodPumping, impactors), 0.2f);
            return(num * Mathf.Min(CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.Consciousness, impactors), 1f));
        }
        public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null)
        {
            float num  = 0f;
            float num2 = PawnCapacityUtility.CalculateLimbEfficiency(diffSet, BodyPartTagDefOf.MovingLimbCore, BodyPartTagDefOf.MovingLimbSegment, BodyPartTagDefOf.MovingLimbDigit, 0.4f, out num, impactors);

            if (num < 0.4999f)
            {
                return(0f);
            }
            float          arg_5E_0 = num2;
            BodyPartTagDef tag      = BodyPartTagDefOf.Pelvis;

            num2 = arg_5E_0 * PawnCapacityUtility.CalculateTagEfficiency(diffSet, tag, 3.40282347E+38f, default(FloatRange), impactors, -1f);
            float arg_89_0 = num2;

            tag  = BodyPartTagDefOf.Spine;
            num2 = arg_89_0 * PawnCapacityUtility.CalculateTagEfficiency(diffSet, tag, 3.40282347E+38f, default(FloatRange), impactors, -1f);
            num2 = Mathf.Lerp(num2, num2 * base.CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.Breathing, impactors), 0.2f);
            num2 = Mathf.Lerp(num2, num2 * base.CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.BloodPumping, impactors), 0.2f);
            return(num2 * Mathf.Min(base.CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.Consciousness, impactors), 1f));
        }
Пример #6
0
        public static bool ApplyHediffOnBodyPartTag(Pawn pawn, BodyPartTagDef BPTag, HediffDef hediffDef, bool myDebug)
        {
            pawn.RaceProps.body.GetPartsWithTag(BPTag).TryRandomElement(out BodyPartRecord bodyPart);
            if (bodyPart == null)
            {
                Tools.Warn("null body part", myDebug);
                return(false);
            }

            Hediff hediff = HediffMaker.MakeHediff(hediffDef, pawn, bodyPart);

            if (hediff == null)
            {
                Tools.Warn("hediff maker null", myDebug);
                return(false);
            }

            pawn.health.AddHediff(hediff, bodyPart, null);

            return(true);
        }
		// Token: 0x060039CE RID: 14798 RVA: 0x001B7F74 File Offset: 0x001B6374
		protected override DamageWorker.DamageResult ApplyMeleeDamageToTarget(LocalTargetInfo target)
		{
			DamageWorker.DamageResult damageResult = new DamageWorker.DamageResult();
			if (this.tool == null)
			{
				Log.ErrorOnce("Attempted to apply melee hediff without a tool", 38381735, false);
				return damageResult;
			}
			Pawn pawn = target.Thing as Pawn;
			if (pawn == null)
			{
				Log.ErrorOnce("Attempted to apply melee hediff without pawn target", 78330053, false);
				return damageResult;
			}
			HediffSet hediffSet = pawn.health.hediffSet;
			BodyPartTagDef bodypartTagTarget = this.verbProps.bodypartTagTarget;
			foreach (BodyPartRecord part in hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined, bodypartTagTarget, null))
			{
				damageResult.AddHediff(pawn.health.AddHediff(this.tool.hediff, part, null, null));
				damageResult.AddPart(pawn, part);
				damageResult.wounded = true;
			}
			return damageResult;
		}
        public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null)
        {
            BodyPartTagDef sightSource = BodyPartTagDefOf.SightSource;

            return(PawnCapacityUtility.CalculateTagEfficiency(diffSet, sightSource, 3.40282347E+38f, default(FloatRange), impactors, 0.75f));
        }
Пример #9
0
        public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null)
        {
            BodyPartTagDef metabolismSource = BodyPartTagDefOf.MetabolismSource;

            return(PawnCapacityUtility.CalculateTagEfficiency(diffSet, metabolismSource, float.MaxValue, default(FloatRange), impactors, -1f));
        }
Пример #10
0
        private float CalculateForDirectChildren(HediffSet diffSet, BodyPartRecord part, BodyPartTagDef partTag, List <PawnCapacityUtility.CapacityImpactor> impactors)
        {
            float value     = 0;
            int   partCount = 0;

            foreach (BodyPartRecord partWithTag in part.parts.Where(t => t.def.tags.Contains(partTag)))
            {
                value += PawnCapacityUtility.CalculateImmediatePartEfficiencyAndRecord(diffSet, partWithTag, impactors);
                partCount++;
            }

            if (partCount == 0)
            {
                return(0f);
            }

            return(value / partCount);
        }
Пример #11
0
        public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null)
        {
            BodyPartTagDef EVKidney = BodyPartTagDefOf.EVKidney;

            return(PawnCapacityUtility.CalculateTagEfficiency(diffSet, EVKidney, float.MaxValue, default(FloatRange), impactors, -1f));
        }
        public static bool Patch_CalculateLimbEfficiency(ref float __result, HediffSet diffSet, BodyPartTagDef limbCoreTag, BodyPartTagDef limbSegmentTag,
                                                         BodyPartTagDef limbDigitTag, float appendageWeight, out float functionalPercentage, List <CapacityImpactor> impactors)
        {
            functionalPercentage = 0f;

            if (limbCoreTag != BodyPartTagDefOf.MovingLimbCore)
            {
                return(true);
            }

            var hediff = diffSet.GetFirstHediffOfDef(LifeSupportDefOf.QE_LifeSupport);

            if (hediff is null)
            {
                return(true);
            }

            if (hediff.Severity < 1f)
            {
                return(true);
            }

            __result = 0f;

            if (!(impactors is null))
            {
                var capacityImpactor = new CapacityImpactorHediff();
                capacityImpactor.hediff = hediff;
                impactors.Add(capacityImpactor);
            }

            return(false);
        }
Пример #13
0
        public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null)
        {
            BodyPartTagDef bloodPumpingSource = BodyPartTagDefOf.BloodPumpingSource;

            return(PawnCapacityUtility.CalculateTagEfficiency(diffSet, bloodPumpingSource, float.MaxValue, default(FloatRange), impactors));
        }