Exemplo n.º 1
0
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants);
            string label = part.conditionCauser.TryGetComp <CompCauseGameCondition_PsychicSuppression>().gender.GetLabel();

            outExtraDescriptionRules.Add(new Rule_String("affectedGender", label));
        }
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            // Duplicate code so modularize in Util
            Util.SitePartWorker_Base_Notify_GeneratedByQuestGen(part, outExtraDescriptionRules, outExtraDescriptionConstants);

            // Replaces PrisonerWillingToJoinQuestUtility.GeneratePrisoner
            Pawn pawn = GameComponent.GetRandomAllyForSpawning();

            pawn.guest.SetGuestStatus(part.site.Faction, true);
            Util.DressPawnIfCold(pawn, part.site.Tile);

            part.things = new ThingOwner <Pawn>(part, true, LookMode.Deep);
            part.things.TryAdd(pawn, true);
            string text;

            PawnRelationUtility.Notify_PawnsSeenByPlayer(Gen.YieldSingle <Pawn>(pawn), out text, true, false);
            outExtraDescriptionRules.AddRange(GrammarUtility.RulesForPawn("prisoner", pawn, outExtraDescriptionConstants, true, true));
            string output;

            if (!text.NullOrEmpty())
            {
                output = "\n\n" + "PawnHasTheseRelationshipsWithColonists".Translate(pawn.LabelShort, pawn) + "\n\n" + text;
            }
            else
            {
                output = "";
            }
            outExtraDescriptionRules.Add(new Rule_String("prisonerFullRelationInfo", output));
        }
Exemplo n.º 3
0
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants);
            string output = part.conditionCauser.TryGetComp <CompCauseGameCondition_TemperatureOffset>().temperatureOffset.ToStringTemperatureOffset();

            outExtraDescriptionRules.Add(new Rule_String("temperatureOffset", output));
        }
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants);
            string threatsInfo_NewTmp = GetThreatsInfo_NewTmp(part.parms, part.site.Faction);

            outExtraDescriptionRules.Add(new Rule_String("threatsInfo", threatsInfo_NewTmp));
        }
        public override void GenerateFresh(string seed)
        {
            var worldobjects = DefDatabase<WorldObjectDef>.AllDefsListForReading.FindAll(wo => wo.HasModExtension<SpawnAtWorldGen>());
            foreach (var worldObject in worldobjects)
            {
                SpawnAtWorldGen ext = worldObject.GetModExtension<SpawnAtWorldGen>();
                for (int i = 0; i < ext.spawnCount; i++)
                {
                    Site wo = (Site)WorldObjectMaker.MakeWorldObject(worldObject);
                    // Set faction
                    if (ext.spawnPartOfFaction != null)
                        wo.SetFaction(Find.FactionManager.FirstFactionOfDef(ext.spawnPartOfFaction));
                    // Find tile
                    wo.Tile = RandomTileFor(wo, ext, 500);
                    // Parts
                    SitePartParams parms = new SitePartParams
                    {
                        points = 500f
                    };

                    foreach (var part in ext.parts)
                    {
                        SitePart sitePart = new SitePart(wo, part, parms);
                        wo.AddPart(sitePart);
                    }

                    Find.WorldObjects.Add(wo);
                }
            }
        }
Exemplo n.º 6
0
        public static void OnPostDestroyReschedule(SitePart sitePart)
        {
            // If recruited, will have been flagged on map generate: schedule will fire on DoRecruit
            // If abandoned but pawn alive, also will have been flagged on map generate: schedule will fire on PassToWorld

            // If quest failed without entering the map, flag here: schedule will fire on PassToWorld
            if (GameComponent.NextEventTick == -1)
            {
                GameComponent.FlagNextEventReadyForScheduling();
            }

            if (sitePart.things != null && sitePart.things.Any)
            {
                Pawn pawn = (Pawn)sitePart.things[0];
                // If pawn is dead on post destroy: schedule it HERE!
                if (pawn.Dead)
                {
                    GameComponent.TryScheduleNextEvent();
                }
            }
            // No "thing" in SitePart, pawn is recruited, or something else happened.
            // As mentioned above, if recruited, schedule will already have fired on DoRecruit.
            // If not recruited for whatever reason (likely dead, according to tests): schedule it HERE!
            else if (GameComponent.NextEventTick == 0)
            {
                GameComponent.TryScheduleNextEvent();
            }
        }
        public static bool ItemStashHas(ThingDef thingDef)
        {
            List <Site> sites = Find.WorldObjects.Sites;

            for (int i = 0; i < sites.Count; i++)
            {
                Site site = sites[i];
                for (int j = 0; j < site.parts.Count; j++)
                {
                    SitePart sitePart = site.parts[j];
                    if (sitePart.things == null)
                    {
                        continue;
                    }
                    for (int k = 0; k < sitePart.things.Count; k++)
                    {
                        if (sitePart.things[k].def == thingDef)
                        {
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
Exemplo n.º 8
0
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants);
            WeatherDef weather = part.conditionCauser.TryGetComp <CompCauseGameCondition_ForceWeather>().weather;

            outExtraDescriptionRules.AddRange(GrammarUtility.RulesForDef("weather", weather));
        }
Exemplo n.º 9
0
 public override void SitePartWorkerTick(SitePart sitePart)
 {
     if (!sitePart.conditionCauser.DestroyedOrNull() && !sitePart.conditionCauser.Spawned)
     {
         sitePart.conditionCauser.Tick();
     }
 }
Exemplo n.º 10
0
        private void GetLetterText(Pawn prisoner, Site site, SitePart sitePart, int days, out string letter, out string label)
        {
            letter = this.def.letterText.Formatted(site.Faction.Name, prisoner.ageTracker.AgeBiologicalYears, prisoner.story.Title, SitePartUtility.GetDescriptionDialogue(site, sitePart), prisoner.Named("PAWN")).AdjustedFor(prisoner, "PAWN").CapitalizeFirst();
            if (PawnUtility.EverBeenColonistOrTameAnimal(prisoner))
            {
                letter = letter + "\n\n" + "PawnWasFormerlyColonist".Translate(prisoner.LabelShort, prisoner);
            }
            string text;

            PawnRelationUtility.Notify_PawnsSeenByPlayer(Gen.YieldSingle <Pawn>(prisoner), out text, true, false);
            label = this.def.letterLabel;
            if (!text.NullOrEmpty())
            {
                string text2 = letter;
                letter = string.Concat(new string[]
                {
                    text2,
                    "\n\n",
                    "PawnHasTheseRelationshipsWithColonists".Translate(prisoner.LabelShort, prisoner),
                    "\n\n",
                    text
                });
                label = label + " " + "RelationshipAppendedLetterSuffix".Translate();
            }
            letter = letter + "\n\n" + "PrisonerRescueTimeout".Translate(days, prisoner.LabelShort, prisoner.Named("PRISONER"));
        }
Exemplo n.º 11
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Caravan caravan = parms.target as Caravan;
            bool    result;

            if (caravan == null)
            {
                result = false;
            }
            else
            {
                int  tile;
                Site site = (Site)WorldObjectMaker.MakeWorldObject(SiteDefOfReconAndDiscovery.RD_Adventure);
                TileFinder.TryFindPassableTileWithTraversalDistance(caravan.Tile, 1, 2, out tile, (int t) => !Find.WorldObjects.AnyMapParentAt(t), false);
                site.Tile = tile;
                Faction faction = Find.FactionManager.RandomEnemyFaction(true, false, true, TechLevel.Spacer);
                site.SetFaction(faction);

                site.AddPart(new SitePart(site, SiteDefOfReconAndDiscovery.RD_AbandonedColony, SiteDefOfReconAndDiscovery.RD_AbandonedColony.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction)));

                SitePart holoDisk = new SitePart(site, SiteDefOfReconAndDiscovery.RD_HoloDisk, SiteDefOfReconAndDiscovery.RD_HoloDisk.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction));
                holoDisk.hidden = true;
                site.parts.Add(holoDisk);
                if (Rand.Value < 0.3f)
                {
                    SitePart scatteredManhunters = new SitePart(site, SiteDefOfReconAndDiscovery.RD_ScatteredManhunters, SiteDefOfReconAndDiscovery.RD_ScatteredManhunters.Worker.GenerateDefaultParams
                                                                    (StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction));
                    scatteredManhunters.hidden = true;
                    site.parts.Add(scatteredManhunters);
                }
                if (Rand.Value < 0.1f)
                {
                    SitePart mechanoidForces = new SitePart(site, SiteDefOfReconAndDiscovery.RD_MechanoidForces, SiteDefOfReconAndDiscovery.RD_MechanoidForces.Worker.GenerateDefaultParams
                                                                (StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction));
                    mechanoidForces.hidden = true;
                    site.parts.Add(mechanoidForces);
                }
                if (Rand.Value < 0.05f)
                {
                    SitePart stargate = new SitePart(site, SiteDefOfReconAndDiscovery.RD_Stargate, SiteDefOfReconAndDiscovery.RD_Stargate.Worker.GenerateDefaultParams
                                                         (StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction));

                    stargate.hidden = true;

                    site.parts.Add(stargate);
                }
                Find.WorldObjects.Add(site);
                if (site == null)
                {
                    result = false;
                }
                else
                {
                    base.SendStandardLetter(parms, caravan);
                    result = true;
                }
            }
            return(result);
        }
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants);
            int mechanoidsCount = GetMechanoidsCount(part.site, part.parms);

            outExtraDescriptionRules.Add(new Rule_String("count", mechanoidsCount.ToString()));
            outExtraDescriptionConstants.Add("count", mechanoidsCount.ToString());
        }
Exemplo n.º 13
0
 public override string GetPostProcessedThreatLabel(Site site, SitePart siteCoreOrPart)
 {
     return(string.Concat(base.GetPostProcessedThreatLabel(site, siteCoreOrPart),
                          " (",
                          GenLabel.BestKindLabel(siteCoreOrPart.parms.animalKind, Gender.None, true),
                          ")"
                          ));
 }
 public static string GetDescriptionDialogue(Site site, SitePart sitePart)
 {
     if (sitePart != null && !sitePart.def.alwaysHidden)
     {
         return(sitePart.def.Worker.GetPostProcessedDescriptionDialogue(site, sitePart));
     }
     return("HiddenOrNoSitePartDescription".Translate());
 }
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants);
            var asker = slate.Get <Pawn>("asker");
            var site  = part.ParentHolder as Site;

            site.SetFaction(asker.Faction);
        }
Exemplo n.º 16
0
        public override void Init(Site site, SitePart sitePart)
        {
            sitePart.conditionCauser = ThingMaker.MakeThing(sitePart.def.conditionCauserDef);
            CompCauseGameCondition compCauseGameCondition = sitePart.conditionCauser.TryGetComp <CompCauseGameCondition>();

            compCauseGameCondition.RandomizeSettings();
            compCauseGameCondition.LinkWithSite(sitePart.site);
        }
 public override string GetPostProcessedThreatLabel(Site site, SitePart sitePart)
 {
     if (site.MainSitePartDef == SitePartDefOf.PreciousLump)
     {
         return(null);
     }
     return(base.GetPostProcessedThreatLabel(site, sitePart));
 }
Exemplo n.º 18
0
 public override void Notify_SiteMapAboutToBeRemoved(SitePart sitePart)
 {
     base.Notify_SiteMapAboutToBeRemoved(sitePart);
     if (!sitePart.conditionCauser.DestroyedOrNull() && sitePart.conditionCauser.Spawned && sitePart.conditionCauser.Map == sitePart.site.Map)
     {
         sitePart.conditionCauser.DeSpawn();
         sitePart.conditionCauserWasSpawned = false;
     }
 }
        public static string GetDescriptionDialogue(Site site, SitePart sitePart)
        {
            if (sitePart != null && !sitePart.def.defaultHidden)
            {
                return(sitePart.def.description);
            }

            return("HiddenOrNoSitePartDescription".Translate());
        }
Exemplo n.º 20
0
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants);
            int   enemiesCount = GetEnemiesCount(part.site, part.parms);
            float num          = QuestTuning.PointsToRaidSourceRaidsMTBDaysCurve.Evaluate(part.parms.threatPoints);

            outExtraDescriptionRules.Add(new Rule_String("enemiesCount", enemiesCount.ToString()));
            outExtraDescriptionRules.Add(new Rule_String("mtbDays", ((int)(num * 60000f)).ToStringTicksToPeriod(allowSeconds: true, shortForm: false, canUseDecimals: false)));
        }
        public override string GetPostProcessedThreatLabel(Site site, SitePart sitePart)
        {
            string text = base.GetPostProcessedThreatLabel(site, sitePart);

            if (site.HasWorldObjectTimeout)
            {
                text += " (" + "DurationLeft".Translate(site.WorldObjectTimeoutTicksLeft.ToStringTicksToPeriod(true, false, true, true)) + ")";
            }
            return(text);
        }
Exemplo n.º 22
0
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants);
            int    animalsCount = GetAnimalsCount(part.parms);
            string output       = GenLabel.BestKindLabel(part.parms.animalKind, Gender.None, plural: true, animalsCount);

            outExtraDescriptionRules.Add(new Rule_String("count", animalsCount.ToString()));
            outExtraDescriptionRules.Add(new Rule_String("kindLabel", output));
            outExtraDescriptionConstants.Add("count", animalsCount.ToString());
        }
Exemplo n.º 23
0
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants);
            Faction faction = Find.FactionManager.AllFactionsListForReading.Find(f => !f.defeated && !f.IsPlayer && f.RelationKindWith(Faction.OfPlayer) == FactionRelationKind.Hostile && f.def.defName.Contains("VFEV_Vikings"));

            if (faction == null)
            {
                faction = Find.FactionManager.RandomEnemyFaction(false, false, true, TechLevel.Neolithic);
            }
            part.site.SetFaction(faction);
        }
        public override void Notify_GeneratedByQuestGen(SitePart part, Slate slate, List <Rule> outExtraDescriptionRules, Dictionary <string, string> outExtraDescriptionConstants)
        {
            base.Notify_GeneratedByQuestGen(part, slate, outExtraDescriptionRules, outExtraDescriptionConstants);
            ThingDef thingDef = slate.Get <ThingDef>("itemStashSingleThing", null, false);
            IEnumerable <ThingDef> enumerable = slate.Get <IEnumerable <ThingDef> >("itemStashThings", null, false);
            List <Thing>           list       = this.GenThingList();

            part.things = new ThingOwner <Thing>(part, false, LookMode.Deep);
            part.things.TryAddRangeOrTransfer(list, false, false);
            outExtraDescriptionRules.Add(new Rule_String("itemStashContents", GenLabel.ThingsLabel(list, "  - ")));
            outExtraDescriptionRules.Add(new Rule_String("itemStashContentsValue", GenThing.GetMarketValue(list).ToStringMoney(null)));
        }
        private void StartRaid(Map map, SitePart sitePart)
        {
            IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map);

            incidentParms.forced  = true;
            incidentParms.points *= 0.6f;
            if (IncidentDefOf.RaidEnemy.Worker.CanFireNow(incidentParms))
            {
                IncidentDefOf.RaidEnemy.Worker.TryExecute(incidentParms);
                sitePart.lastRaidTick = Find.TickManager.TicksGame;
            }
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            bool    result;
            Faction faction;

            if ((from wo in Find.WorldObjects.AllWorldObjects
                 where wo.def == SiteDefOfReconAndDiscovery.RD_AdventurePeaceTalks
                 select wo).Count <WorldObject>() > 0)
            {
                result = false;
            }
            else if (!this.TryFindFaction(out faction, (Faction f) => f != Faction.OfPlayer && f.PlayerGoodwill < 0f && f.def.CanEverBeNonHostile && f.def.humanlikeFaction))
            {
                result = false;
            }
            else
            {
                int tile;
                if (TileFinder.TryFindNewSiteTile(out tile))
                {
                    Site site = (Site)WorldObjectMaker.MakeWorldObject(SiteDefOfReconAndDiscovery.RD_AdventurePeaceTalks);
                    site.Tile = tile;
                    site.SetFaction(faction);
                    site.AddPart(new SitePart(site, SiteDefOfReconAndDiscovery.RD_PeaceTalks,
                                              SiteDefOfReconAndDiscovery.RD_PeaceTalks.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction)));

                    SitePart peaceTalksFaction = new SitePart(site, SiteDefOfReconAndDiscovery.RD_PeaceTalksFaction, SiteDefOfReconAndDiscovery.RD_PeaceTalksFaction.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction));
                    peaceTalksFaction.hidden = true;
                    site.parts.Add(peaceTalksFaction);
                    site.GetComponent <QuestComp_PeaceTalks>().StartQuest(faction);
                    int num = 5;
                    site.GetComponent <TimeoutComp>().StartTimeout(num * 60000);
                    base.SendStandardLetter(parms, site, new NamedArgument[]
                    {
                        faction.leader.Label,
                        faction.Name,
                        num.ToString()
                    });
                    Find.WorldObjects.Add(site);
                    result = true;
                }
                else
                {
                    result = false;
                }
            }
            return(result);
        }
Exemplo n.º 27
0
        protected override void ScatterAt(IntVec3 loc, Map map, GenStepParams parms, int count = 1)
        {
            Faction  faction  = (map.ParentFaction != null && map.ParentFaction != Faction.OfPlayer) ? map.ParentFaction : Find.FactionManager.RandomEnemyFaction();
            CellRect rect     = CellRect.CenteredOn(loc, 10, 10).ClipInsideMap(map);
            SitePart sitePart = currentParams.sitePart;

            sitePart.conditionCauserWasSpawned = true;
            ResolveParams resolveParams = default(ResolveParams);

            resolveParams.rect            = rect;
            resolveParams.faction         = faction;
            resolveParams.conditionCauser = sitePart.conditionCauser;
            RimWorld.BaseGen.BaseGen.globalSettings.map = map;
            RimWorld.BaseGen.BaseGen.symbolStack.Push("conditionCauserRoom", resolveParams);
            RimWorld.BaseGen.BaseGen.Generate();
        }
        public override void SitePartWorkerTick(SitePart sitePart)
        {
            base.SitePartWorkerTick(sitePart);
            if (sitePart.lastRaidTick != -1 && !((float)Find.TickManager.TicksGame > (float)sitePart.lastRaidTick + 90000f))
            {
                return;
            }
            List <Map> maps = Find.Maps;

            for (int i = 0; i < maps.Count; i++)
            {
                if (maps[i].IsPlayerHome && sitePart.site.IsHashIntervalTick(2500) && Rand.MTBEventOccurs(QuestTuning.PointsToRaidSourceRaidsMTBDaysCurve.Evaluate(sitePart.parms.threatPoints), 60000f, 2500f))
                {
                    StartRaid(maps[i], sitePart);
                }
            }
        }
Exemplo n.º 29
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            bool    result;
            Faction faction;

            if ((from wo in Find.WorldObjects.AllWorldObjects
                 where wo.def == SiteDefOfReconAndDiscovery.RD_AdventurePeaceTalks
                 select wo).Count <WorldObject>() > 0)
            {
                result = false;
            }
            else if (!this.TryFindFaction(out faction, (Faction f) => f != Faction.OfPlayer && f.PlayerGoodwill >= 0))
            {
                result = false;
            }
            else
            {
                int tile;
                if (TileFinder.TryFindNewSiteTile(out tile))
                {
                    Site site = (Site)WorldObjectMaker.MakeWorldObject(WorldObjectDefOf.Site);
                    site.Tile = tile;
                    site.SetFaction(faction);
                    site.AddPart(new SitePart(site, SiteDefOfReconAndDiscovery.RD_Festival,
                                              SiteDefOfReconAndDiscovery.RD_Festival.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction)));

                    // TODO: check if this works correctly
                    SitePart outpost = new SitePart(site, SitePartDefOf.Outpost, SitePartDefOf.Outpost.Worker.GenerateDefaultParams(StorytellerUtility.DefaultSiteThreatPointsNow(), tile, faction));
                    outpost.hidden = true;
                    site.parts.Add(outpost);
                    int num = 8;
                    site.GetComponent <TimeoutComp>().StartTimeout(num * 60000);
                    base.SendStandardLetter(parms, site, new NamedArgument[]
                    {
                        faction.Name
                    });
                    Find.WorldObjects.Add(site);
                    result = true;
                }
                else
                {
                    result = false;
                }
            }
            return(result);
        }
 private void GetLetterText(Pawn prisoner, Site site, SitePart sitePart, int days, out string letter, out string label)
 {
     letter = def.letterText.Formatted(site.Faction.Name, prisoner.ageTracker.AgeBiologicalYears, prisoner.story.Title, SitePartUtility.GetDescriptionDialogue(site, sitePart), prisoner.Named("PAWN")).AdjustedFor(prisoner).CapitalizeFirst();
     if (PawnUtility.EverBeenColonistOrTameAnimal(prisoner))
     {
         letter = letter + "\n\n" + "PawnWasFormerlyColonist".Translate(prisoner.LabelShort, prisoner);
     }
     PawnRelationUtility.Notify_PawnsSeenByPlayer(Gen.YieldSingle(prisoner), out string pawnRelationsInfo, informEvenIfSeenBefore: true, writeSeenPawnsNames: false);
     label = def.letterLabel;
     if (!pawnRelationsInfo.NullOrEmpty())
     {
         string text = letter;
         letter = text + "\n\n" + "PawnHasTheseRelationshipsWithColonists".Translate(prisoner.LabelShort, prisoner) + "\n\n" + pawnRelationsInfo;
         label  = label + " " + "RelationshipAppendedLetterSuffix".Translate();
     }
     letter = letter + "\n\n" + "PrisonerRescueTimeout".Translate(days, prisoner.LabelShort, prisoner.Named("PRISONER"));
 }