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

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

Ответ
 
Wormad

offline
Опыт: 235
Активность:
Начинаю писать ИИ на Jass (Нужна помощь)
Основной Материал (который был прочитан)
Статья про HeroArenaAi (с просмотром(!) триггеров прикреплённой карты)
Статья про то как сделать ИИ для любого количества героев

Прблема
или я чтото делаю не так, как нужно... или опыта (знаний) нехватает... или редактор тупит(что врятли) но у меня при компиляции кода всё время получаются какието ошибки... то нехватает символа ' ... то попытка переиндексировать переменную... то какието неопределённые переменные... (хотя я все обьявил(что в двойне странно))

порылся на форуме, и ничего более подробного не нашел...
вообщем я опустил руки...


Что я хотел сделать
на основе Статьи про HeroArenaAi я хотел сделать ИИ (для карты типа AoS), который:
  • Герой, при появлении в определённой области (CreatUnit), записывался в переменную типа Боевая Еденица (Это у меня получилось) (для последующих нужд)
  • герой учил бы заклинания и способности(заранее оговорённые в коде, при помощи их id-кода (Ctrl+D в редакторе)), при повышении уровня.
  • герой, при некритическом здоровье патрулировал бы из одной определенной области в другую... (применяя изученные заклинания и способности)
  • при критическом уровне здоровья, отправлялся бы в определенную область, до полного выздоровления (что отчасти получилось)

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

Что обещаю взамен?
как только разберусь в коде... напишу подробную статью для новичков (кем сам и являюсь)
Старый 07.08.2009, 19:23
CHAOSITO

offline
Опыт: 35
Активность:
Посути ты просишь чтобы все сделали за тебя а ты только присвоил авторство) молодэц))
Старый 07.08.2009, 19:39
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
Скарее всего ты не верно делаешь чтото пробуй для начала с помощью хотябы построения на гуи а патом перевод и изучай)
Старый 07.08.2009, 21:34
Wormad

offline
Опыт: 235
Активность:
Цитата:
Сообщение от CHAOSITO
Посути ты просишь чтобы все сделали за тебя а ты только присвоил авторство) молодэц))

и да и нет... ведь любая информация, которая не была полученна методом проб и ошибок - это информация другого автора(! о как)
я прошу помочь разобратся в чужом коде...
всё зацепилось за
» фразу автора статьи (Van Damm)
Мы хотим, чтобы AI использовал способности.
Это может звучать сложно, но это не так. Нам только нужно дать команду героям изучить способности, и они будут использовать их сами.
Примечание: ситуация, когда управляемый компьютером герой будет использовать заклинание всегда такая же, как и для заклинания, на котором оно основано.

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

... т.е. создать движок ИИ, и отдельно подключать к нему героев...

Карта HeroArenaAi(из статьи Van Damm'а), с реализованным ИИ...
(так и не смог разобраться).
Старый 08.08.2009, 05:08
Windrunner
Верь мне!
offline
Опыт: 4,565
Активность:
так делай я не особо понял в чем проблема?
Старый 08.08.2009, 10:34
Wormad

offline
Опыт: 235
Активность:
вот что у меня вышло (всё написанное работает!) (на основе Статьи про HeroArenaAi)
» Код моего тригера
Код:
function AILoop takes nothing returns nothing
//  local string a = GetAttachmentTable(GetExpiredTimer())
  local real l = GetUnitStateSwap(UNIT_STATE_LIFE, udg_Hero)
  local real lmax = GetUnitStateSwap(UNIT_STATE_MAX_LIFE, udg_Hero)
  local real e = 1
  local unit h = udg_Hero
  local string o = OrderId2String(GetUnitCurrentOrder(h))
  local rect r = gg_rct_SpawnEnemy
  local rect fun = gg_rct_HealsAl
  local real x = GetUnitX(h)
  local real y = GetUnitY(h)
  local group g
    local boolean b
    local boolexpr be
    local unit f

set o = OrderId2String(GetUnitCurrentOrder(h))
call DisplayTextToForce( GetPlayersAll(), o )        // это для отладки

if (l > lmax*0.75) then
 set udg_AlGoToFlag = false
endif
 
  // если здоровья меньше %
  // (GetUnitStateSwap(UNIT_STATE_LIFE, h) / 5.00 )
  if (l < lmax*0.33) or (udg_AlGoToFlag == true) then 
    call IssuePointOrderLocBJ( h, "move", GetRectCenter(fun) )
    set e = 5
    set udg_AlGoToFlag = true
  else
    if (o == null) or (o=="smart")or (o == "attack") or (o == "patrol") or (o == "move") or (o == "stop") or (o == "hold") then
       set g = CreateGroup()
     set b =  AIFilterEnemyConditions()
     



    endif
    //====== патруль ====
    call IssuePointOrderLocBJ( udg_Hero, "patrol", GetRectCenter(r) )
    //===================
  endif
call TimerStart(GetExpiredTimer(), e, true, function AILoop)
endfunction


function StartAI takes unit hero returns nothing
    local timer m = CreateTimer()
// call AttachObject(m, "hero", hero)
    call TimerStart(m, 0, false, function AILoop)
    set m = null
endfunction


function Trig_AI_Actions takes nothing returns nothing
     call CreateNUnitsAtLoc( 1, 'Nngs', Player(0), GetRectCenter(gg_rct_xCreate), bj_UNIT_FACING )
     set  udg_Hero = GetLastCreatedUnit()
     call IssuePointOrderLocBJ( udg_Hero, "move", GetRectCenter(gg_rct_xMove) )
     call DisplayTextToForce( GetPlayersAll(), "Юнит создан" )
     call StartAI(udg_Hero)
endfunction


function SetupSkills takes nothing returns nothing
    local string h
// Naga Sea Witch
    set h = UnitId2String('Nngs')
    call StoreInteger(udg_GameCache, h, "BaseSkill1", 'ANfl')
    call StoreInteger(udg_GameCache, h, "BaseSkill2", 'ANfa')
    call StoreInteger(udg_GameCache, h, "BaseSkill3", 'ANms')
    call StoreInteger(udg_GameCache, h, "UltimateSkill", 'ANto')
endfunction



//===========================================================================
function InitTrig_AI takes nothing returns nothing

    set gg_trg_AI = CreateTrigger(  )
    call TriggerRegisterPlayerChatEvent( gg_trg_AI, Player(0), "-test", true )
    call TriggerAddAction( gg_trg_AI, function Trig_AI_Actions )
    call ExecuteFunc("SetupSkills")
endfunction


и непонятки и ошибки

function StartAI takes unit hero returns nothing
local timer m = CreateTimer()
// call AttachObject(m, "hero", hero) // здесь и без этого обошолся(покаместь) (т.к. если включить- то ошибка :)) (объясните причину!!!)
call TimerStart(m, 0, false, function AILoop)
set m = null
endfunction



Код:
function AILoop takes nothing returns nothing
...
   if (o == null) or (o=="smart")or (o == "attack") or (o == "patrol") or (o == "move") or (o == "stop") or (o == "hold") then
       set g = CreateGroup()
     set b =  AIFilterEnemyConditions()


// далее я буксую на одном месте

... не могу разобратся с

Код:
function AIFilterEnemyConditions takes nothing returns boolean
 return (GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0) and IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(GetAttachedUnit(GetExpiredTimer(), "hero")))
endfunction


при любой попытке компилировать редактор вылетает....

» У автора это реализованно
Код:
local string a = GetAttachmentTable(GetExpiredTimer())
 local unit h = GetTableUnit(a, "hero")
 local rect i
 local location r
 local real x = GetUnitX(h)
 local real y = GetUnitY(h)
 local group g
 local boolexpr b
 local boolexpr be
 local unit f
 local string o = OrderId2String(GetUnitCurrentOrder(h))
 local real l = GetUnitState(h, UNIT_STATE_LIFE)
 local real e = 5

...

function AIFilterEnemyConditions takes nothing returns boolean
 return (GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0) and IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), GetOwningPlayer(GetAttachedUnit(GetExpiredTimer(), "hero")))
endfunction  
 
...
 
 else
   if ((o == "smart") or (o == "attack") or (o == "patrol") or (o == "move") or (o == "stop")  or (o == "hold") or (o == null)) then
 set g = CreateGroup()
 set b = Condition(function AIFilterEnemyConditions)
 call GroupEnumUnitsInRange(g, x, y, 500, b)
 set f = FirstOfGroup(g)
 if f == null then
...

 else
   call IssueTargetOrder(h, "attack", f)
 endif
 call DestroyGroup(g)
 call DestroyBoolExpr(b)
   endif
...

Примечание: Если у героя всё в порядке со здоровьем, проверяем, стандартный ли у него/неё приказ (чтобы не прерывать чтение заклинаний). Если приказ стандартный, проверяем, есть ли враги в радиусе 500 от героя. Если есть, и это другой герой, просто дайм приказ атаковать (переменную 'e' не изменяем)



Проблема в том что у меня редактор виснет... (скорее всего от неправильного кода)
а мне нужно сделать ИИ на основе Статьи про HeroArenaAi
Старый 08.08.2009, 11:05
Wormad

offline
Опыт: 235
Активность:
Цитата:
Ты для несколько действий присваиваешь одну переменную, попробуй использовать другие названия переменных.

поподробнее...

в аттаче карта... с тем, что я уже сделал
прошу помочь... кто чем сможет.... (лучше пишите на форуме)
Карта
Прикрепленные файлы
Тип файла: w3x TestAI.w3x (22.7 Кбайт, 30 просмотров )

Отредактировано Wormad, 08.08.2009 в 12:22.
Старый 08.08.2009, 11:55
DragonSpirit
у - уходи
offline
Опыт: 22,625
Активность:
Wormad,
1)не советую уже юзать кэш
2)Van Damm не автор статьи,вольный а переводчик
Старый 08.08.2009, 12:14
Wormad

offline
Опыт: 235
Активность:
DragonSpirit, а как быть?
Старый 08.08.2009, 12:23
DragonSpirit
у - уходи
offline
Опыт: 22,625
Активность:
Wormad, переписать под хэш,т.к RB+cache на 1.24 не работают..
Старый 08.08.2009, 13:14
Ответ

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

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

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

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



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