Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
        }