Пример #1
0
        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));
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
        /// <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));
        }
Пример #4
0
        /// <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);
        }