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