private static void Postfix(Hero hero) { // Make things looks better in the encyclopedia ISettingsProvider settings = new MASettings(); if (hero == Hero.MainHero) { MAHelper.Print("Post Pregnancy Check: " + hero); MAHelper.Print(" Main Hero Spouse Unassigned"); hero.Spouse = null; } if (Hero.MainHero.ExSpouses.Contains(hero) || hero.Spouse == Hero.MainHero) { if (hero.Spouse is null || hero.Spouse != Hero.MainHero) { MAHelper.Print("Post Pregnancy Check: " + hero); MAHelper.Print(" Spouse is Main Hero"); if (!settings.Polyamory) { // Remove any extra duplicate exspouses MAHelper.RemoveExSpouses(hero, true); } hero.Spouse = Hero.MainHero; } } foreach (Hero exSpouse in hero.ExSpouses.ToList()) { MAHelper.RemoveExSpouses(hero); MAHelper.RemoveExSpouses(exSpouse); } }
private bool conversation_begin_courtship_for_hero_on_condition() { ISettingsProvider settings = new MASettings(); if (Hero.OneToOneConversationHero.Age >= Campaign.Current.Models.AgeModel.HeroComesOfAge) { if (settings.Debug) { MAHelper.Print("MCM: " + MASettings.UsingMCM); MAHelper.Print("Difficulty: " + settings.Difficulty); MAHelper.Print("Orientation: " + settings.SexualOrientation); MAHelper.Print("Cheating: " + settings.Cheating); MAHelper.Print("Polygamy: " + settings.Polygamy); MAHelper.Print("Incest: " + settings.Incest); MAHelper.Print("Romantic Level: " + Romance.GetRomanticLevel(Hero.MainHero, Hero.OneToOneConversationHero).ToString()); } // OnNeNousDitPasTout/GrandesMaree Patch // In Fact we can't go through Romance.RomanceLevelEnum.Untested // because for the next modification, there will be another romance status // And we must have only have one romance status for each relation if (Romance.GetRomanticLevel(Hero.MainHero, Hero.OneToOneConversationHero) == Romance.RomanceLevelEnum.Untested) { Util.Util.CleanRomance(Hero.MainHero, Hero.OneToOneConversationHero); bool areMarried = Util.Util.AreMarried(Hero.MainHero, Hero.OneToOneConversationHero); if (areMarried) { ChangeRomanticStateAction.Apply(Hero.MainHero, Hero.OneToOneConversationHero, Romance.RomanceLevelEnum.Ended); MAHelper.Print("PATCH Married New Romantic Level: " + Romance.GetRomanticLevel(Hero.MainHero, Hero.OneToOneConversationHero).ToString()); } } } return(Hero.OneToOneConversationHero.IsWanderer && Hero.OneToOneConversationHero.IsPlayerCompanion); }
public static bool AreMarried(Hero hero, Hero otherHero) { if (otherHero == null) { return(false); } //if (hero.Spouse == null) NO we can have no spouse and have exSpouses who ares my spouses //{ // MAHelper.Print(String.Format("AreMarried FAIL car {0} n'a aucune épouse", hero.Name)); // return false; //} if (hero.Spouse != null && hero.Spouse == otherHero) { MAHelper.Print(String.Format("AreMarried SUCCESS because {0} marry {1}", hero.Name, otherHero.Name)); return(true); } if (hero.ExSpouses != null && hero.ExSpouses.FirstOrDefault <Hero>(x => x == otherHero) != null) { MAHelper.Print(String.Format("AreMarried SUCCESS because {0} hax {1} in his ex-spouses", hero.Name, otherHero.Name)); return(true); } MAHelper.Print(String.Format("AreMarried FAIL for {0} and {1}", hero.Name, otherHero.Name)); return(false); }
private bool conversation_adopt_child_on_condition() { ISettingsProvider settings = new MASettings(); StringHelpers.SetCharacterProperties("CONVERSATION_CHARACTER", CharacterObject.OneToOneConversationCharacter); _agent = Math.Abs(Campaign.Current.ConversationManager.OneToOneConversationAgent.GetHashCode()); if (_adoptableAgents is null || _notAdoptableAgents is null) { _adoptableAgents = new List <int>(); _notAdoptableAgents = new List <int>(); } if (_notAdoptableAgents.Contains(_agent)) { MAHelper.Print("Cannot Adopt"); return(false); } if (_adoptableAgents.Contains(_agent)) { MAHelper.Print("Can Adopt"); return(true); } if (Campaign.Current.ConversationManager.OneToOneConversationAgent.Age < Campaign.Current.Models.AgeModel.HeroComesOfAge) { MAHelper.Print("Adoption: " + settings.Adoption); if (!settings.Adoption) { return(false); } MAHelper.Print("Adoption Chance: " + settings.AdoptionChance); // You only roll once! float random = MBRandom.RandomFloat; MAHelper.Print("Random Number: " + random); if (random < settings.AdoptionChance) { _adoptableAgents.Add(_agent); return(true); } else { _notAdoptableAgents.Add(_agent); } } return(false); }
// This will either skip or continue romance // CoupleAgreedOnMarriage = triggers marriage before bartering // CourtshipStarted = skip everything // return false = carry out entire romance private bool conversation_finalize_courtship_for_hero_on_condition() { ISettingsProvider settings = new MASettings(); Romance.RomanceLevelEnum romanticLevel = Romance.GetRomanticLevel(Hero.MainHero, Hero.OneToOneConversationHero); bool clanLeader = Hero.MainHero.Clan.Leader == Hero.MainHero && Hero.MainHero.Clan.Lords.Contains(Hero.OneToOneConversationHero); if (settings.Difficulty == "Realistic") { // Skip issues with bartering marriage within clans // If you are the leader of the clan then it is a problem if (clanLeader) { MAHelper.Print("Realistic: Clan Leader"); return(Romance.MarriageCourtshipPossibility(Hero.MainHero, Hero.OneToOneConversationHero) && romanticLevel == Romance.RomanceLevelEnum.CoupleAgreedOnMarriage); } if (Hero.OneToOneConversationHero.IsNoble || Hero.OneToOneConversationHero.IsMinorFactionHero) { MAHelper.Print("Realistic: Noble"); return(false); } return(Romance.MarriageCourtshipPossibility(Hero.MainHero, Hero.OneToOneConversationHero) && romanticLevel == Romance.RomanceLevelEnum.CoupleAgreedOnMarriage); } else { if (clanLeader) { if (settings.Difficulty == "Easy") { MAHelper.Print("Easy: Clan Leader"); return(Romance.MarriageCourtshipPossibility(Hero.MainHero, Hero.OneToOneConversationHero) && romanticLevel == Romance.RomanceLevelEnum.CoupleAgreedOnMarriage); } MAHelper.Print("Very Easy: Clan Leader"); return(Romance.MarriageCourtshipPossibility(Hero.MainHero, Hero.OneToOneConversationHero) && (romanticLevel == Romance.RomanceLevelEnum.CourtshipStarted || romanticLevel == Romance.RomanceLevelEnum.CoupleDecidedThatTheyAreCompatible)); } if (settings.Difficulty == "Easy" && (Hero.OneToOneConversationHero.IsNoble || Hero.OneToOneConversationHero.IsMinorFactionHero)) { MAHelper.Print("Easy: Noble"); return(false); } MAHelper.Print("Very Easy"); return(Romance.MarriageCourtshipPossibility(Hero.MainHero, Hero.OneToOneConversationHero) && (romanticLevel == Romance.RomanceLevelEnum.CourtshipStarted || romanticLevel == Romance.RomanceLevelEnum.CoupleDecidedThatTheyAreCompatible)); } }
public static void CleanRomance(Hero hero, Hero otherHero) { int n = 0; while (true) { RomanticState romance = Romance.RomanticStateList.FirstOrDefault <RomanticState>(x => (x.Person1 == hero && x.Person2 == otherHero) || (x.Person2 == hero && x.Person1 == otherHero)); if (romance != null) { Romance.RomanticStateList.Remove(romance); n++; } else { break; } } MAHelper.Print(String.Format("Nettoyage romances entre {0} et {1} => {2} suppressions", hero.Name, otherHero.Name, n)); }
private void conversation_courtship_success_on_consequence() { ISettingsProvider settings = new MASettings(); Hero hero = Hero.MainHero; Hero spouse = Hero.OneToOneConversationHero; Hero oldSpouse = hero.Spouse; Hero cheatedSpouse = spouse.Spouse; // If you are marrying a kingdom ruler as a kingdom ruler yourself, // the kingdom ruler will have to give up being clan head. // Apparently causes issues if this is not done. if (spouse.IsFactionLeader && !spouse.IsMinorFactionHero) { if (hero.Clan.Kingdom != spouse.Clan.Kingdom) { if (hero.Clan.Kingdom?.Leader != hero) { // Join kingdom due to lowborn status if (hero.Clan.Leader == Hero.MainHero) { ChangeClanLeaderAction.ApplyWithoutSelectedNewLeader(hero.Clan); if (hero.Clan.Leader == Hero.MainHero) { MAHelper.Print("No Heirs"); DestroyClanAction.Apply(hero.Clan); MAHelper.Print("Eliminated Player Clan"); } } foreach (Hero companion in hero.Clan.Companions.ToList()) { bool inParty = false; if (companion.PartyBelongedTo == MobileParty.MainParty) { inParty = true; } RemoveCompanionAction.ApplyByFire(hero.Clan, companion); AddCompanionAction.Apply(spouse.Clan, companion); if (inParty) { AddHeroToPartyAction.Apply(companion, MobileParty.MainParty, true); } } hero.Clan = spouse.Clan; var current = Traverse.Create <Campaign>().Property("Current").GetValue <Campaign>(); Traverse.Create(current).Property("PlayerDefaultFaction").SetValue(spouse.Clan); MAHelper.Print("Lowborn Player Married to Kingdom Ruler"); } else { ChangeClanLeaderAction.ApplyWithoutSelectedNewLeader(spouse.Clan); MAHelper.Print("Kingdom Ruler Stepped Down and Married to Player"); } } } // New nobility MAHelper.OccupationToLord(spouse.CharacterObject); if (!spouse.IsNoble) { spouse.IsNoble = true; MAHelper.Print("Spouse to Noble"); } // Dodge the party crash for characters part 1 bool dodge = false; if (spouse.PartyBelongedTo == MobileParty.MainParty) { AccessTools.Property(typeof(Hero), "PartyBelongedTo").SetValue(spouse, null, null); MAHelper.Print("Spouse Already in Player's Party"); dodge = true; } // Apply marriage ChangeRomanticStateAction.Apply(hero, spouse, Romance.RomanceLevelEnum.Marriage); MAHelper.Print("Marriage Action Applied"); if (oldSpouse is not null) { MAHelper.RemoveExSpouses(oldSpouse); } // Dodge the party crash for characters part 2 if (dodge) { AccessTools.Property(typeof(Hero), "PartyBelongedTo").SetValue(spouse, MobileParty.MainParty, null); } // Activate character if not already activated if (!spouse.HasMet) { spouse.HasMet = true; } if (!spouse.IsActive) { spouse.ChangeState(Hero.CharacterStates.Active); MAHelper.Print("Activated Spouse"); } if (spouse.IsPlayerCompanion) { spouse.CompanionOf = null; MAHelper.Print("Spouse No Longer Companion"); } if (settings.Cheating && cheatedSpouse is not null) { MAHelper.RemoveExSpouses(cheatedSpouse, true); MAHelper.RemoveExSpouses(spouse, true); MAHelper.Print("Spouse Broke Off Past Marriage"); } MAHelper.RemoveExSpouses(hero); MAHelper.RemoveExSpouses(spouse); PlayerEncounter.LeaveEncounter = true; // New fix to stop some kingdom rulers from disappearing if (spouse.PartyBelongedTo != MobileParty.MainParty) { AddHeroToPartyAction.Apply(spouse, MobileParty.MainParty, true); } }
private static void Prefix(Hero hero) { ISettingsProvider settings = new MASettings(); if (hero.IsFemale && hero.IsAlive && hero.Age > Campaign.Current.Models.AgeModel.HeroComesOfAge) { // If you are the MainHero go through advanced process if (hero == Hero.MainHero || hero == Hero.MainHero.Spouse || Hero.MainHero.ExSpouses.Contains(hero)) { if (hero.Spouse is null && (hero.ExSpouses.IsEmpty() || hero.ExSpouses is null)) { MAHelper.Print(" No Spouse"); return; } _spouses = new List <Hero>(); MAHelper.Print("Hero: " + hero); if (hero.Spouse is not null && hero == Hero.MainHero) { _spouses.Add(hero.Spouse); MAHelper.Print("Spouse to Collection: " + hero.Spouse); } if (settings.Polyamory && hero != Hero.MainHero) { MAHelper.Print("Polyamory"); if (hero.Spouse != Hero.MainHero) { _spouses.Add(Hero.MainHero); MAHelper.Print("Main Hero to Collection: " + Hero.MainHero); } if (Hero.MainHero.Spouse is not null && Hero.MainHero.Spouse != hero) { _spouses.Add(Hero.MainHero.Spouse); MAHelper.Print("Main Hero Spouse to Collection: " + Hero.MainHero.Spouse); } foreach (Hero exSpouse in Hero.MainHero.ExSpouses.Distinct().ToList()) { if (exSpouse != hero && exSpouse.IsAlive) { _spouses.Add(exSpouse); MAHelper.Print("Main Hero ExSpouse to Collection: " + exSpouse); } } } else { // Taken out of polyamory mode if (hero.Spouse != Hero.MainHero && hero != Hero.MainHero) { _spouses.Add(Hero.MainHero); MAHelper.Print("Spouse is Main Hero: " + Hero.MainHero); } if (hero == Hero.MainHero) { foreach (Hero exSpouse in hero.ExSpouses.Distinct().ToList()) { if (exSpouse.IsAlive) { _spouses.Add(exSpouse); MAHelper.Print("ExSpouse to Collection: " + exSpouse); } } } } if (_spouses.Count() > 1) { // The shuffle! List <int> attractionGoal = new(); int attraction = 0; foreach (Hero spouse in _spouses) { attraction += Romance.GetAttractionValueAsPercent(hero, spouse); attractionGoal.Add(attraction); MAHelper.Print("Spouse: " + spouse); MAHelper.Print("Attraction: " + attraction); } int attractionRandom = MBRandom.RandomInt(attraction); MAHelper.Print("Random: " + attractionRandom); int i = 0; while (i < _spouses.Count) { if (attractionRandom < attractionGoal[i]) { MAHelper.Print("Index: " + i); break; } i++; } hero.Spouse = _spouses[i]; _spouses[i].Spouse = hero; } else { var spouse = _spouses.FirstOrDefault(); if (spouse is not null) { hero.Spouse = spouse; spouse.Spouse = hero; } } if (hero.Spouse is null) { MAHelper.Print(" No Spouse"); } else { MAHelper.Print(" Spouse Assigned: " + hero.Spouse); } } } // Outside of female pregnancy behavior if (hero.Spouse is not null) { if (hero.IsFemale == hero.Spouse.IsFemale) { // Decided to do this at the end so that you are not always going out with the opposite gender MAHelper.Print(" Spouse Unassigned: " + hero.Spouse); hero.Spouse.Spouse = null; hero.Spouse = null; } } }
public static bool conversation_player_can_open_courtship_on_condition() { ISettingsProvider settings = new MASettings(); if (Hero.OneToOneConversationHero is null) { return(false); } bool flag = Hero.MainHero.IsFemale && settings.SexualOrientation == "Heterosexual" || !Hero.MainHero.IsFemale && settings.SexualOrientation == "Homosexual" || !Hero.OneToOneConversationHero.IsFemale && settings.SexualOrientation == "Bisexual"; Romance.RomanceLevelEnum romanceLevel = Romance.GetRomanticLevel(Hero.MainHero, Hero.OneToOneConversationHero); // better to use a local variable MAHelper.Print("Courtship Possible: " + Romance.MarriageCourtshipPossibility(Hero.MainHero, Hero.OneToOneConversationHero).ToString()); MAHelper.Print("Romantic Level: " + romanceLevel.ToString()); MAHelper.Print("Retry Courtship: " + settings.RetryCourtship.ToString()); if (Romance.MarriageCourtshipPossibility(Hero.MainHero, Hero.OneToOneConversationHero) && romanceLevel == Romance.RomanceLevelEnum.Untested) { if (Hero.OneToOneConversationHero.IsNoble || Hero.OneToOneConversationHero.IsMinorFactionHero) { if (Hero.OneToOneConversationHero.Spouse is null) { MBTextManager.SetTextVariable("FLIRTATION_LINE", flag ? "{=lord_flirt}My lord, I note that you have not yet taken a spouse." : "{=v1hC6Aem}My lady, I wish to profess myself your most ardent admirer.", false); } else { MBTextManager.SetTextVariable("FLIRTATION_LINE", flag ? "{=lord_cheating_flirt}My lord, I note that you might wish for a new spouse." : "{=v1hC6Aem}My lady, I wish to profess myself your most ardent admirer.", false); } } else { MBTextManager.SetTextVariable("FLIRTATION_LINE", flag ? "{=goodman_flirt}Goodman, I note that you have not yet taken a spouse." : "{=goodwife_flirt}Goodwife, I wish to profess myself your most ardent admirer.", false); } return(true); } bool areMarried = Util.Util.AreMarried(Hero.MainHero, Hero.OneToOneConversationHero); if (romanceLevel == Romance.RomanceLevelEnum.FailedInCompatibility || romanceLevel == Romance.RomanceLevelEnum.FailedInPracticalities || (romanceLevel == Romance.RomanceLevelEnum.Ended && settings.RetryCourtship && !areMarried) ) { if (Hero.OneToOneConversationHero.IsNoble || Hero.OneToOneConversationHero.IsMinorFactionHero) { MBTextManager.SetTextVariable("FLIRTATION_LINE", flag ? "{=2WnhUBMM}My lord, may you give me another chance to prove myself?" : "{=4iTaEZKg}My lady, may you give me another chance to prove myself?", false); } else { MBTextManager.SetTextVariable("FLIRTATION_LINE", flag ? "{=goodman_chance}Goodman, may you give me another chance to prove myself?" : "{=goodwife_chance}Goodwife, may you give me another chance to prove myself?", false); } // Retry Courtship feature! if (settings.RetryCourtship) { if (romanceLevel == Romance.RomanceLevelEnum.Ended) { // OnNeNousDitPasTout/GrandesMaree Patch // Patch we must have only have one romance status for each relation Util.Util.CleanRomance(Hero.MainHero, Hero.OneToOneConversationHero); } if (romanceLevel == Romance.RomanceLevelEnum.FailedInCompatibility || romanceLevel == Romance.RomanceLevelEnum.Ended) { ChangeRomanticStateAction.Apply(Hero.MainHero, Hero.OneToOneConversationHero, Romance.RomanceLevelEnum.CourtshipStarted); } else if (romanceLevel == Romance.RomanceLevelEnum.FailedInPracticalities) { ChangeRomanticStateAction.Apply(Hero.MainHero, Hero.OneToOneConversationHero, Romance.RomanceLevelEnum.CoupleDecidedThatTheyAreCompatible); } } return(true); } return(false); }