示例#1
0
        private static void UpdateColonistStats(Pawn colonist)
        {
            if (!_statsDict.ContainsKey(colonist))
            {
                _statsDict.Add(colonist, new PawnStats());
            }

            var pawnStats = _statsDict[colonist];

            // Efficiency
            var efficiency = (from activity in _pawnCapacities where activity != PawnCapacityDefOf.Consciousness select colonist.health.capacities.GetEfficiency(activity)).Concat(new[] { 10f }).Min();

            if (efficiency < 0.0)
            {
                efficiency = 0.0f;
            }

            pawnStats.pawn_TotalEfficiency = efficiency;

            // Target
            pawnStats.TargetPos = Vector3.zero;

            if (colonist.jobs.curJob != null)
            {
                var jobDriver  = colonist.jobs.curDriver;
                var job        = colonist.jobs.curJob;
                var targetInfo = job.targetA;

                if (jobDriver is JobDriver_HaulToContainer || jobDriver is JobDriver_HaulToCell || (jobDriver is JobDriver_FoodDeliver || jobDriver is JobDriver_FoodFeedPatient) || jobDriver is JobDriver_TakeToBed)
                {
                    targetInfo = job.targetB;
                }

                var doBill = jobDriver as JobDriver_DoBill;
                if (doBill != null)
                {
                    var jobDriverDoBill = doBill;
                    // ReSharper disable once CompareOfFloatsByEqualityOperator
                    if (jobDriverDoBill.workLeft == 0.0)
                    {
                        targetInfo = job.targetA;
                    }
                    else if (jobDriverDoBill.workLeft <= 0.00999999977648258)
                    {
                        targetInfo = job.targetB;
                    }
                }

                if (jobDriver is JobDriver_Hunt && colonist.carrier?.CarriedThing != null)
                {
                    targetInfo = job.targetB;
                }

                if (job.def == JobDefOf.Wait)
                {
                    targetInfo = null;
                }

                if (jobDriver is JobDriver_Ingest)
                {
                    targetInfo = null;
                }

                if (job.def == JobDefOf.LayDown && colonist.InBed())
                {
                    targetInfo = null;
                }

                if (!job.playerForced && job.def == JobDefOf.Goto)
                {
                    targetInfo = null;
                }

                var flag = targetInfo == null;
                if (!flag)
                {
                    var vector3 = targetInfo.Cell.ToVector3Shifted();
                    pawnStats.TargetPos = vector3 + new Vector3(0.0f, 3f, 0.0f);
                }
            }

            // Temperature
            var temperatureForCell = GenTemperature.GetTemperatureForCell(colonist.Position);

            pawnStats.pawn_TooCold = (float)((colonist.ComfortableTemperatureRange().min - (double)Settings.limit_TempComfortOffset - temperatureForCell) / 10.0);
            pawnStats.pawn_TooHot  = (float)((temperatureForCell - (double)colonist.ComfortableTemperatureRange().max - Settings.limit_TempComfortOffset) / 10.0);
            pawnStats.pawn_TooCold = Mathf.Clamp(pawnStats.pawn_TooCold, 0.0f, 2f);
            pawnStats.pawn_TooHot  = Mathf.Clamp(pawnStats.pawn_TooHot, 0.0f, 2f);


            // Health Calc
            pawnStats.DiseaseDisappearance = 1f;
            pawnStats.pawn_Drunkness       = DrugUtility.DrunknessPercent(colonist);


            foreach (var hediff in colonist.health.hediffSet.hediffs)
            {
                var hediffWithComps = (HediffWithComps)hediff;
                if (hediffWithComps != null &&
                    !hediffWithComps.FullyImmune() &&
                    hediffWithComps.Visible &&
                    !hediffWithComps.IsOld() &&
                    (hediffWithComps.CurStage == null ||
                     hediffWithComps.CurStage.everVisible) &&
                    (hediffWithComps.def.tendable ||
                     hediffWithComps.def.naturallyHealed) &&
                    hediffWithComps.def.PossibleToDevelopImmunity())
                {
                    pawnStats.DiseaseDisappearance = Math.Min(pawnStats.DiseaseDisappearance, colonist.health.immunity.GetImmunity(hediffWithComps.def));
                }
            }

            // Apparel Calc
            var num1        = 999f;
            var wornApparel = colonist.apparel.WornApparel;

            foreach (var apparel in wornApparel)
            {
                var num2 = apparel.HitPoints / (float)apparel.MaxHitPoints;
                if (num2 >= 0.0 && num2 < (double)num1)
                {
                    num1 = num2;
                }
            }

            pawnStats.pawn_ApparelHealth = num1;

            pawnStats.pawn_BleedRate = Mathf.Clamp01(colonist.health.hediffSet.BleedingRate * Settings.limit_BleedMult);

            _statsDict[colonist] = pawnStats;
        }
示例#2
0
        // stats recalculation routine
        public void updateColonistStats(Pawn colonist)
        {
            if (!stats_dict.ContainsKey(colonist))
            {
                stats_dict.Add(colonist, new PawnStats());
            }
            PawnStats pawnStats = stats_dict[colonist];

            ///////////////////////////////////////////////////////////////

            pawnStats.isNudist = false;

            foreach (Trait trait in colonist.story.traits.allTraits)
            {
                switch (trait.def.defName)
                {
                case "Nudist":
                    pawnStats.isNudist = true;
                    break;
                }
            }

            // efficiency
            float efficiency = 10;

            foreach (PawnCapacityDef act in pawnCapacities)
            {
                if (act != PawnCapacityDefOf.Consciousness)
                {
                    efficiency = Math.Min(efficiency, colonist.health.capacities.GetEfficiency(act));
                }
            }

            if (efficiency < 0)
            {
                efficiency = 0;
            }
            pawnStats.total_efficiency = efficiency;

            // target
            pawnStats.targetPos = Vector3.zero;

            if (colonist.jobs.curJob != null)
            {
                JobDriver  curDriver = colonist.jobs.curDriver;
                Job        curJob    = colonist.jobs.curJob;
                TargetInfo tp        = curJob.targetA;

                if (curDriver is JobDriver_HaulToContainer || curDriver is JobDriver_HaulToCell ||
                    curDriver is JobDriver_FoodDeliver || curDriver is JobDriver_FoodFeedPatient ||
                    curDriver is JobDriver_TakeToBed)
                {
                    tp = curJob.targetB;
                }

                if (curDriver is JobDriver_DoBill)
                {
                    JobDriver_DoBill bill = (JobDriver_DoBill)curDriver;
                    if (bill.workLeft == 0.0f)
                    {
                        tp = curJob.targetA;
                    }
                    else if (bill.workLeft <= 0.01f)
                    {
                        tp = curJob.targetB;
                    }

                    //Log.Message("" + ((JobDriver_DoBill)colonist.jobs.curDriver).workLeft);
                }

                if (curDriver is JobDriver_Hunt)
                {
                    if (colonist.carryHands != null && colonist.carryHands.CarriedThing != null)
                    {
                        tp = curJob.targetB;
                    }
                }

                if (curJob.def == JobDefOf.Wait)
                {
                    tp = null;
                }
                if (curDriver is JobDriver_Ingest)
                {
                    tp = null;
                }
                if (curJob.def == JobDefOf.LayDown && colonist.InBed())
                {
                    tp = null;
                }
                if (!curJob.playerForced && curJob.def == JobDefOf.Goto)
                {
                    tp = null;
                }

                //Log.Message(colonist.jobs.curJob.def.ToString()+" "+colonist.jobs.curDriver.GetType().ToString());

                if (tp != null && tp.Cell != null)
                {
                    Vector3 pos = tp.Cell.ToVector3Shifted();
                    pawnStats.targetPos = pos + new Vector3(0.0f, 3.0f, 0.0f);
                }
            }

            // temperature

            float temper = GenTemperature.GetTemperatureForCell(colonist.Position);

            pawnStats.tooCold = (colonist.ComfortableTemperatureRange().min - settings.limit_tempComfortOffset - temper) / 10.0f;
            pawnStats.tooHot  = (temper - colonist.ComfortableTemperatureRange().max - settings.limit_tempComfortOffset) / 10.0f;

            pawnStats.tooCold = Mathf.Clamp(pawnStats.tooCold, 0, 2);
            pawnStats.tooHot  = Mathf.Clamp(pawnStats.tooHot, 0, 2);

            // diseases

            pawnStats.diseaseDisappearance = 1;
            pawnStats.drunkness            = DrugUtility.DrunknessPercent(colonist);

            using (IEnumerator <Hediff_Staged> enumerator = colonist.health.hediffSet.GetDiseases().GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    Hediff_Staged disease = enumerator.Current;
                    if (disease == null || disease.FullyImmune || !disease.Visible)
                    {
                        continue;
                    }
                    if (disease.CurStage != null && !disease.CurStage.everVisible)
                    {
                        continue;
                    }
                    if (!disease.def.Treatable && !disease.def.naturallyHealed)
                    {
                        continue;
                    }

                    pawnStats.diseaseDisappearance = Math.Min(pawnStats.diseaseDisappearance, disease.Immunity);
                }
            }

            // apparel problems

            float worstApparel = 999f;

            List <Apparel> apparelListForReading = colonist.apparel.WornApparel;

            for (int index = 0; index < apparelListForReading.Count; ++index)
            {
                float curApparel = (float)apparelListForReading[index].HitPoints / (float)apparelListForReading[index].MaxHitPoints;
                if (curApparel >= 0 && curApparel < worstApparel)
                {
                    worstApparel = curApparel;
                }
            }

            pawnStats.apparelHealth = worstApparel;

            // bloodloss

            pawnStats.bleedRate = Mathf.Clamp01(colonist.health.hediffSet.BleedingRate * settings.limit_bleedMult);

            ////////////////////////////////////////////////////
            stats_dict[colonist] = pawnStats;
        }