public static void GetOptimalHediffsToTendWithSingleTreatment(Pawn patient, bool usingMedicine, List <Hediff> outHediffsToTend, List <Hediff> tendableHediffsInTendPriorityOrder = null) { outHediffsToTend.Clear(); TendUtility.tmpHediffs.Clear(); if (tendableHediffsInTendPriorityOrder != null) { TendUtility.tmpHediffs.AddRange(tendableHediffsInTendPriorityOrder); } else { List <Hediff> hediffs = patient.health.hediffSet.hediffs; for (int i = 0; i < hediffs.Count; i++) { if (hediffs[i].TendableNow) { TendUtility.tmpHediffs.Add(hediffs[i]); } } TendUtility.SortByTendPriority(TendUtility.tmpHediffs); } if (TendUtility.tmpHediffs.Any()) { Hediff hediff = TendUtility.tmpHediffs[0]; outHediffsToTend.Add(hediff); HediffCompProperties_TendDuration hediffCompProperties_TendDuration = hediff.def.CompProps <HediffCompProperties_TendDuration>(); if (hediffCompProperties_TendDuration != null && hediffCompProperties_TendDuration.tendAllAtOnce) { for (int j = 0; j < TendUtility.tmpHediffs.Count; j++) { if (TendUtility.tmpHediffs[j] != hediff && TendUtility.tmpHediffs[j].def == hediff.def) { outHediffsToTend.Add(TendUtility.tmpHediffs[j]); } } } else if (hediff is Hediff_Injury && usingMedicine) { float num = hediff.Severity; for (int k = 0; k < TendUtility.tmpHediffs.Count; k++) { if (TendUtility.tmpHediffs[k] != hediff) { Hediff_Injury hediff_Injury = TendUtility.tmpHediffs[k] as Hediff_Injury; if (hediff_Injury != null) { float severity = hediff_Injury.Severity; if (num + severity <= 20.0) { num += severity; outHediffsToTend.Add(hediff_Injury); } } } } } TendUtility.tmpHediffs.Clear(); } }
public static int GetMedicineCountToFullyHeal(Pawn pawn) { int num = 0; int num2 = pawn.health.hediffSet.hediffs.Count + 1; Medicine.tendableHediffsInTendPriorityOrder.Clear(); List <Hediff> hediffs = pawn.health.hediffSet.hediffs; for (int i = 0; i < hediffs.Count; i++) { if (hediffs[i].TendableNow(false)) { Medicine.tendableHediffsInTendPriorityOrder.Add(hediffs[i]); } } TendUtility.SortByTendPriority(Medicine.tendableHediffsInTendPriorityOrder); int num3 = 0; while (true) { num++; if (num > num2) { break; } TendUtility.GetOptimalHediffsToTendWithSingleTreatment(pawn, true, Medicine.tmpHediffs, Medicine.tendableHediffsInTendPriorityOrder); if (!Medicine.tmpHediffs.Any <Hediff>()) { goto IL_F8; } num3++; for (int j = 0; j < Medicine.tmpHediffs.Count; j++) { Medicine.tendableHediffsInTendPriorityOrder.Remove(Medicine.tmpHediffs[j]); } } Log.Error("Too many iterations.", false); IL_F8: Medicine.tmpHediffs.Clear(); Medicine.tendableHediffsInTendPriorityOrder.Clear(); return(num3); }
public static int GetMedicineCountToFullyHeal(Pawn pawn) { int num = 0; int num2 = pawn.health.hediffSet.hediffs.Count + 1; tendableHediffsInTendPriorityOrder.Clear(); List <Hediff> hediffs = pawn.health.hediffSet.hediffs; for (int i = 0; i < hediffs.Count; i++) { if (hediffs[i].TendableNow()) { tendableHediffsInTendPriorityOrder.Add(hediffs[i]); } } TendUtility.SortByTendPriority(tendableHediffsInTendPriorityOrder); int num3 = 0; while (true) { num++; if (num > num2) { Log.Error("Too many iterations."); break; } TendUtility.GetOptimalHediffsToTendWithSingleTreatment(pawn, usingMedicine: true, tmpHediffs, tendableHediffsInTendPriorityOrder); if (!tmpHediffs.Any()) { break; } num3++; for (int j = 0; j < tmpHediffs.Count; j++) { tendableHediffsInTendPriorityOrder.Remove(tmpHediffs[j]); } } tmpHediffs.Clear(); tendableHediffsInTendPriorityOrder.Clear(); return(num3); }