private bool FinalizeSeats(out string failReason) { failReason = string.Empty; foreach (VehicleHandler handler in vehicle.handlers.Where(x => x.role.RequiredForCaravan)) { if (assignedSeats.Where(r => r.Value.Second.role == handler.role).Select(k => k.Key).Count() >= handler.role.slotsToOperate) { continue; } failReason = "CantAssignVehicle".Translate(vehicle.LabelCap); return(false); } try { trad.ForceTo(1); foreach (Pawn assignedPawn in assignedSeats.Keys) { pawns.FirstOrDefault(p => (p.AnyThing as Pawn) == assignedPawn)?.ForceTo(1); } foreach (KeyValuePair <Pawn, Pair <VehiclePawn, VehicleHandler> > seating in assignedSeats) { if (CaravanHelper.assignedSeats.ContainsKey(seating.Key)) { CaravanHelper.assignedSeats.Remove(seating.Key); } CaravanHelper.assignedSeats.Add(seating.Key, seating.Value); } } catch (Exception ex) { Log.Error($"Failed to finalize assigning vehicle seats. Message: {ex.Message} ST: {ex.StackTrace}"); failReason = ex.Message; return(false); } return(true); }
private static List <TransferableOneWay> ChechToTradeDo(IEnumerable <ThingTrade> targets, IEnumerable <Thing> allThings, ref int rate, bool setRect) { bool result = true; var selects = new List <TransferableOneWay>(); var source = allThings.ToDictionary(i => i, i => i.stackCount); //сортируем вещи сначала более плохие var sourceKeys = source.Keys .Select(t => { QualityCategory qq; QualityUtility.TryGetQuality(t, out qq); return(new { thing = t, q = qq }); }) .OrderBy(t => t.thing.def.defName + "#" + ((int)t.q).ToString() + (10000 - t.thing.HitPoints).ToString() + t.thing.stackCount.ToString().PadLeft(6)) .Select(t => t.thing) .ToList(); foreach (var target in targets) { if (target.Count == 0) { target.NotTrade = false; continue; } if (setRect && target.Count > 100 && rate > 1000000) { rate = 1000000; //от переполнения } var select = new TransferableOneWay(); //Log.Message(target.DefName); foreach (var thing in sourceKeys) { if (target.Count * rate <= select.CountToTransfer) { break; } if (source[thing] == 0) { continue; } if (target.MatchesThing(thing)) { //нам подходит выбираем нужное кол-во select.things.Add(thing); var count = target.Count * rate - select.CountToTransfer > source[thing] ? source[thing] : target.Count * rate - select.CountToTransfer; select.ForceTo(select.CountToTransfer + count); source[thing] -= count; //Log.Message(target.DefName + " == " + thing.def.defName + " o:" + source[thing].ToString() + " g:" + select.CountToTransfer.ToString() + " rate:" + rate.ToString()); } //else Log.Message(target.DefName + " != " + thing.def.defName + " " + select.CountToTransfer.ToString()); } if (setRect && target.Count > select.CountToTransfer || !setRect && target.Count * rate > select.CountToTransfer) { result = false; target.NotTrade = true; //Log.Message("NotTrade " + target.Count.ToString() + " > " + select.CountToTransfer.ToString()); } else { if (setRect && target.Count * rate > select.CountToTransfer) { rate = select.CountToTransfer / target.Count; //Log.Message(" rate:" + rate.ToString()); } selects.Add(select); target.NotTrade = false; } } return(result ? selects : null); }