В общем порядком намучившись, все же пришел к выводу, что ребята писавшие АМАИ неспроста не юзали экспрешены, по всей видимости они по какой то причине(кривизна варкрафта привет) не работают в скриптах ИИ. Пришлось написать свой велосипед, очень похожий на то, что есть у них в принципе. Функция выборки рабочих игрока:
globals
constant player thisPlayer = Player(1) // В моем случае синий игрок
...
endglobals
...
//============================================================================
// Выбираем работников нашего игрока
//============================================================================
function GetPlayerWorkers takes nothing returns group
local group playerWorkers = null
local group allWorkers = null
local unit regularWorker = null
set playerWorkers = CreateGroup()
set allWorkers = CreateGroup()
call GroupEnumUnitsOfType(allWorkers, "Peasant", null)
loop
set regularWorker = FirstOfGroup(allWorkers)
exitwhen regularWorker == null
if GetOwningPlayer(regularWorker) == thisPlayer then
call GroupAddUnit(playerWorkers, regularWorker)
endif
call GroupRemoveUnit(allWorkers, regularWorker)
endloop
return playerWorkers
endfunction
И юзаем нашу функцию:
//============================================================================
// Отряды защиты лагеря
//============================================================================
function Defenders takes nothing returns nothing
local group playerWorkers = null
...
set playerWorkers = GetPlayerWorkers()
call GroupImmediateOrder(playerWorkers, "militia")
call GroupClear(playerWorkers)
call CampaignDefender(1, goldMiners + lumberjacks, MILITIA)
...
endfunction
quq_CCCP, фильтр должен пахать как надо, даже в Blizzard.j есть подобный фильтр. По поводу дебага: честно говоря не знаю, как тут правильно заниматься этим, я и пытаюсь вместо него хотя бы на экран выводить количество юнитов, чтобы понять, сколько рабочих он занес в группу.
quq_CCCP, в самом скрипте ИИ. По поводу дирижаблей знаю, близзы не особо заморачивались конечно. А может хотели исключить ситуацию, чтобы игрок просек фишку с покупкой дирижаблей и подлавливал бота на покупке дирижабля(как можно подловить АМАИ у таверны на покупке героя или у лавки гоблина на покупке предметов).
quq_CCCP, я думаю мы оба понимаем, что это костыли. У меня почти получилось, я раскопал на гитхабе исходники АМАИ, правда их методика не совсем мне нравится, но все же я убедился в том, что надо вызывать способность напрямую, сам комп этого не сделает без прямого приказа. Пока что так:
local group workers = null
local unit regularPeasant = null
local boolexpr expression = null
...
set workers = CreateGroup()
set expression = Filter(function GetPlayerWorkersExpression)
call GroupEnumUnitsOfType(workers, "Peasant", expression)
call GroupImmediateOrder(workers, "militia")
// Проверка
set countUnits = 0
loop
set regularPeasant = FirstOfGroup(workers)
exitwhen regularPeasant == null
set countUnits = countUnits + 1
call GroupRemoveUnit(workers, regularPeasant)
endloop
call DisplayTextToPlayer(GetLocalPlayer(), 0.0, 0.0, "Count: " + I2S(countUnits))
Это работает, работники стали записываться в ополчение, но пока у меня не получается разрешить 2 проблемы:
Я не могу осознать, что не так с экспрешеном, функция возвращает всегда False, предположительно причина в функции GetFilterUnit, полагаю, что она всегда возвращает null. А без экспрешена выбираются вообще все работники на карте, вне зависимости от того, какому игроку они принадлежат и бегут к ратушам хвататься за оружие.
По совершенно не ясной для меня причине криво работает функция конвертации целого числа в строку. Мне выводится пустота, т.е. Count:
Я пробовал выводить разные числа для интереса, он начинает выводить всякую дичь: frostarmor, music, имя одного из игроков, что угодно, но не числа.
Нет, там точно не то, я помню меня интересовал этот вопрос и я ковырял ИИ компьютеров в этой главе. Там точно в атакующих волнах нет рабов хаоса и рабы сами в редакторе объектов без изменений, там баг самой игры, почему то кодои хаоса отображаются как незанятые рабы по какой то причине. Поэтому думаю с ними ИИ путает обычных рабов, вроде бы кодои хаоса не ходят вообще в атаку как раз, насколько я помню.
Черт, еще порядком подбешивает, что скрипты ИИ не понимают функций из blizzard.j. Так можно было бы триггерно выбрать рабочих, отдать приказ мобилизоваться в ополчение, конвертнуть в текст и использовать в скрипте. Эх.
quq_CCCP, да вот по поводу того, что данная абилка юзается главным зданием альянса лишь тогда, когда рабочие начинают терпеть поблизости от него - я знаю, сам замечал неоднократно. Я попробовал вчера еще из интереса заставить ИИ не защищать пока что лагерь ополченцами, а отправить их в атаку, но тоже потерпел фиаско:
Попробую сейчас функцию SetBuildUnit вызвать перед CampaignAttackerEx
Триггерный вариант использования способности рассматриваю как крайний случай, потому как это будет уже не в скрипте ИИ и потому как будут мобилизовываться в ополчение все рабочие.
Попробовал SetBuildUnit, к сожалению, результат тот же.
Жаль, что у AMAI весь код обфусцирован, было бы интересно у них глянуть, как они заставляют компьютер крипить золотые шахты с ополченцами.
PraetorianSM, ополчение стандартное, это для того, чтобы работники принимали участие в обороне окраин лагеря. Стандартное ополчение обычно задействуется тогда, когда бой идет неподалеку от главного здания. А тут задумка в том, чтобы работники не ждали, когда противники вырежут войска и доберутся до них.
Ev3nt, благодарю, нашел данную функцию, но что странно, в моем Blizzard.j отсутствует условие
if (townHall != null) then
Но идея понятна, нужно подходить со стороны ратуши, а не со стороны работника. Однако, в скриптах ИИ нельзя юзать функции из Blizzard.j, все мои попытки заканчивались тем, что скрипт становился нерабочим.
Еще немного багов: иллюзии наносят 1 единицу урона и применение одержимости баньшами приводит в десинку. Баг с баньшами обнаружил Хэппи на стриме, можете в его группе прочитать об этом. Пока что известно точно, что баг проявляется, если воровать работников у хумов и использовать посох телепортации + свиток телепорта. Я пробовал с компом, с орками, было все нормально, с хумами словил краш после выхода из игры.
KingMaximax, я удивляюсь, что они когда это делали, туда не посмотрели. Совсем бараны что ли. Клепают патчи и в каждом патче баги новые каждый раз. Ладно еще поначалу они только разбирались с игрой, но уже больше года прошло, сколько уже можно было нормально во все вникнуть.
Обнаружил баг в 1.31. Из-за того, что близзы изменили ауру от барабанов, любой герой, у которого есть анимация Stand Channel при подбирании этого предмета начинает бесконечно воспроизводить эту анимацию.
Баг начинается после движения юнита.
В общем удалил папку с варкрафтом, скопировал с винта 1.30. Обновился. Вообще варкрафт стал запускаться и тупо черный экран. Редактор тоже не запускался. Ну ок, я даже не удивлен, все по классике, дадим додикам еще один шанс. Удалил еще раз, еще раз скопировал, обновился, теперь вроде карты стали запускаться. Живем до очередного найденного бага.
8gabriel8, нет. Причем из редактора карты запускаются, что самое интересное.
И да может поможет эта инфа, если пытаться создать карту на батлнет, пишет, что файл карты не найден. Возможно такая же ошибка при запуске обычной карты, но тогда почему она не отображается, не знаю.
» WarCraft 3 / Иконки на заказ
» WarCraft 3 / Адекватная невосприимчивость к магии
» WarCraft 3 / Иконки на заказ
» WarCraft 3 / Нужна модель? - Вам сюда!
» WarCraft 3 / Иконки на заказ
» WarCraft 3 / Нужна модель? - Вам сюда!
Заранее благодарю!
» Хроники Вальдиона. Начало / Хроники Вальдиона. Начало
Ред. Meddin
» WarCraft 3 / Как заставить ИИ использовать ополченцев
» WarCraft 3 / Как заставить ИИ использовать ополченцев
Ред. Meddin
» WarCraft 3 / Как заставить ИИ использовать ополченцев
Ред. Meddin
» WarCraft 3 / Как заставить ИИ использовать ополченцев
- Я не могу осознать, что не так с экспрешеном, функция возвращает всегда False, предположительно причина в функции GetFilterUnit, полагаю, что она всегда возвращает null. А без экспрешена выбираются вообще все работники на карте, вне зависимости от того, какому игроку они принадлежат и бегут к ратушам хвататься за оружие.
- По совершенно не ясной для меня причине криво работает функция конвертации целого числа в строку. Мне выводится пустота, т.е. Count:
Я пробовал выводить разные числа для интереса, он начинает выводить всякую дичь: frostarmor, music, имя одного из игроков, что угодно, но не числа.» WarCraft 3 / Как заставить ИИ использовать ополченцев
Ред. Meddin
» WarCraft 3 / Как заставить ИИ использовать ополченцев
Ред. Meddin
» WarCraft 3 / Как заставить ИИ использовать ополченцев
» WarCraft 3 / Конвертер карты в 1.26
» WarCraft 3 / Перевод карты с более новой версии Warcraft на более старую
» WarCraft 3 / Бета версия Warcraft III Reforged 1.32
» WarCraft 3 / Зелёный город
Ред. Meddin
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
» WarCraft 3 / Официально стал доступен PTR 1.31
Баг начинается после движения юнита.
Ред. Meddin
» WarCraft 3 / Перестали запускаться все карты, кроме стандартных
» WarCraft 3 / Перестали запускаться все карты, кроме стандартных
И да может поможет эта инфа, если пытаться создать карту на батлнет, пишет, что файл карты не найден. Возможно такая же ошибка при запуске обычной карты, но тогда почему она не отображается, не знаю.
» Мир безумного / World of Warcraft: «Новый дом»
» Мир безумного / World of Warcraft: «Новый дом»