+ Ответить в теме
Показано с 1 по 20 из 120

Тема: Emigration 2

Комбинированный просмотр

  1. #1
    Варвар

    Аватар для Peter

    Steam
    Mk Z

    Регистрация
    15.10.2005
    Адрес
    Россия, Самара
    Сообщений
    2,580
    ваш скрипт конвертирует атеистов в целевом городе во все религии исходного
    этот подход порождает множество проблем
    во-первых он основан на том, что SetPopulation увеличивает число атеистов. Вы уверены в этом?
    беглый взгляд в исходник такого механизма не выявил:
    https://github.com/Gedemon/Civ5-DLL/...DLL/CvCity.cpp

    во-вторых, давление атеизма в произвольно взятом городе может быть любым, от 100 до нескольких тысяч.
    например город размера 10 может иметь от 100 до 1000 очков атеизма.
    поэтому воздействие миграции будет непредсказуемым, от ничтожного до очень сильного, если он скажем 900 очков атеизма конвертнет в какую-то другую религию. или если там было всего 100 атеизма, и чел прибыл из города 10 размера, он обратит только 10 очков. будет лучше если эффект миграции будет легко пресказуемым.

    я предлагаю для простоты выбирать какую-то одну религию из домашнего города и создавать одного последователя в городе назначения. это будет наглядно для игрока.

    напр.
    а) приехал буддист в город размера 9, 900 очков атеизма: обращаем 1/(1+9) в буддизм, в итоге будет 1 буддист и 9 атеистов
    б) приехал буддист в город размера 9, 500 очков атеизма и 1000 индуизма (3 атеиста, 6 индуистов), конвертируем 50 из атеизма в буддизм и 100 из индуизма в буддизм, получаем 450 атеизма, 900 индуизма, 150 буддизма (3 атеиста, 6 индуистов, 1 буддист).
    продвинь это сообщение в соцсеть:  
    EC2 - разработка игры
    Мастерская Steam - мои моды для Civilization V
    Last Citadel - сайт игроков Warlords III

  2. #2
    Вождь краснокожих Аватар для Tomahawk


    Регистрация
    28.10.2015
    Адрес
    Новосибирск
    Сообщений
    243
    Цитата Сообщение от Peter Посмотреть сообщение
    ваш скрипт конвертирует атеистов в целевом городе во все религии исходного
    этот подход порождает множество проблем
    во-первых он основан на том, что SetPopulation увеличивает число атеистов. Вы уверены в этом?
    Я уверен, что написанный код работает правильно. Можете проверить ситуацию с Ingame Editor (v 39), я сам проделал это несколько раз.

    Что известно: 1) религия в городах хранится в процентах, а не очках, потому что после изменения процентного соотношения с помощью ConvertPercentFollowers, меняется и кол-во последователей потом. 2) Кол-во последователей изменяется самой игрой через 1-2 хода после изменения процентов. Я думаю это связано с тем, что во время хода игра пересчитывает показатели во всех городах, она смотрит на проценты и отображает последователей. Миссионеры меняют последователей мгновенно, потому что видимо вызывают эту функция немедленно. Вы упомянули религиозное давление, по нему игра узнаёт сколько процентов в этот ход ей нужно преобразовать за счёт других религий. Больше давления - быстрее обращение произойдёт. Предположу, что "очки" участвуют в этом процессе.

    По вашей ссылке по исходнику в функции void CvCity::setPopulation(int iNewValue, bool bReassignPop /* = true */) нет упоминания религии вообще. Значит она меняется где-то в другом месте, правильно? Приехавший житель в этот ход пока ещё атеист. Пересчёт произойдёт позже.
    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось Tomahawk; 05.03.2016 в 18:24.

    Tomahawk's Collection for Civilization V - сборник модификаций. Качественный перевод и совместимость между собой.
    R.E.D. World War II - масштабный сценарий Второй мировой войны.
    Война Судного дня - сценарий войны на Ближнем Востоке, произошедшей в 1973 году.

  3. #3
    Варвар

    Аватар для Peter

    Steam
    Mk Z

    Регистрация
    15.10.2005
    Адрес
    Россия, Самара
    Сообщений
    2,580
    Цитата Сообщение от Tomahawk Посмотреть сообщение
    Я уверен, что написанный код работает правильно. Можете проверить ситуацию с Ingame Editor (v 39), я сам проделал это несколько раз.

    Что известно: 1) религия в городах хранится в процентах, а не очках, потому что после изменения процентного соотношения с помощью ConvertPercentFollowers, меняется и кол-во последователей потом. 2) Кол-во последователей изменяется самой игрой через 1-2 хода после изменения процентов. Я думаю это связано с тем, что во время хода игра пересчитывает показатели во всех городах, она смотрит на проценты и отображает последователей. Миссионеры меняют последователей мгновенно, потому что видимо вызывают эту функция немедленно. Вы упомянули религиозное давление, по нему игра узнаёт сколько процентов в этот ход ей нужно преобразовать за счёт других религий. Больше давления - быстрее обращение произойдёт. Предположу, что "очки" участвуют в этом процессе.

    По вашей ссылке по исходнику в функции void CvCity::setPopulation(int iNewValue, bool bReassignPop /* = true */) нет упоминания религии вообще. Значит она меняется где-то в другом месте, правильно? Приехавший житель в этот ход пока ещё атеист. Пересчёт произойдёт позже.
    вы наверное смоделировали не все ситуации
    почитайте как в игре рассчитываются верующие: http://civgames.com/4435
    Как видно из исходника функция SetPopulation не добавляет очков ни одной религии.
    Изменение числа последователей происходит только из-за нового размера города, новый чел причисляется одной из представленных религий на основе существующего соотношения очков.

    ps вообще этот исходник какой-то подозрительный, сейчас скачаю со стима посмотрю в подлиннике так сказать..
    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось Peter; 05.03.2016 в 18:47.
    EC2 - разработка игры
    Мастерская Steam - мои моды для Civilization V
    Last Citadel - сайт игроков Warlords III

  4. #4
    Вождь краснокожих Аватар для Tomahawk


    Регистрация
    28.10.2015
    Адрес
    Новосибирск
    Сообщений
    243
    Давайте определимся как в итоге делать будем, а дальше я реализую, иначе мы долго спорить будем.

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

    Tomahawk's Collection for Civilization V - сборник модификаций. Качественный перевод и совместимость между собой.
    R.E.D. World War II - масштабный сценарий Второй мировой войны.
    Война Судного дня - сценарий войны на Ближнем Востоке, произошедшей в 1973 году.

  5. #5
    Варвар

    Аватар для Peter

    Steam
    Mk Z

    Регистрация
    15.10.2005
    Адрес
    Россия, Самара
    Сообщений
    2,580
    Цитата Сообщение от 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 подождите, давайте разберемся с пантеоном...
    продвинь это сообщение в соцсеть:  
    EC2 - разработка игры
    Мастерская Steam - мои моды для Civilization V
    Last Citadel - сайт игроков Warlords III

  6. #6
    Вождь краснокожих Аватар для Tomahawk


    Регистрация
    28.10.2015
    Адрес
    Новосибирск
    Сообщений
    243
    Шанс могу сделать равным, если мы рассматриваем 3 религии, значит у каждой вероятность будет треть для переезда. Пойдёт? По коду так даже проще.
    Пантеон это как бы язычники, будет интересно их перемещать. Всё равно это максимум для античности, а потом их другие религии задавят. Насчёт ошибки протестируем.
    продвинь это сообщение в соцсеть:  

    Tomahawk's Collection for Civilization V - сборник модификаций. Качественный перевод и совместимость между собой.
    R.E.D. World War II - масштабный сценарий Второй мировой войны.
    Война Судного дня - сценарий войны на Ближнем Востоке, произошедшей в 1973 году.

  7. #7
    Варвар

    Аватар для Peter

    Steam
    Mk Z

    Регистрация
    15.10.2005
    Адрес
    Россия, Самара
    Сообщений
    2,580
    Цитата Сообщение от Tomahawk Посмотреть сообщение
    Шанс могу сделать равным, если мы рассматриваем 3 религии, значит у каждой вероятность будет треть для переезда. Пойдёт? По коду так даже проще.
    Пантеон это как бы язычники, будет интересно их перемещать. Всё равно это максимум для античности, а потом их другие религии задавят. Насчёт ошибки протестируем.
    да, хорошо.

    инфа по работе религиозных функций и пантеона:

    ConvertPercentFollowers
    берет очки eFromReligion, умножает на iPercent/100
    получается iPressureConverting
    это значение вычитается из очков eFromReligion
    и затем делается вызов AddReligiousPressure(eToReligion, iPressureConverting)

    AddReligiousPressure
    в цикле проходим религии
    нашли нужную религию - добавляем ей очки
    нашли пантеон - убавляем ему очки, если eReligion > 0 - не атеизм и не пантеон
    если нужной религии в городе нет, добавляем - здесь может возникнуть ошибка с пантеоном

    в общем, когда распространяются религии, они съедают очки пантеона.
    и сам пантеон нельзя так просто распространять между разными цивами, т.к. целевая цива может не иметь пантеон - тут будет глюк, вероятно крэш.

    в связи с этим может быть два решения -
    1) или вообще не распространять пантеон, т.е. исключать его из списка возможных религий мигранта
    2) или если мигранту достался пантеон смотреть создала ли целевая цива пантеон.
    если создала - распространяем пантеон.
    если нет - распространяем атеизм.

    я так понял вам больше нравится второй вариант, и мне тоже.
    емнип функция определения наличия пантеона должна быть у объекта Player
    (в городе пантеона может не быть, но это не важно - главное чтобы у Player он был)
    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось Peter; 05.03.2016 в 20:46.
    EC2 - разработка игры
    Мастерская Steam - мои моды для Civilization V
    Last Citadel - сайт игроков Warlords III

+ Ответить в теме

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
Рейтинг@Mail.ru

free counters