<div class='quotetop'>Цитата(NeverMind * 17.1.2006, 1:50) [snapback]73407[/snapback]</div>Гы, а я видел както, что Монтецума построил пирамиды и включил сразу же police state =))ПАРАМЕТРЫ AI
<iWonderConstructionRand>: Isak - дополнительный 1dX рандомайзер вероятности начала строительства Чуда (я думаю, что это все таки процентная (?) вероятность начала строительства Чуда, прямая зависимость, а не обратная)
- [0, 10, 20, 30, 40, 50] 0 - Montezuma, 50 - Louis XIV
[/b]
Надо думать, а не думается что то. Давайте вместе посмотрим и объясним. Вот полная функция отказа AI от торговли технологиями, т.е. когда они выделены красным в дипломатии. В т.ч и "монопольный" отказ.
[codebox]DenialTypes CvTeamAI::AI_techTrade(TechTypes eTech, TeamTypes eTeam) const
{
PROFILE_FUNC();
AttitudeTypes eAttitude;
int iNoTechTradeThreshold;
int iTechTradeKnownPercent;
int iKnownCount;
int iPossibleKnownCount;
int iI, iJ;
FAssertMsg(eTeam != getID(), "shouldn't call this function on ourselves");
if (isHuman())
{
return NO_DENIAL;
}
/*
if (isVassal(eTeam))
{
return NO_DENIAL;
}
*/
if (isAtWar(eTeam))
{
return NO_DENIAL;
}
if (AI_getWorstEnemy() == eTeam)
{
return DENIAL_WORST_ENEMY;
}
eAttitude = AI_getAttitude(eTeam);
for (iI = 0; iI < MAX_PLAYERS; iI++)
{
if (GET_PLAYER((PlayerTypes)iI).isAlive())
{
if (GET_PLAYER((PlayerTypes)iI).getTeam() == getID())
{
if (eAttitude <= GC.getLeaderHeadInfo(GET_PLAYER((PlayerTypes)iI).getPersonalityType()).getTechRefuseAttitudeThreshold())
{
return DENIAL_ATTITUDE;
}
}
}
}
if (eAttitude < ATTITUDE_FRIENDLY)
{
if ((GC.getGameINLINE().getTeamRank(getID()) < (GC.getGameINLINE().countCivTeamsEverAlive() / 2)) ||
(GC.getGameINLINE().getTeamRank(eTeam) < (GC.getGameINLINE().countCivTeamsEverAlive() / 2)))
{
iNoTechTradeThreshold = AI_noTechTradeThreshold();
iNoTechTradeThreshold *= max(0, (GC.getHandicapInfo(GET_TEAM(eTeam).getHandicapType()).getNoTechTradeModifier() + 100));
iNoTechTradeThreshold /= 100;
if (AI_getMemoryCount(eTeam, MEMORY_RECEIVED_TECH_FROM_ANY) > iNoTechTradeThreshold)
{
return DENIAL_TECH_WHORE;
}
}
iKnownCount = 0;
iPossibleKnownCount = 0;
for (iI = 0; iI < MAX_CIV_TEAMS; iI++)
{
if (GET_TEAM((TeamTypes)iI).isAlive())
{
if ((iI != getID()) && (iI != eTeam))
{
if (isHasMet((TeamTypes)iI))
{
if (GET_TEAM((TeamTypes)iI).isHasTech(eTech))
{
iKnownCount++;
}
iPossibleKnownCount++;
}
}
}
}
iTechTradeKnownPercent = AI_techTradeKnownPercent();
iTechTradeKnownPercent *= max(0, (GC.getHandicapInfo(GET_TEAM(eTeam).getHandicapType()).getTechTradeKnownModifier() + 100));
iTechTradeKnownPercent /= 100;
if ((iPossibleKnownCount > 0) ? (((iKnownCount * 100) / iPossibleKnownCount) < iTechTradeKnownPercent) : (iTechTradeKnownPercent > 0))
{
return DENIAL_TECH_MONOPOLY;
}
}
for (iI = 0; iI < GC.getNumUnitInfos(); iI++)
{
if (isTechRequiredForUnit(eTech, ((UnitTypes)iI)))
{
if (isWorldUnitClass((UnitClassTypes)(GC.getUnitInfo((UnitTypes)iI).getUnitClassType())))
{
if (getUnitClassMaking((UnitClassTypes)(GC.getUnitInfo((UnitTypes)iI).getUnitClassType())) > 0)
{
return DENIAL_MYSTERY;
}
}
}
}
for (iI = 0; iI < GC.getNumBuildingInfos(); iI++)
{
if (isTechRequiredForBuilding(eTech, ((BuildingTypes)iI)))
{
if (isWorldWonderClass((BuildingClassTypes)(GC.getBuildingInfo((BuildingTypes)iI).getBuildingClassType())))
{
if (getBuildingClassMaking((BuildingClassTypes)(GC.getBuildingInfo((BuildingTypes)iI).getBuildingClassType())) > 0)
{
return DENIAL_MYSTERY;
}
}
}
}
for (iI = 0; iI < GC.getNumProjectInfos(); iI++)
{
if (GC.getProjectInfo((ProjectTypes)iI).getTechPrereq() == eTech)
{
if (isWorldProject((ProjectTypes)iI))
{
if (getProjectMaking((ProjectTypes)iI) > 0)
{
return DENIAL_MYSTERY;
}
}
for (iJ = 0; iJ < GC.getNumVictoryInfos(); iJ++)
{
if (GC.getGameINLINE().isVictoryValid((VictoryTypes)iJ))
{
if (GC.getProjectInfo((ProjectTypes)iI).getVictoryThreshold((VictoryTypes)iJ))
{
return DENIAL_VICTORY;
}
}
}
}
}
return NO_DENIAL;
}[/codebox]
А это - как AI считает процент.
[code]int CvTeamAI::AI_techTradeKnownPercent() const
{
Какие приколисты, мило так называют строки отказа от торговли...
Из релевантного в первом боксе (про вообще желание торговать, без привязки к монополии):
- если отношение меньше либо равно, чем TechRefuseAttitudeThreshold в LeaderHeadInfo, то отказать с формулировкой DENIAL_ATTITUDE ("We just don't like you that much" - вроде такая строка текста)
- из остальных - если отношения хуже "Friendly" и оба в топ-половине по очкам среди всех когда либо живших - (?), то порог торговли = noTechTradeThreshold данного ИИ*(NoTechTradeModifier/100 + 1) - что-то про нежелание давать техи на халяву, по-моему; не отказ ли из-за высокого уровня развития? Не суть важно, впрочем
Теперь самое релевантное, выделенное жирным - про монополию:
- Если отношения хуже "Friendly" и оба в верхней(?) половине по очкам среди всех когда-либо живших; иначе не принимает знание остальными во внимание.
- Процент знания техи определяется среди (дополнение - известных продавцу) ныне здравствующих (перед расчетом числителя и знаменателя идет if (GET_TEAM((TeamTypes)iI).isAlive()) )
- Вопрос - среди кого именно здравствующих? Что значит if ((iI != getID()) && (iI != eTeam)) - "все, кроме продавца и покупателя"? Я не программист, не уверен.
- Порог процента знающих = techTradeKnownPercent данного ИИ*(TechTradeKnownModifier/100 + 1). Если отношение процента знающих среди живущих будет больше (строго) порога - DENIAL_TECH_MONOPOLY (отказ по монопольным соображениям)
Остальное - отказ в военных итехах, в техах, по которым строится чудо, в техах, ведущих к победе.
Доанализ кода (порядок соответсвует порядку согласия или отказа в коде). Мой пост №24 был не совсем верен.
1. С нами не будут торговать, если мы - злейший враг, даже если при таких отношениях ИИ и согласен в общем меняться техами. Следовательно, напасть на Мусу, а потом при Аннойд пытаться торгануть не стоит (теоретически).
2. Вассал не жмет техи от хозяина (но может быть и наоборот, надо протестить)
3. Если Френдли - техи не жмет, даже монопольные. Также не обращает внимания на количество тех, полученных нами от других игроков.
4. Если хуже Френдли, и ранг хотя бы одного из участников обмена (?- не уверен в значении значка ||) - в верхней половине всех, когда-либо живших (округление вниз, т.е. 5-й из 9 не подходит), и мы получили от других игроков тех больше, чем ИИ готов терпеть (индивидуальный параметр iNoTechTradeThreshold, умноженный на [1 + гандикап уровня сложности, который еще надо доставать из кода]), то в дело вступает пресловутая WFYABTA - We fear you are becoming too advanced. И отказ (DENIAL_TECH_WHORE).
Гандикап: К-т сложности для Notechtradethreshold = 2 - 0.1*i, где i = 0-8 (Сеттлер-Бог)
(с) Dynamic
Пример - Ганди на Боге. У него iNoTechTradeThreshold 15, гандикап 20, итого он тготов с нами торговать, если мы выменяли не более 18 тех у других ИИ (дары тоже считаются). С другой стороны, все ИИ с вероятностью 5% в ход могут забыть нам 1 теху, выменянную у других.
Мораль: на высоких уровнях с злопамятными ИИ (см низкий iNoTechTradeThreshold в таблицах NeverMind-а) лучше не выменивать всякие ненужные вещи, типа Луков или Божественного Права.
5. Если хуже Френдли, но без разницы, какие ранги, то берем всех известных продавцу игроков, кроме него самого и нас, и смотрим, сколько из них знают теху.
щас допишу
Часть 2 - тут менять особо нечего:
Процент встреченных продавцом живых цив (кроме нас и продавца) сравниваем с индивидуальным параметром продавца techTradeKnownPercent. Если знают меньше, отказ (DENIAL_TECH_MONOPOLY)
6. Далее - могут отказать менять теху, дающую новые юниты, здания или проекты (DENIAL_MYSTERY). Подробнее - надо лезть вне выложенного кода.
7. Техи, дающие победные проекты (СМИ, Аполлон, детали корабля), не меняют (DENIAL_VICTORY).
Ну, а если вам ни разу не отказали - поздравляем.
|| - логическое ИЛИ
Техи, дающие новые юниты, здания или проекты обсчитываются дважды.
Первый раз при расчете монопольности (там большая, но понятная функция), второй - пункт 6 по Лехе. Но по пункту 6 проверка странная какая-то, я не смог найти кода.