PDA

Просмотр полной версии : Руководство по требованию дани с ГГ Civ5



hwarang
19.07.2013, 18:33
Благодаря тому, что в BNW есть сведения по механике "требования дани", теперь можно более осмыслено подойти к этому благому для казны делу.
Хочу поделиться своими наблюдениями.
Итак, вы давите на ГГ очками "запугивания" (будем так их называть), а ГГ - оказывает противодействует им очками "сопротивления".
Очки "сопротивления" ГГ:
1) 110 - базовое значение
2) 10 - если ГГ военное
3) 10 - если характер враждебный
4) 20 - если кто-то пообещал защиту ему
5) 300 - если вы требовали дань с него за последние 10 ходов
6) 300 - низкое влияние - если отношения с гг носят негативный характер (-30 влияния и меньше). Так что, если вы приватизировали недавно рабочего у этого гг, не рассчитывайте получать с него дань, пока не увеличите уровень влияния.
7) 40 - если требовали с них дань от 10 до 20 ходов назад.

Очки "запугивания" вы получаете за самые современные войска у границ (т.е. если вы подвели дуболома, а кто-нибудь открыл обработку железа, то его бояться не будут. То же самое относится и к лучникам, когда открываются металлоконструкции) и рейтинг армии в демографии.
Рассмотрим очки за рейтинг:
- За первое место даётся 100
- За второе - 83
- третье - 66
- четвёртое - 50
- пятое - 33
- шестое - 16

Очки за войска у границ (войска не обязательно подводить в плотную - достаточно в радиусе 6-х клеток от самого ГГ):
1) За первые 3 юнита даётся по 20 очков (т.е. 60 в сумме)
2) Для того, чтобы получить ещё 20 очков, нужно подвести ещё 2-3 юнита.
Более 80 очков за подведённые войска получить не удалось.
Также необходимо учитывать наличие армии у ГГ. Если вы подвели 3 современных юнита, а у ГГ есть 2, то вместо 60 очков "запугивания" вы получите лишь 20.

Таким образом, имея 5 современных юнитов вы можете требовать дань, будучи на 5 месте в рейтинге. Но только с невоенных ГГ, которым не обещали защиту и без армии.
P.S. тестировалось на маленькой карте (6 игроков), высокой скорости и старте в древности.

Diman000
20.07.2013, 17:07
Круть, очень полезная инфа :good:
Большое спасибо! :clap:

Coolcat
20.07.2013, 20:18
Полезная инфа, спасибо!

HLDM
22.07.2013, 19:21
Здорово, молодец! А что со скоростью игры? она влияет как-то на запугивание?

Blazer
22.07.2013, 20:15
Это просто шикарно, присоединяюсь к похвалам отписавшихся выше :applau:

hwarang
27.07.2013, 01:25
А что со скоростью игры? она влияет как-то на запугивание?
Скорость игры не влияет.

Snake_B
11.08.2013, 13:09
Переместил в "Civilization 5 - Стратегия игры"

Diman000
13.08.2013, 11:54
Пару слов про численность солдат в демографии. Формула там очень сложная, но замечено, что основополагающим является боевая мощь юнита. И в этом плане стреляющие сильно уступают пехоте и конным отрядам.
К примеру, копье считается сильнее композита и намного сильнее лучника.
Вот один из крайних примеров:
Армия 1 - скаут, 2 дуба, 2 копья = 5 юнитов, по демо 26458
Армия 2 - скаут, дуб, 5 луков = 7 юнитов, по демо 23065
На целых 2 юнита больше, жрут на две больше столько ценных ныне монет, а для сбора дани не годятся.
http://www.strategium.ru/forum/index.php?s=&showtopic=46222&view=findpost&p=1015347

Другие примеры:
Шошон - следопыт и композит, армия 15748 в демо
Грек - дуб и гоплит, армия 18762 в демо
Кто-то обычный, дуб и копье, армия ~ 17000

Дань приобрела более важную роль, особенно в начале игры, причем не важно играете ли вы в раннюю войну или в развитие. Так что, стоит подумать о том, клепать ли лукарей одних за другим или, например, чередовать их с копьями.

Ranger-13
18.08.2013, 04:22
Если другой человек дал свою защиту ГГ, то этот ГГ получает +20 очков анти-запугивания.
Я поначалу думал, что это я должен снимать обещание защиты, чтобы эта "двадцатка" исчезла - но нет.

С повышением уровня юнита кол-во солдат меняется в демографии?

Diman000
18.08.2013, 11:20
Если другой человек дал свою защиту ГГ, то этот ГГ получает +20 очков анти-запугивания.
Я поначалу думал, что это я должен снимать обещание защиты, чтобы эта "двадцатка" исчезла - но нет.

С повышением уровня юнита кол-во солдат меняется в демографии?

Да, прокачки влияют. Можно по ацтекам посмотреть, например. Их ягуар дает больше солдат, чем дуб.

ProfiTroll
21.11.2013, 12:24
В связи с недавним обновлением, система сбора дани координатно поменялась и теперь в бОльшей степени зависит от подведенных войск, кто-нибудь изучал этот вопрос?

сидри
21.11.2013, 12:30
В связи с недавним обновлением, система сбора дани координатно поменялась и теперь в бОльшей степени зависит от подведенных войск, кто-нибудь изучал этот вопрос?

чё там изучать? Подводи 2 дубов в начале и собирай дань. Потом уже это нафиг не нужно, ибо требуется подвести х+1 современный юнит, где х - число таких юнитов у ГГ. Ну и быть первым по армии.

ProfiTroll
21.11.2013, 12:42
Звучит неубедительно, т.к вчера мне впервые на рандоме в ффа выпали шошоны и я построил второго разведа, по демо был 1, подвел их обоих к гг у которого не было юнитов на 6 ходу и ничего он мне не дал, через ~ 50 ходов наклепал 3 длиннолуков и тоже повел практически вплотную, и фиг и только когда апнул дуба в меча и подвел он выдал бабло и то на следующий ход...

ProfiTroll
21.11.2013, 12:51
И сразу такой вопрос: считается ли мой дуболом современным юнитом, если теха на копья не открыта никем, а у противника есть копье, полученное избушкой?

сидри
21.11.2013, 13:25
Звучит неубедительно, т.к вчера мне впервые на рандоме в ффа выпали шошоны и я построил второго разведа, по демо был 1, подвел их обоих к гг у которого не было юнитов на 6 ходу и ничего он мне не дал, через ~ 50 ходов наклепал 3 длиннолуков и тоже повел практически вплотную, и фиг и только когда апнул дуба в меча и подвел он выдал бабло и то на следующий ход...

ты уверен, что был первым по армии, играя за шошонов? Статистика по Ф9 не всегда достоверно отображает инфу, там разбежка в 1 ход бывает частенько. То есть если ты построил юнита и вышел на первое место по рейтингу, то ГГ об этом "узнает" только на следующий ход. А вот если ты подошёл копьём, то его видят сразу.



И сразу такой вопрос: считается ли мой дуболом современным юнитом, если теха на копья не открыта никем, а у противника есть копье, полученное избушкой?
имеется ввиду, что твои юниты равны по техам конкретному ГГ. Если у ГГ копьё стоит, то дубы для него будут 0 угрозы представлять, если у него мечник, то бесполезно требовать дань копейщиками. Что у других игроков есть, на это не влияет. Соответственно, если обработка бронзы не открыта, то дуболом для ГГ будет современным, пока у него не появятся меткие лучники.

Diman000
21.11.2013, 13:27
И сразу такой вопрос: считается ли мой дуболом современным юнитом, если теха на копья не открыта никем, а у противника есть копье, полученное избушкой?

Считается. Только если у ГГ есть какая-то армия, силы дуба может не хватить.

ProfiTroll
21.11.2013, 13:45
ты уверен, что был первым по армии, играя за шошонов? Статистика по Ф9 не всегда достоверно отображает инфу, там разбежка в 1 ход бывает частенько. То есть если ты построил юнита и вышел на первое место по рейтингу, то ГГ об этом "узнает" только на следующий ход. А вот если ты подошёл копьём, то его видят сразу.



имеется ввиду, что твои юниты равны по техам конкретному ГГ. Если у ГГ копьё стоит, то дубы для него будут 0 угрозы представлять, если у него мечник, то бесполезно требовать дань копейщиками. Что у других игроков есть, на это не влияет. Соответственно, если обработка бронзы не открыта, то дуболом для ГГ будет современным, пока у него не появятся меткие лучники.
По поводу армии уверен, но у меня закралось подозрение, что шошоновский развед, как и обычный развед не оказывает давление на гг, вечером проверю.
По поводу техи - получается она становится современной только тогда, когда у данного гг появляется соответствующий юнит?
Тогда такая ситуация: средневековье, всех юнитов гг убили варвары, у меня стоит бесполезный дуболом, если я на 1 месте по армии, смогу ли я собрать им дань?

Diman000
21.11.2013, 13:52
По поводу техи - получается она становится современной только тогда, когда у данного гг появляется соответствующий юнит?
Тогда такая ситуация: средневековье, всех юнитов гг убили варвары, у меня стоит бесполезный дуболом, если я на 1 месте по армии, смогу ли я собрать им дань?

По-моему достаточно открытой техи. Конечно, проверить бы ТОЧНО.
Но я тут несколько дуэлек сыграл за последнее время, там кое-где целенаправленно открывали, например, обработку железа. Чтобы срезать сопернику сбор дани дуболомами. И вроде помогало.

сидри
21.11.2013, 14:09
Тогда такая ситуация: средневековье, всех юнитов гг убили варвары, у меня стоит бесполезный дуболом, если я на 1 месте по армии, смогу ли я собрать им дань?

проверяется за 2 минуты. Дуэльная карта, старт в средневековье, сложность поселенец. Построил воина, подвёл к ГГ, посмотрел угрозу.

сидри
21.11.2013, 17:32
По-моему достаточно открытой техи. Конечно, проверить бы ТОЧНО.
Но я тут несколько дуэлек сыграл за последнее время, там кое-где целенаправленно открывали, например, обработку железа. Чтобы срезать сопернику сбор дани дуболомами. И вроде помогало.

недостаточно

специально сейчас проверил, как описывал выше.

Первое место обеспечивает 75 угрозы, юнит (если у ГГ нету своих) еще 25, базовое сопротивление теперь 110. Требуется минимум 2 юнита. Но! Несмотря на то, что стартовал со Средневековья (т.е. мечники уже открыты), построил 2 дуболома и спокойно собрал дань.

Dynamic
21.11.2013, 19:44
Некоторые юниты дают больше, чем +25. Галеасы, например, +75, правда, я не знаю, как долго...

ProfiTroll
21.11.2013, 23:58
Вообщем господа, все намного сложнее сделали... или так и было в ГК, просто неправильно разобрались. Понятия "современных" юнитов тут нет вообще.
1. Считаем сумму силы каждого юнита, умноженное на свой % хп минус тоже самое по войску гг. Назовем эту разницу "Военное преимущество" - ВП
2. Назовем защиту города ГГ - сила базы - СЗ (для 1 жителя это 11, для двух - 13 и т.д.)
3. Дальше мы делим ВП на СЗ и округляем до 0.5 вниз. (т.е. получится система чисел 0.5, 1, 1.5... и т.д.) Каждые 0.5 - это 25 очков влияния на гг. Т.е. если получилось например 1.73, т.е. 1.5, то значит это 75 очков влияния. Ну с военной мощью по демо все понятно. Вообщем если сумма этих цифр больше 110+(особенности гг - военный, враждебный, защита другой цивы), то будет вам денешка))

ProfiTroll
22.11.2013, 00:59
Вообщем господа, все намного сложнее сделали... или так и было в ГК, просто неправильно разобрались. Понятия "современных" юнитов тут нет вообще.
1. Считаем сумму силы каждого юнита, умноженное на свой % хп минус тоже самое по войску гг. Назовем эту разницу "Военное преимущество" - ВП
2. Назовем защиту города ГГ - сила базы - СЗ (для 1 жителя это 11, для двух - 13 и т.д.)
3. Дальше мы делим ВП на СЗ и округляем до 0.5 вниз. (т.е. получится система чисел 0.5, 1, 1.5... и т.д.) Каждые 0.5 - это 25 очков влияния на гг. Т.е. если получилось например 1.73, т.е. 1.5, то значит это 75 очков влияния. Ну с военной мощью по демо все понятно. Вообщем если сумма этих цифр больше 110+(особенности гг - военный, враждебный, защита другой цивы), то будет вам денешка))
То, что сверху описано, не совсем правильно, но !примерно! похоже. Потому как без формулы невозможно точно сказать.
Тут оказывается не сила важна, а именно показатель из демографии по конкретному юниту. Я не знаю как высчитывается демо по юниту (мне бы формулу, которая, повторюсь, зависит и от хп юнита), но именно разница показателей демо ваших юнитов около ГГ и юнитов самого ГГ, деленное на какой-то растущий показатель, зависящий от (силы самого города*1000), и вот этот округленный до 0.5 результат после деления и отвечает за кол-во очков давления с удельным множителем 25.

сидри
22.11.2013, 08:09
Некоторые юниты дают больше, чем +25. Галеасы, например, +75, правда, я не знаю, как долго...

хм... Может быть игра отдельно рассчитывает силу морских, и отдельно сухопутных юнитов? То есть при подведении галеаса согласно посту Профитроля учитывается лишь базовая сила города? Тогда в принципе это похоже на правду...

ProfiTroll
22.11.2013, 10:09
хм... Может быть игра отдельно рассчитывает силу морских, и отдельно сухопутных юнитов? То есть при подведении галеаса согласно посту Профитроля учитывается лишь базовая сила города? Тогда в принципе это похоже на правду...
Это маловероятно чтобы за 1 юнит давало 75 очков, мне кажется динамик не учел другие свои юниты в радиусе 6 клеток от гг. в любом случае нужен хотя бы скрин. Но если динамик прав, то у гг не должно быть вообще юнитов и город не более 12-13 защиты.
ПС разделения на морские и сухопутные юниты в расчете демо и соответственно очков влияния нет.

Dynamic
22.11.2013, 10:50
Скрин дать не могу, т.к. это текущая почтовка. Но, там, возможно, было 2 Гала в радиусе 6.

ProfiTroll
22.11.2013, 11:49
Скрин дать не могу, т.к. это текущая почтовка. Но, там, возможно, было 2 Гала в радиусе 6.
А вот это очень похоже на правду. Если они построены не очень поздно и гг не успел разрастись(зависит от уровня сложности игры). То чаще 1 галеас дает 25 очков, а два дают 75.

Euler
24.11.2013, 23:59
Из SDK, расчёт силы юнита:

/// Update military Power
void CvUnitEntry::DoUpdatePower()
{
int iPower;

// ***************
// Main Factors - Strength & Moves
// ***************

// We want a Unit that has twice the strength to be roughly worth 3x as much with regards to Power
iPower = int(pow((double) GetCombat(), 1.5));

// Ranged Strength
int iRangedStrength = int(pow((double) GetRangedCombat(), 1.45));

// Naval ranged attacks are less useful
if(GetDomainType() == DOMAIN_SEA)
{
iRangedStrength /= 2;
}

if(iRangedStrength > 0)
{
iPower = iRangedStrength;
}

// We want Movement rate to be important, but not a dominating factor; a Unit with double the moves of a similarly-strengthed Unit should be ~1.5x as Powerful
iPower = int((float) iPower * pow((double) GetMoves(), 0.3));

// ***************
// Other modifiers
// ***************

// Suicide Units are obviously less useful
if(IsSuicide())
{
iPower /= 2;
}

// Nukes are cool
if(GetNukeDamageLevel() > 0)
{
iPower += 4000;
}

// ***************
// Promotion modifiers
// ***************

int iTemp;
int iLoop;

for(int iPromotionLoop = 0; iPromotionLoop < GC.getNumPromotionInfos(); iPromotionLoop++)
{
CvPromotionEntry* kPromotion = GC.getPromotionInfo((PromotionTypes)iPromotionLoop);
if(kPromotion == NULL)
continue;

if(GetFreePromotions(iPromotionLoop))
{
// City Attack - add half of the bonus
if(kPromotion->GetCityAttackPercent() > 0)
{
iTemp = (iPower * kPromotion->GetCityAttackPercent() / 2);
iTemp /= 100;
iPower += iTemp;
}

// Attack - add half of the bonus
if(kPromotion->GetAttackMod() > 0)
{
iTemp = (iPower * kPromotion->GetAttackMod() / 2);
iTemp /= 100;
iPower += iTemp;
}

// Defense - add half of the bonus
if(kPromotion->GetDefenseMod() > 0)
{
iTemp = (iPower * kPromotion->GetDefenseMod() / 2);
iTemp /= 100;
iPower += iTemp;
}

// Paradrop - add 25%
if(kPromotion->GetDropRange() > 0)
{
iTemp = iPower;
iTemp /= 4;
iPower += iTemp;
}

// Blitz - add 20%
if(kPromotion->IsBlitz())
{
iTemp = iPower;
iTemp /= 5;
iPower += iTemp;
}

// Set Up For Ranged Attack - reduce by 20%
if(kPromotion->IsMustSetUpToRangedAttack())
{
iTemp = iPower;
iTemp /= 5;
iPower -= iTemp;
}

// Only Defensive - reduce by 25%, but only if the Unit has no ranged capability
if(kPromotion->IsOnlyDefensive() && GetRangedCombat() == 0)
{
iTemp = iPower;
iTemp /= 4;
iPower -= iTemp;
}

for(iLoop = 0; iLoop < GC.getNumTerrainInfos(); iLoop++)
{
// Terrain Attack - add one quarter of the bonus
if(kPromotion->GetTerrainAttackPercent(iLoop) > 0)
{
iTemp = (iPower * kPromotion->GetTerrainAttackPercent(iLoop) / 4);
iTemp /= 100;
iPower += iTemp;
}
// Terrain Defense - add one quarter of the bonus
if(kPromotion->GetTerrainDefensePercent(iLoop) > 0)
{
iTemp = (iPower * kPromotion->GetTerrainDefensePercent(iLoop) / 4);
iTemp /= 100;
iPower += iTemp;
}
}

for(iLoop = 0; iLoop < GC.getNumFeatureInfos(); iLoop++)
{
// Feature Attack - add one quarter of the bonus
if(kPromotion->GetFeatureAttackPercent(iLoop) > 0)
{
iTemp = (iPower * kPromotion->GetFeatureAttackPercent(iLoop) / 4);
iTemp /= 100;
iPower += iTemp;
}
// Feature Defense - add one quarter of the bonus
if(kPromotion->GetFeatureDefensePercent(iLoop) > 0)
{
iTemp = (iPower * kPromotion->GetFeatureDefensePercent(iLoop) / 4);
iTemp /= 100;
iPower += iTemp;
}
}

for(iLoop = 0; iLoop < GC.getNumUnitCombatClassInfos(); iLoop++)
{
// Unit Combat Class (e.g. Pikemen) - add one quarter of the bonus
if(kPromotion->GetUnitCombatModifierPercent(iLoop) > 0)
{
iTemp = (iPower * kPromotion->GetUnitCombatModifierPercent(iLoop) / 4);
iTemp /= 100;
iPower += iTemp;
}
}

for(iLoop = 0; iLoop < GC.getNumUnitClassInfos(); iLoop++)
{
// Unit Class (e.g. bonus ONLY against Galleys) - add one eighth of the bonus
// We're assuming here that the bonus against the other Unit is at least going to be somewhat useful - trust the XML! :o
if(kPromotion->GetUnitClassModifierPercent(iLoop) > 0)
{
iTemp = (iPower * kPromotion->GetUnitClassModifierPercent(iLoop) / 8);
iTemp /= 100;
iPower += iTemp;
}
// Unit Class Attack - one tenth of the bonus
if(kPromotion->GetUnitClassAttackModifier(iLoop) > 0)
{
iTemp = (iPower * kPromotion->GetUnitClassAttackModifier(iLoop) / 10);
iTemp /= 100;
iPower += iTemp;
}
// Unit Class Defense - one tenth of the bonus
if(kPromotion->GetUnitClassDefenseModifier(iLoop) > 0)
{
iTemp = (iPower * kPromotion->GetUnitClassDefenseModifier(iLoop) / 10);
iTemp /= 100;
iPower += iTemp;
}
}

for(iLoop = 0; iLoop < NUM_DOMAIN_TYPES; iLoop++)
{
// Domain - add one quarter of the bonus
if(kPromotion->GetDomainModifierPercent(iLoop) > 0)
{
iTemp = (iPower * kPromotion->GetDomainModifierPercent(iLoop) / 4);
iTemp /= 100;
iPower += iTemp;
}
}
}
}

// Debug output
//char temp[256];
//sprintf(temp, "%s: %i\n", GetDescription(), iPower);
//OutputDebugString(temp);

m_iCachedPower = iPower;
}
//...
/// Current power of unit (raw unit type power adjusted for health)
int CvUnit::GetPower() const
{
VALIDATE_OBJECT
int iPower = getUnitInfo().GetPower();
//Take promotions into account: unit with 4 promotions worth ~50% more
iPower = int((float) iPower * pow((double) getLevel(), 0.3));
iPower *= GetCurrHitPoints();
iPower /= GetMaxHitPoints();
return iPower;
}
Вся функция расчёта:

// Calculates a basic score for whether the major can bully this minor based on many factors.
// Negative score if bully attempt is a failure, zero or positive if success.
// May be modified after return, if the task is easier or harder (ex. bully a worker vs. bully gold)
int CvMinorCivAI::CalculateBullyMetric(PlayerTypes eBullyPlayer)
{
//antonjs: todo: once the algorithm is more decided on, put values into constant/XML
const int iDefaultScore = -110;
const int iFailScore = -999;

CvAssertMsg(GetPlayer()->GetID() != eBullyPlayer, "Minor civ and bully civ not expected to have the same ID!");
if(GetPlayer()->GetID() == eBullyPlayer) return iFailScore;

CvAssertMsg(eBullyPlayer >= 0, "eBullyPlayer is expected to be non-negative (invalid Index)");
CvAssertMsg(eBullyPlayer < MAX_MAJOR_CIVS, "eBullyPlayer is expected to be within maximum bounds (invalid Index)");
if(eBullyPlayer < 0 || eBullyPlayer >= MAX_MAJOR_CIVS) return iFailScore;

// Can't bully the dead
if(!GetPlayer()->isAlive())
return iFailScore;

// The score beings negative, and has to be bumped up to positive by the below factors in order for the bullying to be successful
int iScore = iDefaultScore;

// **************************
// Global military power ranking of major
//
// +0 ~ +100
// **************************
CvWeightedVector<PlayerTypes, MAX_MAJOR_CIVS, true> veMilitaryRankings;
PlayerTypes eMajorLoop;
for(int iMajorLoop = 0; iMajorLoop < MAX_MAJOR_CIVS; iMajorLoop++)
{
eMajorLoop = (PlayerTypes) iMajorLoop;
if(GET_PLAYER(eMajorLoop).isAlive() && !GET_PLAYER(eMajorLoop).isMinorCiv())
{
veMilitaryRankings.push_back(eMajorLoop, GET_PLAYER(eMajorLoop).GetMilitaryMight()); // Don't recalculate within a turn, can cause inconsistency
}
}
CvAssertMsg(veMilitaryRankings.size() > 0, "WeightedVector of military might rankings not expected to be size 0");
veMilitaryRankings.SortItems();
for(int iRanking = 0; iRanking < veMilitaryRankings.size(); iRanking++)
{
if(veMilitaryRankings.GetElement(iRanking) == eBullyPlayer)
{
float fRankRatio = (float)(veMilitaryRankings.size() - iRanking) / (float)(veMilitaryRankings.size());
int iScoreMod = (int)(fRankRatio * 100); // A score between 100*(1 / num majors alive) and 100, with the highest rank major getting 100
iScore += iScoreMod;
break;
}
}

// **************************
// General military power comparison
// **************************


// **************************
// Local military power comparison
//
// +0 ~ +100
// **************************
int iComparisonRadius = std::max(GC.getMap().getGridWidth() / 10, 5);
CvCity* pMinorCapital = GetPlayer()->getCapitalCity();
if(pMinorCapital == NULL)
return iFailScore;
CvPlot* pMinorCapitalPlot = pMinorCapital->plot();
if(pMinorCapitalPlot == NULL)
return iFailScore;
int iMinorCapitalX = pMinorCapitalPlot->getX();
int iMinorCapitalY = pMinorCapitalPlot->getY();
int iMinorLocalPower = 0;
int iBullyLocalPower = 0;
CvPlot* pLoopPlot;
IDInfo* pUnitNode;
CvUnit* pLoopUnit;

// Include the minor's city power
iMinorLocalPower += pMinorCapital->GetPower();

for(int iDX = -iComparisonRadius; iDX <= iComparisonRadius; iDX++)
{
for(int iDY = -iComparisonRadius; iDY <= iComparisonRadius; iDY++)
{
pLoopPlot = ::plotXYWithRangeCheck(iMinorCapitalX, iMinorCapitalY, iDX, iDY, iComparisonRadius);

if(pLoopPlot != NULL)
{
// If there are Units here, loop through them
if(pLoopPlot->getNumUnits() > 0)
{
pUnitNode = pLoopPlot->headUnitNode();

while(pUnitNode != NULL)
{
pLoopUnit = ::getUnit(*pUnitNode);
pUnitNode = pLoopPlot->nextUnitNode(pUnitNode);

// Is a combat unit
if(pLoopUnit && pLoopUnit->IsCombatUnit())
{
if(pLoopUnit->getOwner() == eBullyPlayer)
{
iBullyLocalPower += pLoopUnit->GetPower();
}
else if(pLoopUnit->getOwner() == GetPlayer()->GetID())
{
iMinorLocalPower += pLoopUnit->GetPower();
}
}
}
}

}
}
}
float fLocalPowerRatio = (float)iBullyLocalPower / (float)iMinorLocalPower;
if(fLocalPowerRatio >= 3.0)
{
iScore += 100;
}
else if(fLocalPowerRatio >= 2.0)
{
iScore += 80;
}
else if(fLocalPowerRatio >= 1.5)
{
iScore += 60;
}
else if(fLocalPowerRatio >= 1.0)
{
iScore += 40;
}
else if(fLocalPowerRatio >= 0.5)
{
iScore += 20;
}

// **************************
// Local military threat from major
// **************************
//antonjs: consider: count the number of threatening units (similar to counting threatening barbarians), and/or their power



// **************************
// Proximity to major
// **************************



// **************************
// Previous bully attempts
//
// InstantFail ~ -0
// **************************
int iLastBullyTurn = GetTurnLastBulliedByMajor(eBullyPlayer);
if(iLastBullyTurn >= 0)
{
if(iLastBullyTurn + 10 >= GC.getGame().getGameTurn())
{
return iFailScore;
}
else if(iLastBullyTurn + 20 >= GC.getGame().getGameTurn())
{
iScore += -40;
}
}

// **************************
// Current influence of major
//
// InstantFail ~ -0
// **************************
if(GetEffectiveFriendshipWithMajor(eBullyPlayer) < GC.getFRIENDSHIP_THRESHOLD_CAN_BULLY())
{
return iFailScore;
}
/*antonjs: consider: scale based on how low the influence is, like:
float iNegativeInfluenceMultiplier = 1.2f;
if (GetFriendshipWithMajor(eBullyPlayer) < 0)
{
iScore += (int) (iNegativeInfluenceMultiplier * GetFriendshipWithMajor(eBullyPlayer));
//antonjs: consider: exponent, like influence^1.1
}
*/

// **************************
// Diplomatic reputation of major
// **************************


// **************************
// Passive Support from other majors
//
// -10 ~ -0
// **************************
if(GetAlly() != NO_PLAYER && GetAlly() != eBullyPlayer)
{
iScore += -10;
}
//antonjs: todo: fulfilled support quests, esp. gold gift
//antonjs: todo: friendly support units


// **************************
// Pledges of Protection from other majors
//
// -20 ~ -0
// **************************
//antonjs: consider: don't have PtP be a factor here, only have it factor in major civ diplo reaction
for(int iMajorLoop = 0; iMajorLoop < MAX_MAJOR_CIVS; iMajorLoop++)
{
eMajorLoop = (PlayerTypes) iMajorLoop;
if(eMajorLoop != eBullyPlayer && IsProtectedByMajor(eMajorLoop))
{
iScore += -20;
break;
}
}

// **************************
// Major Civ UA, policies
// **************************



// **************************
// Minor Civ Type
//
// -20 ~ -0
// **************************
if(GetPersonality() == MINOR_CIV_PERSONALITY_HOSTILE)
{
iScore += -10;
}
if(GetTrait() == MINOR_CIV_TRAIT_MILITARISTIC)
{
iScore += -10;
}

return iScore;
}
Т.е. в основном - войска могут дать от 0 до 100 очков давления, для получения 100 нужно иметь армию в 3 раза сильнее, чем у гг. При расчёте мощь юнитов на морских клетках сокращается в 2 раза, кроме того учитываются очки передвижения и юниты ближнего боя дают больше влияния. Сила столицы гг тоже учитывается. От ядерного оружия гг серят кирпичами :) . Но "ифов" там много.

dunker
06.08.2015, 09:45
Интересно, а монгольский бонус против ГГ влияет как-то на их сговорчивость?

Diman000
06.08.2015, 10:55
Кто-то мне говорил что влияет.
Сам не видел.

Atalai
06.08.2015, 16:17
Не влияет. Проверено.

Mongolia


Tricks

Unique Ability: Mongol Terror

Declaring war directly on two or more City-States in quick succession will lower your influence resting point with nearby City-States and increase the rate of influence decay. To avoid this, declare war on a Civ allied to the City-State - there's no such associated penalty then.

Unique Unit: Keshik

As the unit retains the ability to move after attacking, it's able to move within city range, fire and move out in a single turn. Keshiks therefore are excellent against cities, although they can't capture them by themselves. Bring a non-upgraded Horseman or Lancer along with them to be able to safely finish the city off.
As ranged units, Keshiks only need two promotions prior to March becoming available (Barrage/Accuracy I and II.) Supported by Khans, you can easily get a horde of Keshiks healing 25HP every single turn.

Unique Great Person: Khan

Any Civ can receive a Khan of their own by completing the Patronage Social Policy tree and allying with City-States.

Hidden Features

Unique Great Person: Khan

Aside from land units, air units are also affected by the healing rate bonus, although naval units are not. Combine with the Air Repair promotion and the Faith Healers Pantheon for extra effectiveness.

Clarifications

Unique Ability: Mongol Terror

The bonus against City-States does not affect your ability to intimidate them.
Ranged mounted units (Chariot Archers, Keshiks) do not gain extra movement from the UA. Keshiks have 5 movement points, but that is a specific feature of the unit - if another Civ was gifted the unit, it would still have 5 movement points.

Unique Unit: Keshik

Camel Archers are classed as ranged units rather than mounted units, meaning:
Bonuses against mounted units do not affect them (e.g. Spearmen, Pikemen, Lancers)
They will use ranged promotions
Stables won't help you build them faster, but the Temple of Artemis will.
Despite being classifed as ranged units for combat, for purposes of construction, Keshiks still count as mounted units (so stables will boost their production while the Temple of Artemis will not.)
Keshiks, like all land-based ranged units, use their ranged strength when defending against ranged attacks. As such they defend slightly better against cities, Crossbowmen and suchlike than they do against Longswordsmen, Knights and other melee units.
Great Generals I offers a 50% bonus to Great General gain, but so does the Quick Study promotion (in addition to its XP benefit.) These stack multiplicatively, but the output is rounded during the calculation meaning the net contribution to Great General points isn't exactly 225%.
The Quick Study and Great Generals I promotions carry over on upgrade.
Melee-specific promotions (Shock, Drill, etc.) earned by Horsemen do not work when upgraded to Keshiks (with the exception of Blitz,) and ranged-specific promotions earned by Keshiks (with the exception of Logistics) do not work when the unit's upgraded to Cavalry.

Unique Great Person: Khan

Units only receive the healing bonus while they're in a state of healing (either not taking an action or with the March promotion.)
The healing bonus offered stacks with all other boosts to healing rate except the Medic promotions.
A unit stacked with a Khan does not recieve the healing bonus, although the Khan itself does.


Специально выделила соответствующую строку.