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