public static IEnumerable <Dialog_InfoCard.Hyperlink> FocusObjectsForPawnHyperlinks(Pawn pawn)
 {
     for (int i = 0; i < DefDatabase <MeditationFocusDef> .AllDefsListForReading.Count; i++)
     {
         MeditationFocusDef meditationFocusDef = DefDatabase <MeditationFocusDef> .AllDefsListForReading[i];
         if (!meditationFocusDef.CanPawnUse(pawn))
         {
             continue;
         }
         if (!focusObjectHyperlinksPerTypeCache.ContainsKey(meditationFocusDef))
         {
             List <Dialog_InfoCard.Hyperlink> list2 = new List <Dialog_InfoCard.Hyperlink>();
             foreach (ThingDef item in DefDatabase <ThingDef> .AllDefsListForReading)
             {
                 CompProperties_MeditationFocus compProperties = item.GetCompProperties <CompProperties_MeditationFocus>();
                 if (compProperties != null && compProperties.focusTypes.Contains(meditationFocusDef))
                 {
                     list2.Add(new Dialog_InfoCard.Hyperlink(item));
                 }
             }
             focusObjectHyperlinksPerTypeCache[meditationFocusDef] = list2;
         }
         List <Dialog_InfoCard.Hyperlink> list = focusObjectHyperlinksPerTypeCache[meditationFocusDef];
         for (int j = 0; j < list.Count; j++)
         {
             yield return(list[j]);
         }
     }
 }
        public static string FocusTypeAvailableExplanation(Pawn pawn)
        {
            string text = "";

            for (int i = 0; i < DefDatabase <MeditationFocusDef> .AllDefsListForReading.Count; i++)
            {
                MeditationFocusDef meditationFocusDef = DefDatabase <MeditationFocusDef> .AllDefsListForReading[i];
                if (!meditationFocusDef.CanPawnUse(pawn))
                {
                    continue;
                }
                text = text + "MeditationFocusCanUse".Translate(meditationFocusDef.label).RawText + ":\n" + meditationFocusDef.EnablingThingsExplanation(pawn) + "\n\n";
                if (!focusObjectsPerTypeCache.ContainsKey(meditationFocusDef))
                {
                    List <string> list = new List <string>();
                    foreach (ThingDef item in DefDatabase <ThingDef> .AllDefsListForReading)
                    {
                        CompProperties_MeditationFocus compProperties = item.GetCompProperties <CompProperties_MeditationFocus>();
                        if (compProperties != null && compProperties.focusTypes.Contains(meditationFocusDef))
                        {
                            list.AddDistinct(item.label);
                        }
                    }
                    focusObjectsPerTypeCache[meditationFocusDef] = list.ToLineList("  - ", capitalizeItems: true);
                }
                text += "MeditationFocusObjects".Translate(meditationFocusDef.label).CapitalizeFirst() + ":\n" + focusObjectsPerTypeCache[meditationFocusDef] + "\n\n";
            }
            return(text);
        }
 public static IEnumerable <MeditationFocusDef> FocusTypesAvailableForPawn(Pawn pawn)
 {
     for (int i = 0; i < DefDatabase <MeditationFocusDef> .AllDefsListForReading.Count; i++)
     {
         MeditationFocusDef meditationFocusDef = DefDatabase <MeditationFocusDef> .AllDefsListForReading[i];
         if (meditationFocusDef.CanPawnUse(pawn))
         {
             yield return(meditationFocusDef);
         }
     }
 }
 public static bool PawnCanUse(Pawn p, MeditationFocusDef type)
 {
     if (!pawnCanUseMeditationTypeCached.ContainsKey(p))
     {
         pawnCanUseMeditationTypeCached[p] = new Dictionary <MeditationFocusDef, bool>();
     }
     if (!pawnCanUseMeditationTypeCached[p].ContainsKey(type))
     {
         pawnCanUseMeditationTypeCached[p][type] = PawnCanUseInt(p, type);
     }
     return(pawnCanUseMeditationTypeCached[p][type]);
 }
 private static bool PawnCanUseInt(Pawn p, MeditationFocusDef type)
 {
     if (p.story != null)
     {
         for (int i = 0; i < p.story.traits.allTraits.Count; i++)
         {
             List <MeditationFocusDef> disallowedMeditationFocusTypes = p.story.traits.allTraits[i].CurrentData.disallowedMeditationFocusTypes;
             if (disallowedMeditationFocusTypes != null && disallowedMeditationFocusTypes.Contains(type))
             {
                 return(false);
             }
         }
         List <string> list  = p.story.adulthood?.spawnCategories;
         List <string> list2 = p.story.childhood?.spawnCategories;
         for (int j = 0; j < type.incompatibleBackstoriesAny.Count; j++)
         {
             BackstoryCategoryAndSlot backstoryCategoryAndSlot = type.incompatibleBackstoriesAny[j];
             List <string>            list3 = ((backstoryCategoryAndSlot.slot == BackstorySlot.Adulthood) ? list : list2);
             if (list3 != null && list3.Contains(backstoryCategoryAndSlot.categoryName))
             {
                 return(false);
             }
         }
     }
     if (type.requiresRoyalTitle)
     {
         if (p.royalty != null)
         {
             return(p.royalty.AllTitlesInEffectForReading.Any((RoyalTitle t) => t.def.allowDignifiedMeditationFocus));
         }
         return(false);
     }
     if (p.story != null)
     {
         for (int k = 0; k < p.story.traits.allTraits.Count; k++)
         {
             List <MeditationFocusDef> allowedMeditationFocusTypes = p.story.traits.allTraits[k].CurrentData.allowedMeditationFocusTypes;
             if (allowedMeditationFocusTypes != null && allowedMeditationFocusTypes.Contains(type))
             {
                 return(true);
             }
         }
         List <string> list4 = p.story.adulthood?.spawnCategories;
         List <string> list5 = p.story.childhood?.spawnCategories;
         for (int l = 0; l < type.requiredBackstoriesAny.Count; l++)
         {
             BackstoryCategoryAndSlot backstoryCategoryAndSlot2 = type.requiredBackstoriesAny[l];
             List <string>            list6 = ((backstoryCategoryAndSlot2.slot == BackstorySlot.Adulthood) ? list4 : list5);
             if (list6 != null && list6.Contains(backstoryCategoryAndSlot2.categoryName))
             {
                 return(true);
             }
         }
     }
     if (type.requiredBackstoriesAny.Count == 0)
     {
         bool flag = false;
         for (int m = 0; m < DefDatabase <TraitDef> .AllDefsListForReading.Count; m++)
         {
             if (flag)
             {
                 break;
             }
             TraitDef traitDef = DefDatabase <TraitDef> .AllDefsListForReading[m];
             for (int n = 0; n < traitDef.degreeDatas.Count; n++)
             {
                 List <MeditationFocusDef> allowedMeditationFocusTypes2 = traitDef.degreeDatas[n].allowedMeditationFocusTypes;
                 if (allowedMeditationFocusTypes2 != null && allowedMeditationFocusTypes2.Contains(type))
                 {
                     flag = true;
                     break;
                 }
             }
         }
         if (!flag)
         {
             return(true);
         }
     }
     return(false);
 }