Бегущий по лезвию тяпки

14:21 

mob's ai

Antib
Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Переведу статейку для лучшего усвоения, ну и из тех соображений, что ничто не вечно в Промежсети, особенно стараниями всяких рос-бюрократ-заборов (да, как ни странно, страницы с обзором питонских ide или хоумрулов по "Ужасу Аркхэма" попадают под раздачу).

Улучшенный ai монстра. www.roguebasin.com

Некоторые рогалики используют простой ai. Он действует примерно так:

если ВижуГероя тогда АтакуюГероя()
иначе ДелатьНичего()

Удивительно, но это работает. Но чтобы дать монстрам больше стиля и индивидуальности его надо расширить.

Соображения JSwing'а на этот счёт:

1.Разные монстры хотят разные вещи.
2.Монстры узнают других монстров и вещи и взаимодействуют с ними, даже если героя нет поблизости.
3.Каждый монстр действует независимо.
4.Группа монстров должна осознавать себя как группу.
5.Всё это можно сделать ещё сложнее, но нам нужна годная иллюзия интересного поведения,а не совершенный ai. Монстр в среднем живёт 100 ходов, из них 10% времени он видим игроку.

Поведение можно разделить на 5 возможных типов: Желание, Страх, Агрессия, Странствия и Разное.

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

Данные отражающие решения:
У каждого монстра 5 значений "веса" по одному на каждое поведения из списка выше. Монстр может иметь особые черты типа ненависть к эльфам или жажда золота, что добавляет к базовым значениям соответствующих желаний. Чтобы монстр действовал согласно Желания, должен быть список вещей, которые он желает.

Чтобы работали Страх и Агрессия у монстра должно быть сравнительное представление своей силы и силы видимых ему других монстров.
*Возможное дополнение: у монстра может быть сравнительное "глупое" и "умное" значение силы, так человек-крестьянин и человек-маг будут иметь одинаковое значение для глупого монстра.
*Возможное дополнение: уменьшать видимую силу монстра по мере ухудшения его здоровья

Монстр должен иметь список друзей по категориям, например орки всех типов считают друзьями любого орка.
*Возможное дополнение: ввести ряд значений отражающих силу отношения от лютой ненависти до полного поклонения.

Чтобы работало Желание у монстра должен быть список объектов желания. У объекта соответственно должен быть список ценности для монстров.

Во время хода монстр будет делать:
1. Осмотрится и оценит своё окружение. Для всего увиденного он вычисляет значение и отношение чтобы определиться куда и зачем он пойдёт.

2. Если он видит дружественного монстра, то добавляет его видимую силу с поправкой на расстояние к тому, что думает о своей т.к. друзья попытаются сотрудничать.

3. Увиденный не-друг считается врагом. Желание напасть на него у монстра определяется не силой врага, а представлением о его силе и расстоянием до него. Более того, монстр будет атаковать только ближайшего врага в любом направлении, чтобы не пройти мимо одного врага дабы напасть на другого. Также нужно правильно оценивать группы врагов.

4. Для каждого не-друга вычислить значение страха. Например (видимая сила цели)*(6 - расстояние) + 2*(если особые фобии). Группа монстров страшнее индивидуальных.
Если в определённом направлении есть монстры мы увеличиваем значение страха для этого направления. Будет легче, если базовое значение страха не зависит от количества монстров, а страх для направления будет считаться как желание двигаться в противоположном направлении.

(вот тут мне кажется монстр может забиться в угол вместо того, чтоб улизнуть)

5.Для каждого монстра или объекта вычислит желательность, если применимо. Если монстр жаждет золота или конкретный тип снаряжения, следует принять во внимание цену увиденного предмета. Значение желания для каждого направления это сумма желаний в отношении предметов расположенных в данном направлении.

6. Если видно что-то, способное вызвать особое поведение (то самое "Разное") следует вычислить значение привлекательности для этого.

7. Вычислит значение Странствия, которое есть случайно выбранное направление со значением 1 (базовое значение) или 2, если монстр в волнении (не понимаю!). Базовое значение должно быть низким, но увеличивается, если монстр вернулся в посещённую локацию или стоял на месте, во избежание застревания. Не менять значение Странствия если монстр был занят чем-то полезным в данной локации, например спал.

*Возможное дополнение от Эйдена Райдера: Когда монстр занят, скажем ест, что займёт время пропорционально массе пищи, то поле зрения монстра следует уменьшить до 1-2 тайлов, чтобы можно было прокрасться мимо жрущих монстров.

8.Применить ко всему этому вычисленные значения Агрессивности для каждого направления, если они есть, иначе равны 0.

9. Сложить все значения и вычислить направление в котором монстр двинется.

10. Вычисления для монстров в группе должны быть сделаны до того, как они двинуться, чтобы группы не разбредались.

Возможные выводы:
Монстр видящий две различные по силе цели агрессии (слабая близко и сильная дальше) двинется к слабой.
Стивен Солтер возражает, что в интересах монстра напасть на сильную цель. Это позволит группам выбирать более серьёзные цели перед менее значимыми, но я не согласен, т.к. большинство монстров на уровне примерно равны по силе, (ну это где как) то лучше поразить слабого врага, чем быть раненым более сильным. Всё зависит от плотности населения уровня и механики игры.

Дальнейшие примеры не перевожу, т.к. хотя статья по интересующей меня теме, ai на принципе "машины состояний" кажется мне более вменяемым. Если кто-то боится и решает драпать, он не будет тратить время на атаку слабой цели или сбор хлама, который сделает бегство тяжелее.

@темы: Игрища, Шпаргалка

URL
Комментарии
2014-04-12 в 15:02 

Юрий Рэйн
Смотрел неделю назад: http://www.youtube.com/watch?v=Hb_zih4v7Rs Пишем ИИ для Russian AI Cup - может что-то из мыслей добавит (например упоминалось, как заставляли персонаж открывать карту, а не ходить по открытой части), хотя основная логика такая же, как в статье.

Это в принципе оффтоп, но когда смотрю на половину реализации "интеллектуальных" вещей, возникает похожее ощущение "это же по сути просто и как здорово работает!"

Группа монстров страшнее индивидуальных. Если в определённом направлении есть монстры мы увеличиваем значение страха для этого направления.
Или суммируем для "центра масс" (в координатах) группы. Впрочем, что эфективнее для вычислений - вопрос сложный. Но вычислять центр масс, на первый взгляд, может пригодиться для движения в группе.

если монстр в волнении (не понимаю!)
может "поставленный в тупик" = не отдавший предпочтения одному из состояний? Хотя это всего лишь прикидка.

*Возможное дополнение от Эйдена Райдера: Когда монстр занят, скажем ест
А когда ест, он может реагирвоать только на атаку в целях самозащиты.

Это позволит группам выбирать более серьёзные цели перед менее значимыми, но я не согласен, т.к. большинство монстров на уровне примерно равны по силе
Вариант: брать максимальную из тех, что ниже собственной силы? (А ведь у группы она большая)

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

2014-04-12 в 15:36 

Antib
Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Или суммируем для "центра масс" (в координатах) группы. Впрочем, что эфективнее для вычислений - вопрос сложный. Но вычислять центр масс, на первый взгляд, может пригодиться для движения в группе.

Читаю следующую статью на ту же тему и там этот метод приводится. Сразу думается, что при разнообразной игровой механики этот метод имеет существенный недостаток. Представь себе, что у моба такой "центр ненависти" совпадает или близок к позиции какого-нибудь незначительного по силе союзника. Он шарахает туда фаерболом и вместе с тучей раненых врагов обретает ещё и агрессивных бывших друзей :)

А когда ест, он может реагирвоать только на атаку в целях самозащиты.
Вот тут я предвкушаю много интересного, когда доберусь.

Согласен со всем комментарием, впрочем, персонаж можем прихватить вещь, желательность которой много больше её веса.

Это стоит вспомниьт когда я доберусь до инвентори и объектов.

URL
2014-04-12 в 16:16 

Юрий Рэйн
Представь себе, что у моба такой "центр ненависти" совпадает или близок к позиции какого-нибудь незначительного по силе союзника. Он шарахает туда фаерболом и вместе с тучей раненых врагов обретает ещё и агрессивных бывших друзей :)
Согласен. Возможность атаки я в такой ситуации не предполагал.

Это стоит вспомниьт когда я доберусь до инвентори и объектов.
Когда это писал,представлял маленький алмаз невероятной стоимости и бегущего мимо него персонажа с мыслями "слишком тяжёлый".

Интересно, зачит что-то пишется?

2014-04-12 в 18:33 

Antib
Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Когда это писал,представлял маленький алмаз невероятной стоимости и бегущего мимо него персонажа с мыслями "слишком тяжёлый".
Жизнь дороже алмаза.

Интересно, зачит что-то пишется?

Ну я занимаюсь этим в свободное от работы время, когда ещё не устал и ничего не отвлекает, при этом по ходу пьесы учусь программировать.
В наличии есть вычисления расстояний и направлений по координатам, генерация уровня в виде словаря tiles[(x,y)] = TileType и поиск пути по А*,очередь событий с поддержкой прерывания одного действия другим, тип данных для статов персонажа с поддержкой баффа/дебаффа и экспы, вложенной в прокачку стата.
Я планирую пока так:
1. придумать как складировать наблюдения персонажа чтобы было о чём думать той самой evaluation function
2. состояния на основе этих наблюдений типа Страх, Ненависть и Покой.
3. и наконец попытаться собрать всё это время и пространство в кучку, чтобы по сгенерёному уровню один моб побегал от другого.
Если это заработает imho можно будет сказать, что что-то пишется.

URL
2014-04-13 в 10:20 

Antib
Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
Смотрел неделю назад: www.youtube.com/watch?v=Hb_zih4v7Rs Пишем ИИ для Russian AI Cup - может что-то из мыслей добавит

Посмотрел, интересно, но о тактическом взаимодействии персонажей пока думать рано. Я понял, что мне ещё надо толком продумать скиллы, их проверку и здоровье персонажа.

URL
2014-04-13 в 10:46 

Юрий Рэйн
Жизнь дороже алмаза.
Даже если на него можно купить много необходимых вещей, а враг далеко?)

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

2. состояния на основе этих наблюдений типа Страх, Ненависть и Покой.
И Желание. (желать предмет, еду, вступить в группу, а в случае с противником пересекается с ненавистью).
Так же, как и система скиллов - достаточно сложная задача.

2014-04-13 в 11:36 

Antib
Ya! Ya! In his house at New Orlean, undead Lestat waits dreaming.
В голову приходит в общем-то логичная мысль, о использовании списка, сортируемого по значению важности, если таковая будет. (Или какого-нибудь наворота вроде кучи - heapq. Суть в принципе одна.)

На heapq у меня как раз очередь событий.

По объектам у меня пока мыслей вообще нет. От лишних очистил, нужных не надумал. Соответственно Желание и покупку всякого на алмазы надо оставить на потом.

Чтобы работала функция оценки нужны навыки и здоровье.
Навык оценки других и противоположный навык произведения грозного или напротив слабого впечатления.
Здоровье думаю сделать как длительный дебафф случайного телесного атрибута. Если какой атрибут свели до 0, то кранты. Соответсвенно лечение это уменьшение срока того дебаффа.

Скилы я хочу сделать более влияющими чем атрибуты, так что они должны быть чем-то вроде множителей. Тут я ещу думаю. Просто суммировать Ловкость + Скрытность как в ВтМ не хочу, т.к. логичнее считаю когда тот кто больше понимает в скрытности найдёт способ спрятаться так, как ловкий, но мало секущий в маскировке.

URL
Комментирование для вас недоступно.
Для того, чтобы получить возможность комментировать, авторизуйтесь:
 
РегистрацияЗабыли пароль?
главная