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

Тема: Emigration 2

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

  1. #1
    Вождь краснокожих Аватар для 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 году.

  2. #2
    Варвар

    Аватар для 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

  3. #3
    Вождь краснокожих Аватар для 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 году.

  4. #4
    Варвар

    Аватар для 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

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


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

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

  6. #6
    Варвар

    Аватар для 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

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


    Регистрация
    28.10.2015
    Адрес
    Новосибирск
    Сообщений
    243
    Задумка ведь какая была, взяли из города 1 последователя и переместили в другой город, не меняя таким образом баланс последователей на карте. А единственная доступная нам функция для внешнего вмешательства ConvertPercentFollowers изменяет в конечном счёте очки, на основе которых потом пересчитываются последователи. Тогда получается такая плохая ситуация: в городе было 3 индуиста (75%) и 1 синтоист (25%), уезжает один индуист, остаётся 2 индуиста (66%) и 1 синтоист (33%), новые проценты мы добросовестно пересчитаем, чтобы игроки видели: осталось сколько нужно последователей. Но мы будем вмешиваться в изменение баланса в родном городе, изменять очки в нём, перебрасывая их с одной религии на другую. Когда родной город вырастет до 15 (считаем, что внешнего давления не идёт), мы увидим 10 индуистов и 5 синтоистов, хотя без изменения процентов последователей бы было где-то 12 и 3.

    Теперь другая проблема про разное кол-во очков в 2 городах, напрямую мы передавать без DLL их не сможем. В родном городе было например 100 очков буддизма, но он их увезти не сможет, будет только метка "буддист". Приехал мигрант в город с 15 населением, тогда 1 житель от 15 = 6,25%, на столько мы должны увеличить буддизм в городе, но если общее кол-во очков всех религий в нём 12000, то мы увеличим буддизм в городе на 750 очков (6% от 12К), обмен неравноценный получается. Правильно понимаю? Тогда из мигранта выйдет тихий миссионер, а это нам не нужно... тут дело не в коде уже, а в самом принципе.
    продвинь это сообщение в соцсеть:  
    Последний раз редактировалось Tomahawk; 06.03.2016 в 07:42.

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

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

Ваши права

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

free counters