Files
MOOSE/Moose Development/Moose/Python/MooseBridgePayloadExtension.lua
T
2026-08-08 10:23:38 +02:00

106 lines
4.0 KiB
Lua

-- Optional AIRWING payload snapshot extension for MOOSE Bridge.
--
-- Load after MooseBridge.lua when AIRWING payload availability should be included
-- in COHORT snapshots. The core Python advisory layer can then reject AIRWING
-- candidates without a compatible payload for the requested AUFTRAG type.
if not MOOSE_BRIDGE then error("Load MooseBridge.lua before MooseBridgePayloadExtension.lua") end
local function bridge_safe_tostring(value)
if value == nil then return "nil" end
return tostring(value)
end
local function bridge_string_or_nil(value)
if value == nil then return nil end
return tostring(value)
end
function MOOSE_BRIDGE:_CohortUnitType(cohort)
if not cohort then return nil end
local unit_type = self:_SafeCall(cohort, "GetUnitType")
if not unit_type then unit_type = self:_SafeCall(cohort, "GetTypeName") end
if not unit_type then unit_type = self:_SafeCall(cohort, "GetType") end
if not unit_type then unit_type = cohort.unittype or cohort.unitType or cohort.aircrafttype or cohort.AircraftType or cohort.type end
return unit_type and bridge_safe_tostring(unit_type) or nil
end
function MOOSE_BRIDGE:_PayloadPerformance(payload, mission_type)
if type(payload) ~= "table" or type(payload.capabilities) ~= "table" then return nil end
for _, capability in pairs(payload.capabilities) do
if type(capability) == "table" and capability.MissionType == mission_type then
return self:_NumberOrNil(capability.Performance)
end
end
return nil
end
function MOOSE_BRIDGE:_SummarizePayload(payload, mission_type)
if type(payload) ~= "table" then return nil end
local performance = self:_PayloadPerformance(payload, mission_type)
return {
uid=payload.uid,
unitname=bridge_string_or_nil(payload.unitname),
aircrafttype=bridge_string_or_nil(payload.aircrafttype),
navail=self:_NumberOrNil(payload.navail),
unlimited=self:_BoolOrFalse(payload.unlimited),
performance=performance,
}
end
function MOOSE_BRIDGE:_PayloadAvailabilityForMission(airwing, unit_type, mission_type)
local payloads = self:_SafeCallArg(airwing, "_FilterPlayloads", unit_type, mission_type)
if payloads == nil then payloads = self:_SafeCallArg(airwing, "_FilterPayloads", unit_type, mission_type) end
local result = {
available_count=0,
total_available=0,
unlimited_count=0,
best_performance=nil,
payloads={},
}
if type(payloads) ~= "table" then return result end
for _, payload in pairs(payloads) do
local item = self:_SummarizePayload(payload, mission_type)
if item then
result.payloads[#result.payloads + 1] = item
result.available_count = result.available_count + 1
if item.unlimited then result.unlimited_count = result.unlimited_count + 1 end
if item.navail then result.total_available = result.total_available + item.navail end
if item.performance and (not result.best_performance or item.performance > result.best_performance) then
result.best_performance = item.performance
end
end
end
return result
end
function MOOSE_BRIDGE:_CollectPayloadAvailability(cohort, mission_types)
local result = {}
if not cohort or type(mission_types) ~= "table" then return result end
local airwing = cohort.legion
if not airwing or not self:_SafeCall(airwing, "IsAirwing") then return result end
local unit_type = self:_CohortUnitType(cohort)
if not unit_type then return result end
for _, mission_type in pairs(mission_types) do
result[bridge_safe_tostring(mission_type)] = self:_PayloadAvailabilityForMission(airwing, unit_type, mission_type)
end
return result
end
local _moose_bridge_base_build_cohort_snapshot_item = MOOSE_BRIDGE._BuildCohortSnapshotItem
function MOOSE_BRIDGE:_BuildCohortSnapshotItem(cohort_name, cohort, source)
local item = _moose_bridge_base_build_cohort_snapshot_item(self, cohort_name, cohort, source)
if not item then return nil end
local unit_type = self:_CohortUnitType(cohort)
item.unit_type = unit_type
item.payloads_by_mission = self:_CollectPayloadAvailability(cohort, item.mission_types)
return item
end