I understand it was reported before in an earlier version but it hasn't been resolved and no save was attached on that one.
Here I have the save before & after the blinding pulse to help debugging
https://drive.google.com/file/d/1N5boOu3577uHd2iVD-fTlW44bFLNFvW5/view?usp=sharing
Hmm, just skimming the code, I am not sure I understand how it manages to calculate the sight without issue in a normal game.
Bascially, in order to get the sight in `Verse.PawnCapacitiesHandler:GetLevel`, the game has to check each hediff.
Blinding pulse would add Hediff `PsychicBlindness`, which affects sight by `<capacityFactorEffectMultiplier>PsychicSensitivity</capacityFactorEffectMultiplier>`
Then the game checks `PsychicSensitivity` via `RimWorld.StatWorker:GetValue`
This stat has `StatPart_SightPsychicSenstivityOffset`, which requires sight in `TryGetPsychicOffset`, hence the infinite loop
Here I have the save before & after the blinding pulse to help debugging
https://drive.google.com/file/d/1N5boOu3577uHd2iVD-fTlW44bFLNFvW5/view?usp=sharing
Code Select
RimWorld 1.3.3200 rev726
UnityEngine.StackTraceUtility:ExtractStackTrace ()
Verse.Log:Message (string)
RimWorld.VersionControl:LogVersionNumber ()
Verse.Root:CheckGlobalInit ()
Verse.Root:Start ()
Verse.Root_Entry:Start ()
Loading game from file test_after with mods:
- Ludeon.RimWorld
- Ludeon.RimWorld.Royalty
- Ludeon.RimWorld.Ideology
UnityEngine.StackTraceUtility:ExtractStackTrace ()
Verse.Log:Message (string)
Verse.SavedGameLoaderNow:LoadGameFromSaveFileNow (string)
Verse.Root_Play/<>c:<Start>b__1_1 ()
Verse.LongEventHandler:RunEventFromAnotherThread (System.Action)
Verse.LongEventHandler/<>c:<UpdateCurrentAsynchronousEvent>b__27_0 ()
System.Threading.ThreadHelper:ThreadStart_Context (object)
System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool)
System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool)
System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object)
System.Threading.ThreadHelper:ThreadStart ()
Detected infinite stat recursion when evaluating Sight
UnityEngine.StackTraceUtility:ExtractStackTrace ()
Verse.Log:Error (string)
Verse.PawnCapacitiesHandler:GetLevel (Verse.PawnCapacityDef)
RimWorld.StatPart_SightPsychicSenstivityOffset:TryGetPsychicOffset (Verse.Thing,single&)
RimWorld.StatPart_SightPsychicSenstivityOffset:TransformValue (RimWorld.StatRequest,single&)
RimWorld.StatWorker:FinalizeValue (RimWorld.StatRequest,single&,bool)
RimWorld.StatWorker:GetValue (RimWorld.StatRequest,bool)
RimWorld.StatWorker:GetValue (Verse.Thing,bool)
RimWorld.StatExtension:GetStatValue (Verse.Thing,RimWorld.StatDef,bool)
Verse.PawnCapacityUtility:CalculateCapacityLevel (Verse.HediffSet,Verse.PawnCapacityDef,System.Collections.Generic.List`1<Verse.PawnCapacityUtility/CapacityImpactor>,bool)
Verse.PawnCapacitiesHandler:GetLevel (Verse.PawnCapacityDef)
RimWorld.StatWorker:GetValueUnfinalized (RimWorld.StatRequest,bool)
RimWorld.StatWorker:GetValue (RimWorld.StatRequest,bool)
RimWorld.StatWorker:GetValue (Verse.Thing,bool)
RimWorld.StatExtension:GetStatValue (Verse.Thing,RimWorld.StatDef,bool)
RimWorld.Verb_MeleeAttack:GetDodgeChance (Verse.LocalTargetInfo)
RimWorld.Verb_MeleeAttack:TryCastShot ()
Verse.Verb:TryCastNextBurstShot ()
Verse.Verb:WarmupComplete ()
Verse.Verb:TryStartCastOn (Verse.LocalTargetInfo,Verse.LocalTargetInfo,bool,bool,bool)
Verse.Verb:TryStartCastOn (Verse.LocalTargetInfo,bool,bool,bool)
RimWorld.Pawn_MeleeVerbs:TryMeleeAttack (Verse.Thing,Verse.Verb,bool)
Verse.AI.JobDriver_Wait:CheckForAutoAttack ()
Verse.AI.JobDriver_Wait:Notify_StanceChanged ()
Verse.Pawn_StanceTracker:SetStance (Verse.Stance)
Verse.Stance_Busy:Expire ()
Verse.Stance_Busy:StanceTick ()
Verse.Pawn_StanceTracker:StanceTrackerTick ()
Verse.Pawn:Tick ()
Verse.TickList:Tick ()
Verse.TickManager:DoSingleTick ()
Verse.TickManager:TickManagerUpdate ()
Verse.Game:UpdatePlay ()
Verse.Root_Play:Update ()
Hmm, just skimming the code, I am not sure I understand how it manages to calculate the sight without issue in a normal game.
Bascially, in order to get the sight in `Verse.PawnCapacitiesHandler:GetLevel`, the game has to check each hediff.
Blinding pulse would add Hediff `PsychicBlindness`, which affects sight by `<capacityFactorEffectMultiplier>PsychicSensitivity</capacityFactorEffectMultiplier>`
Then the game checks `PsychicSensitivity` via `RimWorld.StatWorker:GetValue`
This stat has `StatPart_SightPsychicSenstivityOffset`, which requires sight in `TryGetPsychicOffset`, hence the infinite loop