Пробовал с другом разыграть дуэль по следующим правилам:
- играем без объявления войны друг другу;
- победителем считается тот, кто имеет больше вассалов на момент отсутствия свободных от вассалитета 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>Честно говоря, готов конкурировать с тобой в малопонимании программирования, но склонен настаивать на своем понимании приведенного кода . DENIAL_POWER_US в сочетании с AI_surrenderTrade встречается только в двух случаях. И раз второе условие мы можем здесь отбросить, то остается объяснить первое.Я, честно говоря, в программировании понимаю довольно таки мало. Однако, склонен рассматривать приведенный NeverMindом код, как условия, при которых уже <strike>капитулировавшая</strike> являющаяся вассалом цивилизация получает независимость от суверена (помимо всего прочего, что там еще присутствует).[/b]
Для себя я перевожу первое условие как "НЕ является вассалом сейчас И (но) мог бы восстать, если бы был вассалом при данных условиях". Если сразу есть возможность восстать против сюзерена, то нет никакого смысла соглашаться на капитуляцию. Отсюда и отключение капитуляции в диплоконтактах. Логично?
Поэтому я и привел код canVassalRevolt, объяснение которого, по моему, должно стать ключем к пониманию ситуации в твоем сэйве. Надо сосредоточиться и сообразить .
<div class='quotetop'>Цитата</div>Очень даже стоит . Я в мае-июне изучал дипломатию, в т.ч. конкретный смысл дипломатических отказов AI, но до конца не изучил, к тому же тогда меня пугало само слово "SDK". А по отдельности не было повода писать, никто об этом не спрашивал.Может стоить проверить также часто встречающуюся невозможность требования "объявления войны третьей цивилизации", "прекращения торговли с третьей цивилизацией"?[/b]
Так что хорошо, что спросил. Меня тоже интересуют подобные ситуации. Лишний повод подумать и разобраться . А код ты легко можешь найти в каталоге 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>"Я завтра не на машине поеду, а на работу" © . Это разные типы, разные функции. TRADE_SURRENDER - тип тороговой опции в дипломатии, которая отличается от TRADE_VASSAL тем, что появляется во время войны. "DENIAL_POWER_US" - тип отказа AI от согласия на определенное дипломатическое предложение (в т.ч. сдаться). Во время использования такого типа отказа, данная дипломатическая опция недоступна, т.е выделена красным цветом .очень меня заинтересовал файл "CvDeal.cpp".
Там условие капитуляции описывается через переменную "TRADE_SURRENDER", а вовсе не через "DENIAL_POWER_US"[/b]
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>Это самый сложный для меня вопрос До сих пор гадаю по ситуации. Хорошо бы кто нибудь дал ссылку на объяснение простых знаков cpp.как "дословно" переводятся символы:
"!=", "=", "==", "ll"[/b]
<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>Я "программировал" только на бейсике, в школе . Так что, даешь освоение C++ в рамках отдельной игры!P.S. Я в свое время писал на Borland Pascal 7.0 (еще в институте, курсе на первом-втором), так что за глупые вопросы прошу больно не пинать. Ну не довелось мне на С++ попрограммировать, и ни одного справочника дома не нашлось [/b]
vpadlo, подскажи какую нибудь ссылку где эти знаки описываются, м?
PS. vpadlo сказал - vpadlo сделал! http://forum.civfanatics.ru/index.php?showtopic=5299