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)); }
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); } }
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); }
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()); }
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)); }
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); }
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); }
public override void PostDrawExtraSelectionOverlays() { MeditationUtility.DrawMeditationSpotOverlay(parent.Position, parent.Map); }
public override void PostDrawExtraSelectionOverlays(Thing parent, Pawn user = null) { base.PostDrawExtraSelectionOverlays(parent, user); MeditationUtility.DrawArtificialBuildingOverlay(parent.Position, parent.def, parent.Map, radius); }
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); }