public static IEnumerable <TaleNews> GetAllNonForgottenNews(this Pawn_NewsKnowledgeTracker tracker) { if (tracker == null) { return(Enumerable.Empty <TaleNews>()); } // EMBRACE THE POWER OF LINQ; LINQ PROTECTS return(tracker.ListOfAllKnownNews.FindAll((TaleNewsReference reference) => !reference.NewsIsLocallyForgotten).Select((TaleNewsReference reference) => reference.ReferencedTaleNews)); }
/// <summary> /// Selects all news that this pawn remembers. Returns a List[TaleNews]. /// <para /> /// Performance advisory: This should be slightly slower than the TaleNewsReference variant. /// </summary> /// <param name="tracker"></param> /// <returns></returns> public static IEnumerable <TaleNews> GetAllValidNonForgottenNews(this Pawn_NewsKnowledgeTracker tracker) { if (tracker == null) { return(Enumerable.Empty <TaleNews>()); } // EMBRACE THE POWER OF LINQ; LINQ PROTECTS return(GetAllValidNonForgottenNewsReferences(tracker).Select(reference => reference.ReferencedTaleNews)); }
/// <summary> /// Selects all news that this pawn has forgotten. Returns a List[TaleNewsReference]. /// </summary> /// <param name="tracker"></param> /// <returns></returns> public static IEnumerable <TaleNewsReference> GetAllForgottenNewsReferences(this Pawn_NewsKnowledgeTracker tracker) { if (tracker == null) { return(Enumerable.Empty <TaleNewsReference>()); } // EMBRACE THE POWER OF LINQ; LINQ PROTECTS return(tracker.AllNewsReferences_ReadOnlyList.FindAll((TaleNewsReference reference) => reference.NewsIsLocallyForgotten)); }
/// <summary> /// Selects all news of this pawn that this pawn remembers. Returns a List[TaleNewsReference]. /// <para /> /// Performance advisory: This should be slightly faster than the TaleNews variant. /// </summary> /// <param name="tracker"></param> /// <returns></returns> public static IEnumerable <TaleNewsReference> GetAllValidNonForgottenNewsReferences( this Pawn_NewsKnowledgeTracker tracker) { if (tracker == null) { return(Enumerable.Empty <TaleNewsReference>()); } // EMBRACE THE POWER OF LINQ; LINQ PROTECTS return(new List <TaleNewsReference>(tracker.AllValidNewsReferences).FindAll(reference => !reference.NewsIsLocallyForgotten)); }
/// <summary> /// Extension method. Determines and returns the chance of the provided pawn to spread TaleNews. /// <para/> /// Invalid pawns (e.g. animals) will return 0. /// </summary> /// <param name="instance"></param> /// <returns></returns> //public static float GetBaseNewsSpreadChance(this Pawn instance) //{ // return instance.GetStatValue(Desynchronized_StatDefOf.NewsSpreadTendency); //} /// <summary> /// Extension method. This method calculates the cumulative chance /// for news-spreading as if the news-spreading check is done multiple times /// <para/> /// As an analogy, it is as if you rolled n dices, and you are looking for the /// probability that any one of them has a 3 facing up. /// </summary> /// <param name="instance"></param> /// <param name="iterations"></param> /// <returns></returns> //public static float GetActualNewsSpreadChance(this Pawn instance, uint iterations = 1) //{ // /* // * The geometric sequence reduction formula is used to optimize performance when // * given a sufficiently-high iterations parameter. // * And suprisingly, the resulting formula is quite simple. // */ // return 1 - Mathf.Pow(1 - GetBaseNewsSpreadChance(instance), iterations); //} public static Pawn_NewsKnowledgeTracker GetNewsKnowledgeTracker(this Pawn instance) { if (instance == null) { return(null); } List <Pawn_NewsKnowledgeTracker> masterList = DesynchronizedMain.TaleNewsDatabaseSystem.KnowledgeTrackerMasterList; foreach (Pawn_NewsKnowledgeTracker tracker in masterList) { if (tracker.Pawn == instance) { return(tracker); } } Pawn_NewsKnowledgeTracker newTracker = Pawn_NewsKnowledgeTracker.GenerateNewTrackerForPawn(instance); DesynchronizedMain.TaleNewsDatabaseSystem.KnowledgeTrackerMasterList.Add(newTracker); return(newTracker); }