Я хочу отредактировать стандартный скрипт orc.ai, чтобы перед покупкой нового героя компьютер проверял, есть ли доступный рандомный кастомный герой из списка, и если доступен, то брал в первую очередь его, если нет, то брал стандартного героя. При этом кастомный герой может быть недоступен, т.к. его уже купил другой игрок (в карте установлен лимит на кастомных героев).
Я не знаю как это сделать технически, поэтому подумал пойти топорным методом. Когда герой появляется на карте, проверить, есть ли доступный кастомный аналог, и если есть - заменить. Набросал черновой скрипт через триггеры, перевёл его в jass. Вставил в .ai скрипт, и понял что он не работает.
function Trig_Hero_Replacement_Conditions takes nothing returns boolean
    if ( not ( GetTriggerUnit() == hero_id ) ) then
        return false
    endif
    if ( not ( GetUnitTypeId(GetTriggerUnit()) == 'Obla' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Hero_Replacement_Actions takes nothing returns nothing
    call ReplaceUnitBJ( GetTriggerUnit(), 'Ogrh', bj_UNIT_STATE_METHOD_RELATIVE )
    set hero_id = GetLastReplacedUnitBJ()
endfunction

//===========================================================================
function InitTrig_Hero_Replacement takes nothing returns nothing
    set gg_trg_Hero_Replacement = CreateTrigger(  )
    call TriggerRegisterEnterRectSimple( gg_trg_Hero_Replacement, GetPlayableMapRect() )
    call TriggerAddCondition( gg_trg_Hero_Replacement, Condition( function Trig_Hero_Replacement_Conditions ) )
    call TriggerAddAction( gg_trg_Hero_Replacement, function Trig_Hero_Replacement_Actions )
endfunction
Наверно, потому что .ai скрипты не рассчитаны на применение функций типа Replace Unit. Либо же я где-то ошибся. Можете подсказать что не так в этом скрипте, или в целом в моём подходе?
Вот файл целиком (включая мой гениальный скрипт в самом конце):

Когда пишешь ai скрипт, в нем нельзя:
Использовать функции из blizzard.j
Использовать триггеры
Использовать code callback функции
Использовать возврат строк
`
ОЖИДАНИЕ РЕКЛАМЫ...
32
В скрипте четко прописано какого героя брать и как его качать, поэтому подмена в процессе игры всё ломает. Стандартный ии разыгрывает только заранее заготовленные шаблоны, которые определяются рандомом при старте и в процессе игры не меняются.
Придется писать ИИ ручками с нуля.
Ответы (2)
11
quq_CCCP, а разве нельзя адаптировать имеющийся ИИ под кастомных героев?
Я знаю что в common.ai есть функция PickMeleeHero, которая отвечает за рандом пик героя, и результат записывает героя в переменную hero. Можно ведь сделать похожую функцию, назвать её условно PickCustomHero, называя результат cuctomhero. Затем уже в самом orc.ai проверять доступность customhero для игрока. Если ответ отрицательный, тогда покупает hero. Если положительный, тогда нанимает cuctomhero.
Только я пока не знаю как это сделать внури скрипта. Я не понимаю логику работу ai скриптов. Они не похожи на стандартный триггерный джасс. Через скрипты вообще можно проверить уровень доступности технологий и юнитов?
А ещё при попытке создать новую функцию и сохранить common.ai или orc.ai, у меня иногда отваливается один .ai скрипт, который был сделан вообще только с помощью ИИ-редактора. И от этого я ещё больше не понимаю логику работы всей этой фигни. Я вообще в игру могу свои функции вписывать? Или может это надо сделать в триггерах, а не пытаться изменить common.ai? Если я на джасс напишу в триггерах новую функцию, она подхватится в .ai скрипте?
32
WilliamBz, ну так это писание своего мили ии, так или иначе. К слову всё микро, применение спеллов раелизованно в движке игры, поэтому с кастом героями поосторожнее.
К слову можно ИИ написать и в обычном редакторе триггеров, но это муторно да и самому микро реализовать не так уж и просто.
23
Когда пишешь ai скрипт, в нем нельзя:
Использовать функции из blizzard.j
Использовать триггеры
Использовать code callback функции
Использовать возврат строк
Принятый ответ
Ответы (2)
11
EugeAl, а как в .ai скрипте проверить наличие живого/мёртвого/обучающегося героя? Сработает ли это например через эту функцию?
GetUnitCount( 'o008' )
Можно ли писать if / then / else или работает только if / then?
23
WilliamBz, почему нет? Это же нативка из common ai
Можно и else elseif итд, и прочий синтаксис, это ведь jass, просто скрипты в формате ai, с некоторыми отличиями)
ExecuteFunc кстати тоже нельзя.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.