Добавлен Wyett
Всем доброго времени суток! Хотелось бы задать вопрос по искусственному интеллекту. Просматривал темы про jass, но там не нашел ничего похожего. В чем собственно вопрос: Задался целью заставить ии в сражениях покупать резаков так же, как он это делает с дирижаблями гоблинов. Посмотрел common.ai. Там для дирижаблей юзается переменная Zeppelin и следующие куски кода:
native PurchaseZeppelin takes nothing returns nothing
native PurchaseZeppelin takes nothing returns nothing
constant integer ZEPPLIN = 'nzep'
constant integer ZEPPELIN = ZEPPLIN
constant integer ZEPPELIN = ZEPPLIN
boolean ready_for_zeppelin = true
boolean get_zeppelin = false
boolean get_zeppelin = false
purchase zeppelins
if get_zeppelin and GetGold() > 300 and GetWood() > 100 then
call Trace("purchase zep\n") xxx
call PurchaseZeppelin()
set get_zeppelin = false
set ready_for_zeppelin = false
return
endif
set ready_for_zeppelin = true
if get_zeppelin and GetGold() > 300 and GetWood() > 100 then
call Trace("purchase zep\n") xxx
call PurchaseZeppelin()
set get_zeppelin = false
set ready_for_zeppelin = false
return
endif
set ready_for_zeppelin = true
function GetZeppelin takes nothing returns nothing
if ready_for_zeppelin then
set get_zeppelin = true
endif
endfunction
if ready_for_zeppelin then
set get_zeppelin = true
endif
endfunction
Сделал все наподобие для резака:
native PurchaseGir takes nothing returns nothing
constant integer GIRR = 'ngir'
constant integer GIR = GIRR
constant integer GIR = GIRR
boolean ready_for_gir = true
boolean get_gir = false
boolean get_gir = false
purchase gir
if get_gir and GetGold() > 400 and GetWood() > 100 then
call Trace("purchase gir\n") xxx
call PurchaseGir()
set get_gir = false
set ready_for_gir = false
return
endif
set ready_for_gir = true
if get_gir and GetGold() > 400 and GetWood() > 100 then
call Trace("purchase gir\n") xxx
call PurchaseGir()
set get_gir = false
set ready_for_gir = false
return
endif
set ready_for_gir = true
function GetGir takes nothing returns nothing
if ready_for_gir then
set get_gir = true
endif
endfunction
if ready_for_gir then
set get_gir = true
endif
endfunction
Взял стандартное ии орков и добавил туда, опираясь на код для дирижаблей:
integer c_gir = 0
set c_gir = GetUnitCount(GIR)
if c_food_used >= 50 and c_gir < 1 then
call GetGir()
endif
call GetGir()
endif
Портирую ии на карту для проверки, задаю в тригере запуск ии для игрока, все как надо, но при запуске карты ии начинает просто добывать ресурсы. Никакого развития не происходит. Методом последовательного вырезания написанного мною кода из файла ии, выяснил, что проблема в этой строке:
set c_gir = GetUnitCount(GIR)
set c_gir = GetUnitCount(GIR)
Не знаю в чем именно проблема. Переменная GIR создана мною в common.ai, по идее, название переменной может быть любым, или я не прав? Подскажите пожалуйста. Насчет того, что ngir - это ид (вроде ид, я в этом не силен) гоблинского резака, уверен, так как получил это с помощью функции call SetBuildAll( BUILD_UNIT, 1, 'ngir', -1 ), модуля ии в World Editor, просто указав там постройку резака и потом экспортировал код и открыл, посмотрел. Буду очень признателен за помощь.
Принятый ответ
Wyett, ты можешь добавлять подобные этим:
function ... takes ... returns ...
Код
endfunction
Резака купить можно, но это будет абсолютно не похоже на покупку дирижабля.
function ... takes ... returns ...
Код
endfunction
Резака купить можно, но это будет абсолютно не похоже на покупку дирижабля.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
constant integer ZEPPLIN = 'nzep'
constant integer ZEPPELIN = ZEPPLIN
?
Почему нельзя было сделать напрямую:
constant integer ZEPPELIN = 'nzep' ?
они прописаны в движке игры
для полных нубов :
строка
но так как разработчики не создавали функцию PurchaseGir то и ты её не можешь использовать
вывод
читай статьи по аи и статьи по джасс
function ... takes ... returns ...
Код
endfunction
Резака купить можно, но это будет абсолютно не похоже на покупку дирижабля.