public void Notify_BuildingDeSpawned(Building b)
 {
     if (MeditationUtility.CountsAsArtificialBuilding(b))
     {
         artificialBuildingsPerCell.Clear();
     }
 }
 public void GainPsyfocus(Thing focus = null)
 {
     currentPsyfocus = Mathf.Clamp(currentPsyfocus + MeditationUtility.PsyfocusGainPerTick(pawn, focus), 0f, 1f);
     if (focus != null && !focus.Destroyed)
     {
         focus.TryGetComp <CompMeditationFocus>()?.Used(pawn);
     }
 }
        protected override Job TryGiveJob(Pawn pawn)
        {
            LocalTargetInfo targetC = MeditationUtility.BestFocusAt(pawn.Position, pawn);
            Job             job     = JobMaker.MakeJob(JobDefOf.Meditate, pawn.Position, pawn.InBed() ? ((LocalTargetInfo)pawn.CurrentBed()) : new LocalTargetInfo(pawn.Position), targetC);

            job.ignoreJoyTimeAssignment = true;
            return(job);
        }
 public override Job TryGiveJobWhileInBed(Pawn pawn)
 {
     if (!ModsConfig.RoyaltyActive)
     {
         return(base.TryGiveJobWhileInBed(pawn));
     }
     return(MeditationUtility.GetMeditationJob(pawn, forJoy: true));
 }
Exemple #5
0
 protected override bool ValidatePawnState(Pawn pawn)
 {
     if (pawn.CurrentBed() != null && pawn.Awake())
     {
         return(MeditationUtility.ShouldMeditateInBed(pawn));
     }
     return(false);
 }
 protected virtual bool ValidatePawnState(Pawn pawn)
 {
     if (pawn.CurrentBed() == null)
     {
         return(!MeditationUtility.CanOnlyMeditateInBed(pawn));
     }
     return(false);
 }
 public override bool CanBeGivenTo(Pawn pawn)
 {
     if (ModsConfig.RoyaltyActive && !MeditationUtility.CanMeditateNow(pawn))
     {
         return(false);
     }
     return(base.CanBeGivenTo(pawn));
 }
        public override void DrawGhost(ThingDef def, IntVec3 center, Rot4 rot, Color ghostCol, Thing thing = null)
        {
            FocusStrengthOffset_ArtificialBuildings focusStrengthOffset_ArtificialBuildings = ((CompProperties_MeditationFocus)def.CompDefFor <CompMeditationFocus>()).offsets.OfType <FocusStrengthOffset_ArtificialBuildings>().FirstOrDefault();

            if (focusStrengthOffset_ArtificialBuildings != null)
            {
                MeditationUtility.DrawArtificialBuildingOverlay(center, def, Find.CurrentMap, focusStrengthOffset_ArtificialBuildings.radius);
            }
        }
Exemple #9
0
        protected virtual void DrawGhost(Color ghostCol)
        {
            ThingDef def;

            if ((def = (PlacingDef as ThingDef)) != null)
            {
                MeditationUtility.DrawMeditationFociAffectedByBuildingOverlay(base.Map, def, Faction.OfPlayer, UI.MouseCell(), placingRot);
            }
            GhostDrawer.DrawGhostThing(UI.MouseCell(), placingRot, (ThingDef)PlacingDef, null, ghostCol, AltitudeLayer.Blueprint);
        }
Exemple #10
0
        protected string PsyfocusPerDayReport()
        {
            if (!pawn.HasPsylink)
            {
                return("");
            }
            Thing thing = Focus.Thing;
            float f     = MeditationUtility.PsyfocusGainPerTick(pawn, thing) * 60000f;

            return("\n" + "PsyfocusPerDayOfMeditation".Translate(f.ToStringPercent()).CapitalizeFirst());
        }
Exemple #11
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);
        }
 protected override Job TryGiveJob(Pawn pawn)
 {
     if (!ModsConfig.RoyaltyActive)
     {
         return(null);
     }
     if (!MeditationUtility.CanMeditateNow(pawn))
     {
         return(null);
     }
     return(MeditationUtility.GetMeditationJob(pawn));
 }
Exemple #13
0
        protected override void DrawGhost(Color ghostCol)
        {
            ThingDef def;

            if ((def = PlacingDef as ThingDef) != null)
            {
                MeditationUtility.DrawMeditationFociAffectedByBuildingOverlay(base.Map, def, Faction.OfPlayer, UI.MouseCell(), placingRot);
            }
            Graphic baseGraphic = ThingToInstall.Graphic.ExtractInnerGraphicFor(ThingToInstall);

            GhostDrawer.DrawGhostThing_NewTmp(UI.MouseCell(), placingRot, (ThingDef)PlacingDef, baseGraphic, ghostCol, AltitudeLayer.Blueprint, ThingToInstall);
        }
        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);
        }
        public List <Thing> GetForCell(IntVec3 cell, float radius)
        {
            CellWithRadius key = new CellWithRadius(cell, radius);

            if (!artificialBuildingsPerCell.TryGetValue(key, out List <Thing> value))
            {
                value = new List <Thing>();
                foreach (Thing item in GenRadial.RadialDistinctThingsAround(cell, map, radius, useCenter: false))
                {
                    if (MeditationUtility.CountsAsArtificialBuilding(item))
                    {
                        value.Add(item);
                    }
                }
                artificialBuildingsPerCell[key] = value;
            }
            return(value);
        }
        public bool TryFindLinkSpot(Pawn pawn, out LocalTargetInfo spot)
        {
            spot = MeditationUtility.FindMeditationSpot(pawn).spot;
            if (CanUseSpot(pawn, spot))
            {
                return(true);
            }
            int num  = GenRadial.NumCellsInRadius(2.9f);
            int num2 = GenRadial.NumCellsInRadius(3.9f);

            for (int i = num; i < num2; i++)
            {
                IntVec3 c = parent.Position + GenRadial.RadialPattern[i];
                if (CanUseSpot(pawn, c))
                {
                    spot = c;
                    return(true);
                }
            }
            spot = IntVec3.Zero;
            return(false);
        }
 public void PsychicEntropyTrackerTick()
 {
     if (currentEntropy > float.Epsilon)
     {
         currentEntropy = Mathf.Max(currentEntropy - 1.TicksToSeconds() * RecoveryRate, 0f);
     }
     if (currentEntropy > float.Epsilon && !pawn.health.hediffSet.HasHediff(HediffDefOf.PsychicEntropy))
     {
         pawn.health.AddHediff(HediffDefOf.PsychicEntropy);
     }
     if (currentEntropy > float.Epsilon)
     {
         if (ticksSinceLastMote >= TicksBetweenMotes[(int)Severity])
         {
             if (pawn.Spawned)
             {
                 MoteMaker.MakeAttachedOverlay(pawn, ThingDefOf.Mote_EntropyPulse, Vector3.zero);
             }
             ticksSinceLastMote = 0;
         }
         else
         {
             ticksSinceLastMote++;
         }
     }
     else
     {
         ticksSinceLastMote = 0;
     }
     if (NeedsPsyfocus && pawn.IsHashIntervalTick(150))
     {
         float num = 400f;
         if (!IsCurrentlyMeditating)
         {
             currentPsyfocus = Mathf.Clamp(currentPsyfocus - PsyfocusFallPerDay / num, 0f, 1f);
         }
         MeditationUtility.CheckMeditationScheduleTeachOpportunity(pawn);
     }
 }
        public bool WillBeAffectedBy(ThingDef def, Faction faction, IntVec3 pos, Rot4 rotation)
        {
            CellRect cellRect = GenAdj.OccupiedRect(pos, rotation, def.size);

            foreach (FocusStrengthOffset offset in Props.offsets)
            {
                FocusStrengthOffset_ArtificialBuildings focusStrengthOffset_ArtificialBuildings;
                if ((focusStrengthOffset_ArtificialBuildings = (offset as FocusStrengthOffset_ArtificialBuildings)) != null && MeditationUtility.CountsAsArtificialBuilding(def, faction) && cellRect.ClosestCellTo(parent.Position).DistanceTo(parent.Position) <= focusStrengthOffset_ArtificialBuildings.radius)
                {
                    return(true);
                }
            }
            return(false);
        }
 public override void DrawGhost(ThingDef def, IntVec3 center, Rot4 rot, Color ghostCol, Thing thing = null)
 {
     MeditationUtility.DrawMeditationSpotOverlay(center, Find.CurrentMap);
 }
Exemple #20
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);
        }
Exemple #21
0
 public override void PostDrawExtraSelectionOverlays()
 {
     MeditationUtility.DrawMeditationSpotOverlay(parent.Position, parent.Map);
 }
Exemple #22
0
 public override void PostDrawExtraSelectionOverlays(Thing parent, Pawn user = null)
 {
     base.PostDrawExtraSelectionOverlays(parent, user);
     MeditationUtility.DrawArtificialBuildingOverlay(parent.Position, parent.def, parent.Map, radius);
 }
Exemple #23
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);
        }