mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-09-01 02:22:15 +00:00
PyBridge
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
-- 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
|
||||
Reference in New Issue
Block a user