Пример #1
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            yield return(Toils_Reserve.Reserve(TargetIndex.B));

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

            yield return(Toils_Haul.TakeToInventory(TargetIndex.B,
                                                    pawn_v.maxGase - pawn_v.gas));

            //    fuel.stackCount < (pawn_v.maxGase - pawn_v.gas) ? fuel.stackCount :

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

            yield return(Toils_General.Wait(450).WithProgressBarToilDelay(TargetIndex.A).FailOnDespawnedNullOrForbidden(TargetIndex.A));

            Toil finish = new Toil
            {
                initAction = delegate
                {
                    if (pawn_v != null)
                    {
                        pawn_v.gas += pawn.inventory.innerContainer.Last().stackCount;
                        pawn.inventory.innerContainer.Remove(pawn.inventory.innerContainer.Last());
                    }
                },
                defaultCompleteMode = ToilCompleteMode.Instant
            };

            yield return(finish);
        }
        private IEnumerable <Toil> TakeExtraIngestibles()
        {
            if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
            {
                yield break;
            }
            Toil reserveExtraFoodToCollect = Toils_WendigoIngest.ReserveFoodFromStackForIngesting(TargetIndex.C);
            Toil findExtraFoodToCollect    = new Toil
            {
                initAction = delegate
                {
                    if (pawn.inventory.innerContainer.TotalStackCountOfDef(IngestibleSource.def) < job.takeExtraIngestibles)
                    {
                        Thing thing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(IngestibleSource.def), PathEndMode.Touch, TraverseParms.For(pawn), 30f, (Thing x) => pawn.CanReserve(x, 10, 1) && !x.IsForbidden(pawn) && x.IsSociallyProper(pawn));
                        if (thing != null)
                        {
                            job.SetTarget(TargetIndex.C, thing);
                            JumpToToil(reserveExtraFoodToCollect);
                        }
                    }
                },
                defaultCompleteMode = ToilCompleteMode.Instant
            };

            yield return(Toils_Jump.Jump(findExtraFoodToCollect));

            yield return(reserveExtraFoodToCollect);

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

            yield return(Toils_Haul.TakeToInventory(TargetIndex.C, () => job.takeExtraIngestibles - pawn.inventory.innerContainer.TotalStackCountOfDef(IngestibleSource.def)));

            yield return(findExtraFoodToCollect);
        }
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDestroyedOrNull(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).FailOn(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(this.Map, thing))
                    {
                        return(true);
                    }
                }
                return(false);
            });
            yield return(toilGoto);

            job.count = Mathf.Min(10, TargetA.Thing.stackCount);
            yield return(Toils_Haul.TakeToInventory(TargetIndex.A, job.count));

            yield break;
        }
        protected override IEnumerable <Toil> MakeNewToils()
        {
            _ = this.FailOnDestroyedOrNull(InstrumentInd);

            var gotoThing = new Toil
            {
                initAction = delegate { pawn.pather.StartPath(TargetThingA, PathEndMode.ClosestTouch); },

                defaultCompleteMode = ToilCompleteMode.PatherArrival
            };

            _ = gotoThing.FailOnDespawnedNullOrForbidden(InstrumentInd);

            yield return(gotoThing);

            var dropInstruments = new Toil
            {
                initAction = delegate
                {
                    var instruments = pawn.inventory.innerContainer.Where(PerformanceManager.IsInstrument)
                                      .ToList();

                    foreach (var instrument in instruments)
                    {
                        _ = pawn.inventory.innerContainer.TryDrop(instrument, pawn.Position, pawn.Map,
                                                                  ThingPlaceMode.Near, out _);
                    }
                }
            };

            yield return(dropInstruments);

            yield return(Toils_Haul.TakeToInventory(InstrumentInd, 1));
        }
Пример #5
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDestroyedOrNull(InstrumentInd);

            Toil gotoThing = new Toil();

            gotoThing.initAction = delegate
            {
                this.pawn.pather.StartPath(this.TargetThingA, PathEndMode.ClosestTouch);
            };

            gotoThing.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            gotoThing.FailOnDespawnedNullOrForbidden(InstrumentInd);

            yield return(gotoThing);

            Toil dropInstruments = new Toil();

            dropInstruments.initAction = delegate
            {
                List <Thing> instruments = pawn.inventory.innerContainer.Where(x => PerformanceManager.IsInstrument(x)).ToList();
                Thing        result;

                foreach (Thing instrument in instruments)
                {
                    pawn.inventory.innerContainer.TryDrop(instrument, pawn.Position, pawn.Map, ThingPlaceMode.Near, out result);
                }
            };

            yield return(dropInstruments);

            yield return(Toils_Haul.TakeToInventory(InstrumentInd, 1));
        }
Пример #6
0
        private IEnumerable <Toil> PrepareToIngestToils_ToolUser(Toil chewToil)
        {
            if (eatingFromInventory)
            {
                yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, TargetIndex.A));
            }
            else
            {
                yield return(ReserveFoodIfWillIngestWholeStack());

                Toil gotoToPickup = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.A);
                yield return(Toils_Jump.JumpIf(gotoToPickup, () => pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation)));

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

                yield return(Toils_Jump.Jump(chewToil));

                yield return(gotoToPickup);

                yield return(Toils_Ingest.PickupIngestible(TargetIndex.A, pawn));

                Toil reserveExtraFoodToCollect = Toils_Reserve.Reserve(TargetIndex.C);
                Toil findExtraFoodToCollect    = new Toil();
                findExtraFoodToCollect.initAction = delegate
                {
                    if (pawn.inventory.innerContainer.TotalStackCountOfDef(IngestibleSource.def) < job.takeExtraIngestibles)
                    {
                        Predicate <Thing> validator = (Thing x) => pawn.CanReserve(x) &&
                                                      !x.IsForbidden(pawn) && x.IsSociallyProper(pawn);
                        Thing thing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map,
                                                                       ThingRequest.ForDef(IngestibleSource.def), PathEndMode.Touch,
                                                                       TraverseParms.For(pawn),
                                                                       12f, validator);
                        if (thing != null)
                        {
                            pawn.CurJob.SetTarget(TargetIndex.C, thing);
                            JumpToToil(reserveExtraFoodToCollect);
                        }
                    }
                };
                findExtraFoodToCollect.defaultCompleteMode = ToilCompleteMode.Instant;
                yield return(Toils_Jump.Jump(findExtraFoodToCollect));

                yield return(reserveExtraFoodToCollect);

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

                yield return(Toils_Haul.TakeToInventory(TargetIndex.C,
                                                        () => job.takeExtraIngestibles - pawn.inventory.innerContainer.TotalStackCountOfDef(IngestibleSource.def)));

                yield return(findExtraFoodToCollect);
            }
            yield return(Toils_Ingest.CarryIngestibleToChewSpot(pawn, TargetIndex.A).FailOnDestroyedOrNull(TargetIndex.A));

            yield return(Toils_Ingest.FindAdjacentEatSurface(TargetIndex.B, TargetIndex.A));
        }
        protected override IEnumerable <Toil> MakeNewToils()
        {
            //Clean up any spare blueprints
            AddFinishAction(delegate
            {
                Blueprint blueprint = TargetB.Thing as Blueprint;
                if (!blueprint?.Destroyed ?? false)
                {
                    Log.Message($"Cleaning up {blueprint}");
                    blueprint.Destroy(DestroyMode.Vanish);
                }
            });

            job.count = 1;
            Thing bedroll = pawn.CurJob.targetA.Thing;

            if (bedroll.Spawned)
            {
                Log.Message($"{pawn} needs to pick up {bedroll}");
                yield return(Toils_Reserve.Reserve(TargetIndex.A));

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

                yield return(Toils_Haul.TakeToInventory(TargetIndex.A, 1));
            }
            yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, TargetIndex.A));

            yield return(Toils_Haul.CarryHauledThingToContainer());

            yield return(Toils_Construct.MakeSolidThingFromBlueprintIfNecessary(TargetIndex.B, TargetIndex.C));

            //yield return Toils_Haul.DepositHauledThingInContainer(TargetIndex.B, TargetIndex.C);//1.0 game destroys minified thing, but its job still does Deposit?
            Toil restInBed = new Toil();

            restInBed.initAction = delegate
            {
                Pawn         pawn   = restInBed.actor;
                Job          curJob = pawn.jobs.curJob;
                Building_Bed bed    = curJob.targetB.Thing as Building_Bed;

                pawn.Map.GetComponent <PlacedBedsMapComponent>().placedBeds[pawn] = bed;

                pawn.ownership?.ClaimBedIfNonMedical(bed);

                Job restJob = new Job(RimWorld.JobDefOf.LayDown, TargetB);
                pawn.jobs.StartJob(restJob, JobCondition.Succeeded);
            };
            yield return(restInBed);
        }
Пример #8
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDestroyedOrNull(TargetIndex.A);
            this.FailOnDestroyedOrNull(TargetIndex.B);

            if (!pawn.inventory.Contains(TargetThingB))
            {
                yield return(Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.Touch));

                yield return(Toils_Haul.StartCarryThing(TargetIndex.B));
            }
            else
            {
                yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, TargetIndex.B));
            }

            var goToAltar = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell);

            yield return(goToAltar);

            var waitingTime = new Toil
            {
                defaultCompleteMode = ToilCompleteMode.Delay,
                defaultDuration     = 740
            };

            waitingTime.WithProgressBarToilDelay(TargetIndex.A);
            waitingTime.initAction = delegate
            {
                report = "WaitingForCongregation".Translate();
                ReligionUtility.Listeners(Lectern, Lectern.listeners);
                foreach (var p in Lectern.listeners)
                {
                    ReligionUtility.GiveAttendJob(Lectern, p);
                }
            };
            yield return(waitingTime);

            var preachingTime = new Toil
            {
                initAction = delegate
                {
                    report = "ReadAPrayer".Translate();
                    //MoteMaker.MakeInteractionBubble(this.pawn, null, ThingDefOf.Mote_Speech, ReligionUtility.faith);
                    var intDef = ReligionDefOf.WorshipInteraction;
                    foreach (var p in Lectern.listeners)
                    {
                        ReligionUtility.TryWorshipInteraction(pawn, p, intDef);
                    }
                },
                defaultCompleteMode = ToilCompleteMode.Delay,
                defaultDuration     = 1800
            };

            preachingTime.WithProgressBarToilDelay(TargetIndex.A);
            preachingTime.tickAction = delegate
            {
                var actor = pawn;
                actor.skills.Learn(SkillDefOf.Social, 0.25f);
            };
            yield return(preachingTime);


            var toStoreToil = new Toil();

            toStoreToil.initAction = delegate
            {
                var actor  = toStoreToil.actor;
                var curJob = actor.jobs.curJob;
                StoreUtility.TryFindBestBetterStoreCellFor(curJob.targetB.Thing, actor, actor.Map,
                                                           StoragePriority.Important, Faction.OfPlayer, out var foundCell);
                //if(!foundCell.IsValid)
                //    StoreUtility.TryFindBestBetterStoreCellFor(curJob.targetB.Thing, actor, actor.Map, StoragePriority.Unstored, Faction.OfPlayer, out foundCell, true);
                //actor.carryTracker.TryStartCarry(TargetB.Thing);
                curJob.targetC = foundCell.IsValid ? foundCell : Lectern.Position;
                foreach (var p in Lectern.listeners)
                {
                    p.jobs.EndCurrentJob(JobCondition.Succeeded);
                }
            };
            yield return(toStoreToil);

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

            yield return(Toils_Haul.PlaceHauledThingInCell(TargetIndex.C, Toils_Haul.TakeToInventory(TargetIndex.C, 1),
                                                           false));

            AddFinishAction(() =>
            {
                ReligionUtility.HeldWorshipThought(pawn);
                ReligionUtility.TryAddAddictionForPreacher(pawn);
            });
        }