ИИ на Jass'e и неработающая функция SetProduce
Прочитал серию статей xgm.guru/p/wc3/melee_ai_creating
Но такое ощущение, что функция SetProduce не компилируется.
Как это выглядит:
  1. Запускаю код из примера без попытки построить что-то
function main takes nothing returns nothing
    call Sleep( 1.0 )  // ждать одну секунду
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script started" )

    loop   // начало вечного цикла
        call ClearHarvestAI()   // Сначала восстанавливаем то, что было сделано менеджером сбора и 
        call HarvestGold( 0, 4 )   // затем говорим ему иместь 4 работника, собирающих золото
        call HarvestWood( 0, 1 )   // и 1 работника, собирающего дерево.
        call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Harvesting" )
        call Sleep( 1.0 )  // Если мы никогда не будем спать, то движок убьёт нас.
    endloop

    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script exiting" )
endfunction
Всё замечательно работает. Пеоны добывают золото и дерево. Регулярные тестовые сообщения на экран приходят. Улыбаемся и машем.
  1. Улучшаем код добавлением функции SetProduce
function main takes nothing returns nothing
    call Sleep( 1.0 )  // Ждать 1 секунду
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script started" )

    loop   // начало вечного цикла
        call ClearHarvestAI()   // Сначала восстанавливаем то, что было сделано менеджером сбора и
        call HarvestGold( 0, 4 )   // затем говорим ему иместь 4 работника, собирающих золото
        call HarvestWood( 0, 1 )   // и 1 работника, собирающего дерево.
        call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Harvesting" )

        call SetProduce(1, 'hpea', 0)  // Попытаться начать тренировку крестьянина

        call Sleep( 3.0 )  // Если мы никогда не будем спать, то движок убьёт нас. 
    endloop
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script exiting" )
endfunction
Результат: Тестовые сообщения на экран не приходят. А пеоны по умолчанию начинают просто добывать золото. То есть ИИ-скрипт не включается.
Что же делать?

Поправка: Решил обновиться до версии 1.27. Результат использования функции SetProduce более жёсткий, чем просто невключение скрипта, а fatal error.

Лучший ответ:
Итак. Комментарии на кириллице убраны, и всё заработало. Но потом я всё же переименовал файл скрипта)


Views: 2 301

Mrachny #1 - 4 years ago -1
Голосов: +0 / -1
Вернись на 1.26а
igor_razor #2 - 4 years ago 2
Голосов: +2 / -0
Да какая разница 1.26 или 1.27? Функция-то в обоих случаях не работает.
nvc123 #3 - 4 years ago 0
Голосов: +0 / -0
igor_razor, ты используешь отдельный скрипт или в редакторе триггеров пишешь аи?
попробуй во 2 варианте закоментить SetProduce (не удалить а именно закоментить)
ssbbssc #4 - 4 years ago 0
Голосов: +0 / -0
call SetProduce(1, 'hpea', 0) Попытаться начать тренировку крестьянина
call Sleep( 3.0 ) Если мы никогда не будем спать, то движок убьёт нас.
я конечно в джазе не особо, но после скобок должны быть отступы? или это не существенно?
а то у тебя call Sleep( 3.0 ) тут и везде пробелы есть, а тут call SetProduce(1, 'hpea', 0) - нет
BaHeK #5 - 4 years ago -2
Голосов: +2 / -4
ssbbssc:
call SetProduce(1, 'hpea', 0) Попытаться начать тренировку крестьянина
call Sleep( 3.0 ) Если мы никогда не будем спать, то движок убьёт нас.
я конечно в джазе не особо, но после скобок должны быть отступы? или это не существенно?
а то у тебя call Sleep( 3.0 ) тут и везде пробелы есть, а тут call SetProduce(1, 'hpea', 0) - нет
Эти отступы ни на что не влияют.
igor_razor #6 - 4 years ago (изм. ) 0
Голосов: +0 / -0
nvc123:
igor_razor, ты используешь отдельный скрипт или в редакторе триггеров пишешь аи?
попробуй во 2 варианте закоментить SetProduce (не удалить а именно закоментить)
Я делаю как описано в статье: прикрепляю файл в импорт и оттуда его запускаю через триггер "ИИ - start AI script" (вроде так звучит действие)
И прикол в том, что если закомментить SetProduce, то он всё равно каким-то образом считывается и вылетает. Зачем он обращает внимание даже на закомментированные функции - неизвестно.
nvc123 #7 - 4 years ago 0
Голосов: +0 / -0
igor_razor, попробуй теперь удалить эту закоменченную строку (именно удалить закоменченную строку с SetProduce)
igor_razor #8 - 4 years ago 0
Голосов: +0 / -0
ну тогда работает) но что мне делать без SetProduce?) Это одна из самых востребованных функций
nvc123 #9 - 4 years ago 0
Голосов: +0 / -0
igor_razor, то есть если удалить закоменченую строку из ранее нерабочего файла то всё работает?
значит проблема в SetProduce
думаю стоит посмотреть дефолтный human.ai
вообще по идее фатал должен возникать в том случае когда кто то пытается вызвать ai для игрока
igor_razor #10 - 4 years ago (изм. ) 0
Голосов: +0 / -0
А разве где-то существует дефолтный human.ai? Я просто оставил название как в примере. Это же обычный текстовый файл, который указывается в триггере как нестандартный ИИ. Неужели его название на что-то влияет?
Themis #11 - 4 years ago 2
Голосов: +2 / -0
Дефолтный human.ai находится в архиве war3x.mpq
Мной замечено, что символы за пределами ASCII в скриптах ИИ, но не common.ai, приводят к отключению скрипта и краху. Иногда. Не важно где эти символы: в комментах или нет.
SetProduce работает без глюков. Последний параметр указывает на номер городка ИИ. А вот в нумерации городков глюки есть.
Коммент напротив слипа ошибочен. Интерпретатор всего лишь добавит паузу в 1 секунду по лимиту операций.
В джазе пробелы не важны, А вот в скаримовском папирусе да.
nvc123 #12 - 4 years ago 0
Голосов: +0 / -0
igor_razor, human.ai это стандартный ai файл для альянса
он хранится в архиве вара в папке Scripts
igor_razor #13 - 4 years ago 0
Голосов: +0 / -0
То есть стоит попробовать поменять имя скрипта и выкинуть нафиг все кирриллические комменты? Но почему тогда работает первый вариант без SetProduce?
П.с. комменты в коде от переводчика вышеупомянутой статьи.
Themis #14 - 4 years ago 1
Голосов: +1 / -0
Имя не меняй.
Да, и, кажется, первого слипа на 1 секунду недостаточно, чтобы увидеть "Script started", надо 3 секунды.
А еще, не помню что, но было что-то такое, чего нельзя делать в теле функции main. То есть на будущее сделай так:
function main takes nothing returns nothing
    call Sleep( 1.0 )  // ждать одну секунду
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script started" )

    call myLoop()

    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script exiting" )
endfunction
igor_razor #15 - 4 years ago 0
Голосов: +0 / -0
Одной секунды вполне достаточно, чтобы увидеть сообщение.
То есть предлагается весь функционал вынести в отдельные процедуры-функции? Но ведь у автора статьи, видимо, всё работает в main'e.
Themis #16 - 4 years ago -1
Голосов: +1 / -2
Всего скриптов ИИ существует только три = стандартный в war3.mpq, AMAI и мой. Автор статьи к ним отношения не имеет.
Потому что даже один и тот же коммент с кирилицей, после переноса в другую строку, может уже не приводить к вылету.
igor_razor #17 - 4 years ago (изм. ) 0
Голосов: +0 / -0

Итак. Комментарии на кириллице убраны, и всё заработало. Но потом я всё же переименовал файл скрипта)