Example #1
0
        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);
        }
Example #2
0
        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);
        }