PDA

Просмотр полной версии : Как заставить противника капитулировать?



AFro
05.01.2007, 01:33
Пробовал с другом разыграть дуэль по следующим правилам:
- играем без объявления войны друг другу;
- победителем считается тот, кто имеет больше вассалов на момент отсутствия свободных от вассалитета AI;

Ситуация в сейве: Я, играя арабами, не могу требовать капитуляции у англичан (остался один город, не Лондон, в городе одна катапульта), обладая определенным перевесом в войсках (могу захватить город в любой момент). Требование "Капитуляция" просто нельзя выбрать в окне переговоров.
Аналогичная ситуация у друга (Америка) против Мали (правда в Дженне осталось войск немного больше)...

Сейв: Warlords 2.08 + русификация от нашфанатикс :punk:

Вопросы: есть ли что нибудь по капитуляциям на форуме (поиск по слову "капитуляция" приемлемых результатов не дал :secret: );
Если кто разрешал подобные ситуации - поделитесь опытом... :bye:

[attachmentid=1858]

NeverMind
10.01.2007, 01:09
Я посмотрел, вообще интересно было бы разобраться с этой капитуляцией. Но сложно, код какой то большой, и не совсем понятный :unsure: . В данном случае, Виктория тебе отказывает в капитуляции под предлогом "We're doing fine on our own.", тип отказа - DENIAL_POWER_US. В SDK этому отказу капитулировать соответствует следующая часть кода:

[code]

JCricket
10.01.2007, 03:22
NeverMind, ты даже не имеешь понятия, какое важное открытие ты сделал! Где же ты раньше-то был? :applau2:
ИМХО:
Если сила кандидата в вассалы превышает 3/4 средней силы или 2/3 силы кандидата в феодалы, то последует отказ.

AFro
10.01.2007, 07:57
:nono:
Согласно демографических таблиц:
Моя сила = 130000;
Средняя сила = 128200;
Сила Виктории = 77000;

Соответственно: 3/4 средней силы составляет 96150 (что превышает силу Виктории),
2/3 моей силы составляет 86666.6(6) (что также превышает силу Виктории).

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

Вероятно, существуют еще какие-то ограничения...
:worthy:

NeverMind
10.01.2007, 17:44
AFro, приведены два условия. Точно не работает из них только второе. Ситуация в сэйве об этом свидетельствует однозначно :D.

Но остается первое условие подобного отказа.

[code]

vpadlo
10.01.2007, 18:06
Можно при помощи VC++ запустить игру в режиме отладки, поставить в начале нужной ф-ции бряк, а потом трасировать(запустить пошагово) и смотреть что происходит.

AFro
11.01.2007, 19:23
Я, честно говоря, в программировании понимаю довольно таки мало. Однако, склонен рассматривать приведенный NeverMindом код, как условия, при которых уже <strike>капитулировавшая</strike> являющаяся вассалом цивилизация получает независимость от суверена (помимо всего прочего, что там еще присутствует).

Может быть (это в том случае, если я прав) стоит глянуть в "дипломатические" функции (если такие, в принципе, существуют)? Ведь, насколько я понимаю, в сейве нет возможности оговорить капитуляцию как элемент стоимости мирного договора. Может стоить проверить также часто встречающуюся невозможность требования "объявления войны третьей цивилизации", "прекращения торговли с третьей цивилизацией"?

P.S. Все эти "может быть" не следует рассматривать с точки зрения "чем спрашивать - взял бы сам и посмотрел", т.к. по уже указывавшейся выше причине получить такие элементы кодов, которые представлены выше "не _у_мею никакой возможности... :shy2:

NeverMind
12.01.2007, 01:44
<div class='quotetop'>Цитата(AFro * 11.1.2007, 19:23) 154200</div>

Я, честно говоря, в программировании понимаю довольно таки мало. Однако, склонен рассматривать приведенный NeverMindом код, как условия, при которых уже <strike>капитулировавшая</strike> являющаяся вассалом цивилизация получает независимость от суверена (помимо всего прочего, что там еще присутствует).[/b]
Честно говоря, готов конкурировать с тобой в малопонимании программирования, но склонен настаивать на своем понимании приведенного кода :D. DENIAL_POWER_US в сочетании с AI_surrenderTrade встречается только в двух случаях. И раз второе условие мы можем здесь отбросить, то остается объяснить первое.

Для себя я перевожу первое условие как "НЕ является вассалом сейчас И (но) мог бы восстать, если бы был вассалом при данных условиях". Если сразу есть возможность восстать против сюзерена, то нет никакого смысла соглашаться на капитуляцию. Отсюда и отключение капитуляции в диплоконтактах. Логично?

Поэтому я и привел код canVassalRevolt, объяснение которого, по моему, должно стать ключем к пониманию ситуации в твоем сэйве. Надо сосредоточиться и сообразить :D.

<div class='quotetop'>Цитата</div>
Может стоить проверить также часто встречающуюся невозможность требования "объявления войны третьей цивилизации", "прекращения торговли с третьей цивилизацией"?[/b]
Очень даже стоит :yes:. Я в мае-июне изучал дипломатию, в т.ч. конкретный смысл дипломатических отказов AI, но до конца не изучил, к тому же тогда меня пугало само слово "SDK". А по отдельности не было повода писать, никто об этом не спрашивал.

Так что хорошо, что спросил. Меня тоже интересуют подобные ситуации. Лишний повод подумать и разобраться :yes:. А код ты легко можешь найти в каталоге c Warlords - нужны .cpp файлы. Смотри на них просто как на текстовые файлы, и наверняка обнаружишь для себя много интересного без всяких познаний в программировании. :bye:

AFro
16.01.2007, 18:20
:wacko:
Почитал немного...
очень меня заинтересовал файл "CvDeal.cpp".
Там условие капитуляции описывается через переменную "TRADE_SURRENDER", а вовсе не через "DENIAL_POWER_US".
Правда вот, понять каким образом реализуются проверки и какие файлы нужно просматривать, чтобы понять принципы этой реализации у меня никак не получается.

Ярким примером такого условия является, хотя бы нижеописанное:


bool CvDeal::isVassalDeal() const
{
return (isVassalTrade(&m_firstTrades) || isVassalTrade(&m_secondTrades));
}

bool CvDeal::isVassalTrade(const CLinkList<TradeData>* pList)
{
if (pList)
{
for (CLLNode<TradeData>* pNode = pList->head(); pNode != NULL; pNode = pList->next(pNode))
{
if (pNode->m_data.m_eItemType == TRADE_VASSAL || pNode->m_data.m_eItemType == TRADE_SURRENDER)
{
return true;
}
}
}

return false;
}


bool CvDeal::isUncancelableVassalDeal(PlayerTypes eByPlayer, CvWString* pszReason) const
{
CLLNode<TradeData>* pNode;

for (pNode = headFirstTradesNode(); (pNode != NULL); pNode = nextFirstTradesNode(pNode))
{
if (pNode->m_data.m_eItemType == TRADE_SURRENDER || pNode->m_data.m_eItemType == TRADE_VASSAL)
{
if (eByPlayer == getSecondPlayer())
{
if (pszReason)
{
*pszReason += gDLL->getText("TXT_KEY_MISC_DEAL_NO_CANCEL_EVER");
}

return true;
}
}

if (pNode->m_data.m_eItemType == TRADE_SURRENDER)
{
CvTeam& kVassal = GET_TEAM(GET_PLAYER(getFirstPlayer()).getTeam());
TeamTypes eMaster = GET_PLAYER(getSecondPlayer()).getTeam();

if (!kVassal.canVassalRevolt(eMaster))
{
if (pszReason)
{
GAMETEXT.setVassalRevoltHelp(*pszReason, eMaster, GET_PLAYER(getFirstPlayer()).getTeam());
}

return true;
}
}
}

for (pNode = headSecondTradesNode(); (pNode != NULL); pNode = nextSecondTradesNode(pNode))
{
if (pNode->m_data.m_eItemType == TRADE_SURRENDER || pNode->m_data.m_eItemType == TRADE_VASSAL)
{
if (eByPlayer == getFirstPlayer())
{
if (pszReason)
{
*pszReason += gDLL->getText("TXT_KEY_MISC_DEAL_NO_CANCEL_EVER");
}

return true;
}
}

if (pNode->m_data.m_eItemType == TRADE_SURRENDER)
{
CvTeam& kVassal = GET_TEAM(GET_PLAYER(getSecondPlayer()).getTeam());
TeamTypes eMaster = GET_PLAYER(getFirstPlayer()).getTeam();

if (!kVassal.canVassalRevolt(eMaster))
{
if (pszReason)
{
if (pszReason)
{
GAMETEXT.setVassalRevoltHelp(*pszReason, eMaster, GET_PLAYER(getFirstPlayer()).getTeam());
}
}

return true;
}
}
}

return false;
}

Прошу разбирающихся в этом описании подсказать, относится ли этот текст к обсуждаемой теме (а, может быть, и перевести что нибудь на русский :shy2: )

P.S. Вопрос к NeverMindу - а как сделать код в окошечке? а то уж очень длинное сообщение получилось :secret:

Blacksun
16.01.2007, 19:00
Каким то боком относится, но основа - canVassalRevolt ().

Во время заключения торговых отношений (и вассальских тоже) в общей (CvBase - находится в динамической (оперативной) пямяти игры) баз появляются записи. Здесь просто перебираются эти записи для нахождения нужной, а будет присоединение или нет - проверяется в canVassalRevolt (). (Т.е. эта функция определяет - возможность присоединения вассала или нет). Но при этом... Торговые отношения - должны быть типа - TRADE_SURRENDER

[code]
enum DllExport TradeableItems

NeverMind
16.01.2007, 21:09
<div class='quotetop'>Цитата(AFro * 16.1.2007, 18:20) 155425</div>
очень меня заинтересовал файл "CvDeal.cpp".
Там условие капитуляции описывается через переменную "TRADE_SURRENDER", а вовсе не через "DENIAL_POWER_US"[/b]
"Я завтра не на машине поеду, а на работу" © ;). Это разные типы, разные функции. TRADE_SURRENDER - тип тороговой опции в дипломатии, которая отличается от TRADE_VASSAL тем, что появляется во время войны. "DENIAL_POWER_US" - тип отказа AI от согласия на определенное дипломатическое предложение (в т.ч. сдаться). Во время использования такого типа отказа, данная дипломатическая опция недоступна, т.е выделена красным цветом :yes:.

PS. Вместо кода "соde" можно использовать "соdebox", тогда содержимое будет ограничено окошком. :secret:

AFro
17.01.2007, 19:27
Кстати, о знаниях программирования. Решил я привязать ситуацию в сейве ко второму (или первому?) условию. Т.е., если я правильно понимаю CanVassalRevolt должна возвращать false, что бы строчка вассалитета в торговле была белого цвета.
Но тут возникли проблемы, в связи с чем - вопрос:
как "дословно" переводятся символы:
"!=", "=", "==", "ll"
и как определить какое значение принимает, ну скажем, функция GC.getDefineINT("VASSAL_REVOLT_OWN_LOSSES_FACTOR") в конкретной ситуации :biglol:

:harhar: Даешь освоение С++ через форум

P.S. Я в свое время писал на Borland Pascal 7.0 (еще в институте, курсе на первом-втором), так что за глупые вопросы прошу больно не пинать. Ну не довелось мне на С++ попрограммировать, и ни одного справочника дома не нашлось :shy2:

vpadlo
17.01.2007, 19:55
В скобках паскалевские обозначения

"==" -- равно("=")
"!=" -- не равно("<>")
"=" -- присвоить значени(":=")
"||" -- или("OR")
"&&" -- И ("AND")
! -- НЕ (отрицание)

<div class='quotetop'>Цитата(AFro * 17.1.2007, 18:27) 155707</div>

и как определить какое значение принимает, ну скажем, функция GC.getDefineINT("VASSAL_REVOLT_OWN_LOSSES_FACTOR") в конкретной ситуации :biglol:
[/b]
Смотреть код этой функции и думать что она возвращает. А как же ещё?

// Добавил немножко. (GC.getDefineINT - принимает просто целое значение)

VASSAL_REVOLT_OWN_LOSSES_FACTOR - 50 %... От территории (По мому вассальной) (Определено при разборке ф-ции - getVassalPower ())

NeverMind
17.01.2007, 19:59
<div class='quotetop'>Цитата(AFro * 17.1.2007, 19:27) 155707</div>

если я правильно понимаю CanVassalRevolt должна возвращать false, что бы строчка вассалитета в торговле была белого цвета.[/b] Да, получается так в данном случае.

<div class='quotetop'>Цитата</div>
как "дословно" переводятся символы:
"!=", "=", "==", "ll"[/b] Это самый сложный для меня вопрос :biglol: До сих пор гадаю по ситуации. Хорошо бы кто нибудь дал ссылку на объяснение простых знаков cpp. :worthy:

<div class='quotetop'>Цитата</div>
и как определить какое значение принимает, ну скажем, функция GC.getDefineINT("VASSAL_REVOLT_OWN_LOSSES_FACTOR") в конкретной ситуации[/b] Это значение всегда постоянно . Все getDefine подставляется из GlobalDefines.xml, я делал таблицу по нему в Excel-формате для наглядности: http://forum.civfanatics.ru/index.php?showtopic=3107

<div class='quotetop'>Цитата</div>
P.S. Я в свое время писал на Borland Pascal 7.0 (еще в институте, курсе на первом-втором), так что за глупые вопросы прошу больно не пинать. Ну не довелось мне на С++ попрограммировать, и ни одного справочника дома не нашлось :shy2:[/b] Я "программировал" только на бейсике, в школе :biglol:. Так что, даешь освоение C++ в рамках отдельной игры! :D

vpadlo, подскажи какую нибудь ссылку где эти знаки описываются, м? :whistle:

PS. vpadlo сказал - vpadlo сделал! :umnik: http://forum.civfanatics.ru/index.php?showtopic=5299