private static float ApproxDaysWorthOfWater(List <Pawn> pawns, List <ThingCount> extraWater, IgnorePawnsInventoryMode ignoreInventory) { if (!DaysWorthOfWaterCalculator.AnyNonTerrainDrinkingPawn(pawns)) { return(1000f); } List <ThingCount> tmpWater = new List <ThingCount>(); tmpWater.Clear(); if (extraWater != null) { for (int i = 0; i < extraWater.Count; i++) { bool canGetWater = false; for (int j = 0; j < extraWater[i].ThingDef.comps.Count; j++) { var compprop = extraWater[i].ThingDef.comps[j] as CompProperties_WaterSource; if (compprop != null && compprop.sourceType == CompProperties_WaterSource.SourceType.Item && compprop.waterAmount > 0.0f) { canGetWater = true; break; } } if (canGetWater && extraWater[i].Count > 0) { tmpWater.Add(extraWater[i]); } } } for (int j = 0; j < pawns.Count; j++) { if (!InventoryCalculatorsUtility.ShouldIgnoreInventoryOf(pawns[j], ignoreInventory)) { ThingOwner <Thing> innerContainer = pawns[j].inventory.innerContainer; for (int k = 0; k < innerContainer.Count; k++) { if (innerContainer[k].CanGetWater()) { tmpWater.Add(new ThingCount(innerContainer[k].def, innerContainer[k].stackCount)); } } } } if (!tmpWater.Any <ThingCount>()) { return(0f); } List <float> tmpDaysWorthOfFoodPerPawn = new List <float>(); List <bool> tmpAnyFoodLeftIngestibleByPawn = new List <bool>(); tmpDaysWorthOfFoodPerPawn.Clear(); tmpAnyFoodLeftIngestibleByPawn.Clear(); for (int l = 0; l < pawns.Count; l++) { tmpDaysWorthOfFoodPerPawn.Add(0f); tmpAnyFoodLeftIngestibleByPawn.Add(true); } float num = 0f; bool flag; do { flag = false; for (int m = 0; m < pawns.Count; m++) { Pawn pawn = pawns[m]; if (tmpAnyFoodLeftIngestibleByPawn[m]) { do { int num2 = DaysWorthOfWaterCalculator.BestEverGetWaterIndexFor(pawns[m], tmpWater); if (num2 < 0) { tmpAnyFoodLeftIngestibleByPawn[m] = false; break; } CompProperties_WaterSource compprop = null; for (int x = 0; x < tmpWater[num2].ThingDef.comps.Count; x++) { compprop = tmpWater[num2].ThingDef.comps[x] as CompProperties_WaterSource; if (compprop != null && compprop.sourceType == CompProperties_WaterSource.SourceType.Item) { break; } } if (compprop == null) { tmpAnyFoodLeftIngestibleByPawn[m] = false; break; } Need_Water need_water = pawn.needs.water(); if (need_water == null) { tmpAnyFoodLeftIngestibleByPawn[m] = false; break; } float num3 = Mathf.Min(compprop.waterAmount, need_water.WaterAmountBetweenThirstyAndHealthy); float num4 = num3 / need_water.WaterAmountBetweenThirstyAndHealthy * (float)need_water.TicksUntilThirstyWhenHealthy / 60000f; tmpDaysWorthOfFoodPerPawn[m] = tmpDaysWorthOfFoodPerPawn[m] + num4; tmpWater[num2] = tmpWater[num2].WithCount(tmpWater[num2].Count - 1); flag = true; }while (tmpDaysWorthOfFoodPerPawn[m] < num); num = Mathf.Max(num, tmpDaysWorthOfFoodPerPawn[m]); } } }while (flag); float num6 = 1000f; for (int n = 0; n < pawns.Count; n++) { num6 = Mathf.Min(num6, tmpDaysWorthOfFoodPerPawn[n]); } return(num6); }
private static float ApproxDaysWorthOfWater( List <Pawn> pawns, List <ThingDefCount> extraWater, IgnorePawnsInventoryMode ignoreInventory) { if (!AnyNonTerrainDrinkingPawn(pawns)) { return(1000f); } var tmpWater = new List <ThingDefCount>(); tmpWater.Clear(); if (extraWater != null) { foreach (var thingDefCount in extraWater) { var canGetWater = false; foreach (var compProperties in thingDefCount.ThingDef.comps) { if (!(compProperties is CompProperties_WaterSource compprop) || compprop.sourceType != CompProperties_WaterSource.SourceType.Item || !(compprop.waterAmount > 0.0f)) { continue; } canGetWater = true; break; } if (canGetWater && thingDefCount.Count > 0) { tmpWater.Add(thingDefCount); } } } foreach (var pawn in pawns) { if (InventoryCalculatorsUtility.ShouldIgnoreInventoryOf(pawn, ignoreInventory)) { continue; } var innerContainer = pawn.inventory.innerContainer; foreach (var thing in innerContainer) { if (thing.CanGetWater()) { tmpWater.Add(new ThingDefCount(thing.def, thing.stackCount)); } } } if (!tmpWater.Any()) { return(0f); } var tmpDaysWorthOfFoodPerPawn = new List <float>(); var tmpAnyFoodLeftIngestibleByPawn = new List <bool>(); tmpDaysWorthOfFoodPerPawn.Clear(); tmpAnyFoodLeftIngestibleByPawn.Clear(); for (var l = 0; l < pawns.Count; l++) { tmpDaysWorthOfFoodPerPawn.Add(0f); tmpAnyFoodLeftIngestibleByPawn.Add(true); } var num = 0f; bool flag; do { flag = false; for (var m = 0; m < pawns.Count; m++) { var pawn = pawns[m]; if (!tmpAnyFoodLeftIngestibleByPawn[m]) { continue; } do { var num2 = BestEverGetWaterIndexFor(tmpWater); if (num2 < 0) { tmpAnyFoodLeftIngestibleByPawn[m] = false; break; } CompProperties_WaterSource compprop = null; foreach (var compProperties in tmpWater[num2].ThingDef.comps) { compprop = compProperties as CompProperties_WaterSource; if (compprop != null && compprop.sourceType == CompProperties_WaterSource.SourceType.Item) { break; } } if (compprop == null) { tmpAnyFoodLeftIngestibleByPawn[m] = false; break; } var need_water = pawn.needs.Water(); if (need_water == null) { tmpAnyFoodLeftIngestibleByPawn[m] = false; break; } var num3 = Mathf.Min(compprop.waterAmount, need_water.WaterAmountBetweenThirstyAndHealthy); var num4 = num3 / need_water.WaterAmountBetweenThirstyAndHealthy * need_water.TicksUntilThirstyWhenHealthy / 60000f; tmpDaysWorthOfFoodPerPawn[m] = tmpDaysWorthOfFoodPerPawn[m] + num4; tmpWater[num2] = tmpWater[num2].WithCount(tmpWater[num2].Count - 1); flag = true; }while (tmpDaysWorthOfFoodPerPawn[m] < num); num = Mathf.Max(num, tmpDaysWorthOfFoodPerPawn[m]); } }while (flag); var num6 = 1000f; for (var n = 0; n < pawns.Count; n++) { num6 = Mathf.Min(num6, tmpDaysWorthOfFoodPerPawn[n]); } return(num6); }