XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Желтая пресса: обучающие статьи
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

 
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 22,163
Активность:
Устройство AI-файлов
В этой статье я ознакомлю вас со структурой AI-файлов и сделаю некоторые полезные выводы, которые могут помочь вам в будущем овладеть искусством создания гибкого AI.
Здесь рассмотрен также пример, как сделать AI-скрипт на 4 героя, а также описания многих категорий и функций, встречающихся в файлах подобного типа. Для того чтобы лучше понять содержание статьи, нужно знать основные моменты, касающиеся Jass. Итак, приступим.

Устройство AI-файлов


Устройство AI-файлов я объясню на примере стандартного AI-скрипта, который можно создать, лишь зайдя в AI-редактор World Editor’a.
После того, как зайдёте в редактор, нажмите "Файл" --> "Экспорт кода" и сохраните файл в любом месте. Теперь можете открыть этот AI-скрипт стандартным блокнотом или любым jass редактором. Итак, что же мы видим?
Файл начинается с обычных jass-комментариев к AI-скрипту, в которых указывается номер дата создания файла и прочая маловажная нам информация.
Однако не следует стирать все комментарии в файле ради экономии места – благодаря ним вы сможете не запутаться в подразделах и категориях, из которых состоят AI-скрипты.
Первая категория называется Global Variables, то есть глобальные переменные. Сюда можно добавлять и свои переменные, только обозначайте чуть пониже, что они делают. Те переменные, которые присутствуют в скрипте сейчас, стирать не нужно, ибо это приведёт к неработоспособности AI из-за того, что данные переменные встречаются в функциях. Кстати, обратите внимание на язык:
Код:
Globals
<тип переменной> <название переменной> <значение переменной>
...
endglobals

Как вы видите, set здесь писать нету смысла, а те пробелы можно уменьшить в размере – ничего не изменится. Кроме того, когда в скрипт добавляются какие-либо условия, то это также отражается на глобальных переменных. Если условие было логическим сравнением, то будет создана дополнительная переменная типа boolean с названием вида gCond_*, где * - это название условия. Можно сразу ответить на вопрос, почему в AI-редакторе не добавляются условия с русскими буквами. Точно также происходит и с условиями, касающимися сравнения чисел, причём в обоих случаях изначально переменные принимают значение false.
Далее идёт категория Utility Functions. Теперь идут те самые функции, в которых участвуют переменные. Здесь содеражатся вспомогательные функции – например, проверка последних команд, нужно ли расширение компьютерному игроку и многое другое. Изменять, как мне кажется, следует на свой страх и риск.

Следующий раздел – Basic Options. Здесь указываются все те опции, которые устанавливаются в первом окне AI-редактора, а именно:
  • call SetMeleeAI( ) – здесь я так и не разобрался, что означает это условие, но какого-либо значения оно при создании AI-скрипта не принимает, ибо скобки остаются пустыми.
  • call SetDefendPlayer( ) – Защита игрока (AI будет защищать игрока, на которого напали).
  • call SetRandomPaths( ) – случайные пути (AI будет наступать с разных точек на вражескую базу).
  • call SetTargetHeroes( ) – Цель – герои (AI будет пытаться атаковать вражеских героев во время боя).
  • call SetPeonsRepair( ) – Ремонт зданий (во время нападения работники будут ремонтировать дружественные здания).
  • call SetHeroesFlee( ) – бегство героев с поле боя.
  • call SetHeroesBuyItems( ) – покупка предметов из магазина.
  • call SetUnitsFlee( true ) – бегство юнитов.
  • call SetGroupsFlee( true ) – бегство войска
  • call SetWatchMegaTargets( ) – пощады не будет
  • call SetIgnoreInjured( ) – игнорирование ранений
  • call SetHeroesTakeItems( ) – герои будут брать предметы
  • call SetSlowChopping( ) – медленное развитие
  • call SetCaptainChanges( ) – смена основного лагеря
  • call SetSmartArtillery( ) – умная артиллерия
В остальных же случаях в скобках указывается значение true или false, правда мои исследования AI-скриптов компании Blizzard показали, что они вообще не пользуются этими функциями, да и описания их нет ни в одном AI-файле. Это упрощённые функции, которые используются для «поверхностного» налаживания компьютерного интеллекта.

Теперь поговорим о категории Conditions – именно здесь указываются и расписываются те условия, которые мы создаём в редакторе AI интеллекта. Вспомнили про переменные вида gCond_*. Здесь и устанавливается, что они собой представляют. Общий вид синтаксиса таков:
Код:
function UpdateConditions takes nothing returns nothing
<название переменной условия> = ( <какая либо проверящая функция/счётчик ( )> == <значение функции> )
...
endfunction

Иными словами, можно сказать, что каждую секунду проверяется значение функции/счётчика, и если оно соответствует параметру <значение функции>, то значение условия будет true, а если нет – так и останется false.

Теперь самое интересное – категория Heroes, то есть герои. Начинается она с функции SetHero(), которая подразумевает передачу ей целых параметров order и heroid. Об этой передаче поговорим позже, а пока рассмотрим то, из чего состоит эта функция.
Здесь рассматриваются случаи – когда, что и чему равно. Берётся переменная hero_id, зачем она нужна – будет рассказано позже. Далее рассматривается каждый герой последовательности (указывается только лишь id-код) и устанавливаются навыки в виде массива skills (также указываются id-коды). Мы можем легко менять все эти параметры, главное, чтобы герой обладал соответствующими навыками, ибо изучать он их не будет, а будет находиться в состоянии тупика. Мы также можем изменить число способностей – ведь часто применяются геройские уровни больше 10. Зная об этом, соответственно, можно изменять и последовательность изучения навыков.
После развития способностей идёт подкатегория “Selects hero IDs for three possible heroes”, благодаря которой мы можем регулировать случайность, а также изменять количество героев в игре. Рассмотрим пример из файла:
Код:
function SelectHeroes takes nothing returns nothing
    local integer roll = GetRandomInt(1,100)
    if (roll <= 17) then
        call SetHero( 1, 'Hpal' )
        call SetHero( 2, 'Hamg' )
        call SetHero( 3, 'Hmkg' )
    elseif (roll <= 34) then
        call SetHero( 1, 'Hpal' )
        call SetHero( 2, 'Hmkg' )
        call SetHero( 3, 'Hamg' )
    elseif (roll <= 50) then
        call SetHero( 1, 'Hamg' )
        call SetHero( 2, 'Hpal' )
        call SetHero( 3, 'Hmkg' )
    elseif (roll <= 67) then
        call SetHero( 1, 'Hamg' )
        call SetHero( 2, 'Hmkg' )
        call SetHero( 3, 'Hpal' )
    elseif (roll <= 84) then
        call SetHero( 1, 'Hmkg' )
        call SetHero( 2, 'Hpal' )
        call SetHero( 3, 'Hamg' )
    else
        call SetHero( 1, 'Hmkg' )
        call SetHero( 2, 'Hamg' )
        call SetHero( 3, 'Hpal' )
    endif
endfunction

Объяснять смысл, думаю не надо. Берётся обычное целое число случайным образом в промежутке от 1 до 100, а потом рассматриваются случаи и устанавливаются параметры для функции SetHero. Теперь, о том, как это всё дело улучшить.
В принципе, улучшать данную функцию при наличии 3 героев я бы не стал, а вот когда их четыре – средства AI-редактора даже не позволяют нам поставить столько и тем более рассмотреть всякого рода случайности. Для установки равных случайностей выпадения героев, пользуемся формулой P=n! (факториал), где n! = 1*2*3*4*…*n. Благодаря ней можно узнать максимальное количество комбинаций. В случае четырёх героев их аж 24. И все надо рассматривать. Но тут на помощь нам приходит то, что необязательно брать промежуток от 1 до 100 – можно взять и числа побольше или поменьше – например 1 до 24. После этого убираем весь код функции и пишем всё по-новому. Например, пусть наш четвёртый герой – Кровавый маг (id-код – 'Hblm'). Тогда функция будет примерно выглядеть вот так:
Код:
function SelectHeroes takes nothing returns nothing
    local integer roll = GetRandomInt(1,24)
    if (roll == 1) then
        call SetHero( 1, 'Hpal' )
        call SetHero( 2, 'Hamg' )
        call SetHero( 3, 'Hmkg' )
        сall SetHero( 4, ‘Hblm’ )
    elseif (roll == 2) then
        call SetHero( 1, 'Hpal' )
        call SetHero( 2, 'Hmkg' )
        call SetHero( 3, 'Hamg' )
        сall SetHero( 4, ‘Hblm’ )
...
// и т.д. и т.д., рассматривая все комбинации
    endif
endfunction

Думаю, разобрались с этим, но не забудьте отредактировать верх (последовательность изучения навыков). Приведу такой пример:
Код:
if (order == 1) then
        set hero_id = heroid
        if (heroid == 'Hpal') then
            set skills1[ 1] = 'AHhb'
            set skills1[ 2] = 'AHds'
            set skills1[ 3] = 'AHad'
            set skills1[ 4] = 'AHhb'
            set skills1[ 5] = 'AHds'
            set skills1[ 6] = 'AHre'
            set skills1[ 7] = 'AHad'
            set skills1[ 8] = 'AHhb'
            set skills1[ 9] = 'AHds'
            set skills1[10] = 'AHad'
        elseif (heroid == 'Hamg') then
            set skills1[ 1] = 'AHbz'
            set skills1[ 2] = 'AHab'
            set skills1[ 3] = 'AHwe'
            set skills1[ 4] = 'AHbz'
            set skills1[ 5] = 'AHab'
            set skills1[ 6] = 'AHmt'
            set skills1[ 7] = 'AHwe'
            set skills1[ 8] = 'AHbz'
            set skills1[ 9] = 'AHab'
            set skills1[10] = 'AHwe'
        elseif (heroid == 'Hmkg') then
            set skills1[ 1] = 'AHtc'
            set skills1[ 2] = 'AHtb'
            set skills1[ 3] = 'AHbh'
            set skills1[ 4] = 'AHtc'
            set skills1[ 5] = 'AHtb'
            set skills1[ 6] = 'AHav'
            set skills1[ 7] = 'AHbh'
            set skills1[ 8] = 'AHtc'
            set skills1[ 9] = 'AHtb'
            set skills1[10] = 'AHbh'
        elseif (heroid == ‘Hblm’) then
            set skills1[ 1] = 'AHfs'
            set skills1[ 2] = 'AHbn'
            set skills1[ 3] = 'AHfs'
            set skills1[ 4] = 'AHbn'
            set skills1[ 5] = 'AHfs'
            set skills1[ 6] = 'AHpx'
            set skills1[ 7] = 'AHbn'
            set skills1[ 8] = 'AHdr'
            set skills1[ 9] = 'AHdr'
            set skills1[10] = 'AHdr'
endif
...

Экспериментируйте!
Добавляйте больше уровней, больше способностей и больше героев!

Идём дальше. Подкатегория ‘Returns the hero skill for the given hero and level” со одной функцией, которая выглядит так:
Код:
function ChooseHeroSkill takes nothing returns integer
    local integer curHero = GetHeroId()
    local integer level = GetHeroLevelAI()

    if (level > max_hero_level) then
        set max_hero_level = level
    endif

    if (curHero == hero_id) then
        return skills1[level]
    elseif (curHero == hero_id2) then
        return skills2[level]
    elseif (curHero == hero_id3) then
        return skills3[level]
    endif
    return 0
endfunction

Здесь, однако, никакого уровня AI нет (лёгкий, сложный и т.п.). Просто в данной функции рассматривается случай, когда у героя уровень побольше и он уже существует в игре. А также данная функция устанавливает навыки для всех случаев. Имейте в виду – сколько у вас значений параметра order – столько же должно быть случаев у этой функции (речь идёт о второй части), ибо одна из частей не будет работать. Допустим у нас максимальный order = 4 (то есть четыре героя), тогда функция будет выглядеть так:
Код:
function ChooseHeroSkill takes nothing returns integer
    local integer curHero = GetHeroId()
    local integer level = GetHeroLevelAI()

    if (level > max_hero_level) then
        set max_hero_level = level
    endif

    if (curHero == hero_id) then
        return skills1[level]
    elseif (curHero == hero_id2) then
        return skills2[level]
    elseif (curHero == hero_id3) then
        return skills3[level]
    elseif (curHero ==hero_id4) then
        return skills4[level]
    endif
    return 0
endfunction

Надеюсь, вы догадались, что в подкатегорию “Stores hero ID and skills” нужно также добавить дополнительные элементы, такие как skills4 и hero_id4., которые будут встречаться в случае, когда order = 4.

Теперь приступим к категории Building and Harvesting. Это своего рода экономическая стратегия компьютерного игрока. Думаю, это категория больше всего связана со второй, ибо большинство функций берётся оттуда. Когда я исследовал этот скрипт – я был поражён – настолько здесь всё примитивно…
Общий синтаксис команды функции такой:
Код:
call SetBuildAll( BUILD_UNIT, <номер юнита>, <id-код юнита в кавычках>, <месторасположение> )

Хочу дать несколько пояснений по месторасположению в соответствии с игрой. Значения таковы:
-1 = Не важно где.
0 = Главный лагерь.
1 = Дополнительный лагерь 1
2 = Дополнительный лагерь 2
3 = Дополнительный лагерь 3
...
Mine + 0 = рудник номер 1
Mine + 1 = рудник номер 2
Mine + 2 = рудник номер 3
...

Если же юнит создаётся при каком-то условии, которое было указано в глобальных переменных, то функция будет выглядеть так:
Код:
if (<название условия>) then
         call SetBuildAll( BUILD_UNIT, <номер юнита>, <id-код юнита в кавычках>, <месторасположение> )
    endif

Но вот здесь можно поэкспериментировать, например, создать триггер случайного числа прямо в этой функции, а потом рассмотреть случаи этого. Приведу такой пример:
Код:
function BuildPriorities takes nothing returns nothing
    local integer mine = TownWithMine()
    local integer number = GetRandomInt(1,2)
    call SetBuildAll( BUILD_UNIT, 1, 'htow', -1 )
    call SetBuildAll( BUILD_UNIT, 1, 'hpea', -1 )
    call SetBuildAll( BUILD_UNIT, 2, 'hpea', -1 )
    call SetBuildAll( BUILD_UNIT, 3, 'hpea', -1 )
if (number == 1) then 
    call SetBuildAll( BUILD_UNIT, 4, 'hpea', -1 )
elseif (number == 2) then
    call SetBuildAll( BUILD_UNIT, 1, ‘hhou’, -1)
endif
    call SetBuildAll( BUILD_UNIT, 5, 'hpea', -1 )
endfunction

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

Вторая подкатегория – “Specifies harvesting priorities for workers”. Особенности сбора для работников.
Код:
function HarvestPriorities takes nothing returns nothing
    local integer mine = TownWithMine()
    local integer allGold = GetUnitCountDone('hpea')
    local integer allWood = GetUnitCountDone('hpea')
    local integer numWorkers
    set numWorkers = 4
    call HarvestGold( 0, numWorkers )
    set numWorkers = 4
    call HarvestWood( 0, numWorkers )
    if (gCond_Condition2) then
        set numWorkers = 4
        call HarvestGold( 1, numWorkers )
    endif
    set numWorkers = 3
    call HarvestWood( 0, numWorkers )
endfunction

Несколько пояснений"
GetUnitCountDone – это сборщик, тот кто собирает ресурсы, важно, чтобы у него была соответствующая способность. Вводятся 4 локальные переменные. Далее применяется функция HarvestGold(), синтаксис которой таков:
Код:
call HarvestGold( <месторасположение>, <количество работников>)

Здесь в принципе, необязательно было вводить numWorkers, а написать значения так. Месторасположение аналогично, как и в предыдущей подкатегории.

В следующей подкатегории “Determines all building and harvesting assignments for workers” указываются функции, активизирующие сбор. Понять смысл каждой можно, исходя из перевода. Не будем на ней зацикливаться.

Следующая категория – Attacking. Волны атак и прочие параметра, как вы догадались, регулируются здесь.

Подкатегория “Returns true if the minimum forces for an attack exist” отвечает за нижние значения вкладки Атака редактора AI.
Первый цикл отвечает за лимит волн атаки. Если количество волн уже пройдено, то атака просто не произойдёт:
Код:
if (attackWave > 1) then
    return false
endif

Далее, более интересный скрипт. Если ничего вы не изменяли в тех нижних параметрах, то атака не произойдёт только в том случае, если будет отсутствовать первый герой. Выглядит это так:
Код:
if (GetUnitCountDone(hero_id) < 1) then
    return false
endif

Наверно, вы уже догадались, как сменить того первого героя на второго или третьего, не так ли? Но совсем иной вид скрипт принимает, когда минимальные силы – это какая-либо группа атаки.
Код:
set count = 0
set count = count + GetUnitCountDone(<id-код юнита группы>)
set count = count + GetUnitCountDone(<id-код юнита группы>)
...
if (count < 1) then
    return false
endif
return true

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

Кто не понял, объясняю на пальцах: у нас дана группа 1 с юнитами Ведьма и Священник (к примеру), и группа 2 с юнитами Ведьма и Герой. Пока священник не будет создан, вторая группа в бой не пойдёт. Используя это свойство, мы можем менять параметры атаки, ограничиваясь какими-либо условиями, что в простом AI-редакторе невозможно.

Идём дальше:
Подкатегория "Assigns units to attack based on the given attack group". Здесь расписываются юниты группы. Общий синтаксис функций таков:
Код:
local integer all
if (groupID == <номер группы>) then
        set all = GetUnitCountDone( <id-код юнита группы>)
        call AddAttackUnit( <начальное значение вариации>, <конечное значение вариации>, <id-код юнита группы> )
...
    endif
if (groupID == <номер группы>) then
...
endif

Вариации – это те же случайные значения. В AI-редакторе это выглядит, как «минимальное значение – максимальное значение». Если вариаций не нужно, то ставить нужно all.
Вариации хороши тем, что не нужно создавать новые циклы. Кстати, условия здесь будут применяться также, как и в предыдущих примерах.

Подкатегория “Prepares an attack group based on the current attack wave”. Просто и ясно. Подготовка волн к атаке. Можно что-нибудь замудрить с этим… Тем не менее, здесь можно устанавливать порядок атаки, точно также, как и в игре.
Но здесь не используется задержка, ибо она будет использоваться чуть дальше, в категории “Sleep delays for each attack wave”.

Первый цикл, я так и не понял, для чего, но судя по всему убирать его ни в коем случае нельзя. Далее, идёт главная функция:
Код:
if (inWave == <номер волны атаки>) then
    call Sleep( <задержка волны атаки> )
endif
...

Используется только для тех групп, у которых есть значение задержки.
Подкатегория “Advances attack wave counter”. Функция там такая:
Код:
function AttackWaveUpdate takes nothing returns nothing
    call AttackWaveDelay( attackWave )
    set attackWave = attackWave + 1
    if (attackWave > 4) then
        set attackWave = 3
        set nextDelay = attackWave + 1
    endif
endfunction

Вот над ней можно немного помудрить, например, использовать те же случайные значения атаки, можно заморозить какую-либо волну, чтобы она повторялось по несколько раз, используя цикл For, а можно и вовсе понаставить всевозможных условий.
Подкатегория “Basic attack functionality” отвечает за атакование врага, или, можно предположить, что за согласование с союзником.
Зацикливаться на нём незачем.
Но лучше ничего не изменять, на мой взгляд.

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

Последнюю же категорию также, как мне кажется, не следует обрабатывать, так как в неё содержаться действия, активизирующие параметры категории Basic Options.
Зачем же их изменять?
Ну и, наконец, последняя категория получила название Main Entry Point. В ней содержится скрипты, активизирующие работу всего AI-файла, а также информация об игроке.
На этом всё.
Спасибо за внимание!

Отредактировано Jon, 02.06.2007 в 23:10.
Старый 02.06.2007, 22:32
J
expert
offline
Опыт: 48,447
Активность:
я вижу многабукф слабо отформатированого текста...
Старый 02.06.2007, 22:34
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 22,163
Активность:
Jon, а к чему его форматировать, позвольте полюбопытствовать? Итак большую часть статью занимает jass-код. Ну, впрочем, если Вас не затруднит, то разрешаю отредактировать текст с точки зрения оформления.
Старый 02.06.2007, 22:40
J
expert
offline
Опыт: 48,447
Активность:
ну я чуть изменю, вообщем ладно... принцепи далже мб и без разницы.. но всеж...
если непонравится скажи.. назад поменяю... в основном раставил абзацы, но так и пользовался чуть тегами...

Jon добавил:
по статье:
хм.. мне нравицо
Старый 02.06.2007, 23:16
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 22,163
Активность:
Jon, спасибо.
Цитата:
хм.. мне нравицо

Я рад за Вас)
Старый 02.06.2007, 23:22
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
http://xgm.guru/forum/showthread.php?t=8759
имхо стоить включить в текст статьи ссылку как на соосный материал.
Я в свою очередь включю линк на эту статью
Дополнить бы про передачу данных из ИИ в кэш. В ряде случаев это полезно и незаменимо даже

Отредактировано FellGuard, 03.06.2007 в 13:49.
Старый 03.06.2007, 09:03
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 22,163
Активность:
Ну мне кажется, что моя статья получилась лучше, потому что я рассмотрел несколько выводов из AI-скриптов, предложил несколько идей про случайности, да и к тому же написал всё от себя, а скрипты те взял только лишь из самого простого файла AI - поэтому и совпадают местами. Да и писал я её для некампнийского написания AI. Впрочем, хотелось бы знать, что скажут другие.
Старый 03.06.2007, 12:32
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Вот давно хотел почитать про АИ скрипты.

PlayerDark добавил:
Я скрипт контроллер хотел для героев в моих футах сделать но у меня что то не заработало.

PlayerDark добавил:
Такс , можно было бы конечно описать поподробнее.
Старый 03.06.2007, 12:45
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 22,163
Активность:
PlayerDark, опишите, что именно вы хотите сделать, а я попробую вам написать скрипт, если смогу.
(сам я в jass'e не очень силён, но мои знания по нему позволяют произодить подобную исследовательскую деятельность)
Старый 03.06.2007, 12:47
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Последнее пожелание - напиши о том как этот нестандартный АИ импортнуть в игру.

PlayerDark добавил:
Те я хочу его запустить как обычный мили скрипт но ничего не катит , к тому е я туда засунул функцию которая выводит текст а она не работает. Сейчас свой корявый скриптег выложу.
Старый 03.06.2007, 12:53
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 22,163
Активность:
PlayerDark, триггерами вообще-то. Для начала импортируйте в карту, используя редактор импорта, а затем в триггерах используете следующую функцию:
Начать сценарий поведения для <игрок-компьютер, которому предназначается ai>: <название файла ai, импортированного в карту>

Sargeras добавил:
Цитата:
Сейчас свой корявый скриптег выложу.

Жду с нетерпением).
Старый 03.06.2007, 12:56
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Разрешите использовать АИ формат в импорт. Ну щас паковать буду.
Старый 03.06.2007, 12:58
Murloc
Powered by Q
offline
Опыт: 16,977
Активность:
Прочитал статью, из неё даже кое чего понял, из-за моего малого понимания редактора понял не всё, но всё же занятно.
Старый 03.06.2007, 14:11
YellowStar
poon
offline
Опыт: 15,144
Активность:
Это дело пригодиться. А скрипты эти мона делать на все типы карт:)
Старый 03.06.2007, 14:26
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 22,163
Активность:
NaRaYaN, на все те, где предполагается использование AI. И необязательно разрабатывать стратегию экономическую, можно написать просто для, скажем, той же Hero Arena.
Старый 03.06.2007, 14:31
YellowStar
poon
offline
Опыт: 15,144
Активность:
Спасибо. Буду теперь тренироваться.А кста в херо арена герой будет сам выбирать куда ему топать или надо самому это в тригах добавлять.
Старый 03.06.2007, 14:35
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Это ты сможеш осуществлять как через триггеры, так и просто постоянным ИИ скриптом + возможность корректировать алгоритм через передачу команды из триггеров в цикл ИИ (в этой статье о передаче команд не сказано, в соседней впрочем тоже особо тема не раскрыта).
Если вписаны команды нападения и включена опция отступления побитых героев/юнитов (SetHeroesFlee(true), SetUnitsFlee(true)) а также опция SetRandomPaths(true) то ии будет вести себя почти вменяемо.
Старый 03.06.2007, 14:43
Sargeras
Лидер "Двух Королевств"
offline
Опыт: 22,163
Активность:
NaRaYaN, надо самому, но в принципе в ai тоже как-то делается. Не знаю, только, как.
Старый 03.06.2007, 14:44
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Вот например так реализовано управление командами с триггеров.
Карту где Гром с орками убивают Кенариуса все помнят?

FellGuard добавил:
Там Кенариус управляется в зависимости от действий игрока.
Скрипт как нельзя больше подходит для контроля над героем в соотв. картах.
Спеллы какие есть герой кастует сам, без отдачи приказов
Прикрепленные файлы
Тип файла: rar o05_teal.rar (981 байт, 52 просмотров )
Старый 03.06.2007, 14:53
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
Хм , вот я тут эксперементировал с АИ для контроля над войсками. Просто раньше я этим не занимался.

PlayerDark добавил:
Ну он тут еще не закончен. В принципе просто там некоторые мои мысли есть.
Прикрепленные файлы
Тип файла: rar My_Super_Mega_AI.rar (7.6 Кбайт, 68 просмотров )
Старый 04.06.2007, 17:44

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 14:00.