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 }
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)); }