protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDespawnedNullOrForbidden(TargetIndex.A);

            this.FailOn(() => !ItemUtility.IsBuyableNow(pawn, Item));
            //AddEndCondition(() =>
            //{
            //    if (Deliveree.health.ShouldGetTreatment)
            //        return JobCondition.Ongoing;
            //    return JobCondition.Succeeded;
            //});

            if (TargetThingA != null)
            {
                Toil reserveTargetA = Toils_Reserve.Reserve(TargetIndex.A);

                yield return(reserveTargetA);

                yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch)
                             .FailOnDespawnedNullOrForbidden(TargetIndex.A));

                int duration = Rand.Range(MinShoppingDuration, MaxShoppingDuration);
                yield return(Toils_General.Wait(duration).FailOnCannotTouch(TargetIndex.A, PathEndMode.ClosestTouch));

                Toil takeThing = new Toil();
                takeThing.initAction = () => BuyThing(takeThing);
                yield return(takeThing.FailOnDespawnedNullOrForbidden(TargetIndex.A));
            }

            //yield return Toils_Jump.Jump(gotoToil); // shop some more
        }
Beispiel #2
0
        public override Job TryGiveJob(Pawn pawn)
        {
            var map          = pawn.MapHeld;
            var shoppingArea = pawn.GetShoppingArea();
            var things       = shoppingArea.ActiveCells.SelectMany(cell => map.thingGrid.ThingsListAtFast(cell)).Where(t => t.def.EverHaulable && t.def.tradeability != Tradeability.None &&
                                                                                                                       ItemUtility.IsBuyableAtAll(pawn, t) && Qualifies(t)).ToList();
            var storage = shoppingArea.ActiveCells.Select(cell => map.edificeGrid[cell]).OfType <Building_Storage>();

            things.AddRange(storage.SelectMany(s => s.slotGroup.HeldThings.Where(t => ItemUtility.IsBuyableAtAll(pawn, t) && Qualifies(t))));
            if (things.Count == 0)
            {
                return(null);
            }

            // Try some things
            var   selection = things.TakeRandom(5).Where(t => pawn.CanReach(t.Position, PathEndMode.Touch, Danger.None, false, TraverseMode.PassDoors)).ToArray();
            Thing thing     = null;

            if (selection.Length > 1)
            {
                thing = selection.MaxBy(t => Likey(pawn, t));
            }
            else if (selection.Length == 1)
            {
                thing = selection[0];
            }

            if (thing == null)
            {
                return(null);
            }

            if (Likey(pawn, thing) <= 0.5f)
            {
                //Log.Message(thing.Label + ": not interesting for " + pawn.NameStringShort);
                int duration = Rand.Range(JobDriver_BuyItem.MinShoppingDuration, JobDriver_BuyItem.MaxShoppingDuration);

                var canBrowse = CellFinder.TryRandomClosewalkCellNear(thing.Position, map, 2, out var standTarget) && ItemUtility.IsBuyableNow(pawn, thing);
                if (canBrowse)
                {
                    return(new Job(jobDefBrowse, standTarget, thing)
                    {
                        expiryInterval = duration * 2
                    });
                }

                return(null);
            }

            //Log.Message($"{pawn.NameShortColored} is going to buy {thing.LabelShort} at {thing.Position}.");
            return(new Job(jobDefBuy, thing));
        }