コード例 #1
0
 public override bool CanBeGivenTo(Pawn pawn)
 {
     if (ModsConfig.RoyaltyActive && !MeditationUtility.CanMeditateNow(pawn))
     {
         return(false);
     }
     return(base.CanBeGivenTo(pawn));
 }
コード例 #2
0
 protected override Job TryGiveJob(Pawn pawn)
 {
     if (!ModsConfig.RoyaltyActive)
     {
         return(null);
     }
     if (!MeditationUtility.CanMeditateNow(pawn))
     {
         return(null);
     }
     return(MeditationUtility.GetMeditationJob(pawn));
 }
コード例 #3
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (!MeditationUtility.CanMeditateNow(pawn))
            {
                return(null);
            }
            LocalTargetInfo targetC = (ModsConfig.RoyaltyActive ? MeditationUtility.BestFocusAt(pawn.Position, pawn) : LocalTargetInfo.Invalid);
            Job             job     = JobMaker.MakeJob(JobDefOf.Meditate, pawn.Position, pawn.InBed() ? ((LocalTargetInfo)pawn.CurrentBed()) : new LocalTargetInfo(pawn.Position), targetC);

            job.ignoreJoyTimeAssignment = true;
            return(job);
        }
コード例 #4
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDespawnedNullOrForbidden(TargetIndex.A);
            yield return(Toils_General.Do(delegate
            {
                job.SetTarget(TargetIndex.B, Throne.InteractionCell + Throne.Rotation.FacingCell);
            }));

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

            Toil toil = new Toil();

            toil.FailOnCannotTouch(TargetIndex.A, PathEndMode.InteractionCell);
            toil.FailOn(() => Throne.AssignedPawn != pawn);
            toil.FailOn(() => RoomRoleWorker_ThroneRoom.Validate(Throne.GetRoom()) != null);
            toil.FailOn(() => !MeditationUtility.CanMeditateNow(pawn) || !MeditationUtility.SafeEnvironmentalConditions(pawn, base.TargetLocA, base.Map));
            toil.defaultCompleteMode = ToilCompleteMode.Delay;
            toil.defaultDuration     = job.def.joyDuration;
            toil.tickAction          = delegate
            {
                if (pawn.mindState.applyThroneThoughtsTick == 0)
                {
                    pawn.mindState.applyThroneThoughtsTick = Find.TickManager.TicksGame + 10000;
                }
                else if (pawn.mindState.applyThroneThoughtsTick <= Find.TickManager.TicksGame)
                {
                    pawn.mindState.applyThroneThoughtsTick = Find.TickManager.TicksGame + 60000;
                    ThoughtDef thoughtDef = null;
                    if (Throne.GetRoom().Role == RoomRoleDefOf.ThroneRoom)
                    {
                        thoughtDef = ThoughtDefOf.ReignedInThroneroom;
                    }
                    if (thoughtDef != null)
                    {
                        int scoreStageIndex = RoomStatDefOf.Impressiveness.GetScoreStageIndex(Throne.GetRoom().GetStat(RoomStatDefOf.Impressiveness));
                        if (thoughtDef.stages[scoreStageIndex] != null)
                        {
                            pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtMaker.MakeThought(thoughtDef, scoreStageIndex));
                        }
                    }
                }
                rotateToFace = TargetIndex.B;
                MeditationTick();
                if (job.ignoreJoyTimeAssignment && pawn.IsHashIntervalTick(300))
                {
                    pawn.jobs.CheckForJobOverride();
                }
            };
            yield return(toil);
        }
コード例 #5
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            Toil meditate = new Toil
            {
                socialMode = RandomSocialMode.Off
            };

            if (FromBed)
            {
                this.KeepLyingDown(TargetIndex.B);
                meditate = Toils_LayDown.LayDown(TargetIndex.B, job.GetTarget(TargetIndex.B).Thing is Building_Bed, lookForOtherJobs: false, canSleep: false);
            }
            else
            {
                yield return(Toils_Goto.GotoCell(TargetIndex.A, PathEndMode.OnCell));

                meditate.initAction = delegate
                {
                    LocalTargetInfo target = job.GetTarget(TargetIndex.C);
                    if (target.IsValid)
                    {
                        faceDir = target.Cell - pawn.Position;
                    }
                    else
                    {
                        faceDir = (job.def.faceDir.IsValid ? job.def.faceDir : Rot4.Random).FacingCell;
                    }
                };
                if (Focus != null)
                {
                    meditate.FailOnDespawnedNullOrForbidden(TargetIndex.C);
                    if (pawn.HasPsylink && Focus.Thing != null)
                    {
                        meditate.FailOn(() => Focus.Thing.GetStatValueForPawn(StatDefOf.MeditationFocusStrength, pawn) < float.Epsilon);
                    }
                }
                meditate.handlingFacing = true;
            }
            meditate.defaultCompleteMode = ToilCompleteMode.Delay;
            meditate.defaultDuration     = job.def.joyDuration;
            meditate.FailOn(() => !MeditationUtility.CanMeditateNow(pawn) || !MeditationUtility.SafeEnvironmentalConditions(pawn, base.TargetLocA, base.Map));
            meditate.AddPreTickAction(delegate
            {
                bool flag = pawn.GetTimeAssignment() == TimeAssignmentDefOf.Meditate;
                if (job.ignoreJoyTimeAssignment)
                {
                    Pawn_PsychicEntropyTracker psychicEntropy = pawn.psychicEntropy;
                    if (!flag && psychicEntropy.TargetPsyfocus < psychicEntropy.CurrentPsyfocus && (psychicEntropy.TargetPsyfocus < job.psyfocusTargetLast || job.wasOnMeditationTimeAssignment))
                    {
                        EndJobWith(JobCondition.InterruptForced);
                        return;
                    }
                    job.psyfocusTargetLast            = psychicEntropy.TargetPsyfocus;
                    job.wasOnMeditationTimeAssignment = flag;
                }
                if (faceDir.IsValid && !FromBed)
                {
                    pawn.rotationTracker.FaceCell(pawn.Position + faceDir);
                }
                MeditationTick();
                if (ModLister.RoyaltyInstalled && MeditationFocusDefOf.Natural.CanPawnUse(pawn))
                {
                    int num = GenRadial.NumCellsInRadius(MeditationUtility.FocusObjectSearchRadius);
                    for (int i = 0; i < num; i++)
                    {
                        IntVec3 c = pawn.Position + GenRadial.RadialPattern[i];
                        if (c.InBounds(pawn.Map))
                        {
                            Plant plant = c.GetPlant(pawn.Map);
                            if (plant != null && plant.def == ThingDefOf.Plant_TreeAnima)
                            {
                                plant.TryGetComp <CompSpawnSubplant>()?.AddProgress_NewTmp(AnimaTreeSubplantProgressPerTick);
                            }
                        }
                    }
                }
            });
            yield return(meditate);
        }
コード例 #6
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            Toil meditate = new Toil
            {
                socialMode = RandomSocialMode.Off
            };

            if (FromBed)
            {
                this.KeepLyingDown(TargetIndex.B);
                meditate = Toils_LayDown.LayDown(TargetIndex.B, job.GetTarget(TargetIndex.B).Thing is Building_Bed, lookForOtherJobs: false, canSleep: false);
            }
            else
            {
                yield return(Toils_Goto.GotoCell(TargetIndex.A, PathEndMode.OnCell));

                meditate.initAction = delegate
                {
                    LocalTargetInfo target = job.GetTarget(TargetIndex.C);
                    if (target.IsValid)
                    {
                        faceDir = target.Cell - pawn.Position;
                    }
                    else
                    {
                        faceDir = (job.def.faceDir.IsValid ? job.def.faceDir : Rot4.Random).FacingCell;
                    }
                };
                if (Focus != null)
                {
                    meditate.FailOnDespawnedNullOrForbidden(TargetIndex.C);
                }
                meditate.handlingFacing = true;
            }
            meditate.defaultCompleteMode = ToilCompleteMode.Delay;
            meditate.defaultDuration     = job.def.joyDuration;
            meditate.FailOn(() => !MeditationUtility.CanMeditateNow(pawn) || !MeditationUtility.SafeEnvironmentalConditions(pawn, base.TargetLocA, base.Map));
            meditate.AddPreTickAction(delegate
            {
                if (faceDir.IsValid && !FromBed)
                {
                    pawn.rotationTracker.FaceCell(pawn.Position + faceDir);
                }
                pawn.GainComfortFromCellIfPossible();
                MeditationTick();
                if (ModLister.RoyaltyInstalled && MeditationFocusDefOf.Natural.CanPawnUse(pawn))
                {
                    int num = GenRadial.NumCellsInRadius(MeditationUtility.FocusObjectSearchRadius);
                    for (int i = 0; i < num; i++)
                    {
                        IntVec3 c = pawn.Position + GenRadial.RadialPattern[i];
                        if (c.InBounds(pawn.Map))
                        {
                            Plant plant = c.GetPlant(pawn.Map);
                            if (plant != null && plant.def == ThingDefOf.Plant_TreeAnima)
                            {
                                plant.TryGetComp <CompSpawnSubplant>()?.AddProgress(AnimaTreeSubplantProgressPerTick);
                            }
                        }
                    }
                }
            });
            meditate.AddFinishAction(delegate
            {
                if (sustainer != null)
                {
                    sustainer.End();
                }
            });
            yield return(meditate);
        }