static bool Prefix(ref QuestNode_GetPawn __instance, ref Pawn __result, Slate slate, Faction faction = null) { if (faction == FactionColonies.getPlayerColonyFaction()) { List <PawnKindDef> list = new List <PawnKindDef>(); foreach (ThingDef def in Find.World.GetComponent <FactionFC>().raceFilter.AllowedThingDefs) { list.Add(def.race.AnyPawnKind); } Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(list.RandomElement(), faction, PawnGenerationContext.NonPlayer, -1, true, false, false, false, true, false, 1f, false, true, true, true, false, false, false, false, 0f, null, 1f, null, null, null, null, null, null, null, null, null, null, null)); Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide); if (pawn.royalty != null && pawn.royalty.AllTitlesForReading.Any <RoyalTitle>()) { QuestPart_Hyperlinks questPart_Hyperlinks = new QuestPart_Hyperlinks(); questPart_Hyperlinks.pawns.Add(pawn); QuestGen.quest.AddPart(questPart_Hyperlinks); } __result = pawn; return(false); } else { return(true); } }
private Pawn GeneratePawn(Slate slate, Faction faction = null) { PawnKindDef result = mustBeOfKind.GetValue(slate); if (faction == null && !mustHaveNoFaction.GetValue(slate)) { if (!TryFindFactionForPawnGeneration(slate, out faction)) { Log.Error("QuestNode_GetPawn tried generating pawn but couldn't find a proper faction for new pawn."); } else if (result == null) { result = faction.RandomPawnKind(); } } RoyalTitleDef fixedTitle; if (mustHaveRoyalTitleInCurrentFaction.GetValue(slate)) { if (!seniorityRange.TryGetValue(slate, out FloatRange senRange)) { senRange = FloatRange.Zero; } IEnumerable <RoyalTitleDef> source = DefDatabase <RoyalTitleDef> .AllDefsListForReading.Where((RoyalTitleDef t) => faction.def.RoyalTitlesAllInSeniorityOrderForReading.Contains(t) && (senRange.max <= 0f || senRange.IncludesEpsilon(t.seniority))); if (requireResearchedBedroomFurnitureIfRoyal.GetValue(slate) && source.Any((RoyalTitleDef x) => PlayerHasResearchedBedroomRequirementsFor(x))) { source = source.Where((RoyalTitleDef x) => PlayerHasResearchedBedroomRequirementsFor(x)); } fixedTitle = source.RandomElementByWeight((RoyalTitleDef t) => t.commonality); if (mustBeOfKind.GetValue(slate) == null && !DefDatabase <PawnKindDef> .AllDefsListForReading.Where((PawnKindDef k) => k.titleRequired != null && k.titleRequired == fixedTitle).TryRandomElement(out result)) { DefDatabase <PawnKindDef> .AllDefsListForReading.Where((PawnKindDef k) => k.titleSelectOne != null && k.titleSelectOne.Contains(fixedTitle)).TryRandomElement(out result); } } else { fixedTitle = null; } if (result == null) { result = DefDatabase <PawnKindDef> .AllDefsListForReading.Where((PawnKindDef kind) => kind.race.race.Humanlike).RandomElement(); } Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(result, faction, PawnGenerationContext.NonPlayer, -1, forceGenerateNewPawn: true, newborn: false, allowDead: false, allowDowned: false, canGeneratePawnRelations: true, mustBeCapableOfViolence: false, 1f, forceAddFreeWarmLayerIfNeeded: false, allowGay: true, allowFood: true, allowAddictions: true, inhabitant: false, certainlyBeenInCryptosleep: false, forceRedressWorldPawnIfFormerColonist: false, worldPawnFactionDoesntMatter: false, 0f, null, 1f, null, null, null, null, null, null, null, null, null, null, null, fixedTitle)); Find.WorldPawns.PassToWorld(pawn); if (pawn.royalty != null && pawn.royalty.AllTitlesForReading.Any()) { QuestPart_Hyperlinks questPart_Hyperlinks = new QuestPart_Hyperlinks(); questPart_Hyperlinks.pawns.Add(pawn); QuestGen.quest.AddPart(questPart_Hyperlinks); } return(pawn); }
private Pawn GeneratePawn(Slate slate, Faction faction = null) { PawnKindDef pawnKindDef = this.mustBeOfKind.GetValue(slate); if (faction == null && !this.mustHaveNoFaction.GetValue(slate)) { if (!this.TryFindFactionForPawnGeneration(slate, out faction)) { Log.Error("QuestNode_GetPawn tried generating pawn but couldn't find a proper faction for new pawn.", false); } else if (pawnKindDef == null) { pawnKindDef = faction.RandomPawnKind(); } } RoyalTitleDef fixedTitle; if (this.mustHaveRoyalTitleInCurrentFaction.GetValue(slate)) { FloatRange senRange; if (!this.seniorityRange.TryGetValue(slate, out senRange)) { senRange = FloatRange.Zero; } IEnumerable <RoyalTitleDef> source = from t in DefDatabase <RoyalTitleDef> .AllDefsListForReading where faction.def.RoyalTitlesAllInSeniorityOrderForReading.Contains(t) && (senRange.max <= 0f || senRange.IncludesEpsilon((float)t.seniority)) select t; if (this.requireResearchedBedroomFurnitureIfRoyal.GetValue(slate) && source.Any((RoyalTitleDef x) => this.PlayerHasResearchedBedroomRequirementsFor(x))) { source = from x in source where this.PlayerHasResearchedBedroomRequirementsFor(x) select x; } fixedTitle = source.RandomElementByWeight((RoyalTitleDef t) => t.commonality); if (this.mustBeOfKind.GetValue(slate) == null && !(from k in DefDatabase <PawnKindDef> .AllDefsListForReading where k.titleRequired != null && k.titleRequired == fixedTitle select k).TryRandomElement(out pawnKindDef)) { (from k in DefDatabase <PawnKindDef> .AllDefsListForReading where k.titleSelectOne != null && k.titleSelectOne.Contains(fixedTitle) select k).TryRandomElement(out pawnKindDef); } } else { fixedTitle = null; } if (pawnKindDef == null) { pawnKindDef = (from kind in DefDatabase <PawnKindDef> .AllDefsListForReading where kind.race.race.Humanlike select kind).RandomElement <PawnKindDef>(); } Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(pawnKindDef, faction, PawnGenerationContext.NonPlayer, -1, fixedTitle: fixedTitle)); Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Decide); if (pawn.royalty != null && pawn.royalty.AllTitlesForReading.Any <RoyalTitle>()) { QuestPart_Hyperlinks questPart_Hyperlinks = new QuestPart_Hyperlinks(); questPart_Hyperlinks.pawns.Add(pawn); QuestGen.quest.AddPart(questPart_Hyperlinks); } return(pawn); }