Exemple #1
0
            static bool Prefix(Pawn_RoyaltyTracker __instance, Pawn ___pawn, ref bool __result)
            {
                if (!LoadedModManager.GetMod <RoyaltyTweaksMod>().GetSettings <RoyaltyTweaksSettings>().throneRoomTweaks || ___pawn.ownership.AssignedThrone != null)
                {
                    return(true);
                }

                __result = ___pawn.IsFreeColonist && __instance.allowRoomRequirements && !___pawn.IsQuestLodger();
                int  highestSeniority = 0;
                bool throneAssigned   = false;

                if (__result)
                {
                    if (__instance != null && __instance.MostSeniorTitle != null && __instance.MostSeniorTitle.def != null)
                    {
                        List <Map> maps = Find.Maps;
                        for (int i = 0; i < maps.Count; i++)
                        {
                            if (maps[i].IsPlayerHome)
                            {
                                foreach (Pawn pawn in maps[i].mapPawns.FreeColonistsSpawned)
                                {
                                    if (pawn != ___pawn && pawn.royalty != null && pawn.royalty.MostSeniorTitle != null && pawn.royalty.MostSeniorTitle.def != null)
                                    {
                                        if (pawn.royalty.MostSeniorTitle.def.seniority > highestSeniority)
                                        {
                                            highestSeniority = pawn.royalty.MostSeniorTitle.def.seniority;
                                            if (pawn.ownership.AssignedThrone != null)
                                            {
                                                throneAssigned = true;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if (__instance.MostSeniorTitle.def.seniority < highestSeniority)
                        {
                            Pawn spouse = null;
                            if (LoadedModManager.GetMod <RoyaltyTweaksMod>().GetSettings <RoyaltyTweaksSettings>().spouseWantsThroneroom)
                            {
                                spouse = ___pawn.GetSpouse();
                            }
                            if (spouse == null || spouse.royalty == null || spouse.royalty.MostSeniorTitle == null || spouse.royalty.MostSeniorTitle.def.seniority < highestSeniority)
                            {
                                __result = false;
                            }
                        }
                        if (__instance.MostSeniorTitle.def.seniority == highestSeniority && throneAssigned)
                        {
                            __result = false;
                        }
                    }
                }
                return(false);
            }
Exemple #2
0
 private static void OnPreTitleChanged(Pawn_RoyaltyTracker __instance, Faction faction, RoyalTitleDef currentTitle, RoyalTitleDef newTitle, bool sendLetter = true)
 {
     __instance.AssignHeirIfNone(newTitle, faction);
     if (currentTitle != null)
     {
         for (int i = 0; i < currentTitle.grantedAbilities.Count; i++)
         {
             __instance.pawn.abilities.RemoveAbility(currentTitle.grantedAbilities[i]);
         }
     }
 }
            static bool Prefix(Pawn_RoyaltyTracker __instance, Pawn ___pawn, ref bool __result)
            {
                if (!LoadedModManager.GetMod <RoyaltyTweaksMod>().GetSettings <RoyaltyTweaksSettings>().throneRoomTweaks || ___pawn.ownership.AssignedThrone != null)
                {
                    return(true);
                }

                __result = ___pawn.IsFreeColonist && __instance.allowRoomRequirements && !___pawn.IsQuestLodger() && (___pawn.MapHeld?.IsPlayerHome ?? false);

                int  highestSeniority = 0;
                bool throneAssigned   = false;

                if (__result)
                {
                    if (__instance != null && __instance.MostSeniorTitle != null && __instance.MostSeniorTitle.def != null)
                    {
                        foreach (Pawn pawn in PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive_FreeColonists)
                        {
                            if (pawn != ___pawn && pawn.royalty != null && pawn.royalty.MostSeniorTitle != null && pawn.royalty.MostSeniorTitle.def != null)
                            {
                                if (pawn.royalty.MostSeniorTitle.def.seniority > highestSeniority)
                                {
                                    highestSeniority = pawn.royalty.MostSeniorTitle.def.seniority;
                                    if (pawn.ownership.AssignedThrone != null)
                                    {
                                        throneAssigned = true;
                                    }
                                }
                            }
                        }

                        if (__instance.MostSeniorTitle.def.seniority < highestSeniority)
                        {
                            Pawn spouse = null;
                            if (LoadedModManager.GetMod <RoyaltyTweaksMod>().GetSettings <RoyaltyTweaksSettings>().spouseWantsThroneroom)
                            {
                                spouse = ___pawn.GetSpouse();
                            }
                            if (spouse == null || spouse.royalty == null || spouse.royalty.MostSeniorTitle == null || spouse.royalty.MostSeniorTitle.def.seniority < highestSeniority)
                            {
                                __result = false;
                            }
                        }
                        if (__instance.MostSeniorTitle.def.seniority == highestSeniority && throneAssigned)
                        {
                            __result = false;
                        }
                    }
                }
                return(false);
            }
Exemple #4
0
        /// <summary>
        ///     Transfers the favor of all factions from pawn1 to pawn2
        /// </summary>
        /// <param name="pawn1">The pawn1.</param>
        /// <param name="pawn2">The pawn2.</param>
        /// <exception cref="System.ArgumentNullException">
        ///     pawn1
        ///     or
        ///     pawn2
        /// </exception>
        public static void TransferFavor([NotNull] Pawn pawn1, [NotNull] Pawn pawn2)
        {
            if (pawn1 == null)
            {
                throw new ArgumentNullException(nameof(pawn1));
            }
            if (pawn2 == null)
            {
                throw new ArgumentNullException(nameof(pawn2));
            }
            Pawn_RoyaltyTracker rTracker1 = pawn1.royalty;
            Pawn_RoyaltyTracker rTracker2 = pawn2.royalty;

            if (rTracker1 == null)
            {
                return;
            }
            if (rTracker2 == null)
            {
                Log.Error($"trying to transfer titles from {pawn1.Name}/{pawn1.thingIDNumber} to {pawn2.Name}/{pawn2.thingIDNumber} but {pawn2.Name} does not have a royalty tracker!");
                return;
            }

            _facScratchList.Clear();
            _facScratchList.AddRange(rTracker1.AllTitlesForReading.MakeSafe()
                                     .Select(f => f.faction)
                                     .Distinct());          //make a copy so we can remove safely while transferring


            foreach (Faction faction in _facScratchList)
            {
                int favor  = rTracker1.GetFavor(faction);
                int favor2 = rTracker2.GetFavor(faction);
                if (favor2 >= favor)
                {
                    continue;                                  //don't transfer if pawn2 already has a title equal or greater to this
                }
                if (!rTracker1.TryRemoveFavor(faction, favor)) //try to reduce to zero
                {
                    Log.Error($"could not reduce favor of faction {faction.Name}/{faction.def.defName} for {pawn1.Name} to 0");
                    continue;
                }

                //now add the favor to pawn2
                rTracker2.SetFavor_NewTemp(faction, favor);
            }
        }
Exemple #5
0
        public static bool Prefix(Pawn_RoyaltyTracker __instance, Faction faction, RoyalTitleDef currentTitle, RoyalTitleDef newTitle, bool sendLetter)
        {
            Pawn        pawn          = __instance.pawn;
            List <Pawn> startingPawns = Find.GameInitData.startingAndOptionalPawns;

            if (startingPawns.NullOrEmpty())
            {
                //    Log.Message("startingPawns.NullOrEmpty()");
                return(true);
            }
            if (pawn.Faction == Faction.OfPlayer)
            {
                if (startingPawns.Contains(pawn))
                {
                    OnPreTitleChanged(__instance, faction, currentTitle, newTitle, false);
                    return(false);
                }
            }
            return(true);
        }
        //Pawn_RoyaltyTracker
        public static bool Vamp_KeepTitlesWhileDead(Pawn_RoyaltyTracker __instance)
        {
            var pawn = (Pawn)AccessTools.Field(typeof(Pawn_RoyaltyTracker), "pawn").GetValue(__instance);

            if (pawn.IsVampire() && keepTitles)
            {
                //If no royalty exists, why bother?
                if (pawn?.royalty?.AllTitlesForReading?.FirstOrDefault() == null)
                {
                    return(true);
                }

                var dict = Find.World.GetComponent <WorldComponent_VampireTracker>().tempVampireTitles;
                if (dict.ContainsKey(pawn))
                {
                    dict.Remove(pawn);
                }
                dict.Add(pawn, new List <RoyalTitle>(pawn.royalty.AllTitlesForReading));
                return(false);
            }
            return(true);
        }
        //Pawn_RoyaltyTracker
        public static bool Vamp_RestoreTitlesWhenResurrected(Pawn_RoyaltyTracker __instance)
        {
            var pawn = (Pawn)AccessTools.Field(typeof(Pawn_RoyaltyTracker), "pawn").GetValue(__instance);

            if (pawn.IsVampire())
            {
                var dict = Find.World.GetComponent <WorldComponent_VampireTracker>().tempVampireTitles;
                if (!dict.ContainsKey(pawn))
                {
                    return(true);
                }

                var titleList = dict[pawn];
                foreach (var item in titleList)
                {
                    pawn.royalty.SetTitle(item.faction, item.def, false, false, false);
                }
                dict.Remove(pawn);
                return(false);
            }
            return(true);
        }
Exemple #8
0
        public static DiaNode FactionDialogFor(Pawn negotiator, Faction faction)
        {
            MethodBase RequestRoyalHeirChangeOption = AccessTools.Method(typeof(FactionDialogMaker), "RequestRoyalHeirChangeOption", null, null);
            MethodBase RoyalHeirChangeConfirm       = AccessTools.Method(typeof(FactionDialogMaker), "RoyalHeirChangeConfirm", null, null);
            MethodBase RoyalHeirChangeCandidates    = AccessTools.Method(typeof(FactionDialogMaker), "RoyalHeirChangeCandidates", null, null);
            MethodBase RequestAICoreQuest           = AccessTools.Method(typeof(FactionDialogMaker), "RequestAICoreQuest", null, null);
            MethodBase DebugOptions = AccessTools.Method(typeof(FactionDialogMaker), "DebugOptions", null, null);

            DisplayClass dc0 = default(DisplayClass);
            Map          map = negotiator.Map;
            Pawn         pawn;
            string       value;

            if (faction.leader != null)
            {
                pawn  = faction.leader;
                value = faction.leader.Name.ToStringFull.Colorize(ColoredText.NameColor);
            }
            else
            {
                pawn  = dc0.negotiator;
                value = faction.Name;
            }
            if (faction.PlayerRelationKind == FactionRelationKind.Hostile)
            {
                string key = (faction.def.permanentEnemy || !"FactionGreetingHostileAppreciative".CanTranslate()) ? "FactionGreetingHostile" : "FactionGreetingHostileAppreciative";
                dc0.root = new DiaNode(key.Translate(value).AdjustedFor(pawn));
            }
            else if (faction.PlayerRelationKind == FactionRelationKind.Neutral)
            {
                dc0.root = new DiaNode("FactionGreetingWary".Translate(value, dc0.negotiator.LabelShort, dc0.negotiator.Named("NEGOTIATOR"), pawn.Named("LEADER")).AdjustedFor(pawn));
            }
            else
            {
                dc0.root = new DiaNode("FactionGreetingWarm".Translate(value, dc0.negotiator.LabelShort, dc0.negotiator.Named("NEGOTIATOR"), pawn.Named("LEADER")).AdjustedFor(pawn));
            }
            if (map != null && map.IsPlayerHome)
            {
                AddAndDecorateOption(RequestTraderOption(map, faction, dc0.negotiator), true, ref dc0);
                AddAndDecorateOption(RequestMilitaryAid_Scouts_Option(map, faction, dc0.negotiator), true, ref dc0);
                AddAndDecorateOption(RequestMilitaryAid_Warband_Option(map, faction, dc0.negotiator), true, ref dc0);
                Pawn_RoyaltyTracker royalty = dc0.negotiator.royalty;
                if (royalty != null && royalty.HasAnyTitleIn(faction))
                {
                    foreach (RoyalTitle item in royalty.AllTitlesInEffectForReading)
                    {
                        if (item.def.permits != null)
                        {
                            foreach (RoyalTitlePermitDef permit in item.def.permits)
                            {
                                IEnumerable <DiaOption> factionCommDialogOptions = permit.Worker.GetFactionCommDialogOptions(map, dc0.negotiator, faction);
                                if (factionCommDialogOptions != null)
                                {
                                    foreach (DiaOption item2 in factionCommDialogOptions)
                                    {
                                        AddAndDecorateOption(item2, true, ref dc0);
                                    }
                                }
                            }
                        }
                    }
                    if (royalty.GetCurrentTitle(faction).canBeInherited&& !dc0.negotiator.IsQuestLodger())
                    {
                        AddAndDecorateOption((DiaOption)RequestRoyalHeirChangeOption.Invoke((object)typeof(FactionDialogMaker), new object[]
                                                                                            { map, faction, pawn, dc0.negotiator }), true, ref dc0);
                    }
                }
                if (DefDatabase <ResearchProjectDef> .AllDefsListForReading.Any(delegate(ResearchProjectDef rp)
                {
                    if (rp.HasTag(ResearchProjectTagDefOf.ShipRelated))
                    {
                        return(rp.IsFinished);
                    }
                    return(false);
                }))
                {
                    AddAndDecorateOption((DiaOption)RequestAICoreQuest.Invoke((object)typeof(FactionDialogMaker), new object[]
                                                                              { map, faction, dc0.negotiator }), true, ref dc0);
                }
            }
            if (Prefs.DevMode)
            {
                foreach (DiaOption item3 in (IEnumerable <DiaOption>)DebugOptions.Invoke((object)typeof(FactionDialogMaker), new object[]
                                                                                         { faction, dc0.negotiator }))
                {
                    AddAndDecorateOption(item3, false, ref dc0);
                }
            }
            AddAndDecorateOption(new DiaOption("(" + "Disconnect".Translate() + ")")
            {
                resolveTree = true
            }, false, ref dc0);
            return(dc0.root);
        }