Всем доброго времени суток! Собственно, сам вопрос, в заголовке темы. Бьюсь с тем, чтобы заставить компьютера использовать ополченцев для защиты лагеря при условии, что рудник истощился. Пробовал
call CampaignDefender(1, goldMiners + (lumberjacks - 2), MILITIA)
и
call StartUnit(goldMiners + (lumberjacks - 2), MILITIA, 0)
Никакого эффекта. Уже думал попробовать покопать в сторону механизма с сфинксами и лучницами на гиппогрифах, помнил, что там специальная функция была, но когда нашел код функции, увидел, что она исключительно для этих двух юнитов и все. Возможно, механика с ополченцем подобна превращению послушника в тень? Но перерыл скрипты кампаний, нигде не могу найти, чтобы ИИ строил тень. В общем, буду благодарен за советы по теме.

Принятый ответ

В общем порядком намучившись, все же пришел к выводу, что ребята писавшие АМАИ неспроста не юзали экспрешены, по всей видимости они по какой то причине(кривизна варкрафта привет) не работают в скриптах ИИ. Пришлось написать свой велосипед, очень похожий на то, что есть у них в принципе. Функция выборки рабочих игрока:
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
Возможно кому то будет полезно.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
4
3 года назад
0
А зачем это, собственно? Если ополчение создано на основе стандартных способностей (или это и есть стандартная способность), то компьютер будет сам ее использовать, если видит угрозу для лагеря, вне зависимости от истощения рудника.
Или это на случай, когда на карте совсем рудники иссякнут, а работники будут лимит занимать?
4
19
3 года назад
Отредактирован Ev3nt
4
Во-первых, посмотрите это (как вурдалаки, так и ополчение прописывается в MeleeStartingUnits):
function MeleeStartingUnitsHuman takes player whichPlayer, location startLoc, boolean doHeroes, boolean doCamera, boolean doPreload returns nothing
    local boolean  useRandomHero = IsMapFlagSet(MAP_RANDOM_HERO)
    local real     unitSpacing   = 64.00
    local unit     nearestMine
    local location nearMineLoc
    local location heroLoc
    local real     peonX
    local real     peonY
    local unit     townHall = null

    if (doPreload) then
        call Preloader( "scripts\\HumanMelee.pld" )
    endif

    set nearestMine = MeleeFindNearestMine(startLoc, bj_MELEE_MINE_SEARCH_RADIUS)
    if (nearestMine != null) then
        // Spawn Town Hall at the start location.
        set townHall = CreateUnitAtLoc(whichPlayer, 'htow', startLoc, bj_UNIT_FACING)
        
        // Spawn Peasants near the mine.
        set nearMineLoc = MeleeGetProjectedLoc(GetUnitLoc(nearestMine), startLoc, 320, 0)
        set peonX = GetLocationX(nearMineLoc)
        set peonY = GetLocationY(nearMineLoc)
        call CreateUnit(whichPlayer, 'hpea', peonX + 0.00 * unitSpacing, peonY + 1.00 * unitSpacing, bj_UNIT_FACING)
        call CreateUnit(whichPlayer, 'hpea', peonX + 1.00 * unitSpacing, peonY + 0.15 * unitSpacing, bj_UNIT_FACING)
        call CreateUnit(whichPlayer, 'hpea', peonX - 1.00 * unitSpacing, peonY + 0.15 * unitSpacing, bj_UNIT_FACING)
        call CreateUnit(whichPlayer, 'hpea', peonX + 0.60 * unitSpacing, peonY - 1.00 * unitSpacing, bj_UNIT_FACING)
        call CreateUnit(whichPlayer, 'hpea', peonX - 0.60 * unitSpacing, peonY - 1.00 * unitSpacing, bj_UNIT_FACING)

        // Set random hero spawn point to be off to the side of the start location.
        set heroLoc = MeleeGetProjectedLoc(GetUnitLoc(nearestMine), startLoc, 384, 45)
    else
        // Spawn Town Hall at the start location.
        set townHall = CreateUnitAtLoc(whichPlayer, 'htow', startLoc, bj_UNIT_FACING)
        
        // Spawn Peasants directly south of the town hall.
        set peonX = GetLocationX(startLoc)
        set peonY = GetLocationY(startLoc) - 224.00
        call CreateUnit(whichPlayer, 'hpea', peonX + 2.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
        call CreateUnit(whichPlayer, 'hpea', peonX + 1.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
        call CreateUnit(whichPlayer, 'hpea', peonX + 0.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
        call CreateUnit(whichPlayer, 'hpea', peonX - 1.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)
        call CreateUnit(whichPlayer, 'hpea', peonX - 2.00 * unitSpacing, peonY + 0.00 * unitSpacing, bj_UNIT_FACING)

        // Set random hero spawn point to be just south of the start location.
        set heroLoc = Location(peonX, peonY - 2.00 * unitSpacing)
    endif

    if (townHall != null) then
        call UnitAddAbilityBJ('Amic', townHall)
        call UnitMakeAbilityPermanentBJ(true, 'Amic', townHall)
    endif

    if (doHeroes) then
        // If the "Random Hero" option is set, start the player with a random hero.
        // Otherwise, give them a "free hero" token.
        if useRandomHero then
            call MeleeRandomHeroLoc(whichPlayer, 'Hamg', 'Hmkg', 'Hpal', 'Hblm', heroLoc)
        else
            call SetPlayerState(whichPlayer, PLAYER_STATE_RESOURCE_HERO_TOKENS, bj_MELEE_STARTING_HERO_TOKENS)
        endif
    endif

    if (doCamera) then
        // Center the camera on the initial Peasants.
        call SetCameraPositionForPlayer(whichPlayer, peonX, peonY)
        call SetCameraQuickPositionForPlayer(whichPlayer, peonX, peonY)
    endif
endfunction
Во-вторых, откройте human.ai через текстовый редактор и посмотрите его, так как этот файл является искусственным интеллектом.
2
15
3 года назад
Отредактирован Meddin
2
PraetorianSM, ополчение стандартное, это для того, чтобы работники принимали участие в обороне окраин лагеря. Стандартное ополчение обычно задействуется тогда, когда бой идет неподалеку от главного здания. А тут задумка в том, чтобы работники не ждали, когда противники вырежут войска и доберутся до них.
Ev3nt, благодарю, нашел данную функцию, но что странно, в моем Blizzard.j отсутствует условие
if (townHall != null) then
Но идея понятна, нужно подходить со стороны ратуши, а не со стороны работника. Однако, в скриптах ИИ нельзя юзать функции из Blizzard.j, все мои попытки заканчивались тем, что скрипт становился нерабочим.
3
32
3 года назад
3
Meddin, нужно делать в ИИ условие, что если все условия верны - нанять N ополченцев и отправить в атаку. Он сам юзнет спелл, ну или в редакторе триггеров, по старинке - отдаем приказ - ополчение, т.к это морф, только на карте появятся новые боевые единицы, как только появились, бежим ими драться.

Сам ИИ юзает ополченцев лишь когда раба бьют возле ратуши.
2
15
3 года назад
Отредактирован Meddin
2
quq_CCCP, да вот по поводу того, что данная абилка юзается главным зданием альянса лишь тогда, когда рабочие начинают терпеть поблизости от него - я знаю, сам замечал неоднократно. Я попробовал вчера еще из интереса заставить ИИ не защищать пока что лагерь ополченцами, а отправить их в атаку, но тоже потерпел фиаско:
call CampaignAttackerEx(6, 6, 5, MILITIA)
call CampaignAttackerEx(3, 3, 3, RIFLEMAN)
В атаку пошли только стрелки. Разумеется, перед этим приказом я перераспределил рабочих на ресурсах:
call ClearHarvestAI()
call HarvestGold(0, 0)
call HarvestWood(0, (lumberjacks - 2))
Попробую сейчас функцию SetBuildUnit вызвать перед CampaignAttackerEx

Триггерный вариант использования способности рассматриваю как крайний случай, потому как это будет уже не в скрипте ИИ и потому как будут мобилизовываться в ополчение все рабочие.

Попробовал SetBuildUnit, к сожалению, результат тот же.

Жаль, что у AMAI весь код обфусцирован, было бы интересно у них глянуть, как они заставляют компьютер крипить золотые шахты с ополченцами.
0
32
3 года назад
0
Глянь компанию орды, ласт миссию, там пеоны бегали в атаку. Мб для Ии создаётся отдельная версия юнита, который не работник а воин в классификации?
1
15
3 года назад
1
Нет, там точно не то, я помню меня интересовал этот вопрос и я ковырял ИИ компьютеров в этой главе. Там точно в атакующих волнах нет рабов хаоса и рабы сами в редакторе объектов без изменений, там баг самой игры, почему то кодои хаоса отображаются как незанятые рабы по какой то причине. Поэтому думаю с ними ИИ путает обычных рабов, вроде бы кодои хаоса не ходят вообще в атаку как раз, насколько я помню.

Черт, еще порядком подбешивает, что скрипты ИИ не понимают функций из blizzard.j. Так можно было бы триггерно выбрать рабочих, отдать приказ мобилизоваться в ополчение, конвертнуть в текст и использовать в скрипте. Эх.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.