Цитата Сообщение от Tomahawk Посмотреть сообщение
Давайте определимся как в итоге делать будем, а дальше я реализую, иначе мы долго спорить будем.

Вы хотите, чтобы мигрант был полностью представителем одной из религий (1 последователь уезжает). Тогда если в городе с 10 жителями 7 православных, 2 мусульманина и 1 атеист, то шанс того, что в новый город приедет 1 православный - 70%, 1 мусульманин - 20%, и 1 атеист - 10%. Так делаем?
я бы сделал равные шансы для всех религий. мне кажется это и правдоподобно (т.к. эмигрируют обычно меньшинства) и интересно - так слабые религии получат дополнительную возможность распространиться. т.е. генерируем случайное число от 1 до #Religions и берем эту религию.

дальше в целевом городе перебираем все религии и делаем ConvertPercentFollowers (1/newCitySize)*100 для каждой

обратите внимание на пантеон, мне кажется может возникнуть ошибка, если целевая цивилизация не сгенерировала пантеон. т.е. мигрант не должен переносить пантеон.

ConvertPercentFollowers в dll:
Скрытый текст
Код:
/// Convert some percentage of followers from one religion to another
void CvCityReligions::ConvertPercentFollowers(ReligionTypes eToReligion, ReligionTypes eFromReligion, int iPercent)
{
	int iPressureConverting = 0;

	// Find old religion
	ReligionInCityList::iterator it;
	for(it = m_ReligionStatus.begin(); it != m_ReligionStatus.end(); it++)
	{
		if(it->m_eReligion == eFromReligion)
		{
			iPressureConverting = it->m_iPressure * iPercent / 100;
			it->m_iPressure -= iPressureConverting;
			if (it->m_iPressure < 0)
			{
				it->m_iPressure = 0;
			}
		}
	}
	AddReligiousPressure(FOLLOWER_CHANGE_SCRIPTED_CONVERSION, eToReligion, iPressureConverting, NO_PLAYER);
}

/// Add pressure to recruit followers to a religion
void CvCityReligions::AddReligiousPressure(CvReligiousFollowChangeReason eReason, ReligionTypes eReligion, int iPressure, PlayerTypes eResponsiblePlayer)
{
	bool bFoundIt = false;

	ReligionTypes eOldMajorityReligion = GetReligiousMajority();

	ReligionInCityList::iterator it;
	for(it = m_ReligionStatus.begin(); it != m_ReligionStatus.end(); it++)
	{
		if(it->m_eReligion == eReligion)
		{
			it->m_iPressure += iPressure;
			bFoundIt = true;
		}

		//  If this is pressure from a real religion, reduce presence of pantheon by the same amount
		else if(eReligion > RELIGION_PANTHEON && it->m_eReligion == RELIGION_PANTHEON)
		{
			it->m_iPressure = max(0, (it->m_iPressure - iPressure));
		}

		else if (it->m_eReligion > RELIGION_PANTHEON && eReason == FOLLOWER_CHANGE_MISSIONARY)
		{
			const CvReligion *pReligion = GC.getGame().GetGameReligions()->GetReligion(eReligion, NO_PLAYER);
			int iPressureErosion = pReligion->m_Beliefs.GetOtherReligionPressureErosion();  // Normally 0
			if (iPressureErosion > 0)
			{
				int iErosionAmount = iPressureErosion * iPressure / 100;
				it->m_iPressure = max(0, (it->m_iPressure - iErosionAmount));
			}
		}
	}

	// Didn't find it, add new entry
	if(!bFoundIt)
	{
		CvReligionInCity newReligion(eReligion, false, 0, iPressure);
		m_ReligionStatus.push_back(newReligion);
	}

	RecomputeFollowers(eReason, eOldMajorityReligion, eResponsiblePlayer);
}


ps подождите, давайте разберемся с пантеоном...