Хочу начать писать свой ИИ, начиная от базовых команд с переходом на более сложные.
Так, например, попытался пройтись по инструкциям этого урока: xgm.guru/p/wc3/melee_ai_creating1 и начать с простого вывода сообщения на экран:
function main takes nothing returns nothing
    call Sleep( 2 )  // <--- Чтобы удостовериться, что игра готова записать приветствие.
    call DisplayTimedTextToPlayer( GetLocalPlayer(), 0.0, 0.0, 3600, "Hello World!" )
endfunction
Пытался по инструкции менять содержимое файла в движке игры human.ai - не помогло (но к такому методу теста отношусь скептически).
Открыл карту для сражений, поставил триггер, который срабатывает каждые 2 секунды и вызывает код моего .ai, с содержимым:
function main takes nothing returns nothing
    call Sleep( 2 )  // <--- Чтобы удостовериться, что игра готова записать приветствие.
    call DisplayTimedTextToPlayer( GetLocalPlayer(), 0.0, 0.0, 3600, "Hello World!" )
endfunction
Но сообщение на экран не выводится.
А при попытке сделать по инструкции со статьи - игра крашится моментально.
Попытался создать карту с нуля. Поставил точки респавна красного и синего игрока. Включил всё тот же триггер на запуск своего .ai скрипта каждые 2 секунды, который выводит сообщение на экран. Но после запуска карты у меня победа, жму продолжить игру - сообщение не выводится.
Попытался вставить этот код (вывода сообщения на экран) в нестандартный код карты (который до всех триггеров) - но WorldEdit в итоге не компилирует карту даже.
Ошибка: Отсутствует название функции call Sleep( 2 ) <--- Чтобы удостовериться, что игра готова записать приветствие.
Я пробовал искать ответы ответы на свои вопросы в гугле, но не смог получить нужного результата. Какой-либо гайд отсутствует, который мог облегчить порог вхождения в моддинг варкрафта.
Официальная сборка Warcraft 3 1.27 TFT

Проблема в русских символах.
Даже если они закомментированы.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
Да тоже смутился такому факту, но всё лечиться
ответ
1
А это никого не смущает? то что локалки поставлены не первыми
function Trig_treeegs_Actions takes nothing returns nothing
	set udg_Unitper = GetSpellAbilityUnit()
	local unit Usp = udg_Unitper
	local unit orud1
	local unit orud2
	local unit orud3
	. . .
2
Утекают точки...
PolarProjectionBJ(GetRectCenter(RectFromCenterSizeBJ(GetUnitLoc(Usp), 200., 300.)), 256, 100.)
// GetUnitLoc(Usp)
3
Обращения как в функциям
orud1()
Usp()
В общем - рано тебе ещё прям так полностью переходить на Jass.
Тут надо переделывать всё, начиная с момента удаления создаваемого эффекта, и вплоть до момента созданиея юнита по XY. А так же момент с полярными смещениями (ты там вообще лишнюю область создаёшь, а значит не знаешь как надо правильно полярки использовать на GUI).

30
Ты выполнил всё как указано в статье?
  • Вставьте вышеуказанный код в файл, который называется human.ai .
  • Запустите Word Editor.
  • Откройте вашу любимую melee - карту и сохраните её под другим именем или (предпочтительней) в другой директории.
  • Нажмите F12 (или откройте меню модулей и выберите менеджер импорта) .
  • Select File --> Import file in the Import manager.
  • Выберите созданный файл human.ai.
  • Щёлкните правой кнопкой мыши на импортированном файле и выберите Modify file properties.
  • Измените путь к файлу на “\Scripts\human.ai”.
  • Сохраните карту (вам, вероятно, также нужно закрыть карту).
  • Запустите WarCraft III, выберите ''Single game -> Custom Game -> Ваша милая карта’’.
  • Убедитесь, что Вы играете против компьютера расы человека.
  • Начните игру и ищите “Hello World!” на экране (она всё же быстро исчезает).
Ответы (6)
25
“\Scripts\human.ai”
Не знаю в чём тайный смысл использования обратного слэша в начале этой строки, но без него хеллоуворлд работает
3
Makeba, Чуть ниже написал об этом. Убрал его, но игра крашит теперь
25
Svintus, ну я перезакинул файл в карту, залочил настройки игрока 2 на Human / Computer и запустил проверку из редактора. Из игры не проверял
Загруженные файлы
3
Кажется очевидным, что это не работает, так как ИИ компьютера начинает обычное строительство.
То есть стандартный ИИ переписывает мой ИИ.
Но в случае если я уберу код из mpq архива в файле human.ai и заменю на эти строки, то карта просто не запускается.

Если создать папку Scripts, которой по умолчанию нету, и туда закинуть файл human.ai, а в пути убрать слэш с “\Scripts\human.ai” на “Scripts\human.ai”, то при выборе расы компьютеру альянса - игра просто крашит при завершении загрузки карты.
При выборе другой расы - всё нормально.
Можно предположить, что теперь происходит чтение этого ai файла. Но происходит краш
Ответы (8)
15
Svintus, открыв карту через Ladik's MPQ Editor, видно, что название папки неправильное (из-за обратного слэша)
убрав из пути импортированного файла обратный слэш, файл читается, но функция не работает.
запустив варкрафт через UjAPI с включенным dev mode, в консоли видно, что компиляция скрипта завершается с ошибкой.
К сожалению, лог ошибки пустой по какой-то причине. ИИ не писал, так что дальше не помогу, просто написал свой путь анализа проблемы.
Загруженные файлы
3
fenathesnake,
Жаль что не получилось добиться нужного результата, но спасибо за проявленный интерес!
15
Svintus, как ниже написали, вина в нативке Sleep, ее нету, как минимум в 1.24 - 1.28 версиях.
3
fenathesnake,
А как мне понять, что такой функции нет? Я импортировал список функций из движка в JassCraft, и там отображается, что она есть
15
Svintus, ну если common.j из своего варкрафта взял то правильно. Мб есть Sleep в твоей версии, тогда не знаю в чем ошибка.
Посмотреть список существующих нативок можно, открыв через MPQ Editor архив игры (War3Patch.mpq) и открыв common.j
Кстати, увидел там же common.ai, видимо нативки как раз для ИИ, и вот в нем есть нативка Sleep. В общем, как и говорил, я с этим не работал, так что дальше хз, код выглядит валидным.
3
fenathesnake, Этот момент для меня непонятный.
common.ai есть в war3.mpq, в War3Patch.mpq, в War3x.mpq и все они разные. Какой из них используется?
15
Svintus, эти архивы последовательно загружаются
war3.mpq - ассеты варкрафта 3 (ROC)
war3x.mpq - ассеты дополнения (TFT)
war3Patch.mpq - ассеты патча
актуальный файл будет тот, что загружен последним, то есть если есть common.ai во всех архивах, то загрузится тот что в war3Patch.mpq ибо он последний. Это работает вообще со всеми файлами в этих архивах, и, кстати, твоя карта тоже подгружается как архив после всех этих архивов и может заменять почти любой файл из оригинальных ассетов, что порою очень пригождается. Но это так, к слову.
статьи полноценной на эту тему не нашел, вот чето здесь обсуждали
9
Если варик выдал тебе ошибку, то в чем проблема ее прочесть? Тебе черным по белому написано - нет такой функции Sleep(). В джассе есть функция TriggerSleepAction(), которая триггер на паузу ставит, скорее всего ее имеет ввиду автор. Такое могло произойти если автор на другой версии варкрафта сделал гайд.
Ответы (3)
3
IzobretatelBoom, в JassCraft в поиск я вбил Sleep(), он выдал, что такая функция есть. Поэтому вариант что в игре нет такой функции - отпал.
32
Svintus, AI нативки работают по большей части в потоке AI скрипта, скрипт пишется на языке JASS, советую изучить для начала, после посмотреть список AI нативок и стандартные melee ai скрипты.
Скрипт AI можно запустить только для игрока бота, если слотом управляет человек - всё AI не стартанет, убираешь все стандартные триггеры сражения и создаешь запуск твоего ии для конкретного игрока если им управляет компьютер.
3
quq_CCCP,
Так я именно это и делаю, что изучаю как работает ИИ. Нашёл статью, и по ней пытаюсь запустить первые функции. Которые не работают
3
Опытным путём пытаюсь выяснить в чём дело.
Если подгружать файл с кодом
function main takes nothing returns nothing
call Sleep( 2 ) <--- Чтобы удостовериться, что игра готова записать приветствие.
call DisplayTimedTextToPlayer( GetLocalPlayer(), 0.0, 0.0, 3600, "Hello World!" )
endfunction
То краш при инициализации карты.
Если подгружать этот файл пустым - краша нет. Крестьяне просто начинают добывать золото.
Если подгрузить в этот файл извлечённый из mpq код humans.ai - то он работает, краша нет.
Если в этот же файл в конце добавить код, что написан выше - игра крашится.
Значит дело в коде, а не в принципе его интеграции.
Я попытался вызвать просто:
call Sleep( 2 ) <--- Чтобы удостовериться, что игра готова записать приветствие.
Но получил краш. Добавил его к human.ai оригинальный - краш (хотя функция слипа там используется, и она не крашит).
Стерев русский текст - игра крашится перестала.
Теперь этот код:
function main takes nothing returns nothing
call Sleep( 2 )
call DisplayTimedTextToPlayer( GetLocalPlayer(), 0.0, 0.0, 3600, "Hello World!" )
endfunction
Не крашится.
Но и не исполняется.
Я не уверен, но возможно файл .ai не имеет доступа к функциям common.j. Ведь функция DisplayTimedTextToPlayer расположена там.
замечание от EugeAl: 1.5 Злоупотребление форматированием. Здесь нужно код всегда писать в формате кода, чтобы другие люди, если что, могли скопировать код через кнопку.
Ответы (1)
3
Опытным путём пытаюсь выяснить в чём дело.
Если подгружать файл с кодом
function main takes nothing returns nothing
call Sleep( 2 ) <--- Чтобы удостовериться, что игра готова записать приветствие.
call DisplayTimedTextToPlayer( GetLocalPlayer(), 0.0, 0.0, 3600, "Hello World!" )
endfunction
То краш при инициализации карты.
Если подгружать этот файл пустым - краша нет. Крестьяне просто начинают добывать золото.
Если подгрузить в этот файл извлечённый из mpq код humans.ai - то он работает, краша нет.
Если в этот же файл в конце добавить код, что написан выше - игра крашится.
Значит дело в коде, а не в принципе его интеграции.
Я попытался вызвать просто:
call Sleep( 2 ) <--- Чтобы удостовериться, что игра готова записать приветствие.
Но получил краш. Добавил его к human.ai оригинальный - краш (хотя функция слипа там используется, и она не крашит).
Стерев русский текст - игра крашится перестала.
Теперь этот код:
function main takes nothing returns nothing
call Sleep( 2 )
call DisplayTimedTextToPlayer( GetLocalPlayer(), 0.0, 0.0, 3600, "Hello World!" )
endfunction
Не крашится.
Но и не исполняется.
Я не уверен, но возможно файл .ai не имеет доступа к функциям common.j. Ведь функция DisplayTimedTextToPlayer расположена там.
Теперь этот работает. Не знаю в чём магия была.
8
А к чему все эти humans.ai, ты именно Общий ИИ пишешь?
Если ты просто пишешь ИИ для своей карты/карт, можно просто через JASS его написать, разве так будет не проще?

Ты его пишешь просто для себя или ты хочешь написать что-то наподобие ботов AMAI?
Ответы (2)
3
Tredor46, разве я не пытаюсь на JASS писать? Суть топика в том и заключается, чтобы выяснить как писать ИИ на JASS
8
Svintus, Если это просто для себя, то просто установи им логику действий через функции, я пока что так и не понял в чём корень проблемы
Если то-то, делают то-то, если это, делают это, во время того-то, делают это или то-то и т.д.
3
Проблема в русских символах.
Даже если они закомментированы.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.