При появлении героя на карте я хочу его заменить с возможностью компьютера им играть. Но понятное дело, через простой Replace это не работает.
Я уже пробовал различные способы. Например, визуально скрывать оригинального героя, но от него всё равно остаётся тень, и не до конца ясно как отключить его потребление…
Вопрос
7 77
10
Тоесть, в чём сейчас задача. Рассматриваем чисто Орду в качестве примера.
Вот стандартный скрипт выбора героев из 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)
Т.е. герой становится недоступен никому из игроков. И вот для текущего ИИ в том числе. Так что нужно проверять ещё не купил ли он УЖЕ героя. Чтобы он продолжал оперировать им.
В общем пока даже не знаю что куда вставлять.
10
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 лишний раз.
10
EugeAl, а по какому пути мне импортировать common.ai чтобы он применился к карте? Я пробовал кидать скрипты от AMAI в Scripts/ в саму карту, но новый ИИ почему-то не заменял стандартный. Боюсь, как бы здесь не получилось того же.
23
Второй гипотетический вариант - это записывать нового героя в атакующий отряд компьютера. Но вряд ли можно как-то вмешаться в оригинальный ИИ-скрипт.
Можно. Через mpq editor открыть архивы игры, найти там в папке Scripts, например, human.ai, это стандартный ИИ Альянса, и спокойно его править и переделать в том же JassCraft или в блокноте (плохой вариант, а в jngp проблематично, ведь надо будет как то научить его видеть все функции из common.ai)
И затем скрипт импортировать в карту.
Минус - нужно знать джасс)
А вообще какая концепция-то? Выбирать боту героя, чтоб бот им играл?
Принятый ответ
Доктор Стрэндж MCU (Земля 616)
Модель
5 274
Нужно взломать карту или найти открытую не "пропатченную". При открытии пишет, что сведения о триггерах отсутствуют или не верны.
Разрешение от DaeDR:
Вопрос
15 107
23
nazarpunk, а, ок, буду знать.
С кастомными естественно никак
30
EugeAl, listfile со всеми базовыми файлами есть в MPQ Editor и с ними проблем никогда не бывает. Проблемы с кастомными. И как с ними поможет чужой листфайл?
23
nazarpunk, так ведь в картах все базовые файлы одинаково называются. Соответственно нужно закинуть листфайл, чтобы видеть, где в карте к примеру war3map.j,
и спокойно открыть/извлечь его
а не смотреть на кучку файлов с именами File xxxx, которые ещё и не возможно извлечь (mpq Master такие файлы извлекает без расширения и с весом 0 байт)
Не проверял на ладике mpq editor, мб там такой засады нет
23
nazarpunk, я писал коммент про листфайл перед тем, как прочёл коммент ниже, а удалять лень стало, вот и всё