FellGuard
Losyash
offline
Опыт:
39,547Активность: |
Создание ИИ в блокноте
Правила написания ИИ скриптов для кампанийАвтор статьи Moyack Вольный перевод FellGuard ______________________ Предупреждение: более всего подходит для melee карт или миссий кампании в стиле blizzard ______________________
|
|
function main takes nothing returns nothing
call CampaignAI( MOON_WELL, null ) // автор отдал предпочтение эльфам
call SetSlowChopping( false )
call SetPeonsRepair( true)
endfunction
Все стандартные юниты имеют свои постоянные, «собственные» имена, они присваиваются в common.ai для удобства скриптинга. В скриптах *.j (тоесть, в триггерах) карты имя MOON_WELL не будет работать!!! В *.j скриптах для этих целей используются рав-коды юнитов. К примеру, лунный колодец имеет следующий рав-код: 'emow' А вот в *.ai скриптах прекрасно работают как «собственные» имена, так и рав-коды. И если вы внесете своего нестандартного юнита, то либо пишите его рав-код (ибо он не имеет имени), либо добавляйте его имя в common.ai. Последнее, впрочем, хорошо только для полноценных модов, так как common.ai довольно громоздкий и импортировать его нет смысла. Чтобы узнать рав-код объекта, нужно в Object Editor-е нажать Ctrl+D |
call CampaignAI( MOON_WELL, null ) |
call CampaignAI( ‘emov’, null ) |
function ConfigureAI takes nothing returns nothing
call SetSlowChopping( false )
call SetPeonsRepair( true )
endfunction
function main takes nothing returns nothing
call CampaignAI( MOON_WELL, null )
call ConfigureAI( )
endfunction
globals
player MyVictim = Player( 0 )
endglobals
function ConfigureAI takes nothing returns nothing
call SetSlowChopping( false )
call SetPeonsRepair( true )
endfunction
function main takes nothing returns nothing
call CampaignAI( MOON_WELL, null )
call ConfigureAI( )
// **********************************
// * Building Strategy *
// **********************************
call SetBuildUnitEx( 1, 1, 1, TREE_LIFE )
call SetBuildUnit( 15, WISP )
call SetBuildUnitEx( 1, 2, 3, MOON_WELL )
call SetBuildUnitEx( 1, 1, 2, ANCIENT_WAR )
call SetBuildUnit( 1, ELF_ALTAR )
call SetBuildUnit( 1, HUNTERS_HALL )
// **********************************
// * EndStrategy *
// **********************************
endfunction
globals
player MyVictim = Player( 0 )
endglobals
function ConfigureAI takes nothing returns nothing
call SetSlowChopping( false )
call SetPeonsRepair( true )
endfunction
function main takes nothing returns nothing
call CampaignAI( MOON_WELL, null )
call ConfigureAI( )
// **********************************
// * Building Strategy *
// **********************************
call SetReplacements( 1, 2, 3 ) // <==(1)
call SetBuildUnitEx( 1, 1, 1, TREE_LIFE )
call SetBuildUnit( 15, WISP )
call SetBuildUnitEx( 1, 2, 3, MOON_WELL )
call SetBuildUnitEx( 1, 1, 2, ANCIENT_WAR )
call SetBuildUnit( 1, ELF_ALTAR )
call SetBuildUnit( 1, HUNTERS_HALL )
call SetBuildUnitEx( 0, 1, 2, ANCIENT_PROTECT )
call CampaignDefenderEx( 2, 2, 3, ARCHER ) // <==(2)
call CampaignDefenderEx( 1, 1, 1, HUNTRESS )
// **********************************
// * EndStrategy *
// **********************************
endfunction
function main takes nothing returns nothing
...// Здесь у нас код отстройки
//*** WAVE 1 ***
call InitAssaultGroup() // <==(1)
call CampaignAttackerEx( 2, 3, 3, ARCHER ) // <==(2)
call CampaignAttackerEx( 0, 1, 2, HUNTRESS )
call CampaignAttackerEx( 0, 1, 1, BALLISTA )
call SuicideOnPlayerEx( M2, M3, M3, MyVictim ) // <==(3)
endfunction
Существует несколько спсосбов приказать группе напасть. SuicideOnPlayerEx берет, по мнению автора, за цель, главное вражеское поселение (его стартовую позицию), но это лишь до тех пор, добавлю от себя, пока у вас не появится другого поселения (на свежем руднике, например). А возможно вам вообще понадобится сконцентрировать «огонь» на отдельной боевой единице (как в картах, где нужно охранять какой-нибудь караван), в таких случаях вам надо будет использовать функции типа AttackMoveKillA( TargetUnit ). Рассмотрим эту ф-ию на примере отдельного нейтрально-враждебного лагеря в качестве цели. Код:
|
globals
player MyVictim = Player( 0 )
endglobals
function ConfigureAI takes nothing returns nothing
call SetSlowChopping( false )
call SetPeonsRepair( true )
endfunction
function main takes nothing returns nothing
call CampaignAI( MOON_WELL, null )
call ConfigureAI( )
// **********************************
// * Building Strategy *
// **********************************
//
// Уровень 1, постройки
call SetReplacements( 1, 2, 3 )
call SetBuildUnitEx( 1, 1, 1, TREE_LIFE )
call SetBuildUnit( 15, WISP )
call SetBuildUnitEx( 1, 2, 3, MOON_WELL )
call SetBuildUnitEx( 1, 1, 2, ANCIENT_WAR )
call SetBuildUnit( 1, ELF_ALTAR )
call SetBuildUnit( 1, HUNTERS_HALL )
call CampaignDefenderEx( 2, 2, 3, ARCHER )
call CampaignDefenderEx( 1, 1, 1, HUNTRESS )
call CampaignDefenderEx( 0, 1, 2, ANCIENT_PROTECT )
// Уровень 2, постройки
call SetBuildUnit( 1, TREE_AGES )
call SetBuildUnitEx( 1, 1, 2, ANCIENT_LORE )
call SetBuildUnit( 1, ANCIENT_WIND )
// Уровень 2, постройки
call SetBuildUnit( 1, TREE_ETERNITY )
call SetBuildUnitEx( 0, 1, 1, CHIMAERA_ROOST )
// **********************************
// * End Strategy *
// **********************************
// **********************************
// * Attack Strategy *
// **********************************
//*** WAVE 1 ***
call InitAssaultGroup()
call CampaignAttackerEx( 2, 3, 3, ARCHER )
call CampaignAttackerEx( 0, 1, 2, HUNTRESS )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 2 *** Спустя 2-3 минуты после первой волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 3 *** Спустя 2-3 минуты после второй волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 4 *** Спустя 2-3 минуты после третьей волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 5 *** Спустя 3-4 минуты после четвертой волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 3, 3, ARCHER )
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 0, 1, 2, DRYAD )
call SuicideOnPlayerEx( M4, M3, M3, MyVictim )
//*** WAVE 6 *** Спустя 3-4 минуты после пятой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call SuicideOnPlayerEx( M5, M3, M3, MyVictim )
//*** WAVE 7 *** Спустя 3-5 минут после шестой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call CampaignAttackerEx( 0, 1, 2, MOUNTAIN_GIANT )
call SuicideOnPlayerEx( M5, M4, M3, MyVictim )
//*** WAVE 8 *** Спустя 3-4-5 минут после седьмой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call SuicideOnPlayerEx( M6, M5, M4, MyVictim )
//*** WAVE 9 *** Спустя 4-5-6 минут после восьмой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call CampaignAttackerEx( 0, 1, 2, MOUNTAIN_GIANT )
call CampaignAttackerEx( 1, 1, 2, FAERIE_DRAGON )
call CampaignAttackerEx( 0, 1, 2, CHIMAERA )
call SuicideOnPlayerEx( M6, M5, M4, MyVictim )
// **********************************
// * End Strategy *
// **********************************
endfunction
globals
player MyVictim = Player( 0 )
endglobals
function ConfigureAI takes nothing returns nothing
call SetSlowChopping( false )
call SetPeonsRepair( true )
endfunction
function main takes nothing returns nothing
call CampaignAI( MOON_WELL, null )
call ConfigureAI( )
// **********************************
// * Building Strategy *
// **********************************
//
// Уровень 1, постройки
call SetReplacements( 1, 2, 3 )
call SetBuildUnitEx( 1, 1, 1, TREE_LIFE )
call SetBuildUnit( 15, WISP )
call SetBuildUnitEx( 1, 2, 3, MOON_WELL )
call SetBuildUnitEx( 1, 1, 2, ANCIENT_WAR )
call SetBuildUnit( 1, ELF_ALTAR )
call SetBuildUnit( 1, HUNTERS_HALL )
call CampaignDefenderEx( 2, 2, 3, ARCHER )
call CampaignDefenderEx( 1, 1, 1, HUNTRESS )
call CampaignDefenderEx( 0, 1, 2, ANCIENT_PROTECT )
// Уровень 2, постройки
call SetBuildUnit( 1, TREE_AGES )
call SetBuildUnitEx( 1, 1, 2, ANCIENT_LORE )
call SetBuildUnit( 1, ANCIENT_WIND )
// Уровень 3, постройки
call SetBuildUnit( 1, TREE_ETERNITY )
call SetBuildUnitEx( 0, 1, 1, CHIMAERA_ROOST )
// **********************************
// * End Strategy *
// **********************************
// **********************************
// * Attack Strategy *
// **********************************
//*** WAVE 1 ***
call InitAssaultGroup()
call CampaignAttackerEx( 2, 3, 3, ARCHER )
call CampaignAttackerEx( 0, 1, 2, HUNTRESS )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 2 *** Спустя 2-3 минуты после первой волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 3 *** Спустя 2-3 минуты после второй волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 4 *** Спустя 2-3 минуты после третьей волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 5 *** Спустя 3-4 минуты после четвертой волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 3, 3, ARCHER )
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 0, 1, 2, DRYAD )
call SuicideOnPlayerEx( M4, M3, M3, MyVictim )
//*** WAVE 6 *** Спустя 3-4 минуты после пятой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call SuicideOnPlayerEx( M5, M3, M3, MyVictim )
loop // Старт неостанавливаемого повтора волн
//*** WAVE 7 *** Спустя 3-5 минут после шестой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call CampaignAttackerEx( 0, 1, 2, MOUNTAIN_GIANT )
call SuicideOnPlayerEx( M5, M4, M3, MyVictim )
//*** WAVE 8 *** Спустя 3-4-5 минут после седьмой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call SuicideOnPlayerEx( M6, M5, M4, MyVictim )
//*** WAVE 9 *** Спустя 4-5-6 минут после восьмой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call CampaignAttackerEx( 0, 1, 2, MOUNTAIN_GIANT )
call CampaignAttackerEx( 1, 1, 2, FAERIE_DRAGON )
call CampaignAttackerEx( 0, 1, 2, CHIMAERA )
call SuicideOnPlayerEx( M6, M5, M4, MyVictim )
endloop
// **********************************
// * Attack Strategy never ends *
// **********************************
endfunction
globals
player MyVictim = Player( 0 )
endglobals
function ConfigureAI takes nothing returns nothing
call SetSlowChopping( false )
call SetPeonsRepair( true )
endfunction
function main takes nothing returns nothing
call CampaignAI( MOON_WELL, null )
call ConfigureAI( )
// **********************************
// * Building Strategy *
// **********************************
//
// Уровень 1, постройки
call SetReplacements( 1, 2, 3 )
call SetBuildUnitEx( 1, 1, 1, TREE_LIFE )
call SetBuildUnit( 15, WISP )
call SetBuildUnitEx( 1, 2, 3, MOON_WELL )
call SetBuildUnitEx( 1, 1, 2, ANCIENT_WAR )
call SetBuildUnit( 1, ELF_ALTAR )
call SetBuildUnit( 1, HUNTERS_HALL )
call CampaignDefenderEx( 2, 2, 3, ARCHER )
call CampaignDefenderEx( 1, 1, 1, HUNTRESS )
call CampaignDefenderEx( 0, 1, 2, ANCIENT_PROTECT )
// Уровень 2, постройки
call SetBuildUnit( 1, TREE_AGES )
call SetBuildUnitEx( 1, 1, 2, ANCIENT_LORE )
call SetBuildUnit( 1, ANCIENT_WIND )
// Уровень 3, постройки
call SetBuildUnit( 1, TREE_ETERNITY )
call SetBuildUnitEx( 0, 1, 1, CHIMAERA_ROOST )
// **********************************
// * End Strategy *
// **********************************
// **********************************
// * Attack Strategy *
// **********************************
//*** WAVE 1 ***
call InitAssaultGroup()
call CampaignAttackerEx( 2, 3, 3, ARCHER )
call CampaignAttackerEx( 0, 1, 2, HUNTRESS )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** Базовые улучшения для Охотничьего зала ***
call SetBuildUpgrEx( 1, 2, 3, UPG_STR_MOON )
call SetBuildUpgrEx( 1, 2, 3, UPG_MOON_ARMOR )
call SetBuildUpgrEx( 1, 2, 3, UPG_STR_WILD )
call SetBuildUpgrEx( 1, 2, 3, UPG_HIDES )
//*** WAVE 2 *** Спустя 2-3 минуты после первой волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 3 *** Спустя 2-3 минуты после второй волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 4 *** Спустя 2-3 минуты после третьей волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** Dryad Upgrade
call SetBuildUpgrEx( 1, 1, 1, UPG_ABOLISH )
//*** WAVE 5 *** Спустя 3-4 минуты после четвертой волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 3, 3, ARCHER )
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 0, 1, 2, DRYAD )
call SuicideOnPlayerEx( M4, M3, M3, MyVictim )
//*** Druid of the Claw Upgrade
call SetBuildUpgrEx( 0, 1, 2, UPG_DRUID_CLAW )
//*** WAVE 6 *** Спустя 3-4 минуты после пятой волны/style
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call SuicideOnPlayerEx( M5, M3, M3, MyVictim )
//*** chimaera Upgrade
call SetBuildUpgrEx( 0, 0, 1, UPG_CHIM_ACID )
loop // Старт неостанавливаемого повтора волн
//*** WAVE 7 *** Спустя 3-5 минут после шестой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call CampaignAttackerEx( 0, 1, 2, MOUNTAIN_GIANT )
call SuicideOnPlayerEx( M5, M4, M3, MyVictim )
//*** WAVE 8 *** Спустя 3-4-5 минут после седьмой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call SuicideOnPlayerEx( M6, M5, M4, MyVictim )
//*** WAVE 9 *** Спустя 4-5-6 минут после восьмой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call CampaignAttackerEx( 0, 1, 2, MOUNTAIN_GIANT )
call CampaignAttackerEx( 1, 1, 2, FAERIE_DRAGON )
call CampaignAttackerEx( 0, 1, 2, CHIMAERA )
call SuicideOnPlayerEx( M6, M5, M4, MyVictim )
endloop
// **********************************
// * Attack Strategy never ends *
// **********************************
endfunction
function hero_levels takes nothing returns integer
local integer hero = GetHeroId()
local integer level = GetHeroLevelAI()
local integer a = 0
if hero == DEMON_HUNTER then
if level == 1 or level == 3 or level == 5 then
set a = IMMOLATION
endif
if level == 2 or level == 4 or level == 7 then
set a = MANA_BURN
endif
if level >= 8 then
set a = EVASION
endif
if level == 6 then
set a = METAMORPHOSIS
endif
endif
if hero == MOON_CHICK then
if level == 1 or level == 3 or level == 5 then
set a = TRUESHOT
endif
if level == 2 or level == 4 or level == 7 then
set a = SEARING_ARROWS
endif
if level >= 8 then
set a = SCOUT
endif
if level == 6 then
set a = STARFALL
endif
endif
return a
endfunction
call CampaignAI( MOON_WELL, function hero_levels ) |
globals
player MyVictim = Player( 0 )
endglobals
function ConfigureAI takes nothing returns nothing
call SetSlowChopping( false )
call SetPeonsRepair( true )
endfunction
function hero_levels takes nothing returns integer
local integer hero = GetHeroId()
local integer level = GetHeroLevelAI()
local integer a = 0
if hero == DEMON_HUNTER then
if level == 1 or level == 3 or level == 5 then
set a = IMMOLATION
endif
if level == 2 or level == 4 or level == 7 then
set a = MANA_BURN
endif
if level >= 8 then
set a = EVASION
endif
if level == 6 then
set a = METAMORPHOSIS
endif
endif
if hero == MOON_CHICK then
if level == 1 or level == 3 or level == 5 then
set a = TRUESHOT
endif
if level == 2 or level == 4 or level == 7 then
set a = SEARING_ARROWS
endif
if level >= 8 then
set a = SCOUT
endif
if level == 6 then
set a = STARFALL
endif
endif
return a
endfunction
function main takes nothing returns nothing
call CampaignAI( MOON_WELL, function hero_levels ) //<== Теперь эта функция
call ConfigureAI( ) // улучшает героев
// **********************************
// * Building Strategy *
// **********************************
//
// Уровень 1, постройки
call SetReplacements( 1, 2, 3 )
call SetBuildUnitEx( 1, 1, 1, TREE_LIFE )
call SetBuildUnit( 15, WISP )
call SetBuildUnitEx( 1, 2, 3, MOON_WELL )
call SetBuildUnitEx( 1, 1, 2, ANCIENT_WAR )
call SetBuildUnit( 1, ELF_ALTAR )
call SetBuildUnit( 1, HUNTERS_HALL )
call CampaignDefenderEx( 2, 2, 3, ARCHER )
call CampaignDefenderEx( 1, 1, 1, HUNTRESS )
call CampaignDefenderEx( 0, 1, 2, ANCIENT_PROTECT )
// Уровень 2, постройки
call SetBuildUnit( 1, TREE_AGES )
call SetBuildUnitEx( 1, 1, 2, ANCIENT_LORE )
call SetBuildUnit( 1, ANCIENT_WIND )
// Уровень 3, постройки
call SetBuildUnit( 1, TREE_ETERNITY )
call SetBuildUnitEx( 0, 1, 1, CHIMAERA_ROOST )
// **********************************
// * End Strategy *
// **********************************
// **********************************
// * Attack Strategy *
// **********************************
//*** WAVE 1 ***
call InitAssaultGroup()
call CampaignAttackerEx( 2, 3, 3, ARCHER )
call CampaignAttackerEx( 0, 1, 2, HUNTRESS )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** Базовые улучшения для Охотничьего зала ***
call SetBuildUpgrEx( 1, 2, 3, UPG_STR_MOON )
call SetBuildUpgrEx( 1, 2, 3, UPG_MOON_ARMOR )
call SetBuildUpgrEx( 1, 2, 3, UPG_STR_WILD )
call SetBuildUpgrEx( 1, 2, 3, UPG_HIDES )
//*** WAVE 2 *** Спустя 2-3 минуты после первой волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 3 *** Спустя 2-3 минуты после второй волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 4 *** Спустя 2-3 минуты после третьей волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** Dryad Upgrade
call SetBuildUpgrEx( 1, 1, 1, UPG_ABOLISH )
//*** WAVE 5 *** Спустя 3-4 минуты после четвертой волны
call InitAssaultGroup()
call CampaignAttackerEx( 3, 3, 3, ARCHER )
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 0, 1, 2, DRYAD )
call SuicideOnPlayerEx( M4, M3, M3, MyVictim )
//*** Druid of the Claw Upgrade
call SetBuildUpgrEx( 0, 1, 2, UPG_DRUID_CLAW )
//*** WAVE 6 *** Спустя 3-4 минуты после пятой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call SuicideOnPlayerEx( M5, M3, M3, MyVictim )
//*** chimaera Upgrade
call SetBuildUpgrEx( 0, 0, 1, UPG_CHIM_ACID )
loop // Старт неостанавливаемого повтора волн
//*** WAVE 7 *** Спустя 3-5 минут после шестой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call CampaignAttackerEx( 0, 1, 2, MOUNTAIN_GIANT )
call SuicideOnPlayerEx( M5, M4, M3, MyVictim )
//*** WAVE 8 *** Спустя 3-4-5 минут после седьмой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call SuicideOnPlayerEx( M6, M5, M4, MyVictim )
//*** WAVE 9 *** Спустя 4-5-6 минут после восьмой волны
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call CampaignAttackerEx( 0, 1, 2, MOUNTAIN_GIANT )
call CampaignAttackerEx( 1, 1, 2, FAERIE_DRAGON )
call CampaignAttackerEx( 0, 1, 2, CHIMAERA )
call SuicideOnPlayerEx( M6, M5, M4, MyVictim )
endloop
// **********************************
// * Attack Strategy never ends *
// **********************************
endfunction
function main takes nothing returns nothing
local integer cmd // <== это впишите только если будете использовать 2-й способ
. . . // Ваш код отстройки здесь
//***************
// * * Способ 1 **
//***************
call WaitForSignal() // <== Просто ждем сигнала с карты
//***************
// * * Способ 2 **
//***************
set cmd = WaitForSignal() // <== Ждем до сигнала, и когда тот поступит, заносим начение команды в переменную
if cmd == 0 then
// выполнить алгоритм 0
elseif cmd == 1 then
// выполнить алгоритм 1. итд
...
endif
endfunction
GetLastCommand() GetLastData() |
function main takes nothing returns nothing
local integer cmd
. . . // Здесь код постройки, и допустим, несколько волн атакующих
set cmd = GetLastData() // <== Здесь одна из двух ф-ий, либо WaitForSignal()
if cmd == 0 then
// выполнить алгоритм 0
elseif cmd == 1 then
// выполнить алгоритм 1. итд
...
endif
endfunction
function any_word takes nothing returns nothing
. . . //Весь предыдущий код здесь
call WaitForSignal()
call PopLastCommand() // удаляем последнюю команду, сразу после ее поступления
. . .
endfunction
|
//*************************************************************************
//* Night Elf Campaign AI *
//* By Moyack *
//*************************************************************************
//*
globals
player MyVictim = Player( 0 )
endglobals
function ConfigureAI takes nothing returns nothing
call SetSlowChopping( false )
call SetPeonsRepair( true )
endfunction
function hero_levels takes nothing returns integer
local integer hero = GetHeroId()
local integer level = GetHeroLevelAI()
local integer a = 0
if hero == DEMON_HUNTER then
if level == 1 or level == 3 or level == 5 then
set a = IMMOLATION
endif
if level == 2 or level == 4 or level == 7 then
set a = MANA_BURN
endif
if level >= 8 then
set a = EVASION
endif
if level == 6 then
set a = METAMORPHOSIS
endif
endif
if hero == MOON_CHICK then
if level == 1 or level == 3 or level == 5 then
set a = TRUESHOT
endif
if level == 2 or level == 4 or level == 7 then
set a = SEARING_ARROWS
endif
if level >= 8 then
set a = SCOUT
endif
if level == 6 then
set a = STARFALL
endif
endif
return a
endfunction
function main takes nothing returns nothing
call CampaignAI( MOON_WELL, function hero_levels )
call ConfigureAI( )
// **********************************
// * Building Strategy *
// **********************************
//
// Tier 1 Buildings
call SetReplacements( 1, 2, 3 )
call SetBuildUnitEx( 1, 1, 1, TREE_LIFE )
call SetBuildUnit( 15, WISP )
call SetBuildUnitEx( 1, 2, 3, MOON_WELL )
call SetBuildUnitEx( 1, 2, 2, ANCIENT_WAR )
call SetBuildUnit( 1, ELF_ALTAR )
call SetBuildUnit( 1, HUNTERS_HALL )
call CampaignDefenderEx( 2, 2, 3, ARCHER )
call CampaignDefenderEx( 1, 1, 1, HUNTRESS )
call SetBuildUnitEx( 1, 2, 3, ANCIENT_PROTECT )
// Tier 2 buildings
call SetBuildUnit( 1, TREE_AGES )
call SetBuildUnitEx( 1, 2, 2, ANCIENT_LORE )
call SetBuildUnit( 1, ANCIENT_WIND )
// Tier 3 buildings
call SetBuildUnit( 1, TREE_ETERNITY )
call SetBuildUnitEx( 0, 1, 1, CHIMAERA_ROOST )
// **********************************
// * End Strategy *
// **********************************
// **********************************
// * Attack Strategy *
// **********************************
//*** WAVE 1 *** AI will begin to attack in 5 minutes
call InitAssaultGroup()
call CampaignAttackerEx( 2, 3, 3, ARCHER )
call CampaignAttackerEx( 0, 1, 2, HUNTRESS )
call SuicideOnPlayerEx( M5, M5, M5, MyVictim )
//*** Basic upgrades from HUNTERS HALL ***
call SetBuildUpgrEx( 1, 2, 3, UPG_STR_MOON )
call SetBuildUpgrEx( 1, 2, 3, UPG_MOON_ARMOR )
call SetBuildUpgrEx( 1, 2, 3, UPG_STR_WILD )
call SetBuildUpgrEx( 1, 2, 3, UPG_HIDES )
//*** WAVE 2 *** Between 2 or 3 minutes after Wave 1
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 3 *** Between 2 or 3 minutes after Wave 2
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** WAVE 4 *** Between 2 or 3 minutes after Wave 3
call InitAssaultGroup()
call CampaignAttackerEx( 3, 4, 4, ARCHER )
call CampaignAttackerEx( 1, 2, 3, HUNTRESS )
call CampaignAttackerEx( 0, 1, 1, BALLISTA )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call SuicideOnPlayerEx( M3, M2, M2, MyVictim )
//*** Dryad Upgrade
call SetBuildUpgrEx( 1, 1, 1, UPG_ABOLISH )
//*** WAVE 5 *** Between 3 or 4 minutes after Wave 4
call InitAssaultGroup()
call CampaignAttackerEx( 3, 3, 3, ARCHER )
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 0, 1, 2, DRYAD )
call SuicideOnPlayerEx( M4, M3, M3, MyVictim )
//*** Druid of the Claw Upgrade
call SetBuildUpgrEx( 0, 1, 2, UPG_DRUID_CLAW )
//*** WAVE 6 *** Between 3 or 4 minutes after Wave 5
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call SuicideOnPlayerEx( M4, M3, M3, MyVictim )
//*** chimaera Upgrade
call SetBuildUpgrEx( 0, 0, 1, UPG_CHIM_ACID )
loop //Init the infinite attack loop
//*** WAVE 7 *** Between 3 or 5 minutes after Wave 6
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call CampaignAttackerEx( 0, 1, 2, MOUNTAIN_GIANT )
call SuicideOnPlayerEx( M5, M4, M3, MyVictim )
//*** WAVE 8 *** Between 3 or 5 minutes after Wave 7
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call SuicideOnPlayerEx( M5, M4, M3, MyVictim )
//*** WAVE 9 *** Between 4 or 6 minutes after Wave 8
call InitAssaultGroup()
call CampaignAttackerEx( 2, 2, 2, HUNTRESS )
call CampaignAttackerEx( 1, 1, 1, DEMON_HUNTER )
call CampaignAttackerEx( 1, 1, 1, MOON_CHICK )
call CampaignAttackerEx( 1, 2, 3, DRYAD )
call CampaignAttackerEx( 0, 1, 2, DRUID_CLAW )
call CampaignAttackerEx( 0, 1, 2, MOUNTAIN_GIANT )
call CampaignAttackerEx( 1, 1, 2, FAERIE_DRAGON )
call CampaignAttackerEx( 0, 1, 2, CHIMAERA )
call SuicideOnPlayerEx( M6, M5, M4, MyVictim )
endloop
// **********************************
// * Attack Strategy never ends *
// **********************************
endfunction
NETRAT
offline
Опыт:
83,762Активность: |
Так, сразу оговорка что в статье упоминается исключительно милишный АИ, то есть в ней вообще нет упоминаний про АИ для карт типа, отличного от Melee |
03.01.2007, 22:25 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
шозабред столько букоф ни очём. |
03.01.2007, 22:54 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Aspid
offline
Опыт:
8,361Активность: |
Цитата:
судя по всему пропущено слово "имеет" Jass AI имеет сходный почти во всем синтаксис и типы переменных Собственно сабж: статья может быть полезной тогда и только тогда если вы действительно решились всерьез заниматься созданием AI - с нее следует начинать. А для среднестатистического модмейкера это действительно Цитата:
Тем не менее фелл поздравляю большую проделал работу. |
||
03.01.2007, 23:44 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
пс аи имеет синтаксис один в один с обычным джазом, разница только в том что функции другие |
04.01.2007, 01:14 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
DioD, статью выложил не свою, а перевод. Практически слово в слово, разве что некоторые слова пропущены.
Многабукоф ни о чем выложил по острой нужде TheBestOrc`а. Цитата:
Хм, ну не только для melee, больше для кампании, этот ИИ рационально себя вести не будет (тоесть, отступать при неравных силах итп) Цитата:
Цитата:
Знаю, повторяю, перевод слово в слово, все вопросы к автору статьи ;) Всем спасибо, все поправлю. FellGuard добавил: Про не-милишное использование сказал в конце: Цитата:
FellGuard добавил: Хм, может стоит удалить весь код, тогда статья займет полторы страницы.. Хз |
||||
04.01.2007, 10:13 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
dk
offline
Опыт:
61,843Активность: |
А вот если бы ты сам провел эти исследования насчет управления капитанами, то было бы вобще гуд, а то сейчас политика насчет перевода буржуев ужесточилась походу... |
04.01.2007, 10:35 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
Извини, не хвататет у мну энтузиазму на такие исследования. Если пораскинуть мозгом, можно все самому уяснить, мне это ясно дали понять. Следственно, в такого рода статьях нужды нет. |
04.01.2007, 13:07 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
TheBestOrc
offline
Опыт:
350Активность: |
FellGuard исключительно спосибо для статьи Отредактировано TheBestOrc, 04.01.2007 в 16:19. |
04.01.2007, 15:56 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
adic3x
offline
Опыт:
107,539Активность: |
Интересно, но как я понял если это для мили - то малоактуально. |
04.01.2007, 16:34 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
ADOLF, не для мили, в который раз повторю, больше для кампании. А у кого голова думает и кто не поленится прочитать, так тот может и выудит для себя принципы работы с ИИ скриптами, и базируясь на них наворотит свой аналог АМАИ, ну или хотя-бы приемлемых ботов для карт типа АОС без всякого триггерного управления и глюков.
В принципе, в сфере ИИ возможны не менее впечатляющие наработки и системы, чем в Jass-е (скрипты ИИ - Jass AI), только, разве что, это будет не так заметно. Достаточно почитать common.ai чтобы составить себе представление о возможностях ИИ скриптов. В качестве хорошего примера можно привести ИИ Кенариуса или ИИ нежити и Архимонда из РОК-а и поведение Иллидана с нагами в последней миссии ТФТ Просто ИИ здесь рассмотрен на примере рядового скрипта из кампании - раздолби лагерь нежити прежде, чем лагерь раздолбит тебя... |
04.01.2007, 19:43 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
exploder
iOS zealot
offline
Опыт:
19,394Активность: |
Каты бесят, как хорошо без них было жыть... Теперь норовят целую галерею фанарта в кат упрятать... |
04.01.2007, 20:10 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
А по существу :) Тут поступают жалобы, что многабукоф, так что каты вещь нелишняя в организации статей, мое имхо. |
04.01.2007, 22:15 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Aspid
offline
Опыт:
8,361Активность: |
FellGuard лично мне с катами гораздо удобнее читать.
Отредактировано Q, 05.01.2007 в 19:34. |
05.01.2007, 18:16 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
TheBestOrc
offline
Опыт:
350Активность: |
1 ) у некто если другие статье для ИИ скриптов :-)
FellGuard ты сделал исключительна и по существу первая статей для ИИ скриптов на этот форум
буду рад если некто / из которы поступают жалобы / рассмотрет Стандартный ИИ на примере :-) |
05.01.2007, 20:16 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ArchWorm
Матрица незалежности
offline
Опыт:
4,675Активность: |
Чуствую, я на вц3ц наслушаюсь от мояка за этот перевод. |
06.01.2007, 10:06 | #16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
dk
offline
Опыт:
61,843Активность: |
Ну если они и узнали о главной странице, то вряд ли им хватит ума зайти в этот раздел и найти тут эту статью... Так что успокойся, все норм |
06.01.2007, 10:24 | #17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
Dead_knight, ума хватит, если ктонибудь подскажет :)
ArchWorm12612, а что может Moyack иметь против этого перевода? Имхо, все момдмейкеры с головами на плечах и месячным стажем в варе все что здесь написано знают... А в том, что некоторым людям проще читать русские буквы, нежели английские, ничего страшного нет. FellGuard добавил: К тому же, если бы я писал все с нуля, то написал бы тоже самое, так что так и так перевод :) FellGuard добавил: 4 All, Статья доведена до ума. |
06.01.2007, 12:16 | #18
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
VBSniper
Ёк макарёк
offline
Опыт:
3,486Активность: |
оО прикольная статья!! Мне понравилось. Респект __________ MPI3 нервно курит в сторонке! |
22.01.2007, 18:56 | #19
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
remal
нечто
offline
Опыт:
2,087Активность: |
во-многом бред... и про отстройку и про атаку.... и даже про проверку...
|
28.01.2007, 22:33 | #20
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|