Пробовал с другом разыграть дуэль по следующим правилам:
- играем без объявления войны друг другу;
- победителем считается тот, кто имеет больше вассалов на момент отсутствия свободных от вассалитета AI;
Ситуация в сейве: Я, играя арабами, не могу требовать капитуляции у англичан (остался один город, не Лондон, в городе одна катапульта), обладая определенным перевесом в войсках (могу захватить город в любой момент). Требование "Капитуляция" просто нельзя выбрать в окне переговоров.
Аналогичная ситуация у друга (Америка) против Мали (правда в Дженне осталось войск немного больше)...
Сейв: Warlords 2.08 + русификация от нашфанатикс![]()
Вопросы: есть ли что нибудь по капитуляциям на форуме (поиск по слову "капитуляция" приемлемых результатов не дал);
Если кто разрешал подобные ситуации - поделитесь опытом...![]()
[attachmentid=1858]
Я посмотрел, вообще интересно было бы разобраться с этой капитуляцией. Но сложно, код какой то большой, и не совсем понятный. В данном случае, Виктория тебе отказывает в капитуляции под предлогом "We're doing fine on our own.", тип отказа - DENIAL_POWER_US. В SDK этому отказу капитулировать соответствует следующая часть кода:
[code]
NeverMind, ты даже не имеешь понятия, какое важное открытие ты сделал! Где же ты раньше-то был?![]()
ИМХО:
Если сила кандидата в вассалы превышает 3/4 средней силы или 2/3 силы кандидата в феодалы, то последует отказ.
![]()
Согласно демографических таблиц:
Моя сила = 130000;
Средняя сила = 128200;
Сила Виктории = 77000;
Соответственно: 3/4 средней силы составляет 96150 (что превышает силу Виктории),
2/3 моей силы составляет 86666.6(6) (что также превышает силу Виктории).
Т.е. приведенные условия выполняются, а капитуляцию даже выбрать нельзя в окне дипломатии...
Вероятно, существуют еще какие-то ограничения...
![]()
Можно при помощи VC++ запустить игру в режиме отладки, поставить в начале нужной ф-ции бряк, а потом трасировать(запустить пошагово) и смотреть что происходит.
С пола не упасть!
http://img444.imageshack.us/img444/7241/samogonxg0.png
Я, честно говоря, в программировании понимаю довольно таки мало. Однако, склонен рассматривать приведенный NeverMindом код, как условия, при которых уже <strike>капитулировавшая</strike> являющаяся вассалом цивилизация получает независимость от суверена (помимо всего прочего, что там еще присутствует).
Может быть (это в том случае, если я прав) стоит глянуть в "дипломатические" функции (если такие, в принципе, существуют)? Ведь, насколько я понимаю, в сейве нет возможности оговорить капитуляцию как элемент стоимости мирного договора. Может стоить проверить также часто встречающуюся невозможность требования "объявления войны третьей цивилизации", "прекращения торговли с третьей цивилизацией"?
P.S. Все эти "может быть" не следует рассматривать с точки зрения "чем спрашивать - взял бы сам и посмотрел", т.к. по уже указывавшейся выше причине получить такие элементы кодов, которые представлены выше "не _у_мею никакой возможности...![]()
<div class='quotetop'>Цитата(AFro * 11.1.2007, 19:23) [snapback]154200[/snapback]</div>Честно говоря, готов конкурировать с тобой в малопонимании программирования, но склонен настаивать на своем понимании приведенного кодаЯ, честно говоря, в программировании понимаю довольно таки мало. Однако, склонен рассматривать приведенный NeverMindом код, как условия, при которых уже <strike>капитулировавшая</strike> являющаяся вассалом цивилизация получает независимость от суверена (помимо всего прочего, что там еще присутствует).[/b]. DENIAL_POWER_US в сочетании с AI_surrenderTrade встречается только в двух случаях. И раз второе условие мы можем здесь отбросить, то остается объяснить первое.
Для себя я перевожу первое условие как "НЕ является вассалом сейчас И (но) мог бы восстать, если бы был вассалом при данных условиях". Если сразу есть возможность восстать против сюзерена, то нет никакого смысла соглашаться на капитуляцию. Отсюда и отключение капитуляции в диплоконтактах. Логично?
Поэтому я и привел код canVassalRevolt, объяснение которого, по моему, должно стать ключем к пониманию ситуации в твоем сэйве. Надо сосредоточиться и сообразить.
<div class='quotetop'>Цитата</div>Очень даже стоитМожет стоить проверить также часто встречающуюся невозможность требования "объявления войны третьей цивилизации", "прекращения торговли с третьей цивилизацией"?[/b]. Я в мае-июне изучал дипломатию, в т.ч. конкретный смысл дипломатических отказов AI, но до конца не изучил, к тому же тогда меня пугало само слово "SDK". А по отдельности не было повода писать, никто об этом не спрашивал.
Так что хорошо, что спросил. Меня тоже интересуют подобные ситуации. Лишний повод подумать и разобраться. А код ты легко можешь найти в каталоге c Warlords - нужны .cpp файлы. Смотри на них просто как на текстовые файлы, и наверняка обнаружишь для себя много интересного без всяких познаний в программировании.
![]()
![]()
Почитал немного...
очень меня заинтересовал файл "CvDeal.cpp".
Там условие капитуляции описывается через переменную "TRADE_SURRENDER", а вовсе не через "DENIAL_POWER_US".
Правда вот, понять каким образом реализуются проверки и какие файлы нужно просматривать, чтобы понять принципы этой реализации у меня никак не получается.
Ярким примером такого условия является, хотя бы нижеописанное:
[codebox]
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;
}
[/codebox]
Прошу разбирающихся в этом описании подсказать, относится ли этот текст к обсуждаемой теме (а, может быть, и перевести что нибудь на русский)
P.S. Вопрос к NeverMindу - а как сделать код в окошечке? а то уж очень длинное сообщение получилось![]()
Каким то боком относится, но основа - canVassalRevolt ().
Во время заключения торговых отношений (и вассальских тоже) в общей (CvBase - находится в динамической (оперативной) пямяти игры) баз появляются записи. Здесь просто перебираются эти записи для нахождения нужной, а будет присоединение или нет - проверяется в canVassalRevolt (). (Т.е. эта функция определяет - возможность присоединения вассала или нет). Но при этом... Торговые отношения - должны быть типа - TRADE_SURRENDER
[code]
enum DllExport TradeableItems
Программирование - это не то, что ты думаешь.... - Это то, что думает о тебе компьютер.
http://blacksun.civfanatics.ru
-------------------------------------------------
MTDG2 - [civ]christianity[/civ]Монархия
---------------------------------
Председатель CFR Awards 2007
---------------------------------
Председатель CFR Awards 2008
<div class='quotetop'>Цитата(AFro * 16.1.2007, 18:20) [snapback]155425[/snapback]</div>"Я завтра не на машине поеду, а на работу" ©очень меня заинтересовал файл "CvDeal.cpp".
Там условие капитуляции описывается через переменную "TRADE_SURRENDER", а вовсе не через "DENIAL_POWER_US"[/b]. Это разные типы, разные функции. TRADE_SURRENDER - тип тороговой опции в дипломатии, которая отличается от TRADE_VASSAL тем, что появляется во время войны. "DENIAL_POWER_US" - тип отказа AI от согласия на определенное дипломатическое предложение (в т.ч. сдаться). Во время использования такого типа отказа, данная дипломатическая опция недоступна, т.е выделена красным цветом
.
PS. Вместо кода "соde" можно использовать "соdebox", тогда содержимое будет ограничено окошком.![]()
Кстати, о знаниях программирования. Решил я привязать ситуацию в сейве ко второму (или первому?) условию. Т.е., если я правильно понимаю CanVassalRevolt должна возвращать false, что бы строчка вассалитета в торговле была белого цвета.
Но тут возникли проблемы, в связи с чем - вопрос:
как "дословно" переводятся символы:
"!=", "=", "==", "ll"
и как определить какое значение принимает, ну скажем, функция GC.getDefineINT("VASSAL_REVOLT_OWN_LOSSES_FACTOR") в конкретной ситуации![]()
Даешь освоение С++ через форум
P.S. Я в свое время писал на Borland Pascal 7.0 (еще в институте, курсе на первом-втором), так что за глупые вопросы прошу больно не пинать. Ну не довелось мне на С++ попрограммировать, и ни одного справочника дома не нашлось![]()
В скобках паскалевские обозначения
<div class='quotetop'>Цитата(AFro * 17.1.2007, 18:27) [snapback]155707[/snapback]</div>Код:"==" -- равно("=") "!=" -- не равно("<>") "=" -- присвоить значени(":=") "||" -- или("OR") "&&" -- И ("AND") ! -- НЕ (отрицание)Смотреть код этой функции и думать что она возвращает. А как же ещё?и как определить какое значение принимает, ну скажем, функция GC.getDefineINT("VASSAL_REVOLT_OWN_LOSSES_FACTOR") в конкретной ситуации![]()
[/b]
// Добавил немножко. (GC.getDefineINT - принимает просто целое значение)
VASSAL_REVOLT_OWN_LOSSES_FACTOR - 50 %... От территории (По мому вассальной) (Определено при разборке ф-ции - getVassalPower ())
С пола не упасть!
http://img444.imageshack.us/img444/7241/samogonxg0.png
<div class='quotetop'>Цитата(AFro * 17.1.2007, 19:27) [snapback]155707[/snapback]</div>Да, получается так в данном случае.если я правильно понимаю CanVassalRevolt должна возвращать false, что бы строчка вассалитета в торговле была белого цвета.[/b]
<div class='quotetop'>Цитата</div>Это самый сложный для меня вопроскак "дословно" переводятся символы:
"!=", "=", "==", "ll"[/b]До сих пор гадаю по ситуации. Хорошо бы кто нибудь дал ссылку на объяснение простых знаков cpp.
![]()
<div class='quotetop'>Цитата</div>Это значение всегда постоянно . Все getDefine подставляется из GlobalDefines.xml, я делал таблицу по нему в Excel-формате для наглядности: http://forum.civfanatics.ru/index.php?showtopic=3107и как определить какое значение принимает, ну скажем, функция GC.getDefineINT("VASSAL_REVOLT_OWN_LOSSES_FACTOR") в конкретной ситуации[/b]
<div class='quotetop'>Цитата</div>Я "программировал" только на бейсике, в школеP.S. Я в свое время писал на Borland Pascal 7.0 (еще в институте, курсе на первом-втором), так что за глупые вопросы прошу больно не пинать. Ну не довелось мне на С++ попрограммировать, и ни одного справочника дома не нашлось[/b]
. Так что, даешь освоение C++ в рамках отдельной игры!
vpadlo, подскажи какую нибудь ссылку где эти знаки описываются, м?
PS. vpadlo сказал - vpadlo сделал!http://forum.civfanatics.ru/index.php?showtopic=5299