public static Tale_DoublePawn GetLatestDoublePawnTale(TaleDef def, Predicate <Tale_DoublePawn> predicate)
        {
            Tale_DoublePawn tale = null;
            int             num  = 0;

            for (int i = 0; i < Find.TaleManager.AllTalesListForReading.Count; i++)
            {
                var latestTale = Find.TaleManager.AllTalesListForReading[i];
                if (latestTale.def == def && latestTale is Tale_DoublePawn tale_doublePawn && predicate(tale_doublePawn) && (tale == null || latestTale.AgeTicks < num))
                {
                    tale = tale_doublePawn;
                    num  = latestTale.AgeTicks;
                }
            }
            return(tale);
        }
Ejemplo n.º 2
0
        public Pawn GetMostRecentKidnapping()
        {
            Tale_DoublePawn currentTale = null;

            foreach (Tale_DoublePawn kidnapping in Find.TaleManager.AllTalesListForReading.Where(t => t.def == TaleDefOf.KidnappedColonist)
                     .Select(t => (Tale_DoublePawn)t)
                     .Where(t => PawnIds.Contains(t.secondPawnData.pawn.ThingID)))
            {
                if (currentTale == null)
                {
                    currentTale = kidnapping;

                    continue;
                }

                if (currentTale.AgeTicks > kidnapping.AgeTicks)
                {
                    currentTale = kidnapping;
                }
            }

            if (currentTale != null)
            {
                return(currentTale.secondPawnData.pawn);
            }

            foreach (Pawn pawn in Find.WorldPawns.AllPawnsAlive)
            {
                if (!PawnIds.Contains(pawn.ThingID))
                {
                    continue;
                }

                return(pawn);
            }

            return(null);
        }
        public override float OpinionOffset()
        {
            if (ThoughtUtility.ThoughtNullified(pawn, def))
            {
                return(0f);
            }
            Predicate <Tale_DoublePawn> validator = delegate(Tale_DoublePawn t)
            {
                return(pawn == t.firstPawnData.pawn && otherPawn == t.secondPawnData.pawn);
            };
            Tale_DoublePawn latestTale = VSIE_Utils.GetLatestDoublePawnTale(def.taleDef, validator);

            if (latestTale != null)
            {
                float num = 1f;
                if (latestTale.def.type == TaleType.Expirable)
                {
                    float value = (float)latestTale.AgeTicks / (latestTale.def.expireDays * 60000f);
                    num = Mathf.InverseLerp(1f, def.lerpOpinionToZeroAfterDurationPct, value);
                }
                return(base.CurStage.baseOpinionOffset * num);
            }
            return(0f);
        }