Продолжаю углубляться в особенности исполнения функций. Специально прогонял через эти программки обычную версию, без модов. Так как играл без автоплея, то результат сильно отличался. Но вот проблемные функции по прежнему на месте. Тот же LayerAnimationPaths был замечен не раз, к тому же ещё вчера нашел в теме мода Planetfall случай когда она вообще приводила к вылету докапываясь до настроек карты. Что интересно на ихфанатиках вообще почти не заметил упоминания этой функции, походу либо они и не знают, что она странная, либо эти программки что-то не так показывают. Но судя по упоминанию в теме Planetfall и тому что обе программы показывают примерно одни и те же результаты, похоже где-то здесь и вправду подвох, найти бы ещё где.
Я пока нашел три основные функции где точно виден подвох. Это за исключением уже побежденной LayerAnimationPaths , CvPlayerAI::AI_getGreeting и многократно упоминаемая CvPlayerAI::AI_maxGoldPerTurnTrade. Есть ещё около десятка других, но они не так заметны. CvPlayerAI::AI_getGreeting к примеру не только многократно вызывает сама себя, но и CvPlot::isLake зачем вообще функции выбирающей тип приветствия при диалоге с AI знать является ли тайл озером?

Есть у меня пока гипотеза, что возникает это из-за какого-то бага в питон-составляющей, что присылает всякую ересь в фунции.
Вот эта функция, уже упрощенная правда когда я комментирую все кроме последней строки, она пропадает из списков. Есть подозрение, что передаваемый PlayerTypes ePlayer идет как непойми что.
Скрытый текст
Код:
DiploCommentTypes CvPlayerAI::AI_getGreeting(PlayerTypes ePlayer) const
{
	TeamTypes eWorstEnemy;

	if (GET_PLAYER(ePlayer).getTeam() != getTeam())
	{
		eWorstEnemy = GET_TEAM(getTeam()).AI_getWorstEnemy();

		if ((eWorstEnemy != NO_TEAM) && (eWorstEnemy != GET_PLAYER(ePlayer).getTeam()) && GET_TEAM(GET_PLAYER(ePlayer).getTeam()).isHasMet(eWorstEnemy) && (GC.getASyncRand().get(4) == 0))
		{
			if (GET_PLAYER(ePlayer).AI_hasTradedWithTeam(eWorstEnemy) && !atWar(GET_PLAYER(ePlayer).getTeam(), eWorstEnemy))
			{
				return (DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_WORST_ENEMY_TRADING");
			}
			else
			{
				return (DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_WORST_ENEMY");
			}
		}
		else if ((getNumNukeUnits() > 0) && (GC.getASyncRand().get(4) == 0))
		{
			return (DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_NUKES");
		}
		else if ((GET_PLAYER(ePlayer).getPower() < getPower()) && AI_getAttitude(ePlayer) < ATTITUDE_PLEASED && (GC.getASyncRand().get(4) == 0))
		{
			return (DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_UNIT_BRAG");
		}
	}

	return (DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_GREETINGS");
}