WarCraft 3: AI System GUI

» Раздел: Триггеры и объекты
» Автор оригинала: N7 Molot
» Источник: Голова

Решил поделиться своим опытом для новичков и не только, многим известно что я использую GUI. Пошарив по сайту не нашел статью про ИИ систему.
Погнали!!!

Фиксация приказов (new)

Фиксация на поможет оптимизировать проект и нашу работу, так же ИИ система не будет выполнять тот же приказ, который уже выполняет.
Что нужно:
  • переменная с массивом (реал, целогика, логика)
  • несколько триггеров
Первое:
Я использовал переменную реал, вы можете взять целое число (целогика) или значение логики, разницы особой нет, главное что бы в массиве не было пересечений.
Второе:
В первом фиксируем приказ атаки, во втором фиксируем приказ использование способности через событие "Начиняет применять способность", в третьем обнуляем фиксацию приказа при событии "Завершает применять способность и Прерывает применение способности", так же после гибели обнуляем фиксацию приказа и если боевая единица не атакует обнуляем фиксацию приказа.
Можно использовать эту функцию для обычных игроков, что бы не было пересечения применения нестандартных способностей.

К бою готов!

Сразу же/или же после отчета стартового времени Вашего проекта нужно что бы ИИ система уже была готова к бою.
Вот мой пример:
Видно что когда ИИ выбрал героя, он появляется в области под названием "Baza" - и сразу же изучает способность. Изучение способностей можно сделать (даже так интересней будет так то да, костян! ) через случайный расчет (integer - random number (число) and (число) = 1) , скажем 1 к 3. Если у Вас при старте дается стартовая сумма ресурсов, можно произвести закупку первоначальных предметов.

Порядок действий

Это самое просто что можно сделать через GUI.
Нужно:
  1. области действий (или точки (область шириной(x) 1 высотой(y) 1) )
  2. триггеры
  3. переменная точки с массивом
Действия для первого условия:
  1. рисуем области/точки для базы, возле фонтана жизни, магазина и важные стратегические точки (если AOS, то получается, каждая база, фонтан, магазины не в области базы, точки направления движения линий, точки в центре направления)
  2. так же если имеются нейтральные боевые единицы понадобятся точки входа (скажем, позиция входа в лес =D)
Действия для второго условия:
Заранее фиксируем точку при загрузке карты:
Таким образом нам не нужно каждый раз фиксировать точки и удалять их. Утечка не увеличится, так как новый объект не создается. Фиксируем точку в центре нужной области, функция "set = point".
Триггеры (можете использовать все пункты):
Первый триггер:
1.1) событие = боевая единица входит в область (точка)
1.2) условие =>
  • боевая единица под контролем компьютера
  • здоровье (манна) больше или равно количества подходящей для боя (скажем больше 20%)
1.3) действие =>
  • боевая единица выполняет приказ движения/патруля/перейти нападая на противников в зафиксированную точку
Второй триггер:
  • Если боевая единица возле фонтана, то потребуется дополнительный триггер, с событием = "каждая секунда", условием = боевая единица под контролем компьютер и то что здоровье/манна = 100%, так же что боевая единица находится области возле фонтана, действие = движение в точку выхода из базы, и после через случайное число движение в одну из областей (отдельный триггер).
Третий триггер:
2.1) Событие: Каждую секунду
2.2) Действие цикл:
2.2.1) Первое действие под условием:
Условие = Компьютер, Играет (можно не ставить), Жив, Фиксация приказа меньше 1 (атаки)
Действие = Перейти нападая на заранее зафиксированную точку
2.2.2) Второе действие под условием:
Условие = Компьютер, Играет (можно не ставить), Жив, Герой не атакует, Фиксация приказа не равна 0
Действие = Обнуляем фиксацию приказа
Второе действие на поможет избежать паузы ИИ системы.
Четвертый триггер:
  • Если к примеру боевую единицу атаковала пушка (пример AOS), то атакованная боевая единица двигается в зафиксированную точку через функцию "offset" с радиусом атаки пушки или на нужное отрицательное значение, после нужно её удалить или же в близлежащую точку (заранее нарисованную область 1 на 1) возле точки.
Пример: подробнее в виде
Дополнение к воскрешению героя:
  • После смерти, в триггере где идет воскрешение героя, обнуляем значение приказов у убийцы и у убитого.
Пример:
Не забываем фиксировать точку прежде чем отдавать приказ, призы отдаем на зафиксированные точки, после их удаляем.

Закупка

Вариант 1
Так как у нас имеются области/точки возле магазина (базы), то нам проще будет сделать закупку ИИ.
Нужно:
  1. предметы
  2. область (если нет)
  3. триггер - 1
Триггер (пример моя арена):
Что здесь у нас?
Боевая единица под контролем ИИ, входит в область базы (магазина или фонтана, как на примере), если имеет нужное количество золота, но при этом не имеет предмет, который будет получать и тип боевой единица подходящий, то он получает предмет и теряет количество золота равному стоимости предмета.
Крафтинг/Сборка артефактов:
Лучше всего если = боевая единица имеет золото равному общей сумме артефакта давать ему сразу артефакт, или же если имеет компоненты артефакта + количество золота для рецепта, удалять компоненты, давать артефакт, отнимать количество золота равному стоимости рецепта.
Вариант 2
Если хотите что бы ИИ был прям как человек и закупался через приказ то придется делать нам пустую боевую единицу (dummy) с изображением предмета.
  • И делаем вот такой замечательный триггер:
При покупке пустой боевой единицы (dummy) купившая боевая единица получает предмет, который визуализирован боевой единицей . Я добавил ему время жизни одну доли секунду, что бы особо не засорял ресурсную память игры.
за одно пробежался как можно закупаться при полном рюкзаке
Важно: не забывайте сделать отдельный триггер, когда умирает боевая единица (не герой) удалять его из игры, иначе объект будет вечно в памяти игры.
  • Дальше составляем приказ для ИИ:
На примере ставим условие что герой не имеет предмета, который он хочет приобрести, и то что он жив но имеет нужное количество ресурсов для этого (если предмет требует ресурс и древесины и золота, то в условиях выставляем функцию "всё (all)", и выдаем приказ на приобретения боевой единицы (dummy), таким образом у нас визуализация что ИИ реально покупает предмет.

Изучение способностей

Что нам нужно?
  1. триггер - 1
  2. герои у которых есть способности
И так, составляем триггер:
Поясняю:
При повышении уровня, добавляем условие нужного героя, что бы выставить правильно способности, и то что он является компьютером. Через целое число (цикл) которое равняется 1 к функции "Неиспользованное число способностей (Unspent skill points)" зафиксированного героя и через функцию "Learn (изучить)" выбираем нужную способность. Так же убираем ненужные уровни, так как четверная способность изучается у всех на разных уровнях, будьте внимательны. Так же можно рассчитать уровень изучения последней способности, за исключением 4 способности, и повышать после этого уровня способность "Повышение характеристик".

Использования способностей

Нестандартная способность создается на базе стандартных способностях, соответственно имеется функция приказа на её использование (функции: Боевая единица - Order (приказ)), они как известно отдаются на точку (point), цель (target) и без цели (no target). В каждом приказе имеются различные команды от атаки, до использовании способности.
Что нам потребуется:
  • триггер с действиями и условиями, что действие проходит на ИИ (компьютер), к примеру:
Далее выдаем действие, по примеру:
Атакована единица - отдает приказ (базовая способность)
Пример способности на точку:
Возьму за основу "Темная стая". Ваш зоркий глаз увидел, что я взял ещё две функции: "set = point" и "remove point", так как способность используется на точку, в памяти игры эта точка останется, и по этому нам нужно сначала зафиксировать точку (позиция атакующего), потом отдать приказ на точку, затем её удалить.
Пример способности на цель:
Взята "Цепь молний", она как известно используется на цель, фиксация не обязательная.
Пример способности без цель:
Ну тут всё просто. Фиксация не обязательная , её можно произвести на атакованного или же атакующего.
Так же стоит напомнить что есть такие способности как "Стадо ящериц" он называется в списке приказа "Пастуший рог". Если не знаем как называется базовая способность, то придется прописывать jass функцию или же прописывать строку способности. Ссылка на jass будет ниже, а строка находится в "Редакторе объектов", в вкладке "Способности" под строкой "Текст - порядок строк: включен":
Вам потребуется "Jass New Gen Pack" для исправной работы, так как в приказа в стандартном WE нет такой функции, как "Отдать приказ (строка)". А нам она потребуется, и выглядит так:
Таким образом можно облегчить себе работу, что бы не искать базу вашей способности, можно просто прописать строку. В Jass New Gen Pack любую строку можно применить на любую цель, но как правило или фиксируется точка единицы применения или же вовсе не работает, так что запоминайте какая берется цель применения, точка или же единица.
Активнопассивные способности, под тэгом иконки ATT:
можно активировать приказом без цели:
только с приказом на вашу базовую способность. Или строкой ((строка)on\off):
не в каждой способности они включаются и выключаются через строку on\off, смотрите что пишется в вашей базовой способности.
Что получается:
Нам нужны способности и триггер с условиями действия на ИИ и что они будут использовать. Можно сделать по системе случайного числа (random number/переменная с массивом (что бы не было пересечений в рандоме)), как будет на примере болванки, или же на условие, если мало здоровья у единицы, то отдаем приказ. В новой версии болванки стоит дополнительное условие на фиксацию приказа. Эта фиксация не даст использовать другую способность при использовании другой способности.

Жизнь после паузы

После паузы (оглушения/использования способности) ИИ игрок будет стоять на месте, это частое явление. Избежать этого можно через триггер рестарт:
Пример, та же арена. На примере конечно ошибка, с утечкой отряда, его нужно ставить после цикла или же использовать группу игроков.
Через определенное время все ИИ игроки будут выполнять нужное действие. У меня каждый участок действия зафиксирован областью, то есть если ИИ не атакует/атакован, не использует способность или же не выполняет приказ он выполняет приказ с переходом на атаку в зафиксированную точку участка, после зафиксированная точка удаляется, так же если он не имеет нужное количество здоровья и манны для боя, то он переходит на базу/в область источника жизни. Через порядок действий он не будет патрулировать между точками/областями, так как везде выставлено нужное количество здоровья и манны.
Конечно не всегда ИИ игрок будет двигаться после использования способности или же он не до конца исполнит способность и продолжит свой порядок действий. Что бы этого избежать фиксируем игрока ИИ, который использует способность переменной (массив) и в условии рестарта выставляем - не равно зафиксированный ИИ игрок.

Видео

Оговорки в видео:
  1. В триггере на приказ атаки, второе условие, где обнуление, в условии ставим Real не равно 0 или же в действии ставим Real = 0 (который set_Real)
  2. В цикле изучения не ставим индекс игрока А (integer A), должно стаять триггерный игрок (trigger player)

Всем спасибо, будут вопросы пишите.


Просмотров: 1 017

» Лучшие комментарии


Mrachny #1 - 8 месяцев назад 3
Хорошая работа!)
nvc123 #2 - 8 месяцев назад 0
статья про 1 функцию?
вы издеваетесь?
нет, я понимаю что человечество деградирует
но не настолько же
короче я снял с публикации
мб в 2003 году ещё и опубликовали (хотя вряд ли) но в 2016 точно нет
molot39 #3 - 8 месяцев назад 0
nvc123:
статья про 1 функцию?
вы издеваетесь?
нет, я понимаю что человечество деградирует
но не настолько же
короче я снял с публикации
мб в 2003 году ещё и опубликовали (хотя вряд ли) но в 2016 точно нет
Спасибо за то что поддержал, но как видно Mrachny, это по нраву. Да это одна функция, но во многих статьях прописывается что скиллинг делается через ID способности, а тут через базу. Это статья для новичков. Если другие администраторы решат что эта тема не актуальная, я не буду против её удаления.
molot39 #4 - 8 месяцев назад 0
nvc123:
окей, я допишу больше функций про ИИ.
not_name #5 - 6 месяцев назад 0
стадо ящериц в там называется пастуший рог!!
AlexSan #6 - 6 месяцев назад 0
что за шрифт на лого?
molot39 #7 - 6 месяцев назад 0
AlexSan:
что за шрифт на лого?
уже не помню, переносил винду, не все шрифты восстановил, вроде "Cloister Black".

not_name:
стадо ящериц в там называется пастуший рог!!
От души, и в прям он)
Maolink #8 - 6 месяцев назад 0
А где карта с данными триггерами? Файл в загрузке на Jass -_-
molot39 #9 - 5 месяцев назад (отредактировано ) 0
Maolink:
А где карта с данными триггерами? Файл в загрузке на Jass -_-
Цитата из статьи:
Вам потребуется "Jass New Gen Pack" для исправной работы
molot39 #10 - 3 месяца назад 0

Статья обновлена
DemonoiD #11 - 3 месяца назад 0
Утечку можно исключить, добавляя пустую способность юниту в стане и убирая её, когда он из этого самого стана выходит. Либо увеличивая/уменьшая уровень этой способности (что более рационально и дает практически булевую переменную)
molot39 #12 - 3 месяца назад 0
DemonoiD:
Утечку можно исключить, добавляя пустую способность юниту в стане и убирая её, когда он из этого самого стана выходит. Либо увеличивая/уменьшая уровень этой способности (что более рационально и дает практически булевую переменную)
К чему это?
DemonoiD #13 - 3 месяца назад 0
molot39, просто так, умничаю.
molot39 #14 - 3 месяца назад (отредактировано ) 0
DemonoiD:
molot39, просто так, умничаю.
а... прокатит только с дамми, у меня на примере вообще со всеми типами юнитов.