Для логирования работы своего ИИ хочу выводить на экран имеющееся у него количество юнитов определённого типа.
Код выглядит так:
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. Больше не создаются.
Я бы хотел вывести эту цифру на экран.
Warcraft 3 TFT 1.27, не Reforged

Я нашёл ответ на забугорном форуме: www.hiveworkshop.com/threads/i2s-without-natives-for-use-in-ai-s...
Суть такова, что по каким-то причинам I2S не работает в ИИ (.ai файле).
Выход из ситуации - написать свою функцию конвертации 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.
Благодарю за помощь пользователя Tredor46. Этот пользователь, вроде, разбирается хуже всех среди ответивших в JASS. Но польза от его ответов была больше, чем от кого-либо среди ответивших.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Ответы (11)
8
А вообще я не знаю такой функции GetUnitCount()
Можешь скинуть что она делает? Это же не варкарфтавская функция вроде как (по крайней мере у меня не высвечивается)
3
Tredor46,
Варкрафтовская, стандартная функция из движка
8
Svintus, А тьфу, это AIшные функции, я их из подсветки убрал, пока что не было надобности ими пользоваться
GetPlayerUnitTypeCount - Может вот эта нужна?
Или можешь их в группу добавить и посчитать GroupEnumUnitsOfPlayer()
3
Tredor46,
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
Не работает
30
А тьфу, это AIшные функции
Так их можно прокинуть по аналогии с UnitAlive.
3
nazarpunk,
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
не срабатывает
8
Svintus, ну засунь в группу всех нужных (я бы кстати так изначально и сделал) и посчитай их
CountUnitsInGroup(GroupEnumUnitsOfPlayer())
3
Tredor46,
Я ещё не дошёл до работы с группами и не знаю как это сделать
3
Tredor46,
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
не знаю, на сколько это правильно или нет. Не крашит, но и не выводит инфу
8
Svintus, если честно я вообще не понимаю что ты пишешь, и как вообще это должно работать, давай я сейчас карты сделаю, там будет 4 работника и их количество будет выводить на экран, подожди чучуть
8
Вот, там рабочие, каждую секунду подсчитывается количество рабочих игрока красного и выводится на экран
Загруженные файлы
Ответы (9)
3
Tredor46,
Я так понял, ты только через гуи делаешь что-то?
3
Tredor46,
Я через кастомный код пишу. Написание кода таким образом, я так понимаю, отличается от написания кода через гуи.
8
Svintus, скинь скрин что ты там где делаешь, я просто сейчас не понимаю что у тебя там происходит и почему ничего не получается
И GUI это триггеры, код это не GUI
8
Svintus, ты что-то пишешь где-то вне варкрафта и потом будешь это подключать?
3
Tredor46,
Открываю JassCraft, создаю файл с расширением .ai и пишу там код для ИИ
Примеры реализации из этой статьи: xgm.guru/p/wc3/melee_ai_creating2
Решил написать своё логирование для каждой функции, чтобы не искать ошибок во всём коде.
8
Svintus, ты скрин так и не скинул, у тебя там вообще что-нибудь работает?
Я посмотрел, да ничем там особо написание не должно различаться, язык то JASS и там и там есть, а vJass и cJass не знаю
Они там есть?
23
local string mytextMessage = GetUnitCount('hpea')
Понятно, почему не срабатывает. Ты присвоил строке возвратное число
Эта функция returns integer, а не string
Если ai script написан с ошибками, то он не будет
работать. Кроме добычи ресов у работников.
Также для ai есть специальная функция PlayerEx(), аналог j функции Player()
в JassCraft есть проверка синтаксиса, на ошибки. Она не 100% точная, но несоответствие типов она проверит
Посмотри там Syntax Check сверху окна проги.
Ответы (12)
3
EugeAl,
Я знаю, что строке присвоил число. Но разве стринг не может принять число? Число - всё ещё является символом, который стринг может принимать. Стринг ведь может принимать число в виде символа, а не в виде числа.
Учитывая что я не собираюсь совершать арифметические манипуляции, то вывод числа в виде символа меня устраивает.
Кроме того DisplayTimedTextToPlayer принимает стринг. Я так понимаю, я не могу передать туда integer.
30
Но разве стринг не может принять число?
Я смотрю, ты уже принял...
замечание от ScorpioT1000: 2.2 Провокация других пользователей на нарушение правил.
8
Svintus, ты можешь передать только тот тип переменной, который требуются и никакой другой
3
Tredor46,
Спасибо, я понял, что сам он не конвертирует. Нужно вызывать функцию конвертации I2S.
Но как и ранее, оно возвращает (null).
Это будет грустно, если вывод количества юнитов определённого типа может делать только через добавление их в группу...
3
Tredor46,
хотя функция GetUnitCount принимает только integer.
Будто бы вызывать её так "GetUnitCount('hpea')" неправильно. Но и найти айди юнитов в формате integer я не смог пока
8
Svintus, Да необязательно их в группу добавлять, ты их просто подсчитай любым способом и выведи ту переменную, в которой подсчитал
8
Svintus, Вот это сейчас, то что ты второе сказал, я честно говоря не понял вообще
3
Tredor46,
Функция GetUnitCount - получить количество единиц.
В ней я указываю название юнита, которое нужно посчитать GetUnitCount('hpea'). hpea - название рабочего Альянса, в редакторе войск.
Эта функция и должна делать подсчёт количества юнитов, которое я потом пытаюсь вывести
30
ты можешь передать только тот тип переменной, который требуются и никакой другой
Правда? Смотри фокус:
globals
	integer A = 1
	real B = A
endglobals
30
Но и найти айди юнитов в формате integer я не смог пока
Открою тебе великую тайну - 'hpea' это число.
8
nazarpunk, Получается меня переиграли и уничтожили как дешёвку
3
Попробовал функции GetUnitCountEx, GetUnitCount, GetUnitCountDone - все возвращают (null)
3
Я нашёл ответ на забугорном форуме: www.hiveworkshop.com/threads/i2s-without-natives-for-use-in-ai-s...
Суть такова, что по каким-то причинам I2S не работает в ИИ (.ai файле).
Выход из ситуации - написать свою функцию конвертации 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.
Благодарю за помощь пользователя Tredor46. Этот пользователь, вроде, разбирается хуже всех среди ответивших в JASS. Но польза от его ответов была больше, чем от кого-либо среди ответивших.
Принятый ответ
Ответы (12)
8
Svintus, плохая альтернатива, эта функция может выводить только числа от 0 до 9, если твоих рабочих будет например 14, она выведет return ""
8
Svintus, Я сейчас посмотрел на этом сайте твоём, под функцией I2C2 есть функция I2S2, вот она то тебе скорее всего и нужна
3
Tredor46,
Да, заметил, спасибо!
Но я не стал публиковать вторую функцию - не понимаю как она работает. Хотя она действительно работает с числами больше 10.
26
не понимаю как она работает
Очевидно, что разбивает число на цифры с помощью остатка от деления на 10
8
Svintus, допустим есть число 28437, в цикле она получает первую цифру из числа 28437, то есть цифру "2", после чего конвертирует её в строку и складывает строки, потом берёт следующую цифру "8", опять конвертирует, складывает, получается уже "28", ну и делает это до тех пор, пока не получится строка "28437", а затем возвращает её
Она так же работает и с отрицательными числами
26
в цикле она получает первую цифру из числа 28437, то есть цифру "2", после чего конвертирует её в строку
Так, только наоборот. Она идёт с конца, и вставляет последнюю конвертированную цифру в начало строки
8
Makeba, а ну да, с конца, я не особо в неё вглядывался, ладно
23
Svintus, блин, совсем забыл написать
В ИИ скриптах не работают нативки вывода строк, ExecuteFunc, триггеры, каллбэк функций, то есть ForGroup, TriggerAddAction, TimerStart и так далее
Инфа с сайта jass sourceforge
26
Makeba, а ну да, с конца, я не особо в неё вглядывался, ладно
Особо не вглядывался в функцию, но побежал объяснять как она работает, буквально написав всё наоборот.
11
Совет. Установи AMAI интегратор. Сделай карту с AMAI посмотри код файлов .ai. Поймёшь, что ты уже проходишь, этап создания ИИ в мили картах, но только в самом начале. И поймёшь, что поиск пути тебе не даст покоя. В будущем.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.