Для логирования работы своего ИИ хочу выводить на экран имеющееся у него количество юнитов определённого типа.
Код выглядит так:
Код выглядит так:
function main takes nothing returns nothing
loop
call Sleep( 3.0 )
call DisplayTimedTextToPlayer( GetLocalPlayer(), 0.0, 0.0, 10, I2S(GetUnitCount('hpea')))
endloop
endfunction
Но из GetUnitCount('hpea') не передаётся количество юнитов.
При инициализации карты их появляется 4. Больше не создаются.
Я бы хотел вывести эту цифру на экран.
При инициализации карты их появляется 4. Больше не создаются.
Я бы хотел вывести эту цифру на экран.
Warcraft 3 TFT 1.27, не Reforged
Принятый ответ
Я нашёл ответ на забугорном форуме: www.hiveworkshop.com/threads/i2s-without-natives-for-use-in-ai-s...
Суть такова, что по каким-то причинам I2S не работает в ИИ (.ai файле).
Выход из ситуации - написать свою функцию конвертации integer в string
Выход из ситуации - написать свою функцию конвертации integer в string
Сама функция:
function I2C2 takes integer i returns string
if i == 0 then
return "0"
elseif i == 1 then
return "1"
elseif i == 2 then
return "2"
elseif i == 3 then
return "3"
elseif i == 4 then
return "4"
elseif i == 5 then
return "5"
elseif i == 6 then
return "6"
elseif i == 7 then
return "7"
elseif i == 8 then
return "8"
elseif i == 9 then
return "9"
endif
return ""
endfunction
Теперь я использую I2C2 вместо I2S.
После этого мой код работает как надо, возвращая 4.
После этого мой код работает как надо, возвращая 4.
Благодарю за помощь пользователя Tredor46. Этот пользователь, вроде, разбирается хуже всех среди ответивших в JASS. Но польза от его ответов была больше, чем от кого-либо среди ответивших.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Можешь скинуть что она делает? Это же не варкарфтавская функция вроде как (по крайней мере у меня не высвечивается)
Варкрафтовская, стандартная функция из движка
В этом случае передаётся (null)
GetPlayerUnitTypeCount - Может вот эта нужна?
Или можешь их в группу добавить и посчитать GroupEnumUnitsOfPlayer()
function main takes nothing returns nothing
local string mytextMessage = GetPlayerUnitTypeCount(Player 1,('hpea'))
loop
call Sleep( 3.0 )
call DisplayTimedTextToPlayer( GetLocalPlayer(), 0.0, 0.0, 10, mytextMessage )
endloop
endfunction
function main takes nothing returns nothing
local string mytextMessage = UnitAlive('hpea')
loop
call Sleep( 3.0 )
call DisplayTimedTextToPlayer( GetLocalPlayer(), 0.0, 0.0, 10, mytextMessage )
endloop
endfunction
CountUnitsInGroup(GroupEnumUnitsOfPlayer())
Я ещё не дошёл до работы с группами и не знаю как это сделать
function main takes nothing returns nothing
local group workersGroup = CreateGroup
GroupAddUnit takes group workersGroup unit UnitAlive('hpea')
CountUnitsInGroup takes group workersGroup returns integer
local string workerGroup1 = workersGroup
loop
call Sleep( 3.0 )
call DisplayTimedTextToPlayer( GetLocalPlayer(), 0.0, 0.0, 10, workerGroup1 )
endloop
endfunction
Я так понял, ты только через гуи делаешь что-то?
Я через кастомный код пишу. Написание кода таким образом, я так понимаю, отличается от написания кода через гуи.
И GUI это триггеры, код это не GUI
Открываю JassCraft, создаю файл с расширением .ai и пишу там код для ИИ
Примеры реализации из этой статьи: xgm.guru/p/wc3/melee_ai_creating2
Да.
Я посмотрел, да ничем там особо написание не должно различаться, язык то JASS и там и там есть, а vJass и cJass не знаю
Они там есть?
Так я же код скинул. Другого кода там нет
Ред. EugeAl
Эта функция returns integer, а не string
Если ai script написан с ошибками, то он не будет
работать. Кроме добычи ресов у работников.
Посмотри там Syntax Check сверху окна проги.
Ред. Svintus
Я знаю, что строке присвоил число. Но разве стринг не может принять число? Число - всё ещё является символом, который стринг может принимать. Стринг ведь может принимать число в виде символа, а не в виде числа.
Учитывая что я не собираюсь совершать арифметические манипуляции, то вывод числа в виде символа меня устраивает.
Ред. Svintus
Спасибо, я понял, что сам он не конвертирует. Нужно вызывать функцию конвертации I2S.
Но как и ранее, оно возвращает (null).
хотя функция GetUnitCount принимает только integer.
Будто бы вызывать её так "GetUnitCount('hpea')" неправильно. Но и найти айди юнитов в формате integer я не смог пока
Ред. Svintus
Функция GetUnitCount - получить количество единиц.
В ней я указываю название юнита, которое нужно посчитать GetUnitCount('hpea'). hpea - название рабочего Альянса, в редакторе войск.
Эта функция и должна делать подсчёт количества юнитов, которое я потом пытаюсь вывести
Ред. nazarpunk
Ред. Svintus
Выход из ситуации - написать свою функцию конвертации integer в string
После этого мой код работает как надо, возвращая 4.
Ред. Tredor46
Ред. Svintus
Да, заметил, спасибо!
Но я не стал публиковать вторую функцию - не понимаю как она работает. Хотя она действительно работает с числами больше 10.
Ред. Makeba
Она так же работает и с отрицательными числами
В ИИ скриптах не работают нативки вывода строк, ExecuteFunc, триггеры, каллбэк функций, то есть ForGroup, TriggerAddAction, TimerStart и так далее
Инфа с сайта jass sourceforge