[quote]Бот замирает возле стены, упершись в неё взглядом.[/quote]
Хмм... Помнится, в даггерфоле они были умнее. Там было заклинание истинной невидимости, не слетающее при атаке.
Когда ты истинно невидимый бил оппонента, он двигаться в твою сторону, пытаясь атаковать вслепую. Потом некоторое время блуждал случайным образом и останавливался. Причём если приблизиться иногда замечал, и атаковал (надо понимать, "на слух").
[quote]Но для такой компании как Беседка, не написать нормальный ИИ для игры... я бы отнёс это к лаже[/quote]
Вот именно.
Для "полигонного супа" (когда карта представляет собой набор разрозненных объектов, никак не связанных кроме близкого взаимного расположения) жизненно важной является предварительная разметка. Они пошли по правильному пути - но во первых, выпустили морровинд до того, как довели это до ума, а во-вторых, разметки в подавляющем большинстве мест не было! То есть в редакторе есть функция "сгенерировать рельсы автоматически", но ей никто не воспользовался, ни для одной клетки мира, ЕМНИП. Генерирует она криво, и неписи не могут этой сеткой воспользоваться. Насколько понял, оно прижимало навигационные узлы слишком близко к полу, и ИИ считал пути непроходимыми, поскольку соединяющие их векторы проходили сквозь полигоны земли и пола. Другая возможность - узлы оказывались на полмилиметра под полом, и ИИ считал что к ним нет пути, поскольку они на другой стороне полигона. Какая-то дурь в этом духе. Короче, если открыть редактор и поискать там навигационных узлов, то найдётся очень немного, вручную расставленных на мостах в Бальморе. Причём неписи, ничтоже сумнящеся, плюют на эти рельсы и переходят речку вброд рядом с мостиком (там где берега достаточно пологие для этого).
Я немного поработал с редактором, в Ф:НВ эта мутотенть выглядит абсолютно одинаково (и вообще редактор со времён муравинда изменился мало), но похоже научилась-таки работать. Но для полигонного супа этого мало! По идее, движок должен поддерживать разметку объёмов, которым художник может задавать свойства-намёки "это хорошая снайперская нычка", "здесь лучше не маячить" и так далее, раз уж ИИ не блещет. Но нет, ничего подобного нету. только точки и вектора между ними. Ну, ещё невидимые стены чтобы отбить охоту лазить на сюжетно непроходимые горы.
Теперь давайте о том, до чего я допёр в своём велосипеде, и что ЕМНИП изначально было в Quake 2 и выше. Навигационная сетка должна представлять не точки, связанные векторами, а *объёмы*, связанные векторами! То есть, да, у объёма есть какая-то очка, к которой непись стремится пока он снаружи. Но как только он оказался внутри объёма - он считается принадлежащим ему, и сразу выбирает следующую точку в графе. По умному подбирая размер и форму объёмов, можно легко научить ИИ ходить даже по очень пересечённой местности. В квейке было очень просто, объёмы происходили от брашей, из которых составлялся мир (браш - это (обычно) полый геометрический объём, складывающийся с другими брашами таким образом, что при наложении образуют единое свободное пространство сложной формы. Основа основ всех 3д игр от первого квейка и как минимум до третьего).
У меня же в игре был "спрайтовый суп" (каждый спрайт физически - цилиндр), и проверять на столкновение с ними было дорого, желательно только с ближайшими (организовано было хранение данных в памяти через одно место). На базовом уровне, проверялась попытка двинуть монстра с текущей скоростью в текущем направлении. Если там оказывалось занято - скорость сбрасывалась в ноль, и монстр начинал "ощупывать" мир вокруг себя, проверяя вправо и влево, причём с увеличенным радиусом. С какой стороны было свободно - в ту и доворачивал каждый кадр. Пока в выбранном направлении не становилось возможно двигаться.
Уровнем выше, по миру было расставлено несколько цилиндрических зон, вручную связанных графами (причём, зоны были только в трудных для навигации местах вроде мостов или огороженной площадки с узким выходом). Я пытался (честно) освежить память, покопавшись в исходном коде, но лишь нажил головную боль от таких детских болезней как тоны некомментированного ассемблерного кода, стада переменных с ничего не говорящими именами из двух букв и важных функций с именами из четырёх... Господи, каким же я был...
Неорганизованным.
Короче, на пальцах. бОльшая часть мира лежала вне зон, но все акторы запоминали последнюю посещённую, и считали что находятся в ней пока не касались другой зоны. По миру от одной зоны до другой можно добраться слепо тыркаясь и обходя препятствия по левой или правой руке. Кроме того, где-то раз в секунду (ибо дорого) монстр проверял напрямую проходимость до игрока, то есть строил цепочку перемещений "в уме" двигая объём равный себе напрямую. Если это перемещение заканчивалось успешным касанием, то монстр плевал на навигационные зоны и бросался на прямик, по базовому алгоритму. Хуже всего было для монстров, ещё не посетивших ни одну зону. Они не знали к чему привязываться, но, ЕМНИП, там был эвристический алгоритм засчитывавший их в ближайшую по какой-то зубодробительной формуле.
Перед мостом была большая и плоская зона, направляющая к узкой зоне на нижних ступенях, та - к узкой зоне на вершине, и так на другую сторону. Монстр не пёрся напрямую к ступеням, он шлёпал к зоне, откуда удобно на них взойти не свалившись в речку и не забредя *под* мост (ибо базовый алгоритм-"тыркание слепого котёнка"). Если на мосту был затор или по другой причине монстр заблудился и пошёл обратно, то он сходя со ступеней наступал на большую плоскую зону (над краем которой располагалась маленькая наступенная), и его разворачивало обратно к началу ступеней. В результате даже тестовая толпа голов в тридцать быстро втягивалась на узкий мостик и резво пересекала его. Я словил немеряного фана когда это всё наконец заработало и людоеды пришли ко мне, перейдя два моста через реку и сделав крюк за границы видимости