вторник, 6 апреля 2021 г.

ИИ в RPG Maker. Продвинутые враги.

В предыдущей статье я описал базовые возможности по настройке поведения врагов в RPG Maker. Обычно этого достаточно, если вы делаете сюжетную RPG старой японской школы, разбавленную случайными боями и редкими битвами с боссами.

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


2. Продвинутые настройки.

Когда речь идет о продвинутом в мейкере, обычно, это сторонние или самописные скрипты, и тут не исключение.

Скриптов ИИ для мейкера существует не так много, а я использовал еще меньше. И первый из них, самый простой и примитивный по возможностям, я использовал в ДДД.


Это Smarter Enemy AI by Fomar0153 для VX(ACE).

Он (автоматом) настраивает врагов-лекарей на лечение самого пострадавшего из их группы, а также учит их не баффать/дебаффать тех, на ком уже висит этот бафф/дебафф, правда, для последней фичи приходится в заметках врага прописывать все подобные стейты в виде <state_ai x>.


Следующий скрипт для аси я не трогал, но использовал его развитие для MV. Для Ace это Advanced AI conditions от Archeia (https://rpgmaker.net/scripts/541/)

Он дает чуть более расширенные условия, нужные для срабатывания скилла, но, самое главное - позволяет задавать комбинации условий (через И), чего в стандартных настройках не добьешься (как я писал в предыдущей заметке, в окне можно выбрать только одно условие). К примеру, на каждом 3м ходу враг может лечиться, но если у него меньше 20% HP, что обычными настройками не добиться (там либо шаг, либо условие на HP).

Для этого дела в заметках используется тег <ai_conditions>задаем условия</ai_conditions>. 

В заметках скилла (вражеского) можно задавать крайне полезные условия target_hpgt n (Enemy HP > n), target_hplt n (Enemy HP < n), target_states: n, n... (враг имеет статус), target_states_not: n, n... (враг не имеет статус) и так далее. Полезно оно для того, чтобы враги могли применять скиллы в зависимости от цели (героя из пати). Например, не травить дважды или добить наверняка сильным скиллом, если HP героя достаточно низкое.

В настройках врагов так же используются новые условия, описанные ранее, и можно использовать обычные, что дает сам мейкер; например hpgt n, turns_order: a+bx и так далее - все описания по ссылке выше.

Наконец, можно задать отдельно <turn_pattern: a+bx> под которым определяется список skill: a, b (а - номер, b - рейтинг), аналогично turn no. стандартного окна мейкера.

В общем, если в проекте на асе вам хочется настроить приличный ИИ врагов, и есть идеи, как, когда и что делать - то этот скрипт будет крайне полезен.


Наконец, последний YEP_BattleAICore для MV (http://yanfly.moe/2015/10/19/yep-16-battle-a-i-core/), самый продвинутый из перечисленных в статье. Настройки задаются похоже, в тегах, в ноутсах врагов.
<AI Priority>                    
   condition: SKILL x, target   
   condition: skill name, target  (skill name - название скилла в БД, удобней, чем номер)
 </AI Priority>   
Плюс еще можно накинуть сверху  <AI Level: x>, который означает рандомность, с которой враг следует этому описанию <AI Priority>. Например, если стоит два условия, которые должны сработать в этот ход, и <AI Level: 80>, то первое в списке сработает с 80% вероятностью, и есть 20% шанс, то срабтает следующее, и так далее.

Разберем три составляющих каждой строки подробнее:

1. condition
Условия (conditions) куда богаче предыдущего скрипта.
- Always = всегда (пример Always: Skill 10, Lowest HP%).

- ELEMENT X case (пример Element Fire Weakness: Fireball, Lowest HP%). Полезно, чтобы враги были шибко хитрые и шмаляли магией с учетом слабостей выших героев.

- eval (любой код со скоупом битвы) Eval user.name() === 'Bat A': Skill 10, Highest HP% - тут можно творить, чудеса, к примеру см статью http://yanfly.moe/2015/10/19/yep-16-battle-a-i-core/. Это выбор знающих жавасткриптовые внутренности мейкера или хотя бы документацию.

group ALIVE MEMBERS eval (пример Party Alive Members > 2: Skill 10, Lowest HP%), group = 'party' для своей команды или 'troop' для банды врагов. Пригодится для экстренных лечений или воскрешений, или вообще сбежать, если остался один.

- group DEAD MEMBERS eval (пример Troop Dead Members === $gameVariables.value(3): Skill 12, Random) все аналично предыдущему, но для мертвых членов группы. Аналогично.

- stat PARAM eval, где stat = 'atk', 'def', 'mat', 'mdf', 'agi', 'luk', 'maxhp', 'maxmp', 'hp', 'mp', 'hp%', 'mp%', или 'level'. Проверка параметра, например MP param > 90: Mana Drain, Highest MP

- USER stat PARAM eval, аналогично, но проверка на юзере.

- type PARTY LEVEL eval, где type = 'highest', 'lowest', 'average', например Highest Party Level > 10: Skill 10, Lowest MP%. Можно настроить атаки врагов в зависимости от уровня партии.

- RANDOM x%, просто рандом => Random 50%: Skill 10, Lowest HP%

- STATE === state x
- STATE === state name
Проверяем состояние героя, воскрешаем или снимаем его, как тут: State === Knockout: Life, Random.

- SWITCH X case, проверяем свитч, Switch 5 On: Skill 10, Lowest HP%

- VARIABLE X eval, налог с переменными. Variable 5 <= 100: Skill 11, Highest HP%

- TURN eval, проверка номера хода, Turn === 4: Skill 11, Highest hp%. Зная, как делать деление с остатком в js можно эмулировать turn no.

Также позволительно добавлять множественные условия в одной строки (И) через +++
STATE === Blind +++ STATE === Fear: Dark, Lowest HP%.

2. Скилл, тут все понятно, либо по номеру (Skill 10), либо по названию Fireball.

3. Цель - в кого шмалять.
Выбор огромный, проще почитать документацию или примеры выше, опишу нестандартные:
<<nothing>>       случайный враг/друг
     First             первый
     User             сам юзер

Как итог, последний скрипт - это большое развитие предыдущего, он позволяет очень гибко настроить поведение врагов. Но скрипт - это всего лишь инструмент, важно то, как его используют. 

Об этом мы и поговорим в следующей статье.

1 комментарий: