Немного обсуждений по матчасти:
WicВопрос по ИИ, раз уж ты глубоко раскопал его - в каких ситуациях ИИ двигается без атаки, хотя имеет возможность атаковать ?
Несколько типов таких ситуаций известны - когда ИИ не хочет получить мульти-отдачу, когда не хочет встать под прожиг с отдачи, когда не хочет прожечь своих.
Но иногда (очень редко) встречаются ситуации, когда так же ведут себя обычные юниты против обычных юнитов.
SavВыбор цели ближней атаки.
- Если ров убивает не меньше четверти стека, то он в принципе считает ров, а так же зыбучие пески, непроходимыми.
- Для каждого гекса вычисляется базовая ценность (неположительное число). Сюда входит опасность из-за наличия стены огня и рва, опасность вставать рядом со своим стеком, если у врага есть площадная атака или огненное дыхание, опасность становиться через клетку от своего стека с огненным даханием, опасность становиться на любой гекс, на котором какой-то враг с круговой атакой сможет атаковать текущий стек вместе с каким-то ещё; а так же опасность подставляться под удар вражеского стека, который в текущий момент ни до кого не доходит.
Оценка ценностей удара врагов. Для каждого стека врага вычисляется:
- Число раундов, за которое можно провести атаку (добраться до цели).
- Ценность гекса, с которого ведётся атака. Здесь берётся базовая ценность гекса, и к ней добавляется часть информации об ударе: ценность блока стрелков, ценность прожечь или ударить круговой атакой дополнительные стеки, штраф за то, что враг ответным ударом прожжёт или ударит круговым ударом дополнительные свои стеки. Если существо большое, берётся худшая ценность из двух гексов, куда он встанет.
- Гекс, с которого надо атаковать цель (берётся самый выгодный по количеству раундов, нужных, чтобы дойти, потом лучший по ценнности, потом кратчайший по длине пути (только для кавалеристов и чемпионов - длиннейший)).
- Ценность удара. Здесь учитывается ценность снятия ответки и ценность самого обмена ударами (без учёта прожига и круговой атаки). Для неактивного врага (ослеплённого, парализованного, окаменённого), а так же палатки первой помощи и подводы с боеприпасам эта ценность всегда равна 0.
- Нужно ли атаковать или просто встать рядом. Если атакующий - гарпия или гарпия-ведьма, то она встанет рядом, если ценность удара меньше ценности гекса. Другие существа встанут рядом, если ценность удара меньше 0, а их сторона лучше противника по стрельбе (здесь учитывается количество стрелков, ударная магия и стрелковые башни). В остальных случаях стек будет атаковать.
- Общая ценность атаки. Она представляет собой сумму ценности гекса и ценности удара. Если стек решил не атаковать, а просто встать рядом, то она равна просто ценности гекса.
После указанных выше расчётов общая ценность и ценность гекса случаным образом изменяются на 25% в сторону увеличения или уменьшения (оба одинаково в процентном выражении). Также обе ценности делятся на число раундов, за которое можно добраться до цели.
Вражеский стек полностью игнорируется как цель для атаки в следующих случаях:
- До него невозможно дойти (за любое число раундов).
- Враг не в замке, а ИИ защищает замок (то есть у замка ИИ нет разрушенных стен, все стеки ИИ внутри замка, и ИИ лучше врага по стрельбе).
- Ещё одно условие, которое содержит баг. Для одноклеточного существа оно корректно и выглядит так: если общая ценность атаки меньше 0 и ценность гекса меньше его базовой ценности (то есть от удара и сам стек пострадает больше, чем враг, и враг ещё и ранит кого-то круговой атакой или прожигом), то враг игнорируется. Для двуклеточного существа условие выглядит так: ценность удара меньше 0 и ценность гекса (как было сказано выше, она выбирается минимальной из 2 гексов, куда встанет стек) меньше базовой ценности гекса, на который встанет хвост стека. Именно из-за этого бага двухгексовые враги не идут на поставленную вплотную стену огня: ценность гекса выбирается минимальной и учитывает огненную стену, в которую встанет голова, а базовая ценность хвоста никакой огненной стены не содержит. Но если общая ценность атаки положительна (например, за стеной не одна фея, а более серьёзный стек, и стена убивает не так много) - то ИИ пойдёт на стену, что периодически удивляет игроков.
Среди всех целей выбирается лучшая следующим образом: активный стек лучше неактивного; потом по минимальному числу раундов, нужному, чтобы добраться до цели (чем меньше, тем лучше); потом по общей ценности (чем больше, тем лучше), потом по потерянному здоровью последнего существа в стеке (чем больше, тем лучше), потом по длине пути до цели (чем меньше, тем лучше).
Далее, если сказочный дракон, архангел или властитель пропасти могут и видят смысл колдовать (ценность колдовства больше общей ценности и ценности гекса лучшего стека) - они всегда колдуют вместо удара. Огр-маг и мастер-джинн (а так же сатир) колдуют только с вероятностью 30%.
Если у ИИ выбран лучший враг:
Если ИИ считает, что к лучшему врагу лучше просто подойти, - он идёт.
Если общая ценность отрицательна и меньше ценности гекса, при этом атакующий - не призванный элементаль, а атакующая сторона лучше противника по стрелкам - то если враг не может ударить по площади или прожечь и есть возможность защитить своего стрелка - идёт защищать.
Иначе он атакует лучшего врага.
Если ИИ игнорирует все стеки врага:
Если не атакует замок, враг не может ударить по площади или прожечь и есть возможность защитить своего стрелка - идёт защищать.
Если не атакует замок и не защищает стрелков - идёт к лучшему по ценности гексу из тех, до которых доходит.
Если атакует замок - идёт как можно ближе к стене (но не входит в ров).
Таким образом, двуклеточный стек может не атаковать в ситуации, аналогичной багу "невидимости" стека за огненной стеной: если базовые опасности гексов таковы, что в лучшей позиции для атаки этого врага передний гекс стека встанет на "опасный" гекс, а задний на неопасный, то этот враг может быть проигнорирован.
Например, можно поставить герою в армию 100 джиннов и 1 фею; поставить город (не башню и не цитадель, чтобы без родных почв) с фортом и без цитадели с 1 чудищем в охране. Напасть на город, феей встать в среднем ряду через 2 гекса налево от ворот (самая дальняя от чудища клетка, такая, чтобы оно доставало до феи), а джинном завейтиться. После этого чудище не будет атаковать фею, а только подойдёт так, чтобы не подставиться под атаку джинна. Причина такая же, как с огненной стеной, только её роль исполняют опасные гексы в зоне досягаемости джинна.
В реальном бою это происходит редко, так как актуально только для стеков, расположенных на границе зоны досягаемости своих сильных стеков, причём только если эти свои стеки ни для кого не доходят; к тому же враг должен быть двухклеточным.
WicКруто ...
На эту тему есть типовая задачка по расстановке в консах стрелковой армии. Например, за Рамп обычно ставятся так - в 6-й стек гранды, в 3-й или 4-й кенты, цель которых - служить приманкой для грейженого стека, чтобы грифы заблокировали грандов, а укусили кентов. Дальше гранды ныкаются в угол, закрываются и отстреливаются.
Но если кентов достаточно много, то грифы могут укусить эльфов. Поэтому при достаточно большом стеке кентов (80+) их обычно делят - в 3-й стек ставят основную массу, а в 4-й стек приманку штук 20. За отсутствием игровой практики могу указать неточные цифры, но общий смысл думаю понятен.
Можно как-то выяснить точные цифры минимально необходимого размера приманки (в зависимости от количества эльфов, размера консы и параметров/навыков героя) ? И соответственно максимально возможный размер основного стека, которого грифы не боятся. Мб калькулятор какой или хотя бы алгоритм вычислений. С учетом +-25% видимо придется указывать разброс.
SavТочных цифр писать не буду, но для оценки можно считать так:
Ценность существа - его AI Value. Добавки/штрафы к его урону и живучести умножаются на ценность под квадратным корнем. Например, если существо имеет штраф при рукопашной и заблокировано, то ценность делится на sqrt(2). Если у героя атака 5, то ценность умножается на sqrt(1.25) (то же, если защита 5). Если наложен щит - ценность умножается на sqrt(1.15) и т. п. Для благословения, проклятья и т. п. бонусом считается то, во сколько раз увеличивается средний урон стека.
Двойной удар для незаблокированного стрелка считается бонусом (умножает ценность на sqrt(2)), а для рукопашника - нет (учтено в AI Value).
Если ИИ считает свою армию в 2 раза слабее вражеской, то ценности всех существ становятся для него одинковыми (пытается убить как можно больше по количеству).
Ценность нанесения урона - это ценность убиваемых существ (их может быть дробное число), но ценность добивания "верхнего" существа с неполным здоровьем берётся как ценность убийства полного здоровья этого существа.
Ценность блока стрелка - это разница между ценностью стека, если он стреляет и если заблокирован (разница может быть в штрафе при рукопашной и двойном выстреле).
Отсюда в принципе всё должно быть можно оценить.
WicСчитается именно атака героя или реальная разница атаки-защиты у юнита АИ и юнита героя ? Армор-оффенс как учитываются ?
Насчет мелкой группы кентов вроде понятен алгоритм, тогда второй вопрос - как посчитать, на какую жирную группу кентов клюнут грифы, не испугавшись ответки ? То есть алгоритм учета ответки нужен.
SavКогда считается ценность, есть только один юнит - тот, который оценивается.
Если быть точным считается бонус к атаке этого юнита (от героя, родной земли и пр.) минус минимальный бонус к атаке по всем юнитам обеих сторон на поле боя.
Ответка считается так же, как удар, через ценность урона. Естественно, с учётом убитых ударом. Урон всегда везде берётся средним.
Вообще почти все вещи оцениваются через изменение ценностей юнитов в результате действия.
Заодно это объясняет, почему в криптах нежить иногда ведет себя не по фен-шую, это как раз из-за +-25%.