В предыдущей статье я описал базовые возможности по настройке поведения врагов в 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 сам юзер
Как итог, последний скрипт - это большое развитие предыдущего, он позволяет очень гибко настроить поведение врагов. Но скрипт - это всего лишь инструмент, важно то, как его используют.
Об этом мы и поговорим в следующей статье.
Непонятно, но очень интересно! =)
ОтветитьУдалить