static void Postfix() { if (MobileParty.MainParty.CurrentSettlement == null && MobileParty.MainParty.LastVisitedSettlement == null) { GrowthDebug.LogInfo("ChangePlayerCharacterAction, two args are null"); MobileParty.MainParty.CurrentSettlement = SettlementHelper.FindNearestSettlement((Func <Settlement, bool>)(sett => sett.IsCastle || sett.IsTown)); } }
private static void SetBanditPartyComponentHideout(Settlement settlement, MobileParty mobileParty) { if (settlement == null) { Settlement settlement1 = SettlementHelper.FindNearestHideout((Settlement x) => x.Culture == mobileParty.MapFaction.Culture && x.Hideout.IsInfested, null) ?? SettlementHelper.FindNearestHideout((Settlement x) => x.Culture == mobileParty.MapFaction.Culture, null); mobileParty.BanditPartyComponent.SetHomeHideout(null); } else { mobileParty.BanditPartyComponent.SetHomeHideout(settlement.Hideout); } }
private static void OnHourlyTickParty(MobileParty mobileParty) { if (mobileParty.IsCaravan || mobileParty.IsVillager) { if (mobileParty.CurrentSettlement != null && mobileParty.CurrentSettlement.IsCastle && !mobileParty.CurrentSettlement.IsUnderSiege && MBRandom.RandomFloat < 0.5f) { Settlement currentSettlement = mobileParty.CurrentSettlement; LeaveSettlementAction.ApplyForParty(mobileParty); mobileParty.SetMoveGoToPoint(currentSettlement.GatePosition); return; } if (mobileParty.DefaultBehavior == AiBehavior.GoToSettlement && mobileParty.ShortTermBehavior != AiBehavior.FleeToPoint && mobileParty.TargetSettlement != null && mobileParty.TargetSettlement.IsUnderSiege && mobileParty.CurrentSettlement == null) { mobileParty.SetMoveGoToPoint(mobileParty.Position2D); return; } } if (mobileParty.IsLordParty || mobileParty.IsCaravan || mobileParty.IsVillager) { if (mobileParty.ShortTermBehavior == AiBehavior.FleeToPoint && mobileParty.ShortTermTargetParty != null) { // find nearest safe settlement Settlement settlementToFlee = SettlementHelper.FindNearestSettlementToMapPoint(mobileParty, s => s.IsFortification && (s.MapFaction == mobileParty.MapFaction || (s.MapFaction.IsKingdomFaction && !s.MapFaction.IsAtWarWith(mobileParty.MapFaction)))); if (settlementToFlee == null || settlementToFlee.IsUnderSiege || settlementToFlee.Party.MapEvent != null) { return; } float dist = mobileParty.Position2D.DistanceSquared(settlementToFlee.GatePosition); if (dist < magnetDistance && dist < mobileParty.ShortTermTargetParty.Position2D.DistanceSquared(settlementToFlee.GatePosition)) { mobileParty.SetMoveGoToSettlement(settlementToFlee); mobileParty.RecalculateShortTermAi(); } } } }
private void AiKeepPatrollingPlayerLands(MobileParty mobileParty, PartyThinkParams thoughts) { Hero companion = mobileParty.LeaderHero; if (mobileParty == MobileParty.MainParty || companion == null || !mobileParty.IsLordParty || companion.Clan != Clan.PlayerClan) { return; } // backward-compatibility if (companion.GetHeroOccupiedEvents().Contains(EvtPatrolLands)) { companion.RemoveEventFromOccupiedHero(EvtPatrolLands); companion.HeroDeveloper.SetPropertyValue(CompanionAiPatrolProperty, 1); } if (mobileParty.Army != null || companion.HeroDeveloper.GetPropertyValue(CompanionAiPatrolProperty) == 0) { return; } Settlement target = SettlementHelper.FindNearestSettlementToMapPoint(mobileParty, s => s.OwnerClan == Clan.PlayerClan && s.Notables.Any(n => n.GetRelationWithPlayer() < 1)); if (target == null) { target = SettlementHelper.FindNearestSettlementToMapPoint(mobileParty, s => s.OwnerClan == Clan.PlayerClan && s.Notables.Any(n => n.GetRelationWithPlayer() < 51)); if (target == null) { target = SettlementHelper.FindNearestSettlementToMapPoint(mobileParty, s => s.OwnerClan == Clan.PlayerClan); if (target == null) { return; } } } AIBehaviorTuple patrol = new AIBehaviorTuple(target, AiBehavior.PatrolAroundPoint, false); float weight = 0; thoughts.AIBehaviorScores.TryGetValue(patrol, out weight); thoughts.AIBehaviorScores[patrol] = weight + 0.6f; }
internal void CECaptorHuntPrisoners(MenuCallbackArgs args, int amount = 20) { CEPersistence.animationPlayEvent = false; TroopRoster releasedPrisoners = TroopRoster.CreateDummyTroopRoster(); if (CESettings.Instance != null) { amount = CESettings.Instance.AmountOfTroopsForHunt; } try { for (int i = 0; i < amount; i++) { TroopRosterElement test = MobileParty.MainParty.PrisonRoster.GetTroopRoster().Where(troop => !troop.Character.IsHero).GetRandomElementInefficiently(); if (test.Character == null) { continue; } MobileParty.MainParty.PrisonRoster.RemoveTroop(test.Character); releasedPrisoners.AddToCounts(test.Character, 1, true); } } catch (Exception) { CECustomHandler.LogToFile("Couldn't find anymore prisoners."); } if (!releasedPrisoners.GetTroopRoster().IsEmpty()) { CECaptorContinue(args); try { Clan clan = Clan.BanditFactions.First(clanLooters => clanLooters.StringId == "looters"); clan.Banner.SetBannerVisual(Banner.CreateRandomBanner().BannerVisual); Settlement nearest = SettlementHelper.FindNearestSettlement(settlement => { return(true); }); MobileParty prisonerParty = BanditPartyComponent.CreateBanditParty("CustomPartyCE_Hunt_" + MBRandom.RandomInt(int.MaxValue), clan, nearest.Hideout, false); PartyTemplateObject defaultPartyTemplate = clan.DefaultPartyTemplate; prisonerParty.InitializeMobileParty(defaultPartyTemplate, MobileParty.MainParty.Position2D, 0.5f, 0.1f, -1); prisonerParty.SetCustomName(new TextObject("{=CEEVENTS1107}Escaped Captives")); prisonerParty.MemberRoster.Clear(); prisonerParty.MemberRoster.Add(releasedPrisoners.ToFlattenedRoster()); prisonerParty.RecentEventsMorale = -100; prisonerParty.IsActive = true; prisonerParty.ActualClan = clan; prisonerParty.Party.Owner = clan.Leader; prisonerParty.Party.Visuals.SetMapIconAsDirty(); prisonerParty.HomeSettlement = nearest; prisonerParty.InitializePartyTrade(0); Hero.MainHero.HitPoints += 40; CECustomHandler.LogToFile(prisonerParty.Leader.Name.ToString()); PlayerEncounter.RestartPlayerEncounter(prisonerParty.Party, MobileParty.MainParty.Party, true); StartBattleAction.Apply(MobileParty.MainParty.Party, prisonerParty.Party); PlayerEncounter.Update(); CEPersistence.huntState = CEPersistence.HuntState.StartHunt; CampaignMission.OpenBattleMission(PlayerEncounter.GetBattleSceneForMapPosition(MobileParty.MainParty.Position2D)); } catch (Exception) { CECaptorKillPrisoners(args, amount); } } else { CECaptorContinue(args); } }
internal void CECaptorPrisonerRebel(MenuCallbackArgs args) { CEPersistence.animationPlayEvent = false; TroopRoster releasedPrisoners = TroopRoster.CreateDummyTroopRoster(); try { foreach (TroopRosterElement element in MobileParty.MainParty.PrisonRoster.GetTroopRoster()) { if (element.Character.IsHero) { element.Character.HeroObject.ChangeState(Hero.CharacterStates.Active); } } releasedPrisoners.Add(MobileParty.MainParty.PrisonRoster.ToFlattenedRoster()); MobileParty.MainParty.PrisonRoster.Clear(); } catch (Exception) { CECustomHandler.LogToFile("Couldn't find anymore prisoners."); } if (!releasedPrisoners.GetTroopRoster().IsEmpty()) { try { TroopRosterElement leader = releasedPrisoners.GetTroopRoster().FirstOrDefault(hasHero => hasHero.Character.IsHero); Clan clan = null; Settlement nearest = null; MobileParty prisonerParty = null; if (leader.Character != null) { clan = leader.Character.HeroObject.Clan; nearest = SettlementHelper.FindNearestSettlement(settlement => settlement.OwnerClan == clan) ?? SettlementHelper.FindNearestSettlement(settlement => true); prisonerParty = LordPartyComponent.CreateLordParty("CustomPartyCE_" + MBRandom.RandomInt(int.MaxValue), leader.Character.HeroObject, MobileParty.MainParty.Position2D, 0.5f, nearest); } else { clan = Clan.BanditFactions.First(clanLooters => clanLooters.StringId == "looters"); clan.Banner.SetBannerVisual(Banner.CreateRandomBanner().BannerVisual); nearest = SettlementHelper.FindNearestSettlement(settlement => true); prisonerParty = BanditPartyComponent.CreateBanditParty("CustomPartyCE_" + MBRandom.RandomInt(int.MaxValue), clan, nearest.Hideout, false); } PartyTemplateObject defaultPartyTemplate = clan.DefaultPartyTemplate; prisonerParty.InitializeMobileParty(defaultPartyTemplate, MobileParty.MainParty.Position2D, 0.5f, 0.1f, -1); prisonerParty.SetCustomName(new TextObject("{=CEEVENTS1107}Escaped Captives")); prisonerParty.MemberRoster.Clear(); prisonerParty.ActualClan = clan; prisonerParty.MemberRoster.Add(releasedPrisoners.ToFlattenedRoster()); prisonerParty.IsActive = true; prisonerParty.HomeSettlement = nearest; prisonerParty.SetMovePatrolAroundPoint(nearest.IsTown ? nearest.GatePosition : nearest.Position2D); if (leader.Character != null) { prisonerParty.Party.Owner = leader.Character.HeroObject; #if BETA prisonerParty.ChangePartyLeader(leader.Character); #else prisonerParty.ChangePartyLeader(leader.Character, true); #endif } else { prisonerParty.Party.Owner = clan.Leader; } prisonerParty.RecentEventsMorale = -100; prisonerParty.Aggressiveness = 0.2f; prisonerParty.InitializePartyTrade(0); Hero.MainHero.HitPoints += 40; CECustomHandler.LogToFile(prisonerParty.Leader.Name.ToString()); PlayerEncounter.RestartPlayerEncounter(MobileParty.MainParty.Party, prisonerParty.Party); GameMenu.SwitchToMenu("encounter"); } catch (Exception) { CECaptorContinue(args); } } else { CECaptorContinue(args); } }
// Captor / Captive Version public void CaptivityImpregnationChance(Hero targetHero, int modifier = 0, bool forcePreg = false, bool lord = true, Hero captorHero = null) { ScoresCalculation scoresCalculation = new ScoresCalculation(); if (targetHero != null && targetHero.IsFemale && !targetHero.IsPregnant && !CECampaignBehavior.CheckIfPregnancyExists(targetHero)) { if (CESettings.Instance != null && IsHeroAgeSuitableForPregnancy(targetHero) && CESettings.Instance.PregnancyToggle) { if (!CESettings.Instance.UsePregnancyModifiers) { modifier = 0; } if (MBRandom.Random.Next(100) >= (CESettings.Instance.AttractivenessSkill ? scoresCalculation.AttractivenessScore(targetHero) / 20 + modifier : CESettings.Instance.PregnancyChance + modifier)) { return; } Hero randomSoldier; if (captorHero != null) { if (!captorHero.IsFemale) { randomSoldier = captorHero; } else { return; } } else if (lord && CECampaignBehavior.ExtraProps.Owner != null) { randomSoldier = CECampaignBehavior.ExtraProps.Owner; } else if (lord && targetHero.PartyBelongedToAsPrisoner != null && targetHero.PartyBelongedToAsPrisoner.IsMobile && targetHero.PartyBelongedToAsPrisoner.MobileParty?.LeaderHero != null && !targetHero.PartyBelongedToAsPrisoner.MobileParty.LeaderHero.IsFemale) { randomSoldier = targetHero.PartyBelongedToAsPrisoner.MobileParty.LeaderHero; } else if (targetHero.PartyBelongedToAsPrisoner != null && targetHero.PartyBelongedToAsPrisoner.IsMobile && targetHero.PartyBelongedToAsPrisoner.MobileParty != null) { IEnumerable <TroopRosterElement> maleMembers = targetHero.PartyBelongedToAsPrisoner.MobileParty.MemberRoster.GetTroopRoster().Where(characterObject => characterObject.Character.IsFemale == false); List <TroopRosterElement> troopRosterElements = maleMembers.ToList(); if (!troopRosterElements.Any()) { return; } CharacterObject m = troopRosterElements.GetRandomElement().Character; randomSoldier = HeroCreator.CreateSpecialHero(m, targetHero.PartyBelongedToAsPrisoner.MobileParty.HomeSettlement, CampaignData.NeutralFaction, CampaignData.NeutralFaction, MBRandom.Random.Next(20) + 20); } else if (targetHero.PartyBelongedToAsPrisoner != null && targetHero.PartyBelongedToAsPrisoner.IsSettlement && targetHero.PartyBelongedToAsPrisoner.Settlement.Party != null && !targetHero.PartyBelongedToAsPrisoner.Settlement.Party.MemberRoster.GetTroopRoster().IsEmpty()) { Settlement playerCaptor = targetHero.PartyBelongedToAsPrisoner.Settlement; IEnumerable <TroopRosterElement> maleMembers = playerCaptor.Party.MemberRoster.GetTroopRoster().Where(characterObject => characterObject.Character.IsFemale == false); List <TroopRosterElement> troopRosterElements = maleMembers.ToList(); if (!troopRosterElements.Any()) { return; } CharacterObject m = troopRosterElements.GetRandomElement().Character; randomSoldier = HeroCreator.CreateSpecialHero(m, playerCaptor, CampaignData.NeutralFaction, CampaignData.NeutralFaction, MBRandom.Random.Next(20) + 20); } else { CharacterObject m = CharacterObject.Templates.Where(characterObject => characterObject.IsFemale == false && characterObject.Occupation == Occupation.Outlaw).GetRandomElementInefficiently(); randomSoldier = HeroCreator.CreateSpecialHero(m, SettlementHelper.FindRandomSettlement(x => x.IsTown && x.Culture == m.Culture), CampaignData.NeutralFaction, CampaignData.NeutralFaction, MBRandom.Random.Next(20) + 20); } TextObject textObject3 = GameTexts.FindText("str_CE_impregnated"); textObject3.SetTextVariable("HERO", targetHero.Name); textObject3.SetTextVariable("SPOUSE", randomSoldier.Name); InformationManager.DisplayMessage(new InformationMessage(textObject3.ToString(), Colors.Magenta)); CEHelper.spouseOne = randomSoldier; CEHelper.spouseTwo = targetHero; MakePregnantAction.Apply(targetHero); CEHelper.spouseOne = CEHelper.spouseTwo = null; //RelationsModifier(randomSoldier, 50, targetHero); } else if (forcePreg) { CharacterObject m = CharacterObject.Templates.Where(characterObject => characterObject.IsFemale == false).GetRandomElementInefficiently(); Hero randomSoldier = HeroCreator.CreateSpecialHero(m, targetHero.BornSettlement, CampaignData.NeutralFaction, CampaignData.NeutralFaction, MBRandom.Random.Next(20) + 20); CEHelper.spouseOne = randomSoldier; CEHelper.spouseTwo = targetHero; MakePregnantAction.Apply(targetHero); CEHelper.spouseOne = CEHelper.spouseTwo = null; TextObject textObject4 = new TextObject("{PLAYER_HERO} forced impregnated by {PLAYER_SPOUSE}."); textObject4.SetTextVariable("PLAYER_HERO", targetHero.Name); textObject4.SetTextVariable("PLAYER_SPOUSE", randomSoldier.Name); InformationManager.DisplayMessage(new InformationMessage(textObject4.ToString(), Colors.Magenta)); } } else if (targetHero != null && !targetHero.IsFemale) { if (CESettings.Instance != null && !CESettings.Instance.PregnancyToggle) { return; } if (CESettings.Instance != null && !CESettings.Instance.UsePregnancyModifiers) { modifier = 0; } if (CESettings.Instance != null && MBRandom.Random.Next(100) >= (CESettings.Instance.AttractivenessSkill ? scoresCalculation.AttractivenessScore(targetHero) / 20 + modifier : CESettings.Instance.PregnancyChance + modifier)) { return; } Hero randomSoldier = null; if (captorHero != null) { randomSoldier = captorHero; if (!(randomSoldier.IsFemale && !randomSoldier.IsPregnant && !CECampaignBehavior.CheckIfPregnancyExists(randomSoldier))) { return; } } else if (lord && targetHero.PartyBelongedToAsPrisoner != null && targetHero.PartyBelongedToAsPrisoner.IsMobile && targetHero.PartyBelongedToAsPrisoner.MobileParty?.LeaderHero != null) { randomSoldier = targetHero.PartyBelongedToAsPrisoner.MobileParty.LeaderHero; if (!(randomSoldier.IsFemale && !randomSoldier.IsPregnant && !CECampaignBehavior.CheckIfPregnancyExists(randomSoldier))) { return; } } else if (targetHero.PartyBelongedToAsPrisoner != null && targetHero.PartyBelongedToAsPrisoner.IsMobile && targetHero.PartyBelongedToAsPrisoner.MobileParty != null) { IEnumerable <TroopRosterElement> femaleMembers = targetHero.PartyBelongedToAsPrisoner.MobileParty.MemberRoster.GetTroopRoster().Where(characterObject => characterObject.Character.IsFemale); List <TroopRosterElement> troopRosterElements = femaleMembers.ToList(); if (!troopRosterElements.Any()) { return; } do { CharacterObject m = troopRosterElements.GetRandomElement().Character; randomSoldier = HeroCreator.CreateSpecialHero(m, targetHero.PartyBelongedToAsPrisoner.MobileParty.HomeSettlement, CampaignData.NeutralFaction, CampaignData.NeutralFaction, MBRandom.Random.Next(15) + 18); } while (!IsHeroAgeSuitableForPregnancy(randomSoldier)); } else if (targetHero.PartyBelongedToAsPrisoner != null && targetHero.PartyBelongedToAsPrisoner.IsSettlement && targetHero.PartyBelongedToAsPrisoner.Settlement.Party != null && !targetHero.PartyBelongedToAsPrisoner.Settlement.Party.MemberRoster.GetTroopRoster().IsEmpty()) { Settlement playerCaptor = targetHero.PartyBelongedToAsPrisoner.Settlement; IEnumerable <TroopRosterElement> femaleMembers = playerCaptor.Party.MemberRoster.GetTroopRoster().Where(characterObject => characterObject.Character.IsFemale); List <TroopRosterElement> troopRosterElements = femaleMembers.ToList(); if (!troopRosterElements.Any()) { return; } do { CharacterObject m = troopRosterElements.GetRandomElement().Character; if (targetHero.PartyBelongedToAsPrisoner.MobileParty != null) { randomSoldier = HeroCreator.CreateSpecialHero(m, targetHero.PartyBelongedToAsPrisoner.MobileParty.HomeSettlement, CampaignData.NeutralFaction, CampaignData.NeutralFaction, MBRandom.Random.Next(15) + 18); } } while (!IsHeroAgeSuitableForPregnancy(randomSoldier)); } else { CharacterObject m = CharacterObject.Templates.Where(characterObject => characterObject.IsFemale && characterObject.IsRegular).GetRandomElementInefficiently(); randomSoldier = HeroCreator.CreateSpecialHero(m, SettlementHelper.FindRandomSettlement(x => x.IsTown && x.Culture == m.Culture), CampaignData.NeutralFaction, CampaignData.NeutralFaction, MBRandom.Random.Next(15) + 18); } TextObject textObject3 = GameTexts.FindText("str_CE_impregnated"); if (randomSoldier != null) { textObject3.SetTextVariable("HERO", randomSoldier.Name); textObject3.SetTextVariable("SPOUSE", targetHero.Name); InformationManager.DisplayMessage(new InformationMessage(textObject3.ToString(), Colors.Magenta)); CEHelper.spouseOne = randomSoldier; } CEHelper.spouseTwo = targetHero; MakePregnantAction.Apply(randomSoldier); CEHelper.spouseOne = CEHelper.spouseTwo = null; //RelationsModifier(randomSoldier, 50, targetHero); } }