mirror of
https://github.com/weyne85/DML.git
synced 2025-10-29 16:57:49 +00:00
173 lines
5.1 KiB
Lua
173 lines
5.1 KiB
Lua
xpStrat = {}
|
|
-- AI strategy module for expansion.
|
|
xpStrat.version = "0.0.0"
|
|
xpStrat.requiredLibs = {
|
|
"dcsCommon", -- always
|
|
"cfxZones", -- Zones, of course
|
|
"milHelo", -- for helo attack and capture missions
|
|
}
|
|
xpStrat.zones = {} -- all the zones that interest me
|
|
xpStrat.AI = {} -- red, blue -- if true, that side has pure ai
|
|
|
|
function xpStrat.addXPZone(theZone)
|
|
xpStrat.zones[theZone.name] = theZone
|
|
end
|
|
|
|
--
|
|
-- Strategy
|
|
--
|
|
function xpStrat.fullAIStrategy(coa, cname)
|
|
if xpStrat.verbose then
|
|
trigger.action.outText("FULL AI Strategy for (" .. coa .. "/" .. cname .. ")", 30)
|
|
end
|
|
end
|
|
|
|
function xpStrat.getMilHSource(coa, msnType, nearZone)
|
|
if not msnType then
|
|
msnType = dcsCommon.pickRandom(milHelo.missionTypes)
|
|
elseif msnType == "*" then
|
|
msnType = nil -- get all.
|
|
end
|
|
|
|
-- get all sources for coa and msnTypes
|
|
local sources = milHelo.getMilSources(coa, msnType)
|
|
if #sources < 1 then
|
|
trigger.action.outText("Strat: no sources found for <" .. msnType .. "> helo mission", 30)
|
|
return nil
|
|
end
|
|
|
|
local theSource = nil
|
|
if nearZone then
|
|
theSource = nearZone:getClosestZone(sources)
|
|
else
|
|
-- pick one by random
|
|
theSource = dcsCommon.pickRandom(sources)
|
|
end
|
|
return theSource
|
|
end
|
|
|
|
function xpStrat.createHeloMission(coa, msnType, theSource, theTarget) -- msnType = "*" means any, nil means pick random
|
|
if not theSource then
|
|
theSource = xpStrat.getMilHSource(coa, msnType)
|
|
end
|
|
if not theSource then
|
|
trigger.action.outText("Strat: cannot find coa <" .. coa .. "> source for <" .. msnType .. "> mission", 30)
|
|
return nil
|
|
end
|
|
msnType = theSource.msnType
|
|
|
|
-- now gather all destinations
|
|
if not theTarget then
|
|
local targets = milHelo.getMilTargets(coa)
|
|
if #targets < 1 then
|
|
trigger.action.outText("Strat: no destinations for side " .. side, 30)
|
|
return nil
|
|
end
|
|
|
|
-- TODO: choose nearest target to source
|
|
-- and prefer neutral
|
|
theTarget = theSource:getClosestZone(targets)--targets[1]
|
|
end
|
|
|
|
-- if we get here, we have a source and target
|
|
|
|
trigger.action.outText("Strat: identified Coa <" .. coa .. "> - Starting <" .. msnType .. "> mission from <" .. theSource.name .. "> to <" .. theTarget.name .. ">)", 30)
|
|
|
|
return theSource, theTarget, msnType
|
|
end
|
|
|
|
function xpStrat.playerAIStrategy(coa, cname)
|
|
if xpStrat.verbose then
|
|
trigger.action.outText("Player-assisted AI Strategy for (" .. coa .. "/" .. cname .. ")", 30)
|
|
end
|
|
|
|
-- strategy in general (ha!, pun)
|
|
-- check which missions are done first
|
|
-- select one mission unless still running and initiate own support flights
|
|
-- select one aggressive flight and start it, no matter what
|
|
end
|
|
|
|
function xpStrat.update()
|
|
-- schedule next round
|
|
timer.scheduleFunction(xpStrat.update, {}, timer.getTime() + xpStrat.interval)
|
|
|
|
local sides = {"red", "blue"}
|
|
for idx, sideName in pairs(sides) do
|
|
local coa = 1
|
|
if sideName == "blue" then coa = 2 end
|
|
|
|
if xpStrat.AI[sideName] then
|
|
xpStrat.fullAIStrategy(coa, sideName)
|
|
else
|
|
xpStrat.playerAIStrategy(coa, sideName)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
function xpStrat.readConfigZone()
|
|
local theZone = cfxZones.getZoneByName("expansionConfig")
|
|
if not theZone then
|
|
theZone = cfxZones.createSimpleZone("expansionConfig")
|
|
end
|
|
xpStrat.redAI = theZone:getBoolFromZoneProperty("redAI", true) -- is red player or AI?
|
|
xpStrat.AI["red"] = xpStrat.redAI
|
|
xpStrat.blueAI = theZone:getBoolFromZoneProperty("blueAI", true) -- is red player or AI?
|
|
xpStrat.AI["blue"] = xpStrat.blueAI
|
|
|
|
xpStrat.interval = theZone:getNumberFromZoneProperty("interval", 600)
|
|
xpStrat.difficulty = theZone:getNumberFromZoneProperty("difficulty", 1)
|
|
|
|
xpStrat.verbose = theZone.verbose
|
|
end
|
|
|
|
|
|
function xpStrat.init()
|
|
-- gather data etc
|
|
|
|
trigger.action.outText("'Expansion' Core v" .. xpStrat.version .. " (" .. dcsCommon.getMapName() .. ") started.", 30)
|
|
local msg = ""
|
|
if xpStrat.redAI then msg = msg .. "\nRed side controlled by AI General"
|
|
else msg = msg .. "\nRed side controlled by Player-Assisted General" end
|
|
if xpStrat.blueAI then msg = msg .. "\nBlue side controlled by AI General"
|
|
else msg = msg .. "\nBlue side controlled by Player-Assisted General" end
|
|
msg = msg .. "\ndifficulty level set to " .. xpStrat.difficulty
|
|
msg = msg .. "\n"
|
|
trigger.action.outText(msg, 30)
|
|
|
|
-- schedule first round of AI in 10 seconds
|
|
timer.scheduleFunction(xpStrat.update, {}, timer.getTime() + 10)
|
|
end
|
|
|
|
function xpStrat.start()
|
|
-- lib check
|
|
if not dcsCommon.libCheck then
|
|
trigger.action.outText("xpStrat requires dcsCommon", 30)
|
|
return false
|
|
end
|
|
if not dcsCommon.libCheck("xpStrat", xpStrat.requiredLibs) then
|
|
return false
|
|
end
|
|
|
|
-- read config
|
|
xpStrat.readConfigZone()
|
|
|
|
-- read income zones
|
|
--[[-- local attrZones = cfxZones.getZonesWithAttributeNamed("income")
|
|
for k, aZone in pairs(attrZones) do
|
|
income.createIncomeWithZone(aZone) -- process attributes
|
|
income.addIncomeZone(aZone) -- add to list
|
|
end
|
|
--]]--
|
|
-- schedule init for 5 seconds after mission start
|
|
timer.scheduleFunction(xpStrat.init, {}, timer.getTime() + 5)
|
|
|
|
trigger.action.outText("xpStrat v" .. xpStrat.version .. " started.", 30)
|
|
return true
|
|
end
|
|
|
|
if not xpStrat.start() then
|
|
trigger.action.outText("xpStrat aborted: missing libraries", 30)
|
|
xpStrat = nil
|
|
end |