Sargeras
Лидер "Двух Королевств"
offline
Опыт:
21,363Активность: |
Устройство AI-файлов
В этой статье я ознакомлю вас со структурой AI-файлов и сделаю некоторые полезные выводы, которые могут помочь вам в будущем овладеть искусством создания гибкого AI.
Здесь рассмотрен также пример, как сделать AI-скрипт на 4 героя, а также описания многих категорий и функций, встречающихся в файлах подобного типа. Для того чтобы лучше понять содержание статьи, нужно знать основные моменты, касающиеся Jass. Итак, приступим. Устройство AI-файловУстройство AI-файлов я объясню на примере стандартного AI-скрипта, который можно создать, лишь зайдя в AI-редактор World Editor’a. После того, как зайдёте в редактор, нажмите "Файл" --> "Экспорт кода" и сохраните файл в любом месте. Теперь можете открыть этот AI-скрипт стандартным блокнотом или любым jass редактором. Итак, что же мы видим? Файл начинается с обычных jass-комментариев к AI-скрипту, в которых указывается номер дата создания файла и прочая маловажная нам информация. Однако не следует стирать все комментарии в файле ради экономии места – благодаря ним вы сможете не запутаться в подразделах и категориях, из которых состоят AI-скрипты. Первая категория называется Global Variables, то есть глобальные переменные. Сюда можно добавлять и свои переменные, только обозначайте чуть пониже, что они делают. Те переменные, которые присутствуют в скрипте сейчас, стирать не нужно, ибо это приведёт к неработоспособности AI из-за того, что данные переменные встречаются в функциях. Кстати, обратите внимание на язык: Код:
Как вы видите, set здесь писать нету смысла, а те пробелы можно уменьшить в размере – ничего не изменится. Кроме того, когда в скрипт добавляются какие-либо условия, то это также отражается на глобальных переменных. Если условие было логическим сравнением, то будет создана дополнительная переменная типа boolean с названием вида gCond_*, где * - это название условия. Можно сразу ответить на вопрос, почему в AI-редакторе не добавляются условия с русскими буквами. Точно также происходит и с условиями, касающимися сравнения чисел, причём в обоих случаях изначально переменные принимают значение false. Далее идёт категория Utility Functions. Теперь идут те самые функции, в которых участвуют переменные. Здесь содеражатся вспомогательные функции – например, проверка последних команд, нужно ли расширение компьютерному игроку и многое другое. Изменять, как мне кажется, следует на свой страх и риск. Следующий раздел – Basic Options. Здесь указываются все те опции, которые устанавливаются в первом окне AI-редактора, а именно:
Теперь поговорим о категории Conditions – именно здесь указываются и расписываются те условия, которые мы создаём в редакторе AI интеллекта. Вспомнили про переменные вида gCond_*. Здесь и устанавливается, что они собой представляют. Общий вид синтаксиса таков: Код:
Иными словами, можно сказать, что каждую секунду проверяется значение функции/счётчика, и если оно соответствует параметру <значение функции>, то значение условия будет true, а если нет – так и останется false. Теперь самое интересное – категория Heroes, то есть герои. Начинается она с функции SetHero(), которая подразумевает передачу ей целых параметров order и heroid. Об этой передаче поговорим позже, а пока рассмотрим то, из чего состоит эта функция. Здесь рассматриваются случаи – когда, что и чему равно. Берётся переменная hero_id, зачем она нужна – будет рассказано позже. Далее рассматривается каждый герой последовательности (указывается только лишь id-код) и устанавливаются навыки в виде массива skills (также указываются id-коды). Мы можем легко менять все эти параметры, главное, чтобы герой обладал соответствующими навыками, ибо изучать он их не будет, а будет находиться в состоянии тупика. Мы также можем изменить число способностей – ведь часто применяются геройские уровни больше 10. Зная об этом, соответственно, можно изменять и последовательность изучения навыков. После развития способностей идёт подкатегория “Selects hero IDs for three possible heroes”, благодаря которой мы можем регулировать случайность, а также изменять количество героев в игре. Рассмотрим пример из файла: Код:
Объяснять смысл, думаю не надо. Берётся обычное целое число случайным образом в промежутке от 1 до 100, а потом рассматриваются случаи и устанавливаются параметры для функции SetHero. Теперь, о том, как это всё дело улучшить. В принципе, улучшать данную функцию при наличии 3 героев я бы не стал, а вот когда их четыре – средства AI-редактора даже не позволяют нам поставить столько и тем более рассмотреть всякого рода случайности. Для установки равных случайностей выпадения героев, пользуемся формулой P=n! (факториал), где n! = 1*2*3*4*…*n. Благодаря ней можно узнать максимальное количество комбинаций. В случае четырёх героев их аж 24. И все надо рассматривать. Но тут на помощь нам приходит то, что необязательно брать промежуток от 1 до 100 – можно взять и числа побольше или поменьше – например 1 до 24. После этого убираем весь код функции и пишем всё по-новому. Например, пусть наш четвёртый герой – Кровавый маг (id-код – 'Hblm'). Тогда функция будет примерно выглядеть вот так: Код:
Думаю, разобрались с этим, но не забудьте отредактировать верх (последовательность изучения навыков). Приведу такой пример: Код:
Экспериментируйте! Добавляйте больше уровней, больше способностей и больше героев! Идём дальше. Подкатегория ‘Returns the hero skill for the given hero and level” со одной функцией, которая выглядит так: Код:
Здесь, однако, никакого уровня AI нет (лёгкий, сложный и т.п.). Просто в данной функции рассматривается случай, когда у героя уровень побольше и он уже существует в игре. А также данная функция устанавливает навыки для всех случаев. Имейте в виду – сколько у вас значений параметра order – столько же должно быть случаев у этой функции (речь идёт о второй части), ибо одна из частей не будет работать. Допустим у нас максимальный order = 4 (то есть четыре героя), тогда функция будет выглядеть так: Код:
Надеюсь, вы догадались, что в подкатегорию “Stores hero ID and skills” нужно также добавить дополнительные элементы, такие как skills4 и hero_id4., которые будут встречаться в случае, когда order = 4. Теперь приступим к категории Building and Harvesting. Это своего рода экономическая стратегия компьютерного игрока. Думаю, это категория больше всего связана со второй, ибо большинство функций берётся оттуда. Когда я исследовал этот скрипт – я был поражён – настолько здесь всё примитивно… Общий синтаксис команды функции такой: Код:
Хочу дать несколько пояснений по месторасположению в соответствии с игрой. Значения таковы: -1 = Не важно где. 0 = Главный лагерь. 1 = Дополнительный лагерь 1 2 = Дополнительный лагерь 2 3 = Дополнительный лагерь 3 ... Mine + 0 = рудник номер 1 Mine + 1 = рудник номер 2 Mine + 2 = рудник номер 3 ... Если же юнит создаётся при каком-то условии, которое было указано в глобальных переменных, то функция будет выглядеть так: Код:
Но вот здесь можно поэкспериментировать, например, создать триггер случайного числа прямо в этой функции, а потом рассмотреть случаи этого. Приведу такой пример: Код:
Здесь мы взяли локальную переменную number случайным образом. Если она равна 1, то строим рабочего, если 2 – ферму. Вторая подкатегория – “Specifies harvesting priorities for workers”. Особенности сбора для работников. Код:
Несколько пояснений" GetUnitCountDone – это сборщик, тот кто собирает ресурсы, важно, чтобы у него была соответствующая способность. Вводятся 4 локальные переменные. Далее применяется функция HarvestGold(), синтаксис которой таков: Код:
Здесь в принципе, необязательно было вводить numWorkers, а написать значения так. Месторасположение аналогично, как и в предыдущей подкатегории. В следующей подкатегории “Determines all building and harvesting assignments for workers” указываются функции, активизирующие сбор. Понять смысл каждой можно, исходя из перевода. Не будем на ней зацикливаться. Следующая категория – Attacking. Волны атак и прочие параметра, как вы догадались, регулируются здесь. Подкатегория “Returns true if the minimum forces for an attack exist” отвечает за нижние значения вкладки Атака редактора AI. Первый цикл отвечает за лимит волн атаки. Если количество волн уже пройдено, то атака просто не произойдёт: Код:
Далее, более интересный скрипт. Если ничего вы не изменяли в тех нижних параметрах, то атака не произойдёт только в том случае, если будет отсутствовать первый герой. Выглядит это так: Код:
Наверно, вы уже догадались, как сменить того первого героя на второго или третьего, не так ли? Но совсем иной вид скрипт принимает, когда минимальные силы – это какая-либо группа атаки. Код:
Из всего этого можно сделать один очень важный вывод – для того чтобы атаковать – нужно, что все эти юниты-атакующие были в этом списке, хотя ни в справке, ни в редакторе об этом не было ничего сказано. Кто не понял, объясняю на пальцах: у нас дана группа 1 с юнитами Ведьма и Священник (к примеру), и группа 2 с юнитами Ведьма и Герой. Пока священник не будет создан, вторая группа в бой не пойдёт. Используя это свойство, мы можем менять параметры атаки, ограничиваясь какими-либо условиями, что в простом AI-редакторе невозможно. Идём дальше: Подкатегория "Assigns units to attack based on the given attack group". Здесь расписываются юниты группы. Общий синтаксис функций таков: Код:
Вариации – это те же случайные значения. В AI-редакторе это выглядит, как «минимальное значение – максимальное значение». Если вариаций не нужно, то ставить нужно all. Вариации хороши тем, что не нужно создавать новые циклы. Кстати, условия здесь будут применяться также, как и в предыдущих примерах. Подкатегория “Prepares an attack group based on the current attack wave”. Просто и ясно. Подготовка волн к атаке. Можно что-нибудь замудрить с этим… Тем не менее, здесь можно устанавливать порядок атаки, точно также, как и в игре. Но здесь не используется задержка, ибо она будет использоваться чуть дальше, в категории “Sleep delays for each attack wave”. Первый цикл, я так и не понял, для чего, но судя по всему убирать его ни в коем случае нельзя. Далее, идёт главная функция: Код:
Используется только для тех групп, у которых есть значение задержки. Подкатегория “Advances attack wave counter”. Функция там такая: Код:
Вот над ней можно немного помудрить, например, использовать те же случайные значения атаки, можно заморозить какую-либо волну, чтобы она повторялось по несколько раз, используя цикл For, а можно и вовсе понаставить всевозможных условий. Подкатегория “Basic attack functionality” отвечает за атакование врага, или, можно предположить, что за согласование с союзником. Зацикливаться на нём незачем. Но лучше ничего не изменять, на мой взгляд. Предпоследняя подкатегория также мало чем интересна: в ней содержатся сведения о приоритете, понять смысл которых очень легко, соответственно, как и намудрить с ними и добавить что-то своё. Последнюю же категорию также, как мне кажется, не следует обрабатывать, так как в неё содержаться действия, активизирующие параметры категории Basic Options. Зачем же их изменять? Ну и, наконец, последняя категория получила название Main Entry Point. В ней содержится скрипты, активизирующие работу всего AI-файла, а также информация об игроке. На этом всё. Спасибо за внимание! Отредактировано Jon, 02.06.2007 в 23:10. |
02.06.2007, 22:32 | #1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
я вижу многабукф слабо отформатированого текста... |
02.06.2007, 22:34 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sargeras
Лидер "Двух Королевств"
offline
Опыт:
21,363Активность: |
Jon, а к чему его форматировать, позвольте полюбопытствовать? Итак большую часть статью занимает jass-код. Ну, впрочем, если Вас не затруднит, то разрешаю отредактировать текст с точки зрения оформления.
|
02.06.2007, 22:40 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
ну я чуть изменю, вообщем ладно... принцепи далже мб и без разницы.. но всеж...
если непонравится скажи.. назад поменяю... в основном раставил абзацы, но так и пользовался чуть тегами... Jon добавил: по статье: хм.. мне нравицо |
02.06.2007, 23:16 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sargeras
Лидер "Двух Королевств"
offline
Опыт:
21,363Активность: |
Jon, спасибо.
Цитата:
Я рад за Вас) |
|
02.06.2007, 23:22 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
http://xgm.guru/forum/showthread.php?t=8759
имхо стоить включить в текст статьи ссылку как на соосный материал. Я в свою очередь включю линк на эту статью Дополнить бы про передачу данных из ИИ в кэш. В ряде случаев это полезно и незаменимо даже Отредактировано FellGuard, 03.06.2007 в 13:49. |
03.06.2007, 09:03 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sargeras
Лидер "Двух Королевств"
offline
Опыт:
21,363Активность: |
Ну мне кажется, что моя статья получилась лучше, потому что я рассмотрел несколько выводов из AI-скриптов, предложил несколько идей про случайности, да и к тому же написал всё от себя, а скрипты те взял только лишь из самого простого файла AI - поэтому и совпадают местами. Да и писал я её для некампнийского написания AI. Впрочем, хотелось бы знать, что скажут другие. |
03.06.2007, 12:32 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
PlayerDark
Coraline
offline
Опыт:
10,569Активность: |
Вот давно хотел почитать про АИ скрипты.
PlayerDark добавил: Я скрипт контроллер хотел для героев в моих футах сделать но у меня что то не заработало. PlayerDark добавил: Такс , можно было бы конечно описать поподробнее. |
03.06.2007, 12:45 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sargeras
Лидер "Двух Королевств"
offline
Опыт:
21,363Активность: |
PlayerDark, опишите, что именно вы хотите сделать, а я попробую вам написать скрипт, если смогу.
(сам я в jass'e не очень силён, но мои знания по нему позволяют произодить подобную исследовательскую деятельность) |
03.06.2007, 12:47 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
PlayerDark
Coraline
offline
Опыт:
10,569Активность: |
Последнее пожелание - напиши о том как этот нестандартный АИ импортнуть в игру.
PlayerDark добавил: Те я хочу его запустить как обычный мили скрипт но ничего не катит , к тому е я туда засунул функцию которая выводит текст а она не работает. Сейчас свой корявый скриптег выложу. |
03.06.2007, 12:53 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sargeras
Лидер "Двух Королевств"
offline
Опыт:
21,363Активность: |
PlayerDark, триггерами вообще-то. Для начала импортируйте в карту, используя редактор импорта, а затем в триггерах используете следующую функцию:
Начать сценарий поведения для <игрок-компьютер, которому предназначается ai>: <название файла ai, импортированного в карту> Sargeras добавил: Цитата:
Жду с нетерпением). |
|
03.06.2007, 12:56 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
PlayerDark
Coraline
offline
Опыт:
10,569Активность: |
Разрешите использовать АИ формат в импорт. Ну щас паковать буду. |
03.06.2007, 12:58 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Murloc
Powered by Q
offline
Опыт:
16,977Активность: |
Прочитал статью, из неё даже кое чего понял, из-за моего малого понимания редактора понял не всё, но всё же занятно. |
03.06.2007, 14:11 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
YellowStar
poon
offline
Опыт:
15,144Активность: |
Это дело пригодиться. А скрипты эти мона делать на все типы карт:) |
03.06.2007, 14:26 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sargeras
Лидер "Двух Королевств"
offline
Опыт:
21,363Активность: |
NaRaYaN, на все те, где предполагается использование AI. И необязательно разрабатывать стратегию экономическую, можно написать просто для, скажем, той же Hero Arena.
|
03.06.2007, 14:31 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
YellowStar
poon
offline
Опыт:
15,144Активность: |
Спасибо. Буду теперь тренироваться.А кста в херо арена герой будет сам выбирать куда ему топать или надо самому это в тригах добавлять. |
03.06.2007, 14:35 | #16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
Это ты сможеш осуществлять как через триггеры, так и просто постоянным ИИ скриптом + возможность корректировать алгоритм через передачу команды из триггеров в цикл ИИ (в этой статье о передаче команд не сказано, в соседней впрочем тоже особо тема не раскрыта).
Если вписаны команды нападения и включена опция отступления побитых героев/юнитов (SetHeroesFlee(true), SetUnitsFlee(true)) а также опция SetRandomPaths(true) то ии будет вести себя почти вменяемо. |
03.06.2007, 14:43 | #17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sargeras
Лидер "Двух Королевств"
offline
Опыт:
21,363Активность: |
NaRaYaN, надо самому, но в принципе в ai тоже как-то делается. Не знаю, только, как.
|
03.06.2007, 14:44 | #18
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
Вот например так реализовано управление командами с триггеров.
Карту где Гром с орками убивают Кенариуса все помнят? FellGuard добавил: Там Кенариус управляется в зависимости от действий игрока. Скрипт как нельзя больше подходит для контроля над героем в соотв. картах. Спеллы какие есть герой кастует сам, без отдачи приказов |
03.06.2007, 14:53 | #19
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
PlayerDark
Coraline
offline
Опыт:
10,569Активность: |
Хм , вот я тут эксперементировал с АИ для контроля над войсками. Просто раньше я этим не занимался.
PlayerDark добавил: Ну он тут еще не закончен. В принципе просто там некоторые мои мысли есть. |
04.06.2007, 17:44 | #20
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|