+ Ответить в теме
Страница 2 из 2 ПерваяПервая 12
Показано с 21 по 31 из 31

Тема: XML параметры AI лидера

  1. #21
    Полководец Аватар для razer


    Регистрация
    25.12.2006
    Адрес
    Moscow City
    Сообщений
    282
    <div class='quotetop'>Цитата(NeverMind * 17.1.2006, 1:50) [snapback]73407[/snapback]</div>
    ПАРАМЕТРЫ AI
    <iWonderConstructionRand>: Isak - дополнительный 1dX рандомайзер вероятности начала строительства Чуда (я думаю, что это все таки процентная (?) вероятность начала строительства Чуда, прямая зависимость, а не обратная)
    - [0, 10, 20, 30, 40, 50] 0 - Montezuma, 50 - Louis XIV
    [/b]
    Гы, а я видел както, что Монтецума построил пирамиды и включил сразу же police state =))
    продвинь это сообщение в соцсеть:  
    [civ]christianity[/civ]In baks we trast.

  2. #22
    Божество

    Аватар для Lexad


    Регистрация
    29.12.2005
    Адрес
    Новосибирск-Москва
    Сообщений
    7,396
    Так вероятность дополнительная...
    продвинь это сообщение в соцсеть:  
    Krieg души

  3. #23
    Надо думать, а не думается что то . Давайте вместе посмотрим и объясним. Вот полная функция отказа AI от торговли технологиями, т.е. когда они выделены красным в дипломатии. В т.ч и "монопольный" отказ.

    [codebox]DenialTypes CvTeamAI::AI_techTrade(TechTypes eTech, TeamTypes eTeam) const
    {
    PROFILE_FUNC();

    AttitudeTypes eAttitude;
    int iNoTechTradeThreshold;
    int iTechTradeKnownPercent;
    int iKnownCount;
    int iPossibleKnownCount;
    int iI, iJ;

    FAssertMsg(eTeam != getID(), "shouldn&#39;t call this function on ourselves");

    if (isHuman())
    {
    return NO_DENIAL;
    }

    /*
    if (isVassal(eTeam))
    {
    return NO_DENIAL;
    }
    */

    if (isAtWar(eTeam))
    {
    return NO_DENIAL;
    }

    if (AI_getWorstEnemy() == eTeam)
    {
    return DENIAL_WORST_ENEMY;
    }

    eAttitude = AI_getAttitude(eTeam);

    for (iI = 0; iI < MAX_PLAYERS; iI++)
    {
    if (GET_PLAYER((PlayerTypes)iI).isAlive())
    {
    if (GET_PLAYER((PlayerTypes)iI).getTeam() == getID())
    {
    if (eAttitude <= GC.getLeaderHeadInfo(GET_PLAYER((PlayerTypes)iI).getPersonalityType()).getTechRefuseAttitudeThreshold())
    {
    return DENIAL_ATTITUDE;
    }
    }
    }
    }

    if (eAttitude < ATTITUDE_FRIENDLY)
    {
    if ((GC.getGameINLINE().getTeamRank(getID()) < (GC.getGameINLINE().countCivTeamsEverAlive() / 2)) ||
    (GC.getGameINLINE().getTeamRank(eTeam) < (GC.getGameINLINE().countCivTeamsEverAlive() / 2)))
    {
    iNoTechTradeThreshold = AI_noTechTradeThreshold();

    iNoTechTradeThreshold *= max(0, (GC.getHandicapInfo(GET_TEAM(eTeam).getHandicapType()).getNoTechTradeModifier() + 100));
    iNoTechTradeThreshold /= 100;

    if (AI_getMemoryCount(eTeam, MEMORY_RECEIVED_TECH_FROM_ANY) > iNoTechTradeThreshold)
    {
    return DENIAL_TECH_WHORE;
    }
    }

    iKnownCount = 0;
    iPossibleKnownCount = 0;

    for (iI = 0; iI < MAX_CIV_TEAMS; iI++)
    {
    if (GET_TEAM((TeamTypes)iI).isAlive())
    {
    if ((iI != getID()) && (iI != eTeam))
    {
    if (isHasMet((TeamTypes)iI))
    {
    if (GET_TEAM((TeamTypes)iI).isHasTech(eTech))
    {
    iKnownCount++;
    }

    iPossibleKnownCount++;
    }
    }
    }
    }

    iTechTradeKnownPercent = AI_techTradeKnownPercent();

    iTechTradeKnownPercent *= max(0, (GC.getHandicapInfo(GET_TEAM(eTeam).getHandicapType()).getTechTradeKnownModifier() + 100));
    iTechTradeKnownPercent /= 100;

    if ((iPossibleKnownCount > 0) ? (((iKnownCount * 100) / iPossibleKnownCount) < iTechTradeKnownPercent) : (iTechTradeKnownPercent > 0))
    {
    return DENIAL_TECH_MONOPOLY;
    }

    }

    for (iI = 0; iI < GC.getNumUnitInfos(); iI++)
    {
    if (isTechRequiredForUnit(eTech, ((UnitTypes)iI)))
    {
    if (isWorldUnitClass((UnitClassTypes)(GC.getUnitInfo((UnitTypes)iI).getUnitClassType())))
    {
    if (getUnitClassMaking((UnitClassTypes)(GC.getUnitInfo((UnitTypes)iI).getUnitClassType())) > 0)
    {
    return DENIAL_MYSTERY;
    }
    }
    }
    }

    for (iI = 0; iI < GC.getNumBuildingInfos(); iI++)
    {
    if (isTechRequiredForBuilding(eTech, ((BuildingTypes)iI)))
    {
    if (isWorldWonderClass((BuildingClassTypes)(GC.getBuildingInfo((BuildingTypes)iI).getBuildingClassType())))
    {
    if (getBuildingClassMaking((BuildingClassTypes)(GC.getBuildingInfo((BuildingTypes)iI).getBuildingClassType())) > 0)
    {
    return DENIAL_MYSTERY;
    }
    }
    }
    }

    for (iI = 0; iI < GC.getNumProjectInfos(); iI++)
    {
    if (GC.getProjectInfo((ProjectTypes)iI).getTechPrereq() == eTech)
    {
    if (isWorldProject((ProjectTypes)iI))
    {
    if (getProjectMaking((ProjectTypes)iI) > 0)
    {
    return DENIAL_MYSTERY;
    }
    }

    for (iJ = 0; iJ < GC.getNumVictoryInfos(); iJ++)
    {
    if (GC.getGameINLINE().isVictoryValid((VictoryTypes)iJ))
    {
    if (GC.getProjectInfo((ProjectTypes)iI).getVictoryThreshold((VictoryTypes)iJ))
    {
    return DENIAL_VICTORY;
    }
    }
    }
    }
    }

    return NO_DENIAL;
    }[/codebox]

    А это - как AI считает процент.

    [code]int CvTeamAI::AI_techTradeKnownPercent() const
    {
    продвинь это сообщение в соцсеть:  

  4. #24
    Божество

    Аватар для Lexad


    Регистрация
    29.12.2005
    Адрес
    Новосибирск-Москва
    Сообщений
    7,396
    Какие приколисты, мило так называют строки отказа от торговли...

    Из релевантного в первом боксе (про вообще желание торговать, без привязки к монополии):
    - если отношение меньше либо равно, чем TechRefuseAttitudeThreshold в LeaderHeadInfo, то отказать с формулировкой DENIAL_ATTITUDE ("We just don&#39;t like you that much" - вроде такая строка текста)
    - из остальных - если отношения хуже "Friendly" и оба в топ-половине по очкам среди всех когда либо живших - (?), то порог торговли = noTechTradeThreshold данного ИИ*(NoTechTradeModifier/100 + 1) - что-то про нежелание давать техи на халяву, по-моему; не отказ ли из-за высокого уровня развития? Не суть важно, впрочем

    Теперь самое релевантное, выделенное жирным - про монополию:
    - Если отношения хуже "Friendly" и оба в верхней(?) половине по очкам среди всех когда-либо живших; иначе не принимает знание остальными во внимание.
    - Процент знания техи определяется среди (дополнение - известных продавцу) ныне здравствующих (перед расчетом числителя и знаменателя идет if (GET_TEAM((TeamTypes)iI).isAlive()) )
    - Вопрос - среди кого именно здравствующих? Что значит if ((iI != getID()) && (iI != eTeam)) - "все, кроме продавца и покупателя"? Я не программист, не уверен.
    - Порог процента знающих = techTradeKnownPercent данного ИИ*(TechTradeKnownModifier/100 + 1). Если отношение процента знающих среди живущих будет больше (строго) порога - DENIAL_TECH_MONOPOLY (отказ по монопольным соображениям)

    Остальное - отказ в военных итехах, в техах, по которым строится чудо, в техах, ведущих к победе.
    продвинь это сообщение в соцсеть:  
    Krieg души

  5. #25
    Божество

    Аватар для Lexad


    Регистрация
    29.12.2005
    Адрес
    Новосибирск-Москва
    Сообщений
    7,396
    Отсюда вывод, если я не ошибся - чтобы монополист начал торговать техами, надо либо самому выскочить из верхней поовины, либо зафрендить его, либо вынести его из верхней половины.
    продвинь это сообщение в соцсеть:  
    Krieg души

  6. #26
    Божество

    Аватар для Lexad


    Регистрация
    29.12.2005
    Адрес
    Новосибирск-Москва
    Сообщений
    7,396
    А второе окошко просто берет средний по команде модифайер, как я понимаю, и для игры без команд просто = TechTradeKnownPercent
    продвинь это сообщение в соцсеть:  
    Krieg души

  7. #27
    А что обозначают эти 2 показателя ?
    iVassalPowerModifier
    iFreedomAppreciation
    продвинь это сообщение в соцсеть:  

  8. #28
    Божество

    Аватар для Lexad


    Регистрация
    29.12.2005
    Адрес
    Новосибирск-Москва
    Сообщений
    7,396
    Доанализ кода (порядок соответсвует порядку согласия или отказа в коде). Мой пост №24 был не совсем верен.

    1. С нами не будут торговать, если мы - злейший враг, даже если при таких отношениях ИИ и согласен в общем меняться техами. Следовательно, напасть на Мусу, а потом при Аннойд пытаться торгануть не стоит (теоретически).

    2. Вассал не жмет техи от хозяина (но может быть и наоборот, надо протестить )

    3. Если Френдли - техи не жмет, даже монопольные. Также не обращает внимания на количество тех, полученных нами от других игроков.

    4. Если хуже Френдли, и ранг хотя бы одного из участников обмена (?- не уверен в значении значка ||) - в верхней половине всех, когда-либо живших (округление вниз, т.е. 5-й из 9 не подходит), и мы получили от других игроков тех больше, чем ИИ готов терпеть (индивидуальный параметр iNoTechTradeThreshold, умноженный на [1 + гандикап уровня сложности, который еще надо доставать из кода]), то в дело вступает пресловутая WFYABTA - We fear you are becoming too advanced. И отказ (DENIAL_TECH_WHORE).

    Гандикап: К-т сложности для Notechtradethreshold = 2 - 0.1*i, где i = 0-8 (Сеттлер-Бог)
    (с) Dynamic

    Пример - Ганди на Боге. У него iNoTechTradeThreshold 15, гандикап 20, итого он тготов с нами торговать, если мы выменяли не более 18 тех у других ИИ (дары тоже считаются). С другой стороны, все ИИ с вероятностью 5% в ход могут забыть нам 1 теху, выменянную у других.

    Мораль: на высоких уровнях с злопамятными ИИ (см низкий iNoTechTradeThreshold в таблицах NeverMind-а) лучше не выменивать всякие ненужные вещи, типа Луков или Божественного Права.


    5. Если хуже Френдли, но без разницы, какие ранги, то берем всех известных продавцу игроков, кроме него самого и нас, и смотрим, сколько из них знают теху.

    щас допишу
    продвинь это сообщение в соцсеть:  
    Krieg души

  9. #29
    Божество

    Аватар для Lexad


    Регистрация
    29.12.2005
    Адрес
    Новосибирск-Москва
    Сообщений
    7,396
    Часть 2 - тут менять особо нечего:

    Процент встреченных продавцом живых цив (кроме нас и продавца) сравниваем с индивидуальным параметром продавца techTradeKnownPercent. Если знают меньше, отказ (DENIAL_TECH_MONOPOLY)

    6. Далее - могут отказать менять теху, дающую новые юниты, здания или проекты (DENIAL_MYSTERY). Подробнее - надо лезть вне выложенного кода.

    7. Техи, дающие победные проекты (СМИ, Аполлон, детали корабля), не меняют (DENIAL_VICTORY).

    Ну, а если вам ни разу не отказали - поздравляем.
    продвинь это сообщение в соцсеть:  
    Krieg души

  10. #30
    Администратор


    Аватар для Dynamic


    Регистрация
    07.04.2005
    Адрес
    Санкт-Петербург
    Сообщений
    12,186
    || - логическое ИЛИ

    Техи, дающие новые юниты, здания или проекты обсчитываются дважды.
    Первый раз при расчете монопольности (там большая, но понятная функция), второй - пункт 6 по Лехе. Но по пункту 6 проверка странная какая-то, я не смог найти кода.
    продвинь это сообщение в соцсеть:  
    PBEM-169 - Зулу, PBEM-170 - Америка, PBEM-172 - Египет, PBEM-174 - Англия

  11. #31
    Божество

    Аватар для Lexad


    Регистрация
    29.12.2005
    Адрес
    Новосибирск-Москва
    Сообщений
    7,396


    <div class='quotetop'>Цитата</div>
    || - логическое ИЛИ[/b]
    Ну, значит я был прав
    продвинь это сообщение в соцсеть:  
    Krieg души

+ Ответить в теме
Страница 2 из 2 ПерваяПервая 12

Ваши права

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

free counters