Я пытаюсь интегрировать код кастомного ИИ, не для мили сражения.
//===========================================================================
// Custom Orc AI System (Patch 1.27)
//===========================================================================
globals
    constant integer AI_PLAYER = 8
    boolean isAIInitialized = false
    constant real BUILD_SPACING = 512.0
    integer array buildingSizes
endglobals

//===========================================================================
// Initialization
//===========================================================================
function InitBuildingSizes takes nothing returns nothing
    set buildingSizes['ogre'] = 256
    set buildingSizes['ostr'] = 320
    set buildingSizes['ofrt'] = 384
    set buildingSizes['oalt'] = 192
    set buildingSizes['obar'] = 224
    set buildingSizes['osld'] = 256
    set buildingSizes['obea'] = 224
    set buildingSizes['otrb'] = 192
    set buildingSizes['owtw'] = 160
    set buildingSizes['ofor'] = 160
endfunction

//===========================================================================
// Building System
//===========================================================================
function IsStructureFilter takes nothing returns boolean
    return IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and GetOwningPlayer(GetFilterUnit()) == Player(AI_PLAYER)
endfunction

function CheckBuildArea takes real x, real y, real size returns boolean
    local group g = CreateGroup()
    local boolean result = true
    
    if not IsTerrainBuildable(x, y) then
        set result = false
    endif
    if IsTerrainPathable(x, y, PATHING_TYPE_BUILDABILITY) then
        set result = false
    endif
    
    call GroupEnumUnitsInRange(g, x, y, size + 256.0, Condition(function IsStructureFilter))
    set result = (CountUnitsInGroup(g) == 0)
    
    call DestroyGroup(g)
    set g = null
    return result
endfunction

function FindBuildLocation takes real startX, real startY, integer buildType returns location
    local real angle = 0.0
    local real radius = 0.0
    local integer steps = 0
    local real newX
    local real newY
    
    loop
        exitwhen steps > 30
        set angle = 0.0
        loop
            exitwhen angle >= 360.0
            set newX = startX + radius * Cos(angle * bj_DEGTORAD)
            set newY = startY + radius * Sin(angle * bj_DEGTORAD)
            if CheckBuildArea(newX, newY, buildingSizes[buildType]) then
                return Location(newX, newY)
            endif
            set angle = angle + 45.0
        endloop
        set radius = radius + BUILD_SPACING
        set steps = steps + 1
    endloop
    return null
endfunction

//===========================================================================
// Core AI Logic
//===========================================================================
function BuildMainBase takes nothing returns nothing
    local unit worker = GetFirstUnitOfType('ncpn')
    local location buildLoc
    
    if worker == null then
        return
    endif
    
    set buildLoc = FindBuildLocation(GetUnitX(worker), GetUnitY(worker), 'ogre')
    
    if buildLoc != null then
        call IssueBuildOrder(worker, 'ogre', GetLocationX(buildLoc), GetLocationY(buildLoc))
    endif
    
    call RemoveLocation(buildLoc)
    set buildLoc = null
    set worker = null
endfunction

function CustomAI_Main takes nothing returns nothing
    if isAIInitialized then
        return
    endif
    set isAIInitialized = true
    
    call InitBuildingSizes()
    call DisplayTextToForce(GetPlayersAll(), "AI: Started!")
    
    loop
        call BuildMainBase()
        call Sleep(1.0)
    endloop
endfunction

//===========================================================================
// Trigger Initialization
//===========================================================================
function InitTrig_CustomAI takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterTimerEventSingle(t, 0.50)
    call TriggerAddAction(t, function CustomAI_Main)
    set t = null
endfunction
Активается через триггер, но до триггера дело не доходит. Редактор выдаёт ошибку компиляции.
Я вставляю код в триггер, конвертируя предварительно этот триггер в текст.
Я пытался вставить этот код в нестандартный код карты - всё одинаково. Ошибся компиляции в каждой строчки кода. (отсутствует конец строки, отсутствует название переменной)
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
Событие EventUnitSummon
GetUnitX\Y от GetSummonedUnit()
ответ
goodlyhero, ну уже вроде делали с перехватом кастом функций или хештаблицу, wenhao же видел? Там китайская сборка мемхака и 4 библиотеки.

Но вариант фога постабильнее, во первых микс файл в папке с варом позволит создавать карту в обычном режиме и тестировать, + встроенная защита спасёт от ошибок и фаталов на ровном месте, указывая где проблема.

Простые R\W функции то можно не трогать, там все норм. А вот конверты, хуки, вызовы из game.dll - это вот как раз требует нативного решения, ибо довольно медленное.

Ну и думаю ивенты без норм декларации нативок для триггеров не добавить...

8
Там в коде AI функции, разве они работают в редакторе?
Ответы (3)
3
Tredor46,
Гарантировать я ничего не могу конечно.
Но читал что мили АИ имеет доступ только к функциям common.ai.
Но если кастомный код подгружать в карту для управления игроком-компьютером - то этот код имеет доступ ко всем функциям в карте.
8
Svintus, у меня там нет ошибок "(отсутствует конец строки, отсутствует название переменной)", а только ошибки с этими функциями
3
Tredor46,
Ну да. Это если я импортирую этот код в виде .j файла, а потом триггере пытаюсь вызвать основную функцию ИИ оттуда - то ошибка, что нет такой функции.
А если импортировать код в карту, в нестандартный код целиком - то сыпятся ошибки для каждой строчки.
Но суть одна - попытка импортирования кода проваливается
22
Ии скрипты нужно импортировать в карту отдельными ai файлами
В нестандартном коде они не будут работать, нестандартный код это j файл
Запускать их надо из кода карты (j файл) через функцию StartMeleeAI(номер игрока, путь к ai файлу)
Ии скрипты имеют доступ к функциям common.j и common.ai
Ответы (4)
3
EugeAl, я не могу управлять юнитами на карте через нестандартный код?
Кажется, это должно быть возможно.
И если я могу ими управлять, то я могу написать скрипт ИИ в обход стандартным функциям написания ИИ
22
Svintus, можешь, но ИИ будет сбивать приказы в процессе работы, поскольку сам управляет юнитами.
А если написать управление в нестандартном коде, получится, что один скрипт будет мешать другому. Ведь здесь как раз разные потоки
3
EugeAl,
Хорошо. В таком случае, я ведь могу просто не инициализировать стандартный ИИ, и запустить свой кастомный?
22
Svintus, конечно, через эту же функцию StartMeleeAI(), только имя и путь к своему ai файлу нужно будет ввести туда.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.