mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
#STRATEGO
* Exclude Ships as they cannot be conquered anyway * Streamline target finding a bit
This commit is contained in:
parent
79da4cbf27
commit
0cc959bf34
@ -41,6 +41,7 @@
|
|||||||
-- @field #boolean usebudget
|
-- @field #boolean usebudget
|
||||||
-- @field #number CaptureUnits
|
-- @field #number CaptureUnits
|
||||||
-- @field #number CaptureThreatlevel
|
-- @field #number CaptureThreatlevel
|
||||||
|
-- @field #boolean ExcludeShips
|
||||||
-- @extends Core.Base#BASE
|
-- @extends Core.Base#BASE
|
||||||
-- @extends Core.Fsm#FSM
|
-- @extends Core.Fsm#FSM
|
||||||
|
|
||||||
@ -176,7 +177,7 @@ STRATEGO = {
|
|||||||
debug = false,
|
debug = false,
|
||||||
drawzone = false,
|
drawzone = false,
|
||||||
markzone = false,
|
markzone = false,
|
||||||
version = "0.2.4",
|
version = "0.2.5",
|
||||||
portweight = 3,
|
portweight = 3,
|
||||||
POIweight = 1,
|
POIweight = 1,
|
||||||
maxrunways = 3,
|
maxrunways = 3,
|
||||||
@ -195,6 +196,7 @@ STRATEGO = {
|
|||||||
usebudget = false,
|
usebudget = false,
|
||||||
CaptureUnits = 3,
|
CaptureUnits = 3,
|
||||||
CaptureThreatlevel = 1,
|
CaptureThreatlevel = 1,
|
||||||
|
ExcludeShips = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
---
|
---
|
||||||
@ -256,6 +258,7 @@ function STRATEGO:New(Name,Coalition,MaxDist)
|
|||||||
self.maxdist = MaxDist or 150 -- km
|
self.maxdist = MaxDist or 150 -- km
|
||||||
self.disttable = {}
|
self.disttable = {}
|
||||||
self.routexists = {}
|
self.routexists = {}
|
||||||
|
self.ExcludeShips = true
|
||||||
|
|
||||||
self.lid = string.format("STRATEGO %s %s | ",self.name,self.version)
|
self.lid = string.format("STRATEGO %s %s | ",self.name,self.version)
|
||||||
|
|
||||||
@ -427,6 +430,7 @@ function STRATEGO:AnalyseBases()
|
|||||||
self.bases:ForEach(
|
self.bases:ForEach(
|
||||||
function(afb)
|
function(afb)
|
||||||
local ab = afb -- Wrapper.Airbase#AIRBASE
|
local ab = afb -- Wrapper.Airbase#AIRBASE
|
||||||
|
if self.ExcludeShips and ab:IsShip() then return end
|
||||||
local abname = ab:GetName()
|
local abname = ab:GetName()
|
||||||
local runways = ab:GetRunways()
|
local runways = ab:GetRunways()
|
||||||
local numrwys = #runways
|
local numrwys = #runways
|
||||||
@ -438,14 +442,14 @@ function STRATEGO:AnalyseBases()
|
|||||||
local coa = ab:GetCoalition()
|
local coa = ab:GetCoalition()
|
||||||
if coa == nil then return end -- Spawned FARPS issue - these have no tangible data
|
if coa == nil then return end -- Spawned FARPS issue - these have no tangible data
|
||||||
coa = coa+1
|
coa = coa+1
|
||||||
local abtype = "AIRBASE"
|
local abtype = STRATEGO.Type.AIRBASE
|
||||||
if ab:IsShip() then
|
if ab:IsShip() then
|
||||||
numrwys = 1
|
numrwys = 1
|
||||||
abtype = "SHIP"
|
abtype = STRATEGO.Type.SHIP
|
||||||
end
|
end
|
||||||
if ab:IsHelipad() then
|
if ab:IsHelipad() then
|
||||||
numrwys = 1
|
numrwys = 1
|
||||||
abtype = "FARP"
|
abtype = STRATEGO.Type.FARP
|
||||||
end
|
end
|
||||||
local coord = ab:GetCoordinate()
|
local coord = ab:GetCoordinate()
|
||||||
if debug then
|
if debug then
|
||||||
@ -481,10 +485,10 @@ function STRATEGO:UpdateNodeCoalitions()
|
|||||||
local newtable = {}
|
local newtable = {}
|
||||||
for _id,_data in pairs(self.airbasetable) do
|
for _id,_data in pairs(self.airbasetable) do
|
||||||
local data = _data -- #STRATEGO.Data
|
local data = _data -- #STRATEGO.Data
|
||||||
if data.type == "AIRBASE" or data.type == "FARP" then
|
if data.type == STRATEGO.Type.AIRBASE or data.type == STRATEGO.Type.FARP or data.type == STRATEGO.Type.SHIP then
|
||||||
data.coalition = AIRBASE:FindByName(data.name):GetCoalition()
|
data.coalition = AIRBASE:FindByName(data.name):GetCoalition() or 0
|
||||||
else
|
else
|
||||||
data.coalition = data.opszone:GetOwner()
|
data.coalition = data.opszone:GetOwner() or 0
|
||||||
end
|
end
|
||||||
newtable[_id] = _data
|
newtable[_id] = _data
|
||||||
end
|
end
|
||||||
@ -937,11 +941,13 @@ function STRATEGO:FindClosestConsolidationTarget(Startpoint,BaseWeight)
|
|||||||
local cname = self.easynames[tname]
|
local cname = self.easynames[tname]
|
||||||
local targetweight = self.airbasetable[cname].baseweight
|
local targetweight = self.airbasetable[cname].baseweight
|
||||||
coa = self.airbasetable[cname].coalition
|
coa = self.airbasetable[cname].coalition
|
||||||
|
--self:T("Start -> End: "..startpoint.." -> "..cname)
|
||||||
if (dist < shortest) and (coa ~= self.coalition) and (BaseWeight >= targetweight) then
|
if (dist < shortest) and (coa ~= self.coalition) and (BaseWeight >= targetweight) then
|
||||||
|
self:T("Found Consolidation Target: "..cname)
|
||||||
shortest = dist
|
shortest = dist
|
||||||
target = cname
|
target = cname
|
||||||
weight = self.airbasetable[cname].weight
|
weight = self.airbasetable[cname].weight
|
||||||
coa = self.airbasetable[cname].coalition
|
coa = coa
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -974,8 +980,9 @@ function STRATEGO:FindClosestStrategicTarget(Startpoint,Weight)
|
|||||||
local coa = self.airbasetable[cname].coalition
|
local coa = self.airbasetable[cname].coalition
|
||||||
local tweight = self.airbasetable[cname].baseweight
|
local tweight = self.airbasetable[cname].baseweight
|
||||||
local ttweight = self.airbasetable[cname].weight
|
local ttweight = self.airbasetable[cname].weight
|
||||||
self:T("Start -> End: "..startpoint.." -> "..cname)
|
--self:T("Start -> End: "..startpoint.." -> "..cname)
|
||||||
if (dist < shortest) and (coa ~= self.coalition) and (tweight >= Weight) then
|
if (dist < shortest) and (coa ~= self.coalition) and (tweight >= Weight) then
|
||||||
|
self:T("Found Strategic Target: "..cname)
|
||||||
shortest = dist
|
shortest = dist
|
||||||
target = cname
|
target = cname
|
||||||
weight = self.airbasetable[cname].weight
|
weight = self.airbasetable[cname].weight
|
||||||
@ -996,38 +1003,31 @@ function STRATEGO:FindStrategicTargets()
|
|||||||
local data = _data -- #STRATEGO.Data
|
local data = _data -- #STRATEGO.Data
|
||||||
if data.coalition == self.coalition then
|
if data.coalition == self.coalition then
|
||||||
local dist, name, points, coa = self:FindClosestStrategicTarget(data.name,data.weight)
|
local dist, name, points, coa = self:FindClosestStrategicTarget(data.name,data.weight)
|
||||||
if coa == coalition.side.NEUTRAL and points ~= 0 then
|
if points > 0 then
|
||||||
local fpoints = points + self.NeutralBenefit
|
self:T({dist=dist, name=name, points=points, coa=coa})
|
||||||
local tries = 1
|
|
||||||
while targets[fpoints] or tries < 100 do
|
|
||||||
fpoints = points + (self.NeutralBenefit+math.random(1,100))
|
|
||||||
tries = tries + 1
|
|
||||||
end
|
|
||||||
targets[fpoints] = {
|
|
||||||
name = name,
|
|
||||||
dist = dist,
|
|
||||||
points = fpoints,
|
|
||||||
coalition = coa,
|
|
||||||
coalitionname = UTILS.GetCoalitionName(coa),
|
|
||||||
coordinate = self.airbasetable[name].coord,
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
if points ~= 0 then
|
||||||
local enemycoa = self.coalition == coalition.side.BLUE and coalition.side.RED or coalition.side.BLUE
|
local enemycoa = self.coalition == coalition.side.BLUE and coalition.side.RED or coalition.side.BLUE
|
||||||
if coa == enemycoa and points ~= 0 then
|
self:T("Enemycoa = "..enemycoa)
|
||||||
local fpoints = points
|
if coa == coalition.side.NEUTRAL then
|
||||||
local tries = 1
|
local tdata = {}
|
||||||
while targets[fpoints] or tries < 100 do
|
tdata.name = name
|
||||||
fpoints = points + (math.random(1,100))
|
tdata.dist = dist
|
||||||
tries = tries + 1
|
tdata.points = points + self.NeutralBenefit
|
||||||
|
tdata.coalition = coa
|
||||||
|
tdata.coalitionname = UTILS.GetCoalitionName(coa)
|
||||||
|
tdata.coordinate = self.airbasetable[name].coord
|
||||||
|
table.insert(targets,tdata)
|
||||||
|
else
|
||||||
|
local tdata = {}
|
||||||
|
tdata.name = name
|
||||||
|
tdata.dist = dist
|
||||||
|
tdata.points = points
|
||||||
|
tdata.coalition = coa
|
||||||
|
tdata.coalitionname = UTILS.GetCoalitionName(coa)
|
||||||
|
tdata.coordinate = self.airbasetable[name].coord
|
||||||
|
table.insert(targets,tdata)
|
||||||
end
|
end
|
||||||
targets[fpoints] = {
|
|
||||||
name = name,
|
|
||||||
dist = dist,
|
|
||||||
points = fpoints,
|
|
||||||
coalition = coa,
|
|
||||||
coalitionname = UTILS.GetCoalitionName(coa),
|
|
||||||
coordinate = self.airbasetable[name].coord,
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1044,38 +1044,31 @@ function STRATEGO:FindConsolidationTargets()
|
|||||||
local data = _data -- #STRATEGO.Data
|
local data = _data -- #STRATEGO.Data
|
||||||
if data.coalition == self.coalition then
|
if data.coalition == self.coalition then
|
||||||
local dist, name, points, coa = self:FindClosestConsolidationTarget(data.name,self.maxrunways-1)
|
local dist, name, points, coa = self:FindClosestConsolidationTarget(data.name,self.maxrunways-1)
|
||||||
if coa == coalition.side.NEUTRAL and points ~= 0 then
|
if points > 0 then
|
||||||
local fpoints = points + self.NeutralBenefit
|
self:T({dist=dist, name=name, points=points, coa=coa})
|
||||||
local tries = 1
|
|
||||||
while targets[fpoints] or tries < 100 do
|
|
||||||
fpoints = points - (self.NeutralBenefit+math.random(1,100))
|
|
||||||
tries = tries + 1
|
|
||||||
end
|
|
||||||
targets[fpoints] = {
|
|
||||||
name = name,
|
|
||||||
dist = dist,
|
|
||||||
points = fpoints,
|
|
||||||
coalition = coa,
|
|
||||||
coalitionname = UTILS.GetCoalitionName(coa),
|
|
||||||
coordinate = self.airbasetable[name].coord,
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
if points ~= 0 then
|
||||||
local enemycoa = self.coalition == coalition.side.BLUE and coalition.side.RED or coalition.side.BLUE
|
local enemycoa = self.coalition == coalition.side.BLUE and coalition.side.RED or coalition.side.BLUE
|
||||||
if coa == enemycoa and points ~= 0 then
|
self:T("Enemycoa = "..enemycoa)
|
||||||
local fpoints = points
|
if coa == coalition.side.NEUTRAL then
|
||||||
local tries = 1
|
local tdata = {}
|
||||||
while targets[fpoints] or tries < 100 do
|
tdata.name = name
|
||||||
fpoints = points - (math.random(1,100))
|
tdata.dist = dist
|
||||||
tries = tries + 1
|
tdata.points = points + self.NeutralBenefit
|
||||||
|
tdata.coalition = coa
|
||||||
|
tdata.coalitionname = UTILS.GetCoalitionName(coa)
|
||||||
|
tdata.coordinate = self.airbasetable[name].coord
|
||||||
|
table.insert(targets,tdata)
|
||||||
|
else
|
||||||
|
local tdata = {}
|
||||||
|
tdata.name = name
|
||||||
|
tdata.dist = dist
|
||||||
|
tdata.points = points
|
||||||
|
tdata.coalition = coa
|
||||||
|
tdata.coalitionname = UTILS.GetCoalitionName(coa)
|
||||||
|
tdata.coordinate = self.airbasetable[name].coord
|
||||||
|
table.insert(targets,tdata)
|
||||||
end
|
end
|
||||||
targets[fpoints] = {
|
|
||||||
name = name,
|
|
||||||
dist = dist,
|
|
||||||
points = fpoints,
|
|
||||||
coalition = coa,
|
|
||||||
coalitionname = UTILS.GetCoalitionName(coa),
|
|
||||||
coordinate = self.airbasetable[name].coord,
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1245,13 +1238,15 @@ end
|
|||||||
-- @return #table Target Table with #STRATEGO.Target data or nil if none found.
|
-- @return #table Target Table with #STRATEGO.Target data or nil if none found.
|
||||||
function STRATEGO:FindAffordableStrategicTarget()
|
function STRATEGO:FindAffordableStrategicTarget()
|
||||||
self:T(self.lid.."FindAffordableStrategicTarget")
|
self:T(self.lid.."FindAffordableStrategicTarget")
|
||||||
local targets = self:FindStrategicTargets() -- #table of #STRATEGO.Target
|
local Stargets = self:FindStrategicTargets() -- #table of #STRATEGO.Target
|
||||||
|
--UTILS.PrintTableToLog(Stargets,1)
|
||||||
local budget = self.Budget
|
local budget = self.Budget
|
||||||
--local leftover = self.Budget
|
--local leftover = self.Budget
|
||||||
local target = nil -- #STRATEGO.Target
|
local ftarget = nil -- #STRATEGO.Target
|
||||||
local Targets = {}
|
local Targets = {}
|
||||||
for _,_data in pairs(targets) do
|
for _,_data in pairs(Stargets) do
|
||||||
local data = _data -- #STRATEGO.Target
|
local data = _data -- #STRATEGO.Target
|
||||||
|
self:T("Considering Strategic Target "..data.name)
|
||||||
--if data.points <= budget and budget-data.points < leftover then
|
--if data.points <= budget and budget-data.points < leftover then
|
||||||
if data.points <= budget then
|
if data.points <= budget then
|
||||||
--leftover = budget-data.points
|
--leftover = budget-data.points
|
||||||
@ -1259,14 +1254,18 @@ function STRATEGO:FindAffordableStrategicTarget()
|
|||||||
self:T(self.lid.."Affordable strategic target: "..data.name)
|
self:T(self.lid.."Affordable strategic target: "..data.name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not targets then
|
if #Targets == 0 then
|
||||||
self:T(self.lid.."No suitable target found!")
|
self:T(self.lid.."No suitable target found!")
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
target = Targets[math.random(1,#Targets)]
|
if #Targets > 1 then
|
||||||
if target then
|
ftarget = Targets[math.random(1,#Targets)]
|
||||||
self:T(self.lid.."Final affordable strategic target: "..target.name)
|
else
|
||||||
return target
|
ftarget = Targets[1]
|
||||||
|
end
|
||||||
|
if ftarget then
|
||||||
|
self:T(self.lid.."Final affordable strategic target: "..ftarget.name)
|
||||||
|
return ftarget
|
||||||
else
|
else
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
@ -1277,13 +1276,15 @@ end
|
|||||||
-- @return #table Target Table with #STRATEGO.Target data or nil if none found.
|
-- @return #table Target Table with #STRATEGO.Target data or nil if none found.
|
||||||
function STRATEGO:FindAffordableConsolidationTarget()
|
function STRATEGO:FindAffordableConsolidationTarget()
|
||||||
self:T(self.lid.."FindAffordableConsolidationTarget")
|
self:T(self.lid.."FindAffordableConsolidationTarget")
|
||||||
local targets = self:FindConsolidationTargets() -- #table of #STRATEGO.Target
|
local Ctargets = self:FindConsolidationTargets() -- #table of #STRATEGO.Target
|
||||||
|
--UTILS.PrintTableToLog(Ctargets,1)
|
||||||
local budget = self.Budget
|
local budget = self.Budget
|
||||||
--local leftover = self.Budget
|
--local leftover = self.Budget
|
||||||
local target = nil -- #STRATEGO.Target
|
local ftarget = nil -- #STRATEGO.Target
|
||||||
local Targets = {}
|
local Targets = {}
|
||||||
for _,_data in pairs(targets) do
|
for _,_data in pairs(Ctargets) do
|
||||||
local data = _data -- #STRATEGO.Target
|
local data = _data -- #STRATEGO.Target
|
||||||
|
self:T("Considering Consolidation Target "..data.name)
|
||||||
--if data.points <= budget and budget-data.points < leftover then
|
--if data.points <= budget and budget-data.points < leftover then
|
||||||
if data.points <= budget then
|
if data.points <= budget then
|
||||||
--leftover = budget-data.points
|
--leftover = budget-data.points
|
||||||
@ -1291,14 +1292,18 @@ function STRATEGO:FindAffordableConsolidationTarget()
|
|||||||
self:T(self.lid.."Affordable consolidation target: "..data.name)
|
self:T(self.lid.."Affordable consolidation target: "..data.name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not targets then
|
if #Targets == 0 then
|
||||||
self:T(self.lid.."No suitable target found!")
|
self:T(self.lid.."No suitable target found!")
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
target = Targets[math.random(1,#Targets)]
|
if #Targets > 1 then
|
||||||
if target then
|
ftarget = Targets[math.random(1,#Targets)]
|
||||||
self:T(self.lid.."Final affordable consolidation target: "..target.name)
|
else
|
||||||
return target
|
ftarget = Targets[1]
|
||||||
|
end
|
||||||
|
if ftarget then
|
||||||
|
self:T(self.lid.."Final affordable consolidation target: "..ftarget.name)
|
||||||
|
return ftarget
|
||||||
else
|
else
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user