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; }
// 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; }