public static bool TryGainMemory(MemoryThoughtHandler __instance, Thought_Memory newThought, Pawn otherPawn = null) { if (!ThoughtUtility.CanGetThought_NewTemp(__instance.pawn, newThought.def)) { return(false); } if (newThought is Thought_MemorySocial && newThought.otherPawn == null && otherPawn == null) { Log.Error(string.Concat("Can't gain social thought ", newThought.def, " because its otherPawn is null and otherPawn passed to this method is also null. Social thoughts must have otherPawn.")); return(false); } newThought.pawn = __instance.pawn; newThought.otherPawn = otherPawn; if (!newThought.TryMergeWithExistingMemory(out bool showBubble)) { lock (__instance) { List <Thought_Memory> newMemories = new List <Thought_Memory>(__instance.Memories) { newThought }; memoriesFieldRef(__instance) = newMemories; } } if (newThought.def.stackLimitForSameOtherPawn >= 0) { while (__instance.NumMemoriesInGroup(newThought) > newThought.def.stackLimitForSameOtherPawn) { __instance.RemoveMemory(__instance.OldestMemoryInGroup(newThought)); } } if (newThought.def.stackLimit >= 0) { while (__instance.NumMemoriesOfDef(newThought.def) > newThought.def.stackLimit) { __instance.RemoveMemory(__instance.OldestMemoryOfDef(newThought.def)); } } if (newThought.def.thoughtToMake != null) { __instance.TryGainMemory(newThought.def.thoughtToMake, newThought.otherPawn); } if (showBubble && newThought.def.showBubble && __instance.pawn.Spawned && PawnUtility.ShouldSendNotificationAbout(__instance.pawn)) { MoteMaker.MakeMoodThoughtBubble(__instance.pawn, newThought); } return(false); }