Добавлен ImbaState
Доброго времени суток!
Мною был написан простенький ИИ-скрипт на JASS для компухантера, в стиле ИИ в кампаниях метелицы. Т.е. ИИ создает отряд деферов, гардианов и еще юнитов для фаерпати, а затем посылает это самое фаерпати на базу противника. И так волна за волной.
Вот сам скрипт:
Вот сам скрипт:
смотреть сюда
//==================================================
globals
player RedTeam = Player(0)
constant integer SKEL_MAGE = 'uskm'
endglobals
//==================================================
// CONFIGURE
//==================================================
function ConfigureAI takes nothing returns nothing
call SetSlowChopping( true )
call SetPeonsRepair( true )
call SetHarvestLumber( false )
call DoCampaignFarms( false )
endfunction
//==================================================
// MAIN
//==================================================
function main takes nothing returns nothing
call CampaignAI( ZIGGURAT_1, null )
call ConfigureAI()
//====================
// UNITS
//====================
call SetBuildUnit( 1, NECROPOLIS_1 )
call SetBuildUnit( 1, ACOLYTE )
call SetBuildUnit( 1, UNDEAD_MINE )
call SetBuildUnit( 1, UNDEAD_ALTAR )
call SetBuildUnit( 3, CRYPT )
call SetBuildUnit( 2, GRAVEYARD )
call SetBuildUnit( 5, ACOLYTE )
call SetBuildUnit( 1, LICH )
call SetBuildUnit( 20, ZIGGURAT_1 )
call SetBuildUnit( 6, ZIGGURAT_2 )
call SetBuildUnit( 6, ZIGGURAT_FROST )
call SetBuildUnit( 1, NECROPOLIS_2 )
call SetBuildUnit( 2, DAMNED_TEMPLE )
call SetBuildUnit( 2, SLAUGHTERHOUSE )
call SetBuildUnit( 1, NECROPOLIS_3 )
call AddGuardPost( GHOUL, -6124, 4468 )
call AddGuardPost( GHOUL, -5977, 4490 )
call AddGuardPost( GHOUL, -5461, 4556 )
call AddGuardPost( GHOUL, -5304, 4568 )
call AddGuardPost( GHOUL, -3766, 4595 )
call AddGuardPost( GHOUL, -3715, 4717 )
call AddGuardPost( GHOUL, -3675, 4820 )
call AddGuardPost( GHOUL, -3662, 4939 )
call AddGuardPost( GHOUL, -3532, 7206 )
call AddGuardPost( GHOUL, -3462, 7126 )
call AddGuardPost( GHOUL, -3382, 6992 )
call AddGuardPost( GHOUL, -3262, 6861 )
call AddGuardPost( ABOMINATION, -6090, 4600 )
call AddGuardPost( ABOMINATION, -5411, 4705 )
call AddGuardPost( ABOMINATION, -3836, 4799 )
call AddGuardPost( NECRO, -6173, 4772 )
call AddGuardPost( NECRO, -5336, 4891 )
call AddGuardPost( NECRO, -4014, 4735 )
call AddGuardPost( NECRO, -3579, 7059 )
call AddGuardPost( NECRO, -3467, 6879 )
call CampaignDefenderEx( 8, 8, 8, GHOUL )
call CampaignDefenderEx( 4, 4, 4, SKEL_WARRIOR )
call CampaignDefenderEx( 4, 4, 4, SKEL_MAGE )
call CampaignDefenderEx( 4, 4, 4, NECRO )
call CampaignDefenderEx( 4, 4, 4, ABOMINATION )
call CampaignDefenderEx( 1, 1, 1, LICH )
//====================
// ATTACK
//====================
call WaitForSignal()
//*** WAVE 1 2min***
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, GHOUL )
call CampaignAttackerEx( 2, 2, 2, SKEL_WARRIOR )
call SuicideOnPlayer(M2, RedTeam )
//*** WAVE 2 5min***
call InitAssaultGroup()
call CampaignAttackerEx( 3, 3, 3, GHOUL )
call CampaignAttackerEx( 2, 2, 2, SKEL_WARRIOR )
call CampaignAttackerEx( 2, 2, 2, SKEL_MAGE )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 3 8min***
call InitAssaultGroup()
call CampaignAttackerEx( 4, 4, 4, GHOUL )
call CampaignAttackerEx( 4, 4, 4, SKEL_WARRIOR )
call CampaignAttackerEx( 2, 2, 2, SKEL_MAGE )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 4 11min***
call InitAssaultGroup()
call CampaignAttackerEx( 4, 4, 4, GHOUL )
call CampaignAttackerEx( 2, 2, 2, ABOMINATION )
call CampaignAttackerEx( 2, 2, 2, SKEL_WARRIOR )
call CampaignAttackerEx( 1, 1, 1, NECRO )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 5 14min***
call InitAssaultGroup()
call CampaignAttackerEx( 4, 4, 4, GHOUL )
call CampaignAttackerEx( 2, 2, 2, NECRO )
call CampaignAttackerEx( 1, 1, 1, ABOMINATION )
call CampaignAttackerEx( 2, 2, 2, SKEL_WARRIOR )
call CampaignAttackerEx( 2, 2, 2, SKEL_MAGE )
call CampaignAttackerEx( 1, 1, 1, LICH )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 6 17min***
call InitAssaultGroup()
call CampaignAttackerEx( 4, 4, 4, GHOUL )
call CampaignAttackerEx( 2, 2, 2, NECRO )
call CampaignAttackerEx( 2, 2, 2, ABOMINATION )
call CampaignAttackerEx( 2, 2, 2, SKEL_WARRIOR )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 7 20min***
call InitAssaultGroup()
call CampaignAttackerEx( 4, 4, 4, GHOUL )
call CampaignAttackerEx( 2, 2, 2, NECRO )
call CampaignAttackerEx( 4, 4, 4, SKEL_WARRIOR )
call CampaignAttackerEx( 2, 2, 2, SKEL_MAGE )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 8 23min***
call InitAssaultGroup()
call CampaignAttackerEx( 8, 8, 8, GHOUL )
call CampaignAttackerEx( 2, 2, 2, ABOMINATION )
call CampaignAttackerEx( 4, 4, 4, SKEL_WARRIOR )
call CampaignAttackerEx( 2, 2, 2, SKEL_MAGE )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 9 26min***
call InitAssaultGroup()
call CampaignAttackerEx( 8, 8, 8, GHOUL )
call CampaignAttackerEx( 3, 3, 3, ABOMINATION )
call CampaignAttackerEx( 2, 2, 2, NECRO )
call CampaignAttackerEx( 1, 1, 1, LICH )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 10 29min***
call InitAssaultGroup()
call CampaignAttackerEx( 6, 6, 6, GHOUL )
call CampaignAttackerEx( 2, 2, 2, ABOMINATION )
call CampaignAttackerEx( 2, 2, 2, NECRO )
call CampaignAttackerEx( 4, 4, 4, SKEL_WARRIOR )
call CampaignAttackerEx( 2, 2, 2, SKEL_MAGE )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 11 32min***
call InitAssaultGroup()
call CampaignAttackerEx( 6, 6, 6, GHOUL )
call CampaignAttackerEx( 2, 2, 2, NECRO )
call CampaignAttackerEx( 3, 3, 3, ABOMINATION )
call CampaignAttackerEx( 4, 4, 4, SKEL_WARRIOR )
call CampaignAttackerEx( 2, 2, 2, SKEL_MAGE )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 12 35min***
call InitAssaultGroup()
call CampaignAttackerEx( 7, 7, 7, GHOUL )
call CampaignAttackerEx( 2, 2, 2, NECRO )
call CampaignAttackerEx( 2, 2, 2, ABOMINATION )
call CampaignAttackerEx( 4, 4, 4, SKEL_WARRIOR )
call CampaignAttackerEx( 4, 4, 4, SKEL_MAGE )
call SuicideOnPlayer(M3, RedTeam )
//*** WAVE 13+ ***
loop
call InitAssaultGroup()
call CampaignAttackerEx( 8, 8, 8, GHOUL )
call CampaignAttackerEx( 2, 2, 2, NECRO )
call CampaignAttackerEx( 3, 3, 3, ABOMINATION )
call CampaignAttackerEx( 4, 4, 4, SKEL_WARRIOR )
call CampaignAttackerEx( 4, 4, 4, SKEL_MAGE )
call CampaignAttackerEx( 1, 1, 1, LICH )
call SuicideOnPlayer(M3, RedTeam )
call InitAssaultGroup()
call CampaignAttackerEx( 6, 6, 6, GHOUL )
call CampaignAttackerEx( 2, 2, 2, NECRO )
call CampaignAttackerEx( 4, 4, 4, ABOMINATION )
call CampaignAttackerEx( 4, 4, 4, SKEL_WARRIOR )
call CampaignAttackerEx( 4, 4, 4, SKEL_MAGE )
call CampaignAttackerEx( 1, 1, 1, LICH )
call SuicideOnPlayer(M3, RedTeam )
endloop
endfunction
И работает он по сути нормально, за исключением одного. На какой-нибудь волне может прибежать целая толпа деферов в придачу, что сносит к чертям базу, чердак, Звезду Смерти и т.д.
Это происходит не всегда, может вообще ни разу не произойти. И вот этот фактор рандома меня обескураживает.
Вот скриншот базы для этого бота:
Это происходит не всегда, может вообще ни разу не произойти. И вот этот фактор рандома меня обескураживает.
Вот скриншот базы для этого бота:
Из юнитов заранее созданы лишь Лич и послушники. А далее бот сам начинает расставлять по заданным координатам стражу, на базе держит деф-отряд, и еще генерирует очередную атакующую волну.
Вот как это выглядит:
Вот как это выглядит:
Ну и гардианы:
Т.е. все как и задумано, повторюсь.
Но порой вся вот эта деф-пати начинает идти в атаку. Как-будто какой-то деф юнит случайно попал в фаерпати и ИИ решил, что на базу напали и он начал посылать в место атаки отряд деферов.
Вчера словил этот баг и он повел себя наилучшим из всех возможных образов: пока мой отряд разбивал эту дефпати, ИИ начал создавать новых и посылать в атаку. Т.е. был бесконечный такой поток вражеских юнитов. Такого еще не было, ограничивалось лишь одной пачкой.
Но порой вся вот эта деф-пати начинает идти в атаку. Как-будто какой-то деф юнит случайно попал в фаерпати и ИИ решил, что на базу напали и он начал посылать в место атаки отряд деферов.
Вчера словил этот баг и он повел себя наилучшим из всех возможных образов: пока мой отряд разбивал эту дефпати, ИИ начал создавать новых и посылать в атаку. Т.е. был бесконечный такой поток вражеских юнитов. Такого еще не было, ограничивалось лишь одной пачкой.
Сегодня же пытался для скрина заснять как этот баг выглядит, но за 40 минут так и не словил его. Но думаю, что суть ясна.
Лично я пока вижу путь решения в уменьшении количества боевых единиц в дефпати, может какой-то юнит из фаерпати застревает среди дефпати (ну фаерпати же генерится из всех юнитов вокруг, включая гардианов) и впоследствии, т.к. остался на базе, получил еще и статус дефера... Тогда при атаке он мог бы действительно стать причиной такого поведения ИИ. Не знаю...
Кто-нибудь сталкивался с таким?
Лично я пока вижу путь решения в уменьшении количества боевых единиц в дефпати, может какой-то юнит из фаерпати застревает среди дефпати (ну фаерпати же генерится из всех юнитов вокруг, включая гардианов) и впоследствии, т.к. остался на базе, получил еще и статус дефера... Тогда при атаке он мог бы действительно стать причиной такого поведения ИИ. Не знаю...
Кто-нибудь сталкивался с таким?
Принятый ответ
Попробовал оставить только одну бойню и храм. И это сработало. Вот только теперь 2 вурдалака лишних. Точнее единственных, ведь я убрал всех деферов. Если оставлю и один склеп, то и с ними проблем не должно быть. Но вот это число 2... Похоже, что с 3 склепами было бы 3 лишних вурдалака. Получается, что ИИ начинает закупать юнитов разово и похоже сбиваясь со счета, если подготовка проходит одновременно в нескольких зданиях. И вот тогда он этот избыток отправляет автоматом в деф-отряд.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Я решил переделать только фрагмент кода с деферами:
Отредактирован ImbaState
Но суть в том, что я убрал всех абомов и некров, чтобы посмотреть: будут ли эти лишние некр и абом, если их вообще не должно быть в деф-отряде. Изменения вступили в силу, но конечно же эти некр и абом там оказались %)
Отредактирован ImbaState
Затем поставил заново, вот конкретно этот:
Попробую совсем убрать деферов. Не удивлюсь, если будет непобедимый деф-отряд из этой двоицы...
Отредактирован Zahanc
+
О, они точно производятся ИИ? Или они создаются при инициализации карты?
+
Попробуйте ещё поменять количество начальных ресурсов, может быть. Я уже просто угадываю к этому моменту.
Отредактирован ImbaState
Все отлично, лишних мобов нет.
Значит проблема кроется где-то в гардианах, методом тыка буду смотреть...
В общем загадочный баг с лишними юнитами у меня пропал после того, как я убрал деферов и гардианов, и запустил игру с таким скриптом.
Затем я вернул дефферов, обнаружил, что лишних юнитов нет. Начал поочередно возвращать каждый тип гардианов в скрипт. И бага нет. Все работает. Я совсем ничего не менял, лишь заново добавил функции вызова постройки юнитов и их распределения. Написал, вдруг кому-то поможет в будущем.
Ан нет... Я в последние тесты уже warpten подключал. Сейчас посмотрел финальную версию скрипта и обнаружил, что он только с warpten нормально работает. Без него так же создает лишнего некра и абома. Обычно читы ломают игру, а тут... Ладно, буду дальше искать корень проблемы...
Короче... Не знаю как это исправить. Если добавить хоть одного гардиана некра, то сразу же летит в деферы еще один. Аналогично и с абомом, судя по всему.
Начудила с патчем метелица, конешн...