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); }
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); }