public static void TaxReliefDailyTick() { float settled = 0f; int goldTaken = 0; foreach (var detailsModel in SettlersCampaignBehavior.Instance._settlersForVillagesData) { detailsModel.Value.SettlementToday = 0; if (detailsModel.Value.TaxReliefTier == -1) { continue; } Settlement settlement = Settlement.FindFirst((args) => args.StringId == detailsModel.Value.SettlementId); if (settlement == null) { Logger.logDebug("Settlement " + detailsModel.Value.SettlementId + " not found"); continue; } var village = settlement.Village; var tax = detailsModel.Value.TaxReliefAmount(); var villagersToAdd = (tax / Random.Next(5, 25)) / Random.Next(1, 10); goldTaken += (int)tax; settled += villagersToAdd; village.Hearth += villagersToAdd; GiveGoldAction.ApplyForCharacterToSettlement(Hero.MainHero, settlement, (int)tax, true); if (!Main.Settings.ProsperityAffection || village.MarketTown == null) { continue; } village.MarketTown.Settlement.Prosperity -= villagersToAdd / 2; Logger.logDebug("Changed prosperity in " + village.MarketTown.Name + " by " + villagersToAdd / 2); } if (goldTaken != 0f || settled != 0f) { Logger.DisplayInfoMsg(Main.Localization.GetTranslation(Localization.SettlersActionTaxMigration, (int)settled, goldTaken)); } }
/// <summary> /// Recalculate influence based on campaign circumstances and save it as "TargetInfluence" /// </summary> /// <param name="firstTimeSetup"></param> /// <returns></returns> int recalculateInfluencers(bool firstTimeSetup) { Settlement settlement = Settlement.Find(settlementId); // foreach nearby settlement, sum up the influence of each culture type List <Settlement> influencingSettlements = new List <Settlement>(); // Geographically close settlements influencingSettlements.AddRange(Settlement.FindSettlementsAroundPosition(settlement.Position2D, DynaCultureSettings.Instance.SettlementInfluenceRange).Where(x => x.IsVillage || x.IsCastle || x.IsTown)); if (DynaCultureSettings.Instance.TradeLinkedInfluence) { // Trade-linked settlements if (settlement.IsCastle || settlement.IsTown) { influencingSettlements.AddRange(settlement.BoundVillages.Select(v => v.Settlement)); } // Parent's Trade-linked settlements if (settlement.IsVillage) { influencingSettlements.AddRange(Settlement.FindFirst(s => s.BoundVillages.Contains(settlement.Village)).BoundVillages.Select(v => v.Settlement)); } } // calculate the influence caused by our neighbors int sum = 0; Dictionary <CultureObject, int> influencers = new Dictionary <CultureObject, int>(); foreach (var otherSettlement in influencingSettlements) { int influence = getInfluenceFromSettlement(otherSettlement, settlement, firstTimeSetup); sum += influence; if (!influencers.ContainsKey(otherSettlement.Culture)) { influencers.Add(otherSettlement.Culture, influence); } else { influencers[otherSettlement.Culture] += influence; } } // calculate the influence caused by our owners int ownerInfluence = BASE_INFLUENCE * DynaCultureSettings.Instance.OwnerInfluenceStrength; sum += ownerInfluence; if (ownerInfluence > 0) { var ownerCulture = DynaCultureUtils.GetOwnerCulture(settlement); if (!influencers.ContainsKey(ownerCulture)) { influencers.Add(ownerCulture, ownerInfluence); } else { influencers[ownerCulture] += ownerInfluence; } } // foreach influencing culture, calculate the percent of total influence bool didTargetsChange = false; foreach (var pair in influencers) { CultureObject culture = pair.Key; decimal percent = (decimal)pair.Value / sum; if (!TargetInfluences.ContainsKey(culture.StringId)) { TargetInfluences.Add(culture.StringId, percent); didTargetsChange = true; } else if (percent != TargetInfluences[culture.StringId]) { TargetInfluences[culture.StringId] = percent; didTargetsChange = true; } } // clear out no longer influencing cultures for (int x = 0; x < TargetInfluences.Count; x++) { if (!influencers.Select(c => c.Key.StringId).Contains(TargetInfluences.ElementAt(x).Key)) { TargetInfluences[TargetInfluences.ElementAt(x).Key] = 0m; } } if (didTargetsChange) { TargetInfluencesIDKey++; } return(sum); }