mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Progress
This commit is contained in:
@@ -71,7 +71,7 @@ function AI_A2A:New( AIGroup )
|
||||
self:SetControllable( AIGroup )
|
||||
|
||||
self:ManageFuel( .2, 60 )
|
||||
self:ManageDamage( 1 )
|
||||
self:ManageDamage( 0.4 )
|
||||
|
||||
self:SetStartState( "Stopped" )
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
--
|
||||
-- @module AI_A2A_Cap
|
||||
|
||||
BASE:TraceClass("AI_A2A_CAP")
|
||||
--BASE:TraceClass("AI_A2A_CAP")
|
||||
|
||||
--- @type AI_A2A_CAP
|
||||
-- @extends AI.AI_A2A_Patrol#AI_A2A_PATROL
|
||||
|
||||
@@ -269,7 +269,7 @@ do -- AI_A2A_DISPATCHER
|
||||
---
|
||||
-- @param #AI_A2A_DISPATCHER self
|
||||
function AI_A2A_DISPATCHER:ClearDefenderTask( AIGroup )
|
||||
if AIGroup:IsAlive() then
|
||||
if AIGroup:IsAlive() and self.DefenderTasks[AIGroup] then
|
||||
local Target = self.DefenderTasks[AIGroup].Target
|
||||
local Message = "Clearing (" .. self.DefenderTasks[AIGroup].Type .. ") "
|
||||
Message = Message .. AIGroup:GetName()
|
||||
@@ -342,8 +342,22 @@ do -- AI_A2A_DISPATCHER
|
||||
DefenderSquadron.Resources = Resources
|
||||
|
||||
self:SetSquadronOverhead( SquadronName, 1 )
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Get an item from the Squadron table.
|
||||
-- @param #AI_A2A_DISPATCHER self
|
||||
-- @return #table
|
||||
function AI_A2A_DISPATCHER:GetSquadron( SquadronName )
|
||||
local DefenderSquadron = self.DefenderSquadrons[SquadronName]
|
||||
|
||||
if not DefenderSquadron then
|
||||
error( "Unknown Squadron:" .. SquadronName )
|
||||
end
|
||||
|
||||
return DefenderSquadron
|
||||
end
|
||||
|
||||
|
||||
---
|
||||
@@ -361,7 +375,7 @@ do -- AI_A2A_DISPATCHER
|
||||
self.DefenderSquadrons[SquadronName] = self.DefenderSquadrons[SquadronName] or {}
|
||||
self.DefenderSquadrons[SquadronName].Cap = self.DefenderSquadrons[SquadronName].Cap or {}
|
||||
|
||||
local DefenderSquadron = self.DefenderSquadrons[SquadronName]
|
||||
local DefenderSquadron = self:GetSquadron( SquadronName )
|
||||
|
||||
local Cap = self.DefenderSquadrons[SquadronName].Cap
|
||||
Cap.Name = SquadronName
|
||||
@@ -386,7 +400,7 @@ do -- AI_A2A_DISPATCHER
|
||||
self.DefenderSquadrons[SquadronName] = self.DefenderSquadrons[SquadronName] or {}
|
||||
self.DefenderSquadrons[SquadronName].Cap = self.DefenderSquadrons[SquadronName].Cap or {}
|
||||
|
||||
local DefenderSquadron = self.DefenderSquadrons[SquadronName]
|
||||
local DefenderSquadron = self:GetSquadron( SquadronName )
|
||||
|
||||
local Cap = self.DefenderSquadrons[SquadronName].Cap
|
||||
if Cap then
|
||||
@@ -415,7 +429,7 @@ do -- AI_A2A_DISPATCHER
|
||||
self.DefenderSquadrons[SquadronName] = self.DefenderSquadrons[SquadronName] or {}
|
||||
self.DefenderSquadrons[SquadronName].Cap = self.DefenderSquadrons[SquadronName].Cap or {}
|
||||
|
||||
local DefenderSquadron = self.DefenderSquadrons[SquadronName]
|
||||
local DefenderSquadron = self:GetSquadron( SquadronName )
|
||||
|
||||
local Cap = self.DefenderSquadrons[SquadronName].Cap
|
||||
if Cap then
|
||||
@@ -434,7 +448,7 @@ do -- AI_A2A_DISPATCHER
|
||||
self.DefenderSquadrons[SquadronName] = self.DefenderSquadrons[SquadronName] or {}
|
||||
self.DefenderSquadrons[SquadronName].Cap = self.DefenderSquadrons[SquadronName].Cap or {}
|
||||
|
||||
local DefenderSquadron = self.DefenderSquadrons[SquadronName]
|
||||
local DefenderSquadron = self:GetSquadron( SquadronName )
|
||||
|
||||
local Cap = DefenderSquadron.Cap
|
||||
if Cap then
|
||||
@@ -501,8 +515,9 @@ do -- AI_A2A_DISPATCHER
|
||||
--
|
||||
-- @return #AI_A2A_DISPATCHER
|
||||
function AI_A2A_DISPATCHER:SetSquadronOverhead( SquadronName, Overhead )
|
||||
|
||||
self.Overhead = Overhead
|
||||
|
||||
local DefenderSquadron = self:GetSquadron( SquadronName )
|
||||
DefenderSquadron.Overhead = Overhead
|
||||
|
||||
return self
|
||||
end
|
||||
@@ -520,7 +535,8 @@ do -- AI_A2A_DISPATCHER
|
||||
-- @return #AI_A2A_DISPATCHER
|
||||
function AI_A2A_DISPATCHER:SetSquadronGrouping( SquadronName, Grouping )
|
||||
|
||||
self.Grouping = Grouping
|
||||
local DefenderSquadron = self:GetSquadron( SquadronName )
|
||||
DefenderSquadron.Grouping = Grouping
|
||||
|
||||
return self
|
||||
end
|
||||
@@ -602,13 +618,15 @@ do -- AI_A2A_DISPATCHER
|
||||
|
||||
local AIFriendlies = self:GetAIFriendliesNearBy( DetectedItem )
|
||||
|
||||
for AIName, AIFriendly in pairs( AIFriendlies or {} ) do
|
||||
for FriendlyDistance, AIFriendly in UTILS.spairs( AIFriendlies or {} ) do
|
||||
-- We only allow to ENGAGE targets as long as the Units on both sides are balanced.
|
||||
if DetectedCount > DefenderCount then
|
||||
local Friendly = AIFriendly:GetGroup() -- Wrapper.Group#GROUP
|
||||
if Friendly and Friendly:IsAlive() then
|
||||
-- Ok, so we have a friendly near the potential target.
|
||||
-- Now we need to check if the AIGroup has a Task.
|
||||
self:F( { FriendlyName = Friendly:GetName() } )
|
||||
self:F( { FriendlyDistance = FriendlyDistance } )
|
||||
local DefenderTask = self:GetDefenderTask( Friendly )
|
||||
if DefenderTask then
|
||||
-- The Task should be CAP or INTERCEPT
|
||||
@@ -641,13 +659,14 @@ do -- AI_A2A_DISPATCHER
|
||||
self.DefenderSquadrons[SquadronName] = self.DefenderSquadrons[SquadronName] or {}
|
||||
self.DefenderSquadrons[SquadronName].Cap = self.DefenderSquadrons[SquadronName].Cap or {}
|
||||
|
||||
local DefenderSquadron = self.DefenderSquadrons[SquadronName]
|
||||
local DefenderSquadron = self:GetSquadron( SquadronName )
|
||||
local Cap = DefenderSquadron.Cap
|
||||
|
||||
if Cap then
|
||||
|
||||
if self:CanCAP( SquadronName ) then
|
||||
local Spawn = DefenderSquadron.Spawn[ math.random( 1, #DefenderSquadron.Spawn ) ]
|
||||
Spawn:InitGrouping( DefenderSquadron.Grouping )
|
||||
local AIGroup = Spawn:SpawnAtAirbase( DefenderSquadron.Airbase )
|
||||
self:F( { AIGroup = AIGroup:GetName() } )
|
||||
|
||||
@@ -682,6 +701,13 @@ do -- AI_A2A_DISPATCHER
|
||||
Fsm:__Engage( 1, Target.Set ) -- Engage on the TargetSetUnit
|
||||
|
||||
self:SetDefenderTaskTarget( AIGroup, Target )
|
||||
|
||||
function Fsm:onafterRTB()
|
||||
self:F({"CAP RTB"})
|
||||
local Dispatcher = self:GetDispatcher() -- #AI_A2A_DISPATCHER
|
||||
local AIGroup = self:GetControllable()
|
||||
Dispatcher:ClearDefenderTask( AIGroup )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -706,7 +732,8 @@ do -- AI_A2A_DISPATCHER
|
||||
DefendersCount = DefendersCount + AIGroup:GetSize()
|
||||
end
|
||||
|
||||
while( DefendersCount < DefendersMissing ) do
|
||||
DefendersCount = DefendersMissing
|
||||
while( DefendersCount > 0 ) do
|
||||
|
||||
for SquadronName, DefenderSquadron in pairs( self.DefenderSquadrons or {} ) do
|
||||
for InterceptID, Intercept in pairs( DefenderSquadron.Intercept or {} ) do
|
||||
@@ -724,16 +751,24 @@ do -- AI_A2A_DISPATCHER
|
||||
|
||||
if ClosestDefenderSquadronName then
|
||||
|
||||
local DefenderSquadron = self.DefenderSquadrons[ClosestDefenderSquadronName]
|
||||
local DefenderSquadron = self:GetSquadron( ClosestDefenderSquadronName )
|
||||
local DefenderOverhead = DefenderSquadron.Overhead
|
||||
local DefenderGrouping = DefenderSquadron.Grouping
|
||||
local DefendersNeeded = math.ceil( DefendersCount * DefenderOverhead )
|
||||
local Intercept = self.DefenderSquadrons[ClosestDefenderSquadronName].Intercept
|
||||
|
||||
local Spawn = DefenderSquadron.Spawn[ math.random( 1, #DefenderSquadron.Spawn ) ]
|
||||
if DefenderGrouping then
|
||||
Spawn:InitGrouping( ( DefenderGrouping < DefendersNeeded ) and DefenderGrouping or DefendersNeeded )
|
||||
else
|
||||
Spawn:InitGrouping()
|
||||
end
|
||||
local AIGroup = Spawn:SpawnAtAirbase( DefenderSquadron.Airbase )
|
||||
self:F( { AIGroup = AIGroup:GetName() } )
|
||||
|
||||
if AIGroup then
|
||||
|
||||
DefendersCount = DefendersCount + AIGroup:GetSize()
|
||||
DefendersCount = DefendersCount - AIGroup:GetSize()
|
||||
|
||||
local Fsm = AI_A2A_INTERCEPT:New( AIGroup, Intercept.MinSpeed, Intercept.MaxSpeed )
|
||||
Fsm:SetDispatcher( self )
|
||||
@@ -744,7 +779,7 @@ do -- AI_A2A_DISPATCHER
|
||||
self:SetDefenderTask( AIGroup, "INTERCEPT", Fsm, Target )
|
||||
|
||||
function Fsm:onafterRTB()
|
||||
self:F({"RTB"})
|
||||
self:F({"INTERCEPT RTB"})
|
||||
local Dispatcher = self:GetDispatcher() -- #AI_A2A_DISPATCHER
|
||||
local AIGroup = self:GetControllable()
|
||||
Dispatcher:ClearDefenderTask( AIGroup )
|
||||
@@ -795,7 +830,7 @@ do -- AI_A2A_DISPATCHER
|
||||
|
||||
-- First, count the active AIGroups Units, targetting the DetectedSet
|
||||
local DefenderCount = self:CountDefendersEngaged( Target )
|
||||
local DefendersMissing = math.ceil( ( AttackerCount - DefenderCount ) * self.Overhead )
|
||||
local DefendersMissing = AttackerCount - DefenderCount
|
||||
|
||||
local Friendlies = self:CountDefendersToBeEngaged( Target, DefenderCount )
|
||||
|
||||
@@ -865,7 +900,7 @@ do -- AI_A2A_DISPATCHER
|
||||
local Defender = Defender -- Wrapper.Group#GROUP
|
||||
local Message = string.format( "%s, %s", Defender:GetName(), DefenderTask.Type )
|
||||
if DefenderTask.Target then
|
||||
Message = Message .. " => " .. DefenderTask.Target.Index
|
||||
Message = Message .. " => " .. DefenderTask.Target.Index .. " : " .. DefenderTask.Target.Set:GetObjectNames()
|
||||
end
|
||||
self:F( { Tactical = Message } )
|
||||
end
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
-- @module AI_A2A_Intercept
|
||||
|
||||
|
||||
BASE:TraceClass("AI_A2A_INTERCEPT")
|
||||
--BASE:TraceClass("AI_A2A_INTERCEPT")
|
||||
|
||||
|
||||
--- @type AI_A2A_INTERCEPT
|
||||
|
||||
Reference in New Issue
Block a user