+ Ответить в теме
Показано с 1 по 14 из 14

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

  1. #1
    Редактор-наблюдатель Аватар для AFro

    Steam
    76561198030797848

    Регистрация
    22.02.2005
    Адрес
    Москва
    Сообщений
    3,092

    Thumbs up

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

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

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

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

    [attachmentid=1858]
    Вложения Вложения
    продвинь это сообщение в соцсеть:  
    Если ты споришь с идиотом, вероятно, то же самое делает и он...

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

    [code]
    продвинь это сообщение в соцсеть:  

  3. #3
    Бессмертный Аватар для JCricket


    Регистрация
    21.09.2005
    Адрес
    Roads of Israel
    Сообщений
    3,008
    NeverMind, ты даже не имеешь понятия, какое важное открытие ты сделал! Где же ты раньше-то был?
    ИМХО:
    Если сила кандидата в вассалы превышает 3/4 средней силы или 2/3 силы кандидата в феодалы, то последует отказ.
    продвинь это сообщение в соцсеть:  
    Learn from yesterday, live for today, hope for tomorrow.
    Albert Einstein_______________________

  4. #4
    Редактор-наблюдатель Аватар для AFro

    Steam
    76561198030797848

    Регистрация
    22.02.2005
    Адрес
    Москва
    Сообщений
    3,092

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

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

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

    Вероятно, существуют еще какие-то ограничения...
    продвинь это сообщение в соцсеть:  
    Если ты споришь с идиотом, вероятно, то же самое делает и он...

  5. #5
    AFro, приведены два условия. Точно не работает из них только второе. Ситуация в сэйве об этом свидетельствует однозначно .

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

    [code]
    продвинь это сообщение в соцсеть:  

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

  7. #7
    Редактор-наблюдатель Аватар для AFro

    Steam
    76561198030797848

    Регистрация
    22.02.2005
    Адрес
    Москва
    Сообщений
    3,092
    Я, честно говоря, в программировании понимаю довольно таки мало. Однако, склонен рассматривать приведенный NeverMindом код, как условия, при которых уже <strike>капитулировавшая</strike> являющаяся вассалом цивилизация получает независимость от суверена (помимо всего прочего, что там еще присутствует).

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

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

  8. #8
    <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 файлы. Смотри на них просто как на текстовые файлы, и наверняка обнаружишь для себя много интересного без всяких познаний в программировании.
    продвинь это сообщение в соцсеть:  

  9. #9
    Редактор-наблюдатель Аватар для AFro

    Steam
    76561198030797848

    Регистрация
    22.02.2005
    Адрес
    Москва
    Сообщений
    3,092

    Почитал немного...
    очень меня заинтересовал файл "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у - а как сделать код в окошечке? а то уж очень длинное сообщение получилось
    продвинь это сообщение в соцсеть:  
    Если ты споришь с идиотом, вероятно, то же самое делает и он...

  10. #10
    Король Аватар для Blacksun


    Регистрация
    10.05.2006
    Адрес
    М.О. г. Раменское
    Сообщений
    1,873
    Каким то боком относится, но основа - canVassalRevolt ().

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

    [code]
    enum DllExport TradeableItems
    продвинь это сообщение в соцсеть:  
    Программирование - это не то, что ты думаешь.... - Это то, что думает о тебе компьютер.
    http://blacksun.civfanatics.ru
    -------------------------------------------------
    MTDG2 - [civ]christianity[/civ]Монархия
    ---------------------------------
    Председатель CFR Awards 2007
    ---------------------------------
    Председатель CFR Awards 2008

  11. #11
    <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", тогда содержимое будет ограничено окошком.
    продвинь это сообщение в соцсеть:  

  12. #12
    Редактор-наблюдатель Аватар для AFro

    Steam
    76561198030797848

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

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

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

  13. #13
    В скобках паскалевские обозначения
    Код:
    "==" -- равно("=")
    "!=" -- не равно("<>")
    "=" -- присвоить значени(":=")
    "||" -- или("OR")
    "&&" -- И ("AND")
    ! -- НЕ (отрицание)
    <div class='quotetop'>Цитата(AFro * 17.1.2007, 18:27) [snapback]155707[/snapback]</div>
    и как определить какое значение принимает, ну скажем, функция GC.getDefineINT("VASSAL_REVOLT_OWN_LOSSES_FACTOR") в конкретной ситуации
    [/b]
    Смотреть код этой функции и думать что она возвращает. А как же ещё?

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

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

  14. #14


    <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>
    и как определить какое значение принимает, ну скажем, функция 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 (еще в институте, курсе на первом-втором), так что за глупые вопросы прошу больно не пинать. Ну не довелось мне на С++ попрограммировать, и ни одного справочника дома не нашлось [/b]
    Я "программировал" только на бейсике, в школе . Так что, даешь освоение C++ в рамках отдельной игры!

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

    PS. vpadlo сказал - vpadlo сделал! http://forum.civfanatics.ru/index.php?showtopic=5299
    продвинь это сообщение в соцсеть:  

+ Ответить в теме

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
Рейтинг@Mail.ru

free counters