При появлении героя на карте я хочу его заменить с возможностью компьютера им играть. Но понятное дело, через простой Replace это не работает.
Я уже пробовал различные способы. Например, визуально скрывать оригинального героя, но от него всё равно остаётся тень, и не до конца ясно как отключить его потребление пищи, а ещё наверно он продолжает занимать слот на найм героев.
Второй гипотетический вариант - это записывать нового героя в атакующий отряд компьютера. Но вряд ли можно как-то вмешаться в оригинальный ИИ-скрипт.
Третий вариант - может стоит создать свой ИИ через редактор ИИ, и вписать ему в атакующий отряд всех возможных героев как простые войска. Но не будет ли этот способ фризить? Ведь их просто не будет в наличии.
Ради чего все эти движения? Чтобы не писать новый ИИ для каждого героя на карте, т.к. это просто мучительно, их очень много. Вместо этого можно было бы написать вариативные скрипты для ИИ, и уже в них внедрять кастомных героев. Вопрос только - как?

Второй гипотетический вариант - это записывать нового героя в атакующий отряд компьютера. Но вряд ли можно как-то вмешаться в оригинальный ИИ-скрипт.
Можно. Через mpq editor открыть архивы игры, найти там в папке Scripts, например, human.ai, это стандартный ИИ Альянса, и спокойно его править и переделать в том же JassCraft или в блокноте (плохой вариант, а в jngp проблематично, ведь надо будет как то научить его видеть все функции из common.ai)
И затем скрипт импортировать в карту.
Минус - нужно знать джасс)
А вообще какая концепция-то? Выбирать боту героя, чтоб бот им играл?
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Второй гипотетический вариант - это записывать нового героя в атакующий отряд компьютера. Но вряд ли можно как-то вмешаться в оригинальный ИИ-скрипт.
Можно. Через mpq editor открыть архивы игры, найти там в папке Scripts, например, human.ai, это стандартный ИИ Альянса, и спокойно его править и переделать в том же JassCraft или в блокноте (плохой вариант, а в jngp проблематично, ведь надо будет как то научить его видеть все функции из common.ai)
И затем скрипт импортировать в карту.
Минус - нужно знать джасс)
А вообще какая концепция-то? Выбирать боту героя, чтоб бот им играл?
Принятый ответ
Ответы (5)
11
EugeAl, а по какому пути мне импортировать common.ai чтобы он применился к карте? Я пробовал кидать скрипты от AMAI в Scripts/ в саму карту, но новый ИИ почему-то не заменял стандартный. Боюсь, как бы здесь не получилось того же.
11
EugeAl, да, всё верно. У меня кроме стандартных героев, можно покупать героев из кампании. И хочется сделать поддержку ИИ для каждого героя.
Я сейчас зашёл в .ai и обнаружил что герои покупаютя через hero_id. Т.е. нет запечатанных в ИИ героев типа Obla - Блейд Мастера. Всё это прописано в common.ai. Надеюсь, если я отредактирую его, он импортнётся. И надеюсь что в случае если компу будет недоступен какой-то из героев кампании (пикнуть их можно единожды на всех игроков), то он не будет фризить, а просто купит другого. upd: По всей видимости если выбранный им герой недоступен, то он просто никого не покупает.
И ещё момент. У меня герои кампании вынесены в альтернативный алтарь, который вызывается через Crow Form. Я вот думаю, может для ИИ проще добавить всех героев в один алтарь, чтобы не мучиться. Deep Seek подсказал мне следующий скрипт:
function AddHeroToAltar takes nothing returns nothing
    unit altar = GetTriggerUnit() // Получаем алтарь
    integer heroId = 'Oshd' // ID Shadow Hunter (замените на нужный ID героя)

    // Добавляем героя в список доступных для найма
    call UnitAddAbility(altar, heroId)
endfunction

// Инициализация триггера
function InitTrig_AddHeroToAltar takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEvent(t, EVENT_PLAYER_UNIT_CONSTRUCT_FINISH)
    call TriggerAddCondition(t, Condition(function IsAltar))
    call TriggerAddAction(t, function AddHeroToAltar)
endfunction

// Проверка, что построенное здание — алтарь
function IsAltar takes nothing returns boolean
    return GetUnitTypeId(GetTriggerUnit()) == 'oalt'
endfunction
Но я не совсем понимаю как им пользоваться. Обычно скрипты которые он мне советует - не работают. Либо я их неправильно использую.
На крайняк, буду просто делать разные типы алтарей для компов и людей, чтобы не возиться с jass лишний раз.
23
WilliamBz, а зачем копировать common.ai?
Ты можешь в самом своем скрипте использовать как и переменные из common, так и свои прописать, так и использовать равкоды типа Obla
hero_id и camp_hero_id это переменная, а не равкод
Что касается блокировки героев и вообще старта игры и запуска ии скриптов, то можно стандартные скрипты из blizzard.j скопировать, переделать и засунуть их в карту под другими названиями, и их использовать
Обычные блокировки ненужные отключи)
Нейронка какую-то фигню странную тебе написала)) точнее, полный бред. Особенно где UnitAddAbility
11
Нейронка какую-то фигню странную тебе написала)) точнее, полный бред. Особенно где UnitAddAbility
EugeAl, спасибо за инфу! Больше не буду ей пользоваться :D
а зачем копировать common.ai?
Ты можешь в самом своем скрипте использовать как и переменные из common, так и свои прописать, так и использовать равкоды типа Obla
hero_id и camp_hero_id это переменная, а не равкод
Да что-то не получается у меня ничего, если я пробую orc.ai отредактировать. Он тупо ничего не делает. А вот если common.ai отредактированный вставить, он подхватывается.
Я попробую повозиться с этим. Поредачить свой код в orc.ai, может разбирусь как он работает. И если что задам уже новый вопрос в ветке вопрос ответ. Так будет проще.
Спасибо больше за ответы!
23
WilliamBz, ну тогда и common.ai в карту запихни, лишним не будет)
Если ты оба скрипта правишь, естественно нужно оба совать) я то думал ты только orc.ai правишь)
11
Тоесть, в чём сейчас задача. Рассматриваем чисто Орду в качестве примера.
Вот стандартный скрипт выбора героев из common.ai:
//============================================================================
//  PickMeleeHero 
//============================================================================
function PickMeleeHero takes race raceid returns integer
    local integer first
    local integer second
    local integer third
    local integer last
    local integer array heroes


    //------------------------------------------------------------------------
    elseif raceid == RACE_ORC then
    //------------------------------------------------------------------------
        set heroes[1] = BLADE_MASTER
        set heroes[2] = FAR_SEER
        set heroes[3] = TAUREN_CHIEF
        set heroes[4] = SHADOW_HUNTER

    else
        set hero_id = 0
    endif

        set last = 4


    set first  = GetRandomInt(1,last)
    set second = GetRandomInt(1,last-1)
    set third  = GetRandomInt(1,last-2)

    set hero_id        = heroes[first]
    set heroes[first]  = heroes[last]
    set hero_id2       = heroes[second]
    set heroes[second] = heroes[last-1]
    set hero_id3       = heroes[third]

    return hero_id
endfunction
Мне сейчас нужно сделать так, чтобы ИИ сначала подобрал себе список из 3 героев кампании. Я это реализовал следующим образом:
//============================================================================
//  PickCampaignHero 
//============================================================================
function PickCampaignHero takes race raceid returns integer
    local integer first
    local integer second
    local integer third
    local integer last
    local integer array heroes

    //------------------------------------------------------------------------
    elseif raceid == RACE_ORC then
    //------------------------------------------------------------------------
        set heroes[1] = GROM
        set heroes[2] = THRALL
        set heroes[3] = CAIRNE
        set heroes[4] = GULDAN
        set heroes[5] = WARLORD

    else
        set hero_id = 0
    endif

        set last = 5

    set first  = GetRandomInt(1,last)
    set second = GetRandomInt(1,last-1)
    set third  = GetRandomInt(1,last-2)

    set camp_hero_id   = heroes[first]
    set heroes[first]  = heroes[last]
    set camp_hero_id2  = heroes[second]
    set heroes[second] = heroes[last-1]
    set camp_hero_id3  = heroes[third]

    return hero_id
endfunction
Теперь мне нужно каким-то образом в orc.ai вписать код, который бы на момент первой покупки, проверял бы доступность героя кампании, например:
GetPlayerTechMaxAllowedSwap('camp_hero_id', Player(0)) == 1 )
Если герой доступен, то купить его, и использовать hero_id = camp_hero_id
А если герой не доступен, тогда нанимать hero_id по старинке.
Проблема в том, что после покупки героя кампании, у всех игроков на карте срабатывает функция
SetPlayerTechMaxAllowedSwap( 'Obla', 0, Player(0)
Т.е. герой становится недоступен никому из игроков. И вот для текущего ИИ в том числе. Так что нужно проверять ещё не купил ли он УЖЕ героя. Чтобы он продолжал оперировать им.
В общем пока даже не знаю что куда вставлять.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.