Добавлен Svintus
Я пытаюсь интегрировать код кастомного ИИ, не для мили сражения.
//===========================================================================
// 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
Активается через триггер, но до триггера дело не доходит. Редактор выдаёт ошибку компиляции.
Я вставляю код в триггер, конвертируя предварительно этот триггер в текст.
Я пытался вставить этот код в нестандартный код карты - всё одинаково. Ошибся компиляции в каждой строчки кода. (отсутствует конец строки, отсутствует название переменной)
Я вставляю код в триггер, конвертируя предварительно этот триггер в текст.
Я пытался вставить этот код в нестандартный код карты - всё одинаково. Ошибся компиляции в каждой строчки кода. (отсутствует конец строки, отсутствует название переменной)
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Гарантировать я ничего не могу конечно.
Но читал что мили АИ имеет доступ только к функциям common.ai.
Но если кастомный код подгружать в карту для управления игроком-компьютером - то этот код имеет доступ ко всем функциям в карте.
Ред. Svintus
Ну да. Это если я импортирую этот код в виде .j файла, а потом триггере пытаюсь вызвать основную функцию ИИ оттуда - то ошибка, что нет такой функции.
А если импортировать код в карту, в нестандартный код целиком - то сыпятся ошибки для каждой строчки.
Ред. EugeAl
В нестандартном коде они не будут работать, нестандартный код это j файл
Запускать их надо из кода карты (j файл) через функцию StartMeleeAI(номер игрока, путь к ai файлу)
Кажется, это должно быть возможно.
И если я могу ими управлять, то я могу написать скрипт ИИ в обход стандартным функциям написания ИИ
Ред. EugeAl
А если написать управление в нестандартном коде, получится, что один скрипт будет мешать другому. Ведь здесь как раз разные потоки
Ред. Svintus
Хорошо. В таком случае, я ведь могу просто не инициализировать стандартный ИИ, и запустить свой кастомный?
Ред. EugeAl