Esempio n. 1
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            yield return(Toils_Goto.GotoCell(TargetIndex.B, PathEndMode.OnCell));

            pawn.Rotation = Rot4.Random;

            Toil waiting = Toils_General.Wait(job.def.joyDuration);

            waiting.socialMode = RandomSocialMode.Quiet;
            waiting.FailOn(() => !MeditationUtility.CanMeditateNow(pawn) || !MeditationUtility.SafeEnvironmentalConditions(pawn, TargetB.Cell, base.Map));
            waiting.tickAction = () =>
            {
                pawn.GainComfortFromCellIfPossible();
                if (pawn.needs.joy != null)
                {
                    JoyUtility.JoyTickCheckEnd(pawn, JoyTickFullJoyAction.None, 0.2f);
                }

                waiting.handlingFacing = true;
                if (pawn.IsHashIntervalTick(400))
                {
                    MakeThinkingBubble(pawn, TargetA.Pawn);
                }
            };

            yield return(waiting);

            yield break;
        }
 public override Job NonScanJob(Pawn pawn)
 {
     if (MeditationUtility.CanMeditateNow(pawn))
     {
         return(GetAnimaMeditationJob(pawn));
     }
     return(null);
 }
        public override Job NonScanJob(Pawn pawn)
        {
            bool shouldMeditate = pawn.HasPsylink && pawn.psychicEntropy.CurrentPsyfocus < pawn.psychicEntropy.TargetPsyfocus;

            if (shouldMeditate && MeditationUtility.CanMeditateNow(pawn))
            {
                return(MeditationUtility.GetMeditationJob(pawn));
            }
            return(null);
        }
        public static MeditationSpotAndFocus FindAnimaMeditationSpot(Pawn pawn)
        {
            LocalTargetInfo spot  = LocalTargetInfo.Invalid;
            LocalTargetInfo focus = LocalTargetInfo.Invalid;

            if (!ModLister.RoyaltyInstalled)
            {
                Log.ErrorOnce("Psyfocus meditation is a Royalty-specific game system. If you want to use this code please check ModLister.RoyaltyInstalled before calling it.", 657324);
                return(new MeditationSpotAndFocus(spot, focus));
            }
            Thing animaTree = pawn.Map.listerThings.ThingsOfDef(DefDatabase <ThingDef> .GetNamed("Plant_TreeAnima")).FirstOrDefault();

            if (animaTree != null)
            {
                CompMeditationFocus compMeditationFocus = animaTree.TryGetComp <CompMeditationFocus>();
                if (compMeditationFocus != null && compMeditationFocus.CanPawnUse(pawn))
                {
                    if (pawn.HasPsylink && animaTree.GetStatValueForPawn(StatDefOf.MeditationFocusStrength, pawn) > float.Epsilon)
                    {
                        spot  = MeditationUtility.MeditationSpotForFocus(animaTree, pawn);
                        focus = animaTree;
                        return(new MeditationSpotAndFocus(spot, focus));
                    }
                    else
                    {
                        Area    area = pawn.playerSettings.AreaRestriction;
                        IntVec3 c2   = RCellFinder.RandomWanderDestFor(
                            pawn,
                            animaTree.Position,
                            4,
                            delegate(Pawn p, IntVec3 c, IntVec3 r)
                        {
                            return(c.Standable(p.Map) && c.GetDoor(p.Map) == null && (area == null || area[c]));
                        },
                            pawn.NormalMaxDanger()
                            );
                        if (c2.IsValid && (area == null || area[c2]))
                        {
                            return(new MeditationSpotAndFocus(c2, null));
                        }
                    }
                }
            }
            return(new MeditationSpotAndFocus(spot, focus));
        }
 protected override string GetTextFor(Pawn pawn)
 {
     return(MeditationUtility.FocusTypesAvailableForPawnString(pawn));
 }