コード例 #1
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            yield return(Toils_Reserve.Reserve(TargetIndex.A, 1, -1, null));

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

            Toil tFuel = new Toil();

            tFuel.defaultCompleteMode = ToilCompleteMode.Instant;
            tFuel.AddFailCondition(() => this.Casket.GetComp <CompRefuelable>().Fuel < 50f);
            tFuel.AddFailCondition(() => !this.Casket.GetComp <CompPowerTrader>().PowerOn);
            tFuel.initAction = delegate()
            {
                this.Casket.GetComp <CompRefuelable>().ConsumeFuel(25f);
            };
            yield return(tFuel);

            Toil t2 = Toils_General.Wait(6000);

            t2.AddFailCondition(() => !this.Casket.GetComp <CompPowerTrader>().PowerOn);
            t2.initAction = delegate()
            {
                this.Casket.Map.weatherManager.TransitionTo(WeatherDef.Named("RainyThunderstorm"));
            };
            t2 = t2.WithProgressBar(TargetIndex.A, () => (6000f - (float)this.ticksLeftThisToil) / 6000f, false, -0.5f);
            yield return(t2);

            yield return(new Toil
            {
                defaultCompleteMode = ToilCompleteMode.Instant,
                initAction = delegate()
                {
                    GenExplosion.DoExplosion(this.Casket.Position, this.Casket.Map, 50f, DamageDefOf.EMP, this.Casket,
                                             -1, -1f, SoundDefOf.EnergyShield_Broken, null, null, null, null, 0f, 1, false, null, 0f, 1);
                    this.Casket.GetComp <CompOsiris>().HealContained();
                    this.Casket.Map.weatherManager.TransitionTo(WeatherDef.Named("Rain"));
                    IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.FactionArrival, this.Casket.Map);
                    incidentParms.forced = true;
                    incidentParms.target = this.Casket.Map;
                    QueuedIncident qi = new QueuedIncident(new FiringIncident(IncidentDef.Named("ShortCircuit"), null, incidentParms), Find.TickManager.TicksGame + 1);
                    Find.Storyteller.incidentQueue.Add(qi);
                }
            });

            yield return(Toils_Reserve.Release(TargetIndex.A));

            yield break;
        }
コード例 #2
0
        // Token: 0x0600012B RID: 299 RVA: 0x0000C0A4 File Offset: 0x0000A4A4
        protected override IEnumerable <Toil> MakeNewToils()
        {
            yield return(Toils_Reserve.Reserve((Verse.AI.TargetIndex) 1, 1, -1, null));

            yield return(Toils_Reserve.Reserve((Verse.AI.TargetIndex) 2, 1, -1, null));

            yield return(Toils_Goto.GotoThing((Verse.AI.TargetIndex) 1, (Verse.AI.PathEndMode) 3));

            yield return(Toils_Haul.StartCarryThing((Verse.AI.TargetIndex) 1, false, false));

            yield return(Toils_Haul.CarryHauledThingToCell((Verse.AI.TargetIndex) 2));

            Toil t2 = Toils_General.Wait(1000);

            t2.AddFailCondition(() => !this.Emitter.GetComp <CompPowerTrader>().PowerOn);
            t2 = ToilEffects.WithProgressBar(t2, (Verse.AI.TargetIndex) 1, () => (1000f - (float)this.ticksLeftThisToil) / 1000f, false, -0.5f);
            yield return(t2);

            yield return(new Toil
            {
                defaultCompleteMode = (Verse.AI.ToilCompleteMode) 1,
                initAction = delegate()
                {
                    this.Emitter.GetComp <CompHoloEmitter>().Scan(this.Corpse);
                }
            });

            yield return(Toils_Reserve.Release((Verse.AI.TargetIndex) 2));

            yield break;
        }
コード例 #3
0
    protected override IEnumerable <Toil> MakeNewToils()
    {
        yield return(Toils_Goto.GotoCell(TargetIndex.A, PathEndMode.OnCell));

        var gaze = new Toil
        {
            initAction          = delegate { pawn.jobs.posture = PawnPosture.LayingOnGroundFaceUp; },
            tickAction          = delegate { BrrrGlobals.JoyTickOohCheckEnd(pawn); },
            defaultCompleteMode = ToilCompleteMode.Delay,
            defaultDuration     = job.def.joyDuration
        };

        gaze.FailOn(() => pawn.Position.Roofed(pawn.Map));
        gaze.AddFailCondition(delegate
        {
            var actor = gaze.actor;
            var needs = actor.needs;
            if (needs?.food == null)
            {
                return(false);
            }

            var needs2 = actor.needs;
            var num    = needs2 != null ? new float?(needs2.food.CurLevelPercentage) : null;
            var percentageThreshHungry = actor.needs.food.PercentageThreshHungry;
            if ((num.GetValueOrDefault() < percentageThreshHungry) & (num != null))
            {
                return(true);
            }

            return(false);
        });
        yield return(gaze);
    }
コード例 #4
0
        public Toil TryImproveRelationship(Pawn recruiter, Pawn guest)
        {
            var toil = new Toil
            {
                initAction = () => {
                    if (!recruiter.ShouldImproveRelationship(guest))
                    {
                        return;
                    }
                    if (!recruiter.CanTalkTo(guest))
                    {
                        return;
                    }
                    InteractionDef intDef = DefDatabase <InteractionDef> .GetNamed("GuestDiplomacy");

                    recruiter.interactions.TryInteractWith(guest, intDef);
                },
                socialMode          = RandomSocialMode.Off,
                defaultCompleteMode = ToilCompleteMode.Delay,
                defaultDuration     = 350
            };

            toil.AddFailCondition(FailCondition);
            return(toil);
        }
コード例 #5
0
        public static Toil GotoPrisoner(Pawn pawn, Pawn talkee, PrisonerInteractionModeDef mode)
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                pawn.pather.StartPath(talkee, PathEndMode.Touch);
            };
            toil.AddFailCondition(delegate
            {
                if (talkee.DestroyedOrNull())
                {
                    return(true);
                }
                if (mode != PrisonerInteractionModeDefOf.Execution && !talkee.Awake())
                {
                    return(true);
                }
                if (!talkee.IsPrisonerOfColony)
                {
                    return(true);
                }
                return((talkee.guest == null || talkee.guest.interactionMode != mode) ? true : false);
            });
            toil.socialMode          = RandomSocialMode.Off;
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            return(toil);
        }
コード例 #6
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            yield return(Toils_Reserve.Reserve(TargetIndex.A, 4, 0, null));

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

            Toil t2 = Toils_General.Wait(6000);

            t2.AddFailCondition(() => this.Building.GetComp <CompWeatherSat>() == null);
            t2            = t2.WithEffect(EffecterDefOf.Research, TargetIndex.A);
            t2.tickAction = delegate()
            {
                float num = 0.0002f;
                num *= 1f + 0.5f * (float)base.GetActor().story.traits.DegreeOfTrait(TraitDef.Named("PsychicSensitivity"));
                CompWeatherSat comp = this.Building.GetComp <CompWeatherSat>();
                if (comp != null)
                {
                    comp.mana += num;
                    if (comp.mana < 0f)
                    {
                        comp.mana = 0f;
                    }
                    if (comp.mana > 100f)
                    {
                        comp.mana = 100f;
                    }
                }
            };
            yield return(t2);

            yield return(Toils_Reserve.Release(TargetIndex.A));

            yield break;
        }
コード例 #7
0
        public Toil TryRecruitGuest(Pawn recruiter, Pawn guest)
        {
            var toil = new Toil
            {
                initAction = () => {
                    if (!recruiter.ShouldRecruit(guest))
                    {
                        return;
                    }
                    if (!recruiter.CanTalkTo(guest))
                    {
                        return;
                    }
                    InteractionDef intDef = DefDatabase <InteractionDef> .GetNamed("CharmGuestAttempt");

                    recruiter.interactions.TryInteractWith(guest, intDef);
                    var success = guest.CheckRecruitingSuccessful(recruiter);
                },
                socialMode          = RandomSocialMode.Off,
                defaultCompleteMode = ToilCompleteMode.Delay,
                defaultDuration     = 350
            };

            toil.AddFailCondition(FailCondition);
            return(toil);
        }
コード例 #8
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            yield return(Toils_Reserve.Reserve(TargetIndex.A, 1, -1, null));

            yield return(Toils_Reserve.Reserve(TargetIndex.B, 1, -1, null));

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

            yield return(Toils_Haul.StartCarryThing(TargetIndex.A, false, false));

            yield return(Toils_Haul.CarryHauledThingToCell(TargetIndex.B));

            Toil t2 = Toils_General.Wait(1000);

            t2.AddFailCondition(() => !this.Emitter.GetComp <CompPowerTrader>().PowerOn);
            t2 = t2.WithProgressBar(TargetIndex.A, () => (1000f - (float)this.ticksLeftThisToil) / 1000f, false, -0.5f);
            yield return(t2);

            yield return(new Toil
            {
                defaultCompleteMode = ToilCompleteMode.Instant,
                initAction = delegate()
                {
                    Pawn simPawn = this.MakeGeniusPawn();
                    this.Emitter.GetComp <CompHoloEmitter>().SimPawn = simPawn;
                    this.Emitter.GetComp <CompHoloEmitter>().SetUpPawn();
                    this.Disk.Destroy(DestroyMode.Vanish);
                }
            });

            yield return(Toils_Reserve.Release(TargetIndex.B));

            yield break;
        }
コード例 #9
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            CompScanner scannerComp = job.targetA.Thing.TryGetComp <CompScanner>();

            this.FailOnDespawnedNullOrForbidden(TargetIndex.A);
            this.FailOnBurningImmobile(TargetIndex.A);
            this.FailOn(() => !scannerComp.CanUseNow);
            yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell));

            Toil work = new Toil();

            work.tickAction = delegate
            {
                Pawn actor = work.actor;
                _ = (Building)actor.CurJob.targetA.Thing;
                scannerComp.Used(actor);
                actor.skills.Learn(SkillDefOf.Intellectual, 0.035f);
                actor.GainComfortFromCellIfPossible(chairsOnly: true);
            };
            work.PlaySustainerOrSound(scannerComp.Props.soundWorking);
            work.AddFailCondition(() => !scannerComp.CanUseNow);
            work.defaultCompleteMode = ToilCompleteMode.Never;
            work.FailOnCannotTouch(TargetIndex.A, PathEndMode.InteractionCell);
            work.activeSkill = () => SkillDefOf.Intellectual;
            yield return(work);
        }
コード例 #10
0
 protected override IEnumerable<Toil> MakeNewToils()
 {
     Building_DroidChargePad charger = (Building_DroidChargePad)TargetThingA;
     Toil goToPad = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.OnCell);
     goToPad.AddFailCondition(() => { return !charger.IsAvailable(pawn); });
     yield return goToPad;
     Droid droid = (Droid)this.pawn;
     Toil charge = new Toil();
     charge.initAction = () =>
         {
             if (charger.Position != droid.Position)
             {
                 pawn.jobs.EndCurrentJob(JobCondition.Errored);
             }
         };
     charge.defaultCompleteMode = ToilCompleteMode.Never;
     charge.AddFailCondition(() =>
         { return !charger.IsAvailable(pawn); });
     charge.AddEndCondition(() =>
         {
             if (!droid.DesiresCharge())
             {
                 return JobCondition.Succeeded;
             }
             return JobCondition.Ongoing;
         });
     yield return charge;
 }
コード例 #11
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDestroyedOrNull(TargetIndex.A);
            this.FailOnBurningImmobile(TargetIndex.B);
            if (!forbiddenInitially)
            {
                this.FailOnForbidden(TargetIndex.A);
            }
            Toil reserveTargetA = Toils_Reserve.Reserve(TargetIndex.A, 1, -1, null);

            yield return(reserveTargetA);

            Toil toilGoto = null;

            toilGoto = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnSomeonePhysicallyInteracting(TargetIndex.A);
            toilGoto.AddFailCondition(delegate
            {
                Pawn actor = toilGoto.actor;
                Job curJob = actor.jobs.curJob;
                if (curJob.haulMode == HaulMode.ToCellStorage)
                {
                    Thing thing  = curJob.GetTarget(TargetIndex.A).Thing;
                    IntVec3 cell = actor.jobs.curJob.GetTarget(TargetIndex.B).Cell;
                    if (!cell.IsValidStorageFor(Map, thing))
                    {
                        return(true);
                    }
                }
                return(false);
            });
            yield return(toilGoto);

            yield return(Toils_Haul.StartCarryThing(TargetIndex.A, false, true, false));

            if (job.haulOpportunisticDuplicates)
            {
                yield return(Toils_Haul.CheckForGetOpportunityDuplicate(reserveTargetA, TargetIndex.A, TargetIndex.B, false, null));
            }
            if (job.expiryInterval != -1)
            {
                yield return(CheckExpiry());
            }
            Insect insect = toilGoto.actor as Insect;

            if (insect != null && insect.targetColonyFood)
            {
                yield return(ResetTargetColonyFoodFlag(insect));
            }
            Toil carryToCell = Toils_Haul.CarryHauledThingToCell(TargetIndex.B);

            yield return(carryToCell);

            yield return(Toils_Haul.PlaceHauledThingInCell(TargetIndex.B, carryToCell, true));

            if (insect != null && insect.stealFood)
            {
                yield return(ResetStealFoodFlag(insect));
            }
        }
コード例 #12
0
        protected Toil Interact(Pawn talkee, InteractionDef intDef, int duration)
        {
            var toil = new Toil {
                initAction = () => {
                    PawnUtility.ForceWait(talkee, duration, pawn);
                    TargetThingB = pawn;
                    MoteMaker.MakeInteractionBubble(pawn, talkee, intDef.interactionMote, intDef.Symbol);
                },
                socialMode          = RandomSocialMode.Normal,
                defaultCompleteMode = ToilCompleteMode.Delay,
                defaultDuration     = duration
            };

            toil.AddFailCondition(talkee.interactions.InteractedTooRecentlyToInteract);
            toil.AddFailCondition(pawn.interactions.InteractedTooRecentlyToInteract);
            return(toil.WithProgressBarToilDelay(TargetIndex.B));
        }
コード例 #13
0
 public static Toil GotoGuest(Pawn pawn, Pawn talkee, Func<Pawn,bool> condition, bool mayBeSleeping = false)
 {
     var toil = new Toil
     {
         initAction = () => pawn.pather.StartPath(talkee, PathEndMode.Touch),
         defaultCompleteMode = ToilCompleteMode.PatherArrival
     };
     toil.AddFailCondition(() => !GuestUtility.ViableGuestTarget(talkee, mayBeSleeping) || !condition(talkee));
     return toil;
 }
コード例 #14
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOn(() => PrisonerFoodReservation.isReserved(TargetA.Thing));
            yield return(Toils_Reserve.Reserve(TargetIndex.B, 1, -1, null));

            if (eatingFromInventory)
            {
                yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, TargetIndex.A));
            }
            else if (usingNutrientPasteDispenser)
            {
                yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell)
                             .FailOnForbidden(TargetIndex.A));

                yield return(Toils_Ingest.TakeMealFromDispenser(TargetIndex.A, pawn));
            }
            else
            {
                yield return(Toils_Reserve.Reserve(TargetIndex.A, 1, -1, null));

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

                yield return(Toils_Ingest.PickupIngestible(TargetIndex.A, Deliveree));
            }
            var toil = new Toil();

            toil.initAction = delegate
            {
                var actor  = toil.actor;
                var curJob = actor.jobs.curJob;
                actor.pather.StartPath(curJob.targetC, PathEndMode.OnCell);
            };
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            toil.FailOnDestroyedNullOrForbidden(TargetIndex.B);
            toil.AddFailCondition(delegate
            {
                var pawn = (Pawn)toil.actor.jobs.curJob.targetB.Thing;
                return(!pawn.IsPrisonerOfColony || !pawn.guest.CanBeBroughtFood);
            });
            yield return(toil);

            yield return(new Toil
            {
                initAction = delegate
                {
                    Thing thing;
                    pawn.carryTracker.TryDropCarriedThing(toil.actor.jobs.curJob.targetC.Cell, ThingPlaceMode.Direct,
                                                          out thing, null);
                    PrisonerFoodReservation.reserve(thing, (Pawn)toil.actor.jobs.curJob.targetB.Thing);
                },
                defaultCompleteMode = ToilCompleteMode.Instant
            });
        }
コード例 #15
0
        public static Toil GotoGuest(Pawn pawn, Pawn talkee, bool mayBeSleeping = false)
        {
            var toil = new Toil
            {
                initAction          = () => pawn.pather.StartPath(talkee, PathEndMode.Touch),
                defaultCompleteMode = ToilCompleteMode.PatherArrival
            };

            toil.AddFailCondition(() => !GuestUtility.ViableGuestTarget(talkee, mayBeSleeping));
            return(toil);
        }
コード例 #16
0
        public static Toil GotoPawn(Pawn pawn, Pawn talkee, PrisonerInteractionMode mode)
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                pawn.pather.StartPath(talkee, PathEndMode.Touch);
            };
            toil.AddFailCondition(() => talkee.Destroyed);
            toil.socialMode          = RandomSocialMode.Off;
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            return(toil);
        }
コード例 #17
0
        private static Toil ReachTarget(Pawn target)
        {
            Toil toil = new Toil();

            toil.AddFailCondition(() => target == null || target.Destroyed || target.Downed || !target.Spawned || target.Dead);
            toil.socialMode          = 0;
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            toil.initAction          = delegate
            {
                toil.GetActor().pather.StartPath(target, PathEndMode.Touch);
            };
            return(toil);
        }
コード例 #18
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDespawnedOrNull(TargetIndex.B);
            if (eatingFromInventory)
            {
                yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, TargetIndex.A));
            }
            else if (usingNutrientPasteDispenser)
            {
                yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell).FailOnForbidden(TargetIndex.A));

                yield return(Toils_Ingest.TakeMealFromDispenser(TargetIndex.A, pawn));
            }
            else
            {
                yield return(Toils_Ingest.ReserveFoodFromStackForIngesting(TargetIndex.A, Deliveree));

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

                yield return(Toils_Ingest.PickupIngestible(TargetIndex.A, Deliveree));
            }
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                Pawn actor  = toil.actor;
                Job  curJob = actor.jobs.curJob;
                actor.pather.StartPath(curJob.targetC, PathEndMode.OnCell);
            };
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            toil.FailOnDestroyedNullOrForbidden(TargetIndex.B);
            toil.AddFailCondition(delegate
            {
                Pawn pawn = (Pawn)toil.actor.jobs.curJob.targetB.Thing;
                if (!pawn.IsPrisonerOfColony)
                {
                    return(true);
                }
                return((!pawn.guest.CanBeBroughtFood) ? true : false);
            });
            yield return(toil);

            Toil toil2 = new Toil();

            toil2.initAction = delegate
            {
                pawn.carryTracker.TryDropCarriedThing(toil2.actor.jobs.curJob.targetC.Cell, ThingPlaceMode.Direct, out Thing _);
            };
            toil2.defaultCompleteMode = ToilCompleteMode.Instant;
            yield return(toil2);
        }
コード例 #19
0
        private Toil TalkToAnimal(Pawn animal)
        {
            Toil toil = new Toil();

            toil.AddFailCondition(delegate { return(animal.CurJob.def != GUC_JobDefOf.Mounted); });
            toil.initAction = delegate
            {
                Pawn actor = toil.GetActor();
                actor.interactions.TryInteractWith(animal, InteractionDefOf.AnimalChat);
            };
            toil.defaultCompleteMode = ToilCompleteMode.Delay;
            toil.defaultDuration     = 150;
            return(toil);
        }
コード例 #20
0
        public override void DecorateWaitToil(Toil wait)
        {
            Pawn TargetOfAttention = TargetA.Thing as Pawn;

            if (TargetOfAttention == null)
            {
                throw new Exception("Can't pay attention to a null value");
            }
            payAttentinoToID = TargetOfAttention.CurJob.GetUniqueLoadID();
            base.DecorateWaitToil(wait);
            wait.AddFailCondition(
                delegate()
            {
                return(payAttentinoToID == null || payAttentinoToID != (TargetA.Thing as Pawn).CurJob.GetUniqueLoadID());
            });
        }
コード例 #21
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDestroyedNullOrForbidden(TargetIndex.A);
            ICharge          chargee = (ICharge)pawn;
            CompDroidCharger charger = job.GetTarget(TargetIndex.A).Thing.TryGetComp <CompDroidCharger>();

            yield return(Toils_Reserve.Reserve(TargetIndex.A));

            Toil goToPad = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell);

            goToPad.AddFailCondition(() => { return(!charger.IsAvailable(chargee)); });
            yield return(goToPad);

            Toil charge = new Toil();

            charge.initAction = () =>
            {
                if (charger.parent.InteractionCell != chargee.Parent.Position)
                {
                    pawn.jobs.EndCurrentJob(JobCondition.Errored);
                }
                else
                {
                    charger.BeginCharge(chargee);
                    chargee.ShouldUsePower = false;
                }
            };
            charge.defaultCompleteMode = ToilCompleteMode.Never;
            charge.AddFailCondition(() =>
                                    { return(!charger.IsAvailable(chargee)); });
            charge.AddEndCondition(() =>
            {
                if (!chargee.DesiresCharge)
                {
                    return(JobCondition.Succeeded);
                }
                return(JobCondition.Ongoing);
            });
            charge.AddFinishAction(() =>
            {
                charger.EndCharge();
                chargee.ShouldUsePower = true;
            });
            yield return(charge);
        }
コード例 #22
0
 public static Toil TryImproveRelationship(Pawn recruiter, Pawn talkee)
 {
     var toil = new Toil
     {
         initAction = () => {
             if (!GuestUtility.ViableGuestTarget(talkee)) return;
             if (!talkee.ImproveRelationship()) return;
             if (talkee.Faction.ColonyGoodwill >= 100) return;
             if (!recruiter.CanTalkTo(talkee)) return;
             recruiter.talker.TryTalkTo(new SpeechMessage(), talkee);
         },
         defaultCompleteMode = ToilCompleteMode.Delay,
         defaultDuration = 350,
         finishActions = new List<Action> {() => { var success = TryGuestImproveRelationship(recruiter, talkee); }}
     };
     toil.AddFailCondition(() => !GuestUtility.ViableGuestTarget(talkee) || !talkee.ImproveRelationship());
     return toil;
 }
コード例 #23
0
        // Token: 0x06000091 RID: 145 RVA: 0x00005434 File Offset: 0x00003634
        private static Toil AbuseTarget(Pawn target)
        {
            Toil toil = new Toil();

            toil.AddFailCondition(() => target == null || target.Destroyed || target.Downed || !target.Spawned || target.Dead);
            toil.socialMode = RandomSocialMode.Off;
            toil.initAction = delegate()
            {
                Pawn actor = toil.GetActor();
                if (Rand.Value < 0.3f)
                {
                    actor.interactions.TryInteractWith(target, InteractionDefOf.Chitchat);
                    return;
                }
                actor.interactions.TryInteractWith(target, InteractionDefOf.DeepTalk);
            };
            return(toil);
        }
コード例 #24
0
        private Toil TalkToAnimal(TargetIndex tameeInd)
        {
            Toil toil = new Toil();

            toil.AddFailCondition(delegate { return(Mount.CurJob.def != GUC_JobDefOf.Mounted); });
            //toil.AddFailCondition(delegate { return Mount.CurJob.targetA.Thing != pawn; });
            toil.initAction = delegate
            {
                Pawn actor = toil.GetActor();
                actor.interactions.TryInteractWith(Mount, InteractionDefOf.AnimalChat);
            };
            toil.defaultCompleteMode = ToilCompleteMode.Delay;
            toil.defaultDuration     = 150;
            toil.AddFinishAction(delegate
            {
                FinishAction();
            });
            return(toil);
        }
コード例 #25
0
        private static Toil FlirtWithTarget(Pawn target)
        {
            Toil toil = new Toil();

            toil.AddFailCondition(() => target == null || target.Destroyed || target.Downed || !target.Spawned || target.Dead);
            toil.socialMode = 0;
            toil.initAction = delegate
            {
                Pawn actor = toil.GetActor();
                if (actor.relations.DirectRelationExists(PawnRelationDefOf.Lover, target))
                {
                    actor.interactions.TryInteractWith(target, InteractionDefOf.MarriageProposal);
                }
                else
                {
                    actor.interactions.TryInteractWith(target, InteractionDefOf.RomanceAttempt);
                }
            };
            return(toil);
        }
コード例 #26
0
        private static Toil AbuseTarget(Pawn target)
        {
            Toil toil = new Toil();

            toil.AddFailCondition(() => target == null || target.Destroyed || target.Downed || !target.Spawned || target.Dead);
            toil.socialMode = 0;
            toil.initAction = delegate
            {
                Pawn actor = toil.GetActor();
                if (Rand.Value < 0.3f)
                {
                    actor.interactions.TryInteractWith(target, InteractionDefOf.Insult);
                }
                else
                {
                    actor.interactions.TryInteractWith(target, DefDatabase <InteractionDef> .GetNamed("Slight"));
                }
            };
            return(toil);
        }
コード例 #27
0
        // duplicated to make changes
        public Toil CarryHauledThingToCell(TargetIndex squareIndex)
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                IntVec3 cell = toil.actor.jobs.curJob.GetTarget(squareIndex).Cell;
                toil.actor.pather.StartPath(cell, PathEndMode.ClosestTouch);
            };
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            toil.AddFailCondition(delegate
            {
                Pawn actor   = toil.actor;
                IntVec3 cell = actor.jobs.curJob.GetTarget(squareIndex).Cell;

                // call duplicated to make changes
                return(actor.jobs.curJob.haulMode == HaulMode.ToCellStorage && !IsValidStorageFor(cell, actor.carrier.CarriedThing));
            });
            return(toil);
        }
コード例 #28
0
 protected override IEnumerable<Toil> MakeNewToils()
 {
     ICharge chargee = (ICharge)this.pawn;
     CompDroidCharger charger =TargetThingA.TryGetComp<CompDroidCharger>();
     yield return Toils_Reserve.Reserve(TargetIndex.A);
     Toil goToPad = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell);
     goToPad.AddFailCondition(() => { return !charger.IsAvailable(chargee); });
     yield return goToPad;
     Toil charge = new Toil();
     charge.initAction = () =>
         {
             if (charger.parent.InteractionCell != chargee.Parent.Position)
             {
                 pawn.jobs.EndCurrentJob(JobCondition.Errored);
             }
             else
             {
                 charger.BeginCharge(chargee);
                 chargee.ShouldUsePower = false;
             }
         };
     charge.defaultCompleteMode = ToilCompleteMode.Never;
     charge.AddFailCondition(() =>
         { return !charger.IsAvailable(chargee); });
     charge.AddEndCondition(() =>
         {
             if (!chargee.DesiresCharge)
             {
                 return JobCondition.Succeeded;
             }
             return JobCondition.Ongoing;
         });
     charge.AddFinishAction(() =>
         {
             charger.EndCharge();
             chargee.ShouldUsePower = true;
         });
     yield return charge;
 }
コード例 #29
0
 //Stop a hauling job if haulability gets toggled off
 static void Postfix(JobDriver __instance)
 {
     if (__instance is JobDriver_HaulToCell)
     {
         List <Toil> toils =
             (List <Toil>) typeof(JobDriver).InvokeMember("toils",
                                                          BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic,
                                                          null, __instance, null);
         Toil toilGoto = toils[1];
         if (toilGoto.defaultCompleteMode != ToilCompleteMode.PatherArrival)
         {
             Log.Error("Trying to add fail condition on JobDriver_HaulToCell but "
                       + toilGoto.ToString()
                       + " doesn't appear to be a Goto Toil");
             return;
         }
         toilGoto.AddFailCondition(delegate
         {
             Thing t = __instance.job.targetA.Thing;
             return(!__instance.job.ignoreDesignations && !t.IsAHaulableSetToHaulable());
         });
     }
 }
コード例 #30
0
        private Toil TalkToAnimal(TargetIndex tameeInd)
        {
            Toil toil = new Toil();

            toil.AddFailCondition(delegate { return(Mount.CurJob.def != BM_JobDefOf.Mounted_BattleMount); });
            toil.initAction = delegate
            {
                Pawn actor = toil.GetActor();
                actor.interactions.TryInteractWith(Mount, InteractionDefOf.AnimalChat);
            };
            toil.defaultCompleteMode = ToilCompleteMode.Delay;
            toil.defaultDuration     = 150;
            toil.AddFinishAction(delegate {
                if (Mount.CurJob != null && Mount.CurJob.def == BM_JobDefOf.Mounted_BattleMount)
                {
                    Pawn actor = toil.GetActor();
                    ExtendedPawnData pawnData = Base.Instance.GetExtendedDataStorage().GetExtendedDataFor(actor);
                    pawnData.mount            = (Pawn)((Thing)actor.CurJob.GetTarget(tameeInd));
                    TextureUtility.setDrawOffset(pawnData);
                }
            });
            return(toil);
        }
コード例 #31
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            Building_DroidCharger building = (Building_DroidCharger)TargetThingA;

            // Go to the charging pad, but stop trying if it isn't on or is taken.
            Toil gotoToil = Toils_Goto.GotoThing(TargetIndex.A, PathMode.OnSquare);

            gotoToil.AddFailCondition(() => {
                return(!building.IsOnAndAvailable(pawn));
            });
            yield return(gotoToil);

            // Charge until at least 99% full, or the charger is off or taken.
            DroidPawn droid      = (DroidPawn)this.pawn;
            Toil      chargeToil = new Toil();

            chargeToil.initAction = () => {
                if (building.Position != pawn.Position)
                {
                    pawn.jobs.EndCurrentJob(JobCondition.Errored);
                }
            };
            chargeToil.defaultCompleteMode = ToilCompleteMode.Never;
            chargeToil.AddFailCondition(() => {
                return(!building.IsOnAndAvailable(pawn));
            });
            chargeToil.AddEndCondition(() => {
                if (droid.storedEnergy >= 0.99 * DroidPawn.storedEnergyMax)
                {
                    return(JobCondition.Succeeded);
                }
                return(JobCondition.Ongoing);
            });

            yield return(chargeToil);
        }
コード例 #32
0
        private Toil GotoPrisoner(Pawn pawn, Pawn talkee)
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                pawn.pather.StartPath(talkee, PathEndMode.Touch);
            };
            toil.AddFailCondition(delegate
            {
                if (talkee.DestroyedOrNull())
                {
                    return(true);
                }
                if (!talkee.IsPrisonerOfColony)
                {
                    return(true);
                }
                return((talkee.guest == null) ? true : false);
            });
            toil.socialMode          = RandomSocialMode.Off;
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            return(toil);
        }
コード例 #33
0
 public static Toil TryRecruitGuest(Pawn recruiter, Pawn talkee)
 {
     var toil = new Toil
     {
         initAction = () => {
             if (!GuestUtility.ViableGuestTarget(talkee)) return;
             if (talkee.guest.interactionMode!=PrisonerInteractionMode.AttemptRecruit) return;
             if (!recruiter.CanTalkTo(talkee)) return;
             recruiter.talker.TryTalkTo(new SpeechMessage(), talkee);
             talkee.jobs.StopAll();
         },
         defaultCompleteMode = ToilCompleteMode.Delay,
         defaultDuration = 350,
         finishActions = new List<Action> {() => { var success = TryGuestRecruit(recruiter, talkee); }}
     };
     toil.AddFailCondition(() => !GuestUtility.ViableGuestTarget(talkee) || !talkee.TryRecruit());
     return toil;
 }
コード例 #34
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() - making toils");
            this.FailOnDespawnedOrNull(PartnerInd);
            this.FailOnDespawnedNullOrForbidden(BedInd);
            //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() fail conditions check " + (Actor is null) + " " + !xxx.CanUse(Actor, Bed) + " " + !Actor.CanReserve(Partner));
            this.FailOn(() => Actor is null || !xxx.CanUse(Actor, Bed) || !Actor.CanReserve(Partner));
            this.FailOn(() => pawn.Drafted);
            int price = WhoringHelper.PriceOfWhore(Actor);

            yield return(Toils_Reserve.Reserve(PartnerInd, 1, 0));

            //yield return Toils_Reserve.Reserve(BedInd, Bed.SleepingSlotsCount, 0);
            bool partnerHasPenis = Genital_Helper.has_penis(Partner) || Genital_Helper.has_penis_infertile(Partner);

            Toil gotoWhoreBed = new Toil
            {
                initAction = delegate
                {
                    //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() - gotoWhoreBed initAction is called");
                    Actor.pather.StartPath(WhoreSleepSpot, PathEndMode.OnCell);
                    Partner.jobs.StopAll();
                    Partner.pather.StartPath(WhoreSleepSpot, PathEndMode.Touch);
                },
                tickAction = delegate
                {
                    if (Partner.IsHashIntervalTick(150))
                    {
                        Partner.pather.StartPath(Actor, PathEndMode.Touch);
                        //Log.Message(xxx.get_pawnname(Partner) + ": I'm following the w***e");
                    }
                },
                defaultCompleteMode = ToilCompleteMode.PatherArrival
            };

            gotoWhoreBed.FailOnWhorebedNoLongerUsable(BedInd, Bed);
            yield return(gotoWhoreBed);

            Toil waitInBed = new Toil
            {
                initAction = delegate
                {
                    //Rand.PopState();
                    //Rand.PushState(RJW_Multiplayer.PredictableSeed());
                    //Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - waitInBed, initAction is called");
                    ticksLeftThisToil = 5000;
                    ticks_left        = (int)(2000.0f * Rand.Range(0.30f, 1.30f));
                    //Actor.pather.StopDead();  //Let's just make w****s standing at the bed
                    //JobDriver curDriver = Actor.jobs.curDriver;
                    //curDriver.layingDown = LayingDownState.LayingInBed;
                    //curDriver.asleep = false;
                    var gettin_loved = new Job(xxx.gettin_loved, Actor, Bed);
                    Partner.jobs.StartJob(gettin_loved, JobCondition.InterruptForced);
                },
                tickAction = delegate
                {
                    Actor.GainComfortFromCellIfPossible();
                    if (IsInOrByBed(Bed, Partner))
                    {
                        //Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - waitInBed, tickAction pass");
                        ticksLeftThisToil = 0;
                    }
                },
                defaultCompleteMode = ToilCompleteMode.Delay,
            };

            waitInBed.FailOn(() => pawn.GetRoom() == null);
            yield return(waitInBed);

            bool canAfford = WhoringHelper.CanAfford(Partner, Actor, price);

            if (canAfford)
            {
                Toil loveToil = new Toil
                {
                    initAction = delegate
                    {
                        //Actor.jobs.curDriver.ticksLeftThisToil = 1200;
                        //Using ticks_left to control the time of sex
                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - loveToil, setting initAction");

                        /*
                         * //Hoge: W***e is just work. no feel cheatedOnMe.
                         * if (xxx.HasNonPolyPartner(Actor))
                         * {
                         *      Pawn pawn = LovePartnerRelationUtility.ExistingLovePartner(Actor);
                         *      if (((Partner != pawn) && !pawn.Dead) && ((pawn.Map == Actor.Map) || (Rand.Value < 0.15)))
                         *      {
                         *              pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.CheatedOnMe, Actor);
                         *      }
                         * }
                         */
                        if (xxx.HasNonPolyPartnerOnCurrentMap(Partner))
                        {
                            Pawn lover = LovePartnerRelationUtility.ExistingLovePartner(Partner);
                            //Rand.PopState();
                            //Rand.PushState(RJW_Multiplayer.PredictableSeed());
                            // We have to do a few other checks because the pawn might have multiple lovers and ExistingLovePartner() might return the wrong one
                            if (lover != null && Actor != lover && !lover.Dead && (lover.Map == Partner.Map || Rand.Value < 0.25))
                            {
                                lover.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.CheatedOnMe, Partner);
                            }
                        }
                        if (!partnerHasPenis)
                        {
                            Actor.rotationTracker.Face(Partner.DrawPos);
                        }
                    },
                    defaultCompleteMode = ToilCompleteMode.Never,                     //Changed from Delay
                };
                loveToil.AddPreTickAction(delegate
                {
                    //Actor.Reserve(Partner, 1, 0);
                    --ticks_left;
                    xxx.reduce_rest(Partner);
                    xxx.reduce_rest(Actor, 2);

                    if (ticks_left <= 0)
                    {
                        ReadyForNextToil();
                    }
                    else if (pawn.IsHashIntervalTick(ticks_between_hearts))
                    {
                        MoteMaker.ThrowMetaIcon(Actor.Position, Actor.Map, ThingDefOf.Mote_Heart);
                    }
                    Actor.GainComfortFromCellIfPossible();
                    Partner.GainComfortFromCellIfPossible();
                });
                loveToil.AddFinishAction(delegate
                {
                    //Log.Message("[RJW] JobDriver_WhoreIsServingVisitors::MakeNewToils() - finished loveToil");
                    //// Trying to add some interactions and social logs
                    //xxx.processAnalSex(Partner, Actor, ref isAnalSex, partnerHasPenis);
                });
                loveToil.AddFailCondition(() => Partner.Dead || !IsInOrByBed(Bed, Partner));
                loveToil.socialMode = RandomSocialMode.Off;
                yield return(loveToil);

                Toil afterSex = new Toil
                {
                    initAction = delegate
                    {
                        // Adding interactions, social logs, etc
                        SexUtility.ProcessSex(Actor, Partner, false, false, true);

                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Partner should pay the price now in afterSex.initAction");
                        int remainPrice = WhoringHelper.PayPriceToWhore(Partner, price, Actor);

                        /*if (remainPrice <= 0)
                         * {
                         *      --Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Paying price is success");
                         * }
                         * else
                         * {
                         *      --Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Paying price failed");
                         * }*/
                        xxx.UpdateRecords(Actor, price - remainPrice);
                        var thought = (Actor.IsPrisoner) ? thought_captive : thought_free;
                        pawn.needs.mood.thoughts.memories.TryGainMemory(thought);
                        if (SexUtility.ConsiderCleaning(pawn))
                        {
                            LocalTargetInfo cum = pawn.PositionHeld.GetFirstThing <Filth>(pawn.Map);

                            Job clean = new Job(JobDefOf.Clean);
                            clean.AddQueuedTarget(TargetIndex.A, cum);

                            pawn.jobs.jobQueue.EnqueueFirst(clean);
                        }
                    },
                    defaultCompleteMode = ToilCompleteMode.Instant
                };
                yield return(afterSex);
            }
        }
コード例 #35
0
        protected override IEnumerable<Toil> MakeNewToils()
        {
            var foodThing = this.TargetThing( FoodInd );
            var deliveree = (Pawn) this.TargetThing( DelivereeInd );
            var dropCell = this.TargetCell( DeliverToInd );

            yield return Toils_Reserve.Reserve( DelivereeInd, 1 );

            if( foodThing is Building )
            {
                yield return Toils_Goto.GotoThing( FoodInd, PathEndMode.InteractionCell ).FailOnForbidden( FoodInd );

                if( foodThing is Building_NutrientPasteDispenser )
                {
                    yield return Toils_Ingest.TakeMealFromDispenser( FoodInd, this.pawn );
                }
                else if( foodThing is Building_AutomatedFactory )
                {
                    yield return Toils_FoodSynthesizer.TakeMealFromSynthesizer( FoodInd, this.pawn );
                }
                else // Unknown building
                {
                    throw new Exception( "Food target for JobDriver_FoodDeliver is a building but not Building_NutrientPasteDispenser or Building_AutomatedFactory!" );
                }
            }
            else if(
                ( this.pawn.inventory != null )&&
                ( this.pawn.inventory.Contains( foodThing ) )
            )
            {
                yield return Toils_Misc.TakeItemFromInventoryToCarrier( this.pawn, FoodInd );
            }
            else
            {
                yield return Toils_Reserve.Reserve( FoodInd, 1 );
                yield return Toils_Goto.GotoThing( FoodInd, PathEndMode.ClosestTouch );
                yield return Toils_Ingest.PickupIngestible( FoodInd, deliveree );
            }

            var pathToTarget = new Toil();
            pathToTarget.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            pathToTarget.initAction = new Action( () =>
                {
                    var pawn = this.pawn;
                    var job = pawn.jobs.curJob;
                    pawn.pather.StartPath( job.targetC, PathEndMode.OnCell );
                }
            );
            pathToTarget.FailOnDestroyedNullOrForbidden( DelivereeInd );
            pathToTarget.AddFailCondition( () =>
            {
                if( deliveree.Downed )
                {
                    return false;
                }
                if( deliveree.IsPrisonerOfColony )
                {
                    return !deliveree.guest.ShouldBeBroughtFood;
                }
                var compPrisoner = deliveree.TryGetComp<CompPrisoner>();
                if( compPrisoner != null )
                {
                    return !compPrisoner.wasArrested;
                }
                return false;
            } );
            yield return pathToTarget;

            var dropFoodAtTarget = new Toil();
            dropFoodAtTarget.initAction = new Action( () =>
                {
                    Thing resultingThing;
                    this.pawn.carrier.TryDropCarriedThing( dropCell, ThingPlaceMode.Direct, out resultingThing );
                }
            );
            dropFoodAtTarget.defaultCompleteMode = ToilCompleteMode.Instant;
            yield return dropFoodAtTarget;
        }
コード例 #36
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            setup_ticks();

            this.FailOnDespawnedOrNull(iTarget);
            this.FailOnDespawnedNullOrForbidden(iBed);
            this.FailOn(() => !pawn.CanReserveAndReach(Partner, PathEndMode.Touch, Danger.Deadly));
            this.FailOn(() => pawn.Drafted);
            this.FailOn(() => Partner.IsFighting());
            this.FailOn(() => !Partner.CanReach(pawn, PathEndMode.Touch, Danger.Deadly));

            yield return(Toils_Reserve.Reserve(iTarget, 1, 0));

            Toil gotoAnimal = Toils_Goto.GotoThing(iTarget, PathEndMode.Touch);

            yield return(gotoAnimal);

            Toil gotoBed = new Toil();

            gotoBed.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            gotoBed.FailOnBedNoLongerUsable(iBed);
            gotoBed.AddFailCondition(() => Partner.Downed);
            gotoBed.initAction = delegate
            {
                pawn.pather.StartPath(SleepSpot, PathEndMode.OnCell);
                Partner.jobs.StopAll();
                Job job = JobMaker.MakeJob(JobDefOf.GotoMindControlled, SleepSpot);
                Partner.jobs.StartJob(job, JobCondition.InterruptForced);
            };
            yield return(gotoBed);

            Toil waitInBed = new Toil();

            waitInBed.FailOn(() => pawn.GetRoom(RegionType.Set_Passable) == null);
            waitInBed.defaultCompleteMode = ToilCompleteMode.Delay;
            waitInBed.initAction          = delegate
            {
                ticksLeftThisToil = 5000;
            };
            waitInBed.tickAction = delegate
            {
                pawn.GainComfortFromCellIfPossible();
                if (IsInOrByBed(Bed, Partner) && pawn.PositionHeld == Partner.PositionHeld)
                {
                    ReadyForNextToil();
                }
            };
            yield return(waitInBed);

            Toil StartPartnerJob = new Toil();

            StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant;
            StartPartnerJob.socialMode          = RandomSocialMode.Off;
            StartPartnerJob.initAction          = delegate
            {
                var gettin_loved = JobMaker.MakeJob(xxx.gettin_loved, pawn, Bed);
                Partner.jobs.StartJob(gettin_loved, JobCondition.InterruptForced);
            };
            yield return(StartPartnerJob);

            Toil loveToil = new Toil();

            loveToil.AddFailCondition(() => Partner.Dead || !IsInOrByBed(Bed, Partner));
            loveToil.socialMode          = RandomSocialMode.Off;
            loveToil.defaultCompleteMode = ToilCompleteMode.Never;
            loveToil.handlingFacing      = true;
            loveToil.initAction          = delegate
            {
                usedCondom = CondomUtility.TryUseCondom(pawn);
                Start();
            };
            loveToil.AddPreTickAction(delegate
            {
                --ticks_left;
                if (pawn.IsHashIntervalTick(ticks_between_hearts))
                {
                    if (xxx.is_zoophile(pawn))
                    {
                        ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_Heart);
                    }
                    else
                    {
                        ThrowMetaIcon(pawn.Position, pawn.Map, xxx.mote_noheart);
                    }
                }
                SexTick(pawn, Partner);
                SexUtility.reduce_rest(pawn, 1);
                SexUtility.reduce_rest(Partner, 2);
                if (ticks_left <= 0)
                {
                    ReadyForNextToil();
                }
            });
            loveToil.AddFinishAction(delegate
            {
                End();
            });
            yield return(loveToil);

            Toil afterSex = new Toil
            {
                initAction = delegate
                {
                    //Log.Message("JobDriver_BestialityForFemale::MakeNewToils() - Calling aftersex");
                    SexUtility.ProcessSex(Partner, pawn, usedCondom: usedCondom, sextype: sexType);
                },
                defaultCompleteMode = ToilCompleteMode.Instant
            };

            yield return(afterSex);
        }
コード例 #37
0
        // duplicated to make changes
        public Toil CarryHauledThingToCell(TargetIndex squareIndex)
        {
            Toil toil = new Toil();
            toil.initAction = delegate
            {
                IntVec3 cell = toil.actor.jobs.curJob.GetTarget(squareIndex).Cell;
                toil.actor.pather.StartPath(cell, PathEndMode.ClosestTouch);
            };
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            toil.AddFailCondition(delegate
            {
                Pawn actor = toil.actor;
                IntVec3 cell = actor.jobs.curJob.GetTarget(squareIndex).Cell;

                // call duplicated to make changes
                return actor.jobs.curJob.haulMode == HaulMode.ToCellStorage && !IsValidStorageFor(cell, actor.carrier.CarriedThing);
            });
            return toil;
        }