вторник, 10 декабря 2013 г.

Альтернативный ИИ для NWN

Идея ИИ витает в воздухе наверно с самого начала игры в онлайне, но желание лезть в эти дебри было как-то слабовато :)

Итак, чем не нравится ни стандартный, ни ИИ Джасперра (с nwvault):
- Откровенные тормоза. Зависания сервера на 50+ мобах (говорят, это walkwaypoint чудит, я его отдельно оптимизировал, но не тестировал на толпе), иногда - очень редкие TMI.
- В качестве причины предыдущего - перегруженность. Море настроек, проверок, мелких деталей, а по факту 99% мобов живут 3-4 раунда, тупо кидаясь на игроков и умирая. На деле, заменить им эту простыню на включение атаки на первого встречного - разницы не будет. Отдельный момент - спеллкастинг Джасперра. Там в скриптах столько наворочено, что простое вырезание этой части из ИИ мобов без заклинаний поднимает скорость их работы на голову :)
- Выбор цели. Немного приукрашенный рандом. Когда просто случайно, когда выбирает цель самого низкого уровня, с самым низким КБ и т.п. Это, к примеру, довольно осложняет игру бойцами ближнего боя - часто приходится бегать за мобом. И дистанционщиками - приходится качать персонажу КБ, чтобы не пробивали.
- Выманивание. Если выстрелить в кучу, естественно, куча побежит на тебя. Но если аккуратно подходить, чтобы попасть в область видимости только одного моба, то только он за тобой и побежит. Сюда же момент с областью видимости - моб реагирует только в пределах экрана (~30 метров), тогда как камеру можно развернуть так, чтобы видеть примерно на вдвое большее расстояние и более того - стрелять из лука. На такие атаки моб не реагирует вообще.
- Застревание. Это беда скорее самого НВН, чем ИИ, но фикс хотелось бы увидеть.
- Сложность расширения. Не так просто добавить в ИИ свой фит или спелл.

Что я здесь хочу сделать? Прежде всего стоит заметить, что я пишу ИИ полностью с нуля. Можно было бы конечно добавить код к ИИ Джасперра, но он и так имхо слишком уж громоздкий. Особенности:
- Легковесность. Да, большинству мобов хватит и "WAAAGH!!! ATTACK!!!".
- Выбор цели на основе агро-таблиц. Система не идеальна, но сложно придумать что-то изящней, чтобы появились стандартные фэнтезийные архетипы бойцов (танки и т.п.).
- Немного коллективного разума. Программа минимум - чтобы мобы перестали выманиваться. Медиум - сообщать друг другу иммуны врагов. Максимум - действовать более менее коллективно. К примеру, не кидать все диспелы в одного игрока или прикрывать пробитые фланги.
- Оптимизация каста заклинаний. Во-первых, нужна лёгкость добавления новых, во-вторых, просто делать if-elseif-else на 500+ спеллов - не самый подходящий вариант.

Выбор цели уже написан, в нём остались только детали - заполнение агро-таблицы - урон там просто добавляется, числовые значения для атак без урона надо дописать. Сейчас занимаюсь выбором действий мобов, не связанных с магией.